Odoo18-Base/addons/l10n_vn_edi_viettel/wizard/account_move_reversal.py
2025-01-06 10:57:38 +07:00

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)