82 lines
4.3 KiB
Python
82 lines
4.3 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import models, fields, api, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class AccountMoveReversal(models.TransientModel):
|
|
_inherit = "account.move.reversal"
|
|
|
|
l10n_latam_use_documents = fields.Boolean(compute='_compute_documents_info')
|
|
l10n_latam_document_type_id = fields.Many2one('l10n_latam.document.type', 'Document Type', ondelete='cascade', domain="[('id', 'in', l10n_latam_available_document_type_ids)]", compute='_compute_document_type', readonly=False, store=True)
|
|
l10n_latam_available_document_type_ids = fields.Many2many('l10n_latam.document.type', compute='_compute_documents_info')
|
|
l10n_latam_document_number = fields.Char(string='Document Number')
|
|
l10n_latam_manual_document_number = fields.Boolean(compute='_compute_l10n_latam_manual_document_number', string='Manual Number')
|
|
|
|
@api.depends('l10n_latam_document_type_id')
|
|
def _compute_l10n_latam_manual_document_number(self):
|
|
self.l10n_latam_manual_document_number = False
|
|
for rec in self.filtered('move_ids'):
|
|
move = rec.move_ids[0]
|
|
if move.journal_id and move.journal_id.l10n_latam_use_documents:
|
|
rec.l10n_latam_manual_document_number = move._is_manual_document_number()
|
|
|
|
@api.model
|
|
def _reverse_type_map(self, move_type):
|
|
match = {
|
|
'entry': 'entry',
|
|
'out_invoice': 'out_refund',
|
|
'in_invoice': 'in_refund',
|
|
'in_refund': 'in_invoice',
|
|
'out_receipt': 'in_receipt',
|
|
'in_receipt': 'out_receipt'}
|
|
return match.get(move_type)
|
|
|
|
@api.depends('l10n_latam_available_document_type_ids')
|
|
def _compute_document_type(self):
|
|
for record in self.filtered(
|
|
lambda x: not x.l10n_latam_document_type_id or
|
|
x.l10n_latam_document_type_id not in x.l10n_latam_available_document_type_ids):
|
|
document_types = record.l10n_latam_available_document_type_ids._origin
|
|
record.l10n_latam_document_type_id = document_types[0] if document_types else False
|
|
|
|
@api.depends('move_ids', 'journal_id')
|
|
def _compute_documents_info(self):
|
|
self.l10n_latam_available_document_type_ids = False
|
|
self.l10n_latam_use_documents = False
|
|
for record in self:
|
|
if len(record.move_ids) > 1:
|
|
move_ids_use_document = record.move_ids._origin.filtered(lambda move: move.l10n_latam_use_documents)
|
|
if move_ids_use_document:
|
|
raise UserError(_('You can only reverse documents with legal invoicing documents from Latin America one at a time.\nProblematic documents: %s', ", ".join(move_ids_use_document.mapped('name'))))
|
|
else:
|
|
record.l10n_latam_use_documents = record.move_ids.journal_id.l10n_latam_use_documents
|
|
|
|
if record.l10n_latam_use_documents:
|
|
refund = record.env['account.move'].new({
|
|
'move_type': record._reverse_type_map(record.move_ids.move_type),
|
|
'journal_id': record.journal_id.id,
|
|
'partner_id': record.move_ids.partner_id.id,
|
|
'company_id': record.move_ids.company_id.id,
|
|
'reversed_entry_id': record.move_ids.id,
|
|
})
|
|
record.l10n_latam_available_document_type_ids = refund.l10n_latam_available_document_type_ids
|
|
|
|
def _prepare_default_reversal(self, move):
|
|
""" Set the default document type and number in the new revsersal move taking into account the ones selected in
|
|
the wizard """
|
|
res = super()._prepare_default_reversal(move)
|
|
res.update({
|
|
'l10n_latam_document_type_id': self.l10n_latam_document_type_id.id,
|
|
'l10n_latam_document_number': self.l10n_latam_document_number,
|
|
})
|
|
return res
|
|
|
|
@api.onchange('l10n_latam_document_number', 'l10n_latam_document_type_id')
|
|
def _onchange_l10n_latam_document_number(self):
|
|
if self.l10n_latam_document_type_id:
|
|
l10n_latam_document_number = self.l10n_latam_document_type_id._format_document_number(
|
|
self.l10n_latam_document_number)
|
|
if self.l10n_latam_document_number != l10n_latam_document_number:
|
|
self.l10n_latam_document_number = l10n_latam_document_number
|