96 lines
4.4 KiB
Python
96 lines
4.4 KiB
Python
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import _, api, models
|
||
|
|
||
|
|
||
|
class AccountMoveSend(models.AbstractModel):
|
||
|
_inherit = 'account.move.send'
|
||
|
|
||
|
@api.model
|
||
|
def _is_it_edi_applicable(self, move):
|
||
|
return all([
|
||
|
move.company_id.account_fiscal_country_id.code == 'IT'
|
||
|
and move._l10n_it_edi_ready_for_xml_export()
|
||
|
and move.l10n_it_edi_state != 'rejected'
|
||
|
])
|
||
|
|
||
|
def _get_all_extra_edis(self) -> dict:
|
||
|
# EXTENDS 'account'
|
||
|
res = super()._get_all_extra_edis()
|
||
|
res.update({'it_edi_send': {'label': _("Send to Tax Agency"), 'is_applicable': self._is_it_edi_applicable, 'help': _("Send the e-invoice XML to the Italian Tax Agency.")}})
|
||
|
return res
|
||
|
|
||
|
# -------------------------------------------------------------------------
|
||
|
# ALERTS
|
||
|
# -------------------------------------------------------------------------
|
||
|
|
||
|
def _get_alerts(self, moves, moves_data):
|
||
|
# EXTENDS 'account'
|
||
|
alerts = super()._get_alerts(moves, moves_data)
|
||
|
if it_moves := moves.filtered(lambda m: 'it_edi_send' in moves_data[m]['extra_edis'] or moves_data[m]['invoice_edi_format'] == 'it_edi_xml'):
|
||
|
if it_alerts := it_moves._l10n_it_edi_export_data_check():
|
||
|
alerts.update(**it_alerts)
|
||
|
return alerts
|
||
|
|
||
|
# -------------------------------------------------------------------------
|
||
|
# SENDING METHODS
|
||
|
# -------------------------------------------------------------------------
|
||
|
|
||
|
def _get_invoice_extra_attachments(self, invoice):
|
||
|
# EXTENDS 'account'
|
||
|
return super()._get_invoice_extra_attachments(invoice) + invoice.l10n_it_edi_attachment_id
|
||
|
|
||
|
def _hook_invoice_document_before_pdf_report_render(self, invoice, invoice_data):
|
||
|
# EXTENDS 'account'
|
||
|
super()._hook_invoice_document_before_pdf_report_render(invoice, invoice_data)
|
||
|
if (
|
||
|
('it_edi_send' in invoice_data['extra_edis'] and not invoice.l10n_it_edi_attachment_id)
|
||
|
or (invoice_data['invoice_edi_format'] == 'it_edi_xml' and invoice._l10n_it_edi_ready_for_xml_export())
|
||
|
):
|
||
|
if errors := invoice._l10n_it_edi_export_data_check():
|
||
|
invoice_data['error'] = {
|
||
|
'error_title': _("Errors occurred while creating the e-invoice file:"),
|
||
|
'errors': errors,
|
||
|
}
|
||
|
|
||
|
def _hook_invoice_document_after_pdf_report_render(self, invoice, invoice_data):
|
||
|
# EXTENDS 'account'
|
||
|
super()._hook_invoice_document_after_pdf_report_render(invoice, invoice_data)
|
||
|
if (
|
||
|
invoice_data.get('pdf_attachment_values')
|
||
|
and (
|
||
|
('it_edi_send' in invoice_data['extra_edis'] and not invoice.l10n_it_edi_attachment_id)
|
||
|
or (invoice_data['invoice_edi_format'] == 'it_edi_xml' and invoice._l10n_it_edi_ready_for_xml_export())
|
||
|
)
|
||
|
):
|
||
|
invoice_data['l10n_it_edi_values'] = invoice._l10n_it_edi_get_attachment_values(
|
||
|
pdf_values=invoice_data['pdf_attachment_values'])
|
||
|
|
||
|
def _call_web_service_after_invoice_pdf_render(self, invoices_data):
|
||
|
# EXTENDS 'account'
|
||
|
super()._call_web_service_after_invoice_pdf_render(invoices_data)
|
||
|
attachments_vals = {}
|
||
|
moves = self.env['account.move']
|
||
|
for move, move_data in invoices_data.items():
|
||
|
if 'it_edi_send' in move_data['extra_edis']:
|
||
|
moves |= move
|
||
|
if attachment := move.l10n_it_edi_attachment_id:
|
||
|
attachments_vals[move] = {'name': attachment.name, 'raw': attachment.raw}
|
||
|
else:
|
||
|
attachments_vals[move] = invoices_data[move]['l10n_it_edi_values']
|
||
|
moves._l10n_it_edi_send(attachments_vals)
|
||
|
|
||
|
def _link_invoice_documents(self, invoices_data):
|
||
|
# EXTENDS 'account'
|
||
|
super()._link_invoice_documents(invoices_data)
|
||
|
|
||
|
attachments_vals = [
|
||
|
invoice_data.get('l10n_it_edi_values')
|
||
|
for invoice_data in invoices_data.values()
|
||
|
if invoice_data.get('l10n_it_edi_values')
|
||
|
]
|
||
|
if attachments_vals:
|
||
|
attachments = self.env['ir.attachment'].sudo().create(attachments_vals)
|
||
|
res_ids = attachments.mapped('res_id')
|
||
|
self.env['account.move'].browse(res_ids).invalidate_recordset(fnames=['l10n_it_edi_attachment_id', 'l10n_it_edi_attachment_file'])
|