69 lines
3.3 KiB
Python
69 lines
3.3 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class AccountMoveReversal(models.TransientModel):
|
|
_inherit = 'account.move.reversal'
|
|
|
|
l10n_vn_edi_adjustment_type = fields.Selection(
|
|
selection=[
|
|
('1', 'Money adjustment'),
|
|
('2', 'Information adjustment'),
|
|
],
|
|
string='Adjustment type',
|
|
required=True,
|
|
default='1',
|
|
)
|
|
l10n_vn_edi_agreement_document_name = fields.Char(
|
|
string='Agreement Name',
|
|
)
|
|
l10n_vn_edi_agreement_document_date = fields.Datetime(
|
|
string='Agreement Date',
|
|
)
|
|
|
|
def _prepare_default_reversal(self, move):
|
|
# EXTEND 'account'
|
|
values = super()._prepare_default_reversal(move)
|
|
# This information is required when sending an adjustment invoice to sinvoice.
|
|
# This is not needed when sending a replacement (as we will be sending the invoice, not the CN) but it doesn't hurt to log it.
|
|
if move._l10n_vn_edi_is_sent():
|
|
values.update({
|
|
'l10n_vn_edi_agreement_document_name': self.l10n_vn_edi_agreement_document_name or 'NA',
|
|
'l10n_vn_edi_agreement_document_date': self.l10n_vn_edi_agreement_document_date or fields.Datetime.now(),
|
|
'l10n_vn_edi_adjustment_type': self.l10n_vn_edi_adjustment_type,
|
|
})
|
|
return values
|
|
|
|
def _modify_default_reverse_values(self, origin_move):
|
|
# EXTEND 'account'
|
|
values = super()._modify_default_reverse_values(origin_move)
|
|
# This information is REQUIRED on the new invoice that will be sent to sinvoice, if we are creating one.
|
|
if origin_move.l10n_vn_edi_invoice_state not in {False, 'ready_to_send'}:
|
|
values.update({
|
|
'l10n_vn_edi_agreement_document_name': self.l10n_vn_edi_agreement_document_name or 'NA',
|
|
'l10n_vn_edi_agreement_document_date': self.l10n_vn_edi_agreement_document_date or fields.Datetime.now(),
|
|
'l10n_vn_edi_adjustment_type': self.l10n_vn_edi_adjustment_type,
|
|
'l10n_vn_edi_replacement_origin_id': origin_move.id,
|
|
})
|
|
return values
|
|
|
|
def reverse_moves(self, is_modify=False):
|
|
# EXTEND 'account'
|
|
for move in self.move_ids.filtered(lambda m: m._l10n_vn_edi_is_sent()):
|
|
# If an invoice has a tax code (symbol starts with C) and the code has not been approved by the tax authorities, you cannot adjust/reverse it.
|
|
if move.l10n_vn_edi_invoice_symbol.name.startswith('C'):
|
|
invoice_lookup, _error_message = move._l10n_vn_edi_lookup_invoice()
|
|
if 'result' in invoice_lookup and invoice_lookup['result'][0].get('exchangeStatus') != 'INVOICE_HAS_CODE_APPROVED':
|
|
raise UserError(_('You cannot adjust/replace invoice %s, it has not been approved by the tax authorities.\n'
|
|
'Please cancel/reverse it and create a new invoice instead.', move.name))
|
|
|
|
# Makes sure to keep the original status up to date by tagging them by either replaced, or adjusted.
|
|
if is_modify:
|
|
move.l10n_vn_edi_invoice_state = 'replaced'
|
|
else:
|
|
move.l10n_vn_edi_invoice_state = 'adjusted'
|
|
|
|
return super().reverse_moves(is_modify)
|