Odoo18-Base/addons/l10n_it_edi_ndd/models/account_move.py
2025-03-10 10:52:11 +07:00

83 lines
3.8 KiB
Python

from odoo import api, fields, models
from odoo.tools.sql import column_exists, create_column
from odoo.addons.l10n_it_edi_ndd.models.account_payment_methode_line import L10N_IT_PAYMENT_METHOD_SELECTION
class AccountMove(models.Model):
_inherit = 'account.move'
l10n_it_payment_method = fields.Selection(
selection=L10N_IT_PAYMENT_METHOD_SELECTION,
compute='_compute_l10n_it_payment_method',
store=True,
readonly=False,
)
l10n_it_document_type = fields.Many2one(
comodel_name='l10n_it.document.type',
compute='_compute_l10n_it_document_type',
store=True,
readonly=False,
)
def _auto_init(self):
# Create compute stored field l10n_it_document_type and l10n_it_payment_method
# here to avoid timeout error on large databases.
if not column_exists(self.env.cr, 'account_move', 'l10n_it_payment_method'):
create_column(self.env.cr, 'account_move', 'l10n_it_payment_method', 'varchar')
if not column_exists(self.env.cr, 'account_move', 'l10n_it_document_type'):
create_column(self.env.cr, 'account_move', 'l10n_it_document_type', 'integer')
return super()._auto_init()
@api.depends('line_ids.matching_number', 'payment_state')
def _compute_l10n_it_payment_method(self):
if self.env.company.account_fiscal_country_id.code != 'IT':
return
move_lines_per_matching_number = self.env['account.move.line'].search([
('matching_number', 'in', self.line_ids.filtered('matching_number').mapped('matching_number')),
('company_id', '=', self.env.company.id),
]).grouped('matching_number')
for move in self:
matching_numbers = move.line_ids.filtered('matching_number').mapped('matching_number')
if matching_numbers:
# We use matching_numbers[0] directly, assuming there's a valid key in the dictionary.
matching_lines = move_lines_per_matching_number.get(matching_numbers[0])
if matching_lines and matching_lines.payment_id:
payment_method_line = matching_lines.payment_id.payment_method_line_id[0]
if payment_method_line:
move.l10n_it_payment_method = payment_method_line.l10n_it_payment_method
continue # Skip to the next move
# Default handling if no valid matching lines found or if conditions don't match
move.l10n_it_payment_method = move.payment_id.payment_method_line_id.l10n_it_payment_method or move.l10n_it_payment_method or 'MP05'
@api.depends('state')
def _compute_l10n_it_document_type(self):
document_type = self.env['l10n_it.document.type'].search([]).grouped('code')
for move in self:
if move.country_code != 'IT' or move.l10n_it_document_type or move.state != 'posted':
continue
move.l10n_it_document_type = document_type.get(move._l10n_it_edi_get_document_type())
def _l10n_it_edi_get_values(self, pdf_values=None):
# EXTENDS 'l10n_it_edi'
res = super()._l10n_it_edi_get_values(pdf_values)
res['document_type'] = self.l10n_it_document_type.code
res['payment_method'] = self.l10n_it_payment_method
return res
def _reverse_moves(self, default_values_list=None, cancel=False):
"""
This function is needed because the l10n_it_document_type is set only if no value are set when posting it
But when reversing the move, the document type of the original move is copied and so it isn't recomputed.
"""
# EXTENDS account
reverse_moves = super()._reverse_moves(default_values_list, cancel)
for move in reverse_moves:
move.l10n_it_document_type = False
return reverse_moves