Skip to content

Commit

Permalink
Merge PR #3808 into 16.0
Browse files Browse the repository at this point in the history
Signed-off-by eLBati
  • Loading branch information
OCA-git-bot committed Oct 4, 2024
2 parents aa682ed + d02f52d commit f79f418
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 132 deletions.
12 changes: 8 additions & 4 deletions l10n_it_fatturapa_in/models/attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ def _compute_e_invoice_parsing_error(self):

@api.depends("ir_attachment_id.datas")
def _compute_xml_data(self):
invoice_model = self.env["account.move"]
for att in self:
att.xml_supplier_id = False
att.invoices_number = False
Expand All @@ -170,11 +171,14 @@ def _compute_xml_data(self):
# Look into each invoice to compute the following values
invoices_date = []
for invoice_body in fatt.FatturaElettronicaBody:
# Assign this directly so that rounding is applied each time
att.invoices_total += float(
invoice_body.DatiGenerali.DatiGeneraliDocumento.ImportoTotaleDocumento
or 0
amount_untaxed = invoice_model.compute_xml_amount_untaxed(invoice_body)
amount_tax = invoice_model.compute_xml_amount_tax(
invoice_body.DatiBeniServizi.DatiRiepilogo
)
amount_total = invoice_model.compute_xml_amount_total(
invoice_body, amount_untaxed, amount_tax
)
att.invoices_total += amount_total

document_date = invoice_body.DatiGenerali.DatiGeneraliDocumento.Data
invoice_date = format_date(
Expand Down
118 changes: 118 additions & 0 deletions l10n_it_fatturapa_in/tests/data/IT08973230967_6zZcm.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<ns2:FatturaElettronica xmlns:ns2="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" versione="FPR12">
<FatturaElettronicaHeader>
<DatiTrasmissione><IdTrasmittente><IdPaese>IT</IdPaese><IdCodice>08973230967</IdCodice></IdTrasmittente><ProgressivoInvio>6zZcm</ProgressivoInvio><FormatoTrasmissione>FPR12</FormatoTrasmissione><CodiceDestinatario>USAL8PV</CodiceDestinatario></DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>02581610249</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>GAV spa</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>Via Meucci 11/15</Indirizzo>
<CAP>36040</CAP>
<Comune>Brendola</Comune>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>02780790107</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>SOCIETA' ALPHA SRL</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIALE ROMA 543</Indirizzo>
<CAP>07100</CAP>
<Comune>SASSARI</Comune>
<Provincia>SS</Provincia>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
<TerzoIntermediarioOSoggettoEmittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>00161809991</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>Amazon Services Europe S.à r.l.</Denominazione>
</Anagrafica>
</DatiAnagrafici>
</TerzoIntermediarioOSoggettoEmittente>
<SoggettoEmittente>TZ</SoggettoEmittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2023-08-07</Data>
<Numero>IT23-94115I-790</Numero>
<ScontoMaggiorazione>
<Tipo>SC</Tipo>
<Importo>1.23</Importo>
</ScontoMaggiorazione>
<ImportoTotaleDocumento>28.40</ImportoTotaleDocumento>
<Arrotondamento>0.00</Arrotondamento>
</DatiGeneraliDocumento>
<DatiContratto>
<RiferimentoNumeroLinea>1</RiferimentoNumeroLinea>
<RiferimentoNumeroLinea>2</RiferimentoNumeroLinea>
<IdDocumento>406-1634151-9421169</IdDocumento>
<Data>2023-08-06</Data>
</DatiContratto>
<FatturaPrincipale>
<NumeroFatturaPrincipale>IT23-94115I-790</NumeroFatturaPrincipale>
<DataFatturaPrincipale>2023-08-07</DataFatturaPrincipale>
</FatturaPrincipale>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>GAV Pistola Gonfiaggio Pneumatici Professionale Made in Italy con Manometro Pressione WIKA da 63mm per Pressione Gomme di Auto Moto Camion e Biciclette - Scala in BAR Psi - 60D (Standard)</Descrizione>
<Quantita>1.00</Quantita>
<DataInizioPeriodo>2023-08-07</DataInizioPeriodo>
<DataFinePeriodo>2023-08-07</DataFinePeriodo>
<PrezzoUnitario>24.51</PrezzoUnitario>
<ScontoMaggiorazione>
<Tipo>SC</Tipo>
<Importo>1.23</Importo>
</ScontoMaggiorazione>
<PrezzoTotale>23.28</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<Descrizione>Costi di spedizione</Descrizione>
<Quantita>1.00</Quantita>
<DataInizioPeriodo>2023-08-07</DataInizioPeriodo>
<DataFinePeriodo>2023-08-07</DataFinePeriodo>
<PrezzoUnitario>0.00</PrezzoUnitario>
<PrezzoTotale>0.00</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<Arrotondamento>-0.01</Arrotondamento>
<ImponibileImporto>23.27</ImponibileImporto>
<Imposta>5.12</Imposta>
</DatiRiepilogo>
</DatiBeniServizi>
<DatiPagamento>
<CondizioniPagamento>TP02</CondizioniPagamento>
<DettaglioPagamento>
<ModalitaPagamento>MP08</ModalitaPagamento>
<ImportoPagamento>28.40</ImportoPagamento>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
</ns2:FatturaElettronica>
58 changes: 13 additions & 45 deletions l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,18 +200,6 @@ def test_07_xml_import(self):
self.assertEqual(invoice.e_invoice_validation_error, False)
self.assertEqual(invoice.invoice_line_ids[0].admin_ref, "D122353")

def test_08_xml_import(self):
# using ImportoTotaleDocumento
res = self.run_wizard("test8", "IT05979361218_005.xml")
invoice_id = res.get("domain")[0][2][0]
invoice = self.invoice_model.browse(invoice_id)
self.assertEqual(invoice.ref, "FT/2015/0010")
self.assertEqual(invoice.payment_reference, "FT/2015/0010")
self.assertAlmostEqual(invoice.amount_total, 1288.61)
self.assertFalse(invoice.inconsistencies)
# allow following test to reuse the same XML file
invoice.ref = invoice.payment_reference = "14081"

def test_08_xml_import_no_account(self):
"""Check that a useful error message is raised when
the credit account is missing in journal."""
Expand All @@ -236,21 +224,11 @@ def test_08_xml_import_no_account(self):
self.assertIn(journal.display_name, ue.exception.args[0])
self.assertIn(company.display_name, ue.exception.args[0])

discount_amount = -143.18

# Restore the property and import the invoice
expense_default_property.res_id = False
res = self.run_wizard("test8_with_property", "IT05979361218_005.xml")
invoice_id = res.get("domain")[0][2][0]
invoice = self.invoice_model.browse(invoice_id)
invoice_lines = invoice.invoice_line_ids
discount_line = invoice_lines.filtered(
lambda line: line.price_unit == discount_amount
)
self.assertEqual(
discount_line.account_id,
expense_default_property.get_by_record(),
)
# allow following code to reuse the same XML file
invoice.ref = invoice.payment_reference = "14083"

Expand All @@ -259,33 +237,10 @@ def test_08_xml_import_no_account(self):
res = self.run_wizard("test8_with_journal", "IT05979361218_005.xml")
invoice_id = res.get("domain")[0][2][0]
invoice = self.invoice_model.browse(invoice_id)
invoice_lines = invoice.invoice_line_ids
discount_line = invoice_lines.filtered(
lambda line: line.price_unit == discount_amount
)
self.assertEqual(
discount_line.account_id,
journal_account,
)
self.assertTrue(invoice)
# allow following tests to reuse the same XML file
invoice.ref = invoice.payment_reference = "14084"

def test_09_xml_import(self):
# using DatiGeneraliDocumento.ScontoMaggiorazione without
# ImportoTotaleDocumento
# add test file name case sensitive
res = self.run_wizard("test9", "IT05979361218_006.XML")
invoice_id = res.get("domain")[0][2][0]
invoice = self.invoice_model.browse(invoice_id)
self.assertEqual(invoice.ref, "FT/2015/0011")
self.assertEqual(invoice.payment_reference, "FT/2015/0011")
self.assertAlmostEqual(invoice.amount_total, 1288.61)
self.assertEqual(
invoice.inconsistencies,
"Computed amount untaxed 1030.42 is different from" " summary data 1173.6",
)

def test_10_xml_import(self):
# Fix Date format
res = self.run_wizard("test6", "IT05979361218_007.xml")
Expand Down Expand Up @@ -1182,6 +1137,19 @@ def test_access_other_user_e_invoice_attachments(self):
e_invoice = invoices.fatturapa_doc_attachments
self.assertTrue(e_invoice.ir_attachment_id.read())

def test_ignore_global_discount(self):
"""The nodes
- DatiGeneraliDocumento/ScontoMaggiorazione
- DatiGeneraliDocumento/ImportoTotaleDocumento
are not considered for invoice validation/consistency.
"""
res = self.run_wizard("ignore_global_discount", "IT08973230967_6zZcm.xml")
invoice = self.invoice_model.search(res["domain"])
self.assertFalse(invoice.inconsistencies)
self.assertEqual(invoice.amount_untaxed, 23.27)
self.assertEqual(invoice.amount_tax, 5.12)
self.assertEqual(invoice.amount_total, 28.39)


class TestFatturaPAEnasarco(FatturapaCommon):
def setUp(self):
Expand Down
97 changes: 14 additions & 83 deletions l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright 2022 Simone Rubino - TAKOBI
# Copyright 2024 Simone Rubino - Aion Tech
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

import logging
Expand Down Expand Up @@ -817,48 +818,6 @@ def _computeDiscount(self, DettaglioLinea):
discount = (1 - (line_unit / float(DettaglioLinea.PrezzoUnitario))) * 100.0
return discount

def _addGlobalDiscount(self, invoice_id, DatiGeneraliDocumento):
discount = 0.0
if (
DatiGeneraliDocumento.ScontoMaggiorazione
and self.e_invoice_detail_level == "2"
):
invoice = self.env["account.move"].browse(invoice_id)
for DiscRise in DatiGeneraliDocumento.ScontoMaggiorazione:
if DiscRise.Percentuale:
amount = invoice.amount_total * (float(DiscRise.Percentuale) / 100)
if DiscRise.Tipo == "SC":
discount -= amount
elif DiscRise.Tipo == "MG":
discount += amount
elif DiscRise.Importo:
if DiscRise.Tipo == "SC":
discount -= float(DiscRise.Importo)
elif DiscRise.Tipo == "MG":
discount += float(DiscRise.Importo)
company = invoice.company_id
global_discount_product = company.sconto_maggiorazione_product_id
credit_account = self.get_credit_account(
product=global_discount_product,
)
line_vals = {
"move_id": invoice_id,
"name": _("Global bill discount from document general data"),
"account_id": credit_account.id,
"price_unit": discount,
"quantity": 1,
}
if global_discount_product:
line_vals["product_id"] = global_discount_product.id
line_vals["name"] = global_discount_product.name
self.adjust_accounting_data(global_discount_product, line_vals)
else:
line_vals["tax_ids"] = [fields.Command.clear()]
self.env["account.move.line"].with_context(
check_move_validity=False
).create(line_vals)
return True

def _createPaymentsLine(self, payment_id, line, partner_id, invoice):
details = line.DettaglioPagamento or False
if details:
Expand Down Expand Up @@ -1314,10 +1273,6 @@ def invoiceCreate(self, fatt, fatturapa_attachment, FatturaBody, partner_id):
# 2.5
self.set_attachments_data(FatturaBody, invoice)

self._addGlobalDiscount(
invoice.id, FatturaBody.DatiGenerali.DatiGeneraliDocumento
)

if self.e_invoice_detail_level != "1":
self.set_roundings(FatturaBody, invoice)

Expand Down Expand Up @@ -1798,44 +1753,20 @@ def set_invoice_line_ids(
return invoice_lines

def check_invoice_amount(self, invoice, FatturaElettronicaBody):
dgd = FatturaElettronicaBody.DatiGenerali.DatiGeneraliDocumento
if dgd.ScontoMaggiorazione and dgd.ImportoTotaleDocumento:
# assuming that, if someone uses
# DatiGeneraliDocumento.ScontoMaggiorazione, also fills
# DatiGeneraliDocumento.ImportoTotaleDocumento
ImportoTotaleDocumento = float(dgd.ImportoTotaleDocumento)
if not float_is_zero(
invoice.amount_total - ImportoTotaleDocumento, precision_digits=2
):
self.log_inconsistency(
_(
"Bill total %(amount_total)s is different "
"from document total amount %(document_total_amount)s"
)
% {
"amount_total": invoice.amount_total,
"document_total_amount": ImportoTotaleDocumento,
}
)
else:
# else, we can only check DatiRiepilogo if
# DatiGeneraliDocumento.ScontoMaggiorazione is not present,
# because otherwise DatiRiepilogo and odoo invoice total would
# differ
amount_untaxed = invoice.compute_xml_amount_untaxed(FatturaElettronicaBody)
if not float_is_zero(
invoice.amount_untaxed - amount_untaxed, precision_digits=2
):
self.log_inconsistency(
_(
"Computed amount untaxed %(amount_untaxed)s is "
"different from summary data %(summary_data)s"
)
% {
"amount_untaxed": invoice.amount_untaxed,
"summary_data": amount_untaxed,
}
amount_untaxed = invoice.compute_xml_amount_untaxed(FatturaElettronicaBody)
if not float_is_zero(
invoice.amount_untaxed - amount_untaxed, precision_digits=2
):
self.log_inconsistency(
_(
"Computed amount untaxed %(amount_untaxed)s is "
"different from summary data %(summary_data)s"
)
% {
"amount_untaxed": invoice.amount_untaxed,
"summary_data": amount_untaxed,
}
)

def create_and_get_line_id(self, invoice_line_ids, invoice_line_model, upd_vals):
invoice_line_id = (
Expand Down

0 comments on commit f79f418

Please sign in to comment.