83 lines
3.8 KiB
Python
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
|