Skip to content

Commit

Permalink
Merge PR #3188 into 12.0
Browse files Browse the repository at this point in the history
Signed-off-by eLBati
  • Loading branch information
OCA-git-bot committed Mar 31, 2023
2 parents 8de9931 + 72ee0fa commit b25abec
Show file tree
Hide file tree
Showing 3 changed files with 211 additions and 3 deletions.
129 changes: 129 additions & 0 deletions l10n_it_fatturapa_in/tests/data/IT03309970733_DatiTrasportoVAT.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>05979361218</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>VATG2</ProgressivoInvio>
<FormatoTrasmissione>FPA12</FormatoTrasmissione>
<CodiceDestinatario>UFPQ1O</CodiceDestinatario>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>05979361218</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>SOCIETA' ALPHA BETA SRL</Denominazione>
</Anagrafica>
<RegimeFiscale>RF02</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIALE ROMA 543B</Indirizzo>
<CAP>07100</CAP>
<Comune>SASSARI</Comune>
<Provincia>SS</Provincia>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<RappresentanteFiscale>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>03309970733</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>Rappresentante fiscale</Denominazione>
</Anagrafica>
</DatiAnagrafici>
</RappresentanteFiscale>
<CessionarioCommittente>
<DatiAnagrafici>
<CodiceFiscale>80213330584</CodiceFiscale>
<Anagrafica>
<Denominazione>AMMINISTRAZIONE BETA</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIA TORINO 38-B</Indirizzo>
<CAP>00145</CAP>
<Comune>ROMA</Comune>
<Provincia>RM</Provincia>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2015-02-16</Data>
<Numero>FT/2015/0009</Numero>
<Causale>Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567</Causale>
</DatiGeneraliDocumento>
<DatiTrasporto>
<DatiAnagraficiVettore>
<IdFiscaleIVA>
<IdPaese>IE</IdPaese>
<IdCodice>12345678910</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>Trasporto spa</Denominazione>
</Anagrafica>
</DatiAnagraficiVettore>
</DatiTrasporto>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>SA</CodiceTipo>
<CodiceValore>123456-01</CodiceValore>
</CodiceArticolo>
<Descrizione>USB</Descrizione>
<Quantita>4.00</Quantita>
<UnitaMisura>PZ</UnitaMisura>
<PrezzoUnitario>177.00</PrezzoUnitario>
<ScontoMaggiorazione>
<Tipo>SC</Tipo>
<Percentuale>10.00</Percentuale>
</ScontoMaggiorazione>
<PrezzoTotale>637.20</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<RiferimentoAmministrazione>D122353</RiferimentoAmministrazione>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>SA</CodiceTipo>
<CodiceValore>123456-04</CodiceValore>
</CodiceArticolo>
<Descrizione>USB</Descrizione>
<Quantita>1.00</Quantita>
<UnitaMisura>PZ</UnitaMisura>
<PrezzoUnitario>596.00</PrezzoUnitario>
<ScontoMaggiorazione>
<Tipo>SC</Tipo>
<Percentuale>10.00</Percentuale>
</ScontoMaggiorazione>
<PrezzoTotale>536.40</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<RiferimentoAmministrazione>D122354</RiferimentoAmministrazione>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>1173.60</ImponibileImporto>
<Imposta>258.19</Imposta>
<EsigibilitaIVA>S</EsigibilitaIVA>
<RiferimentoNormativo>SCISSIONE PAGAMENTI Split Payment art.17-ter del DPR 633/1972</RiferimentoNormativo>
</DatiRiepilogo>
</DatiBeniServizi>
</FatturaElettronicaBody>
</p:FatturaElettronica>
30 changes: 30 additions & 0 deletions l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,36 @@ def test_56_xml_import_vat_group(self):
vat_group_2_partner,
)

def test_57_xml_import_datitrasporto_not_valid_vat(self):
"""Import an e-bill where the DatiTrasporto has a VAT not valid.
The bill is created without carrier
and the error is logged as an inconsistency.
"""
not_valid_vat = 'IE12345678910'
partner_model = self.env['res.partner']

def vat_partner_exists():
return partner_model.search([
('vat', '=', not_valid_vat),
], limit=1)
# pre-condition: No partner exists with our not valid VAT
self.assertFalse(vat_partner_exists())

# Act: Import the e-bill
res = self.run_wizard('DatiTrasportoVAT', 'IT03309970733_DatiTrasportoVAT.xml')
bill_model = res.get('res_model')
bill_domain = res.get('domain')
bill = self.env[bill_model].search(bill_domain)

# Assert: The partner is not created, the bill has no carrier
# and the VAT issue is mentioned in the inconsistencies
self.assertFalse(vat_partner_exists())
self.assertFalse(bill.carrier_id)
self.assertIn(
not_valid_vat,
bill.inconsistencies,
)

def test_01_xml_link(self):
"""
E-invoice lines are created.
Expand Down
55 changes: 52 additions & 3 deletions l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from odoo.tools import float_is_zero, frozendict
from odoo.tools.safe_eval import safe_eval
from odoo.tools.translate import _
from odoo.exceptions import UserError
from odoo.exceptions import UserError, ValidationError

from odoo.addons.base_iban.models.res_partner_bank import pretty_iban

Expand Down Expand Up @@ -329,7 +329,52 @@ def _prepare_partner_values(self, DatiAnagrafici, cf, vat, supplier):
vals['name'] = DatiAnagrafici.Anagrafica.Denominazione
return vals

def getPartnerBase(self, DatiAnagrafici, supplier=True, raise_if_duplicated=True):
def _get_vat_not_valid_message(self, partner_values):
"""Build the error message raised by res.partner.check_vat.
:param partner_values: Values to create the partner
that would raise the error.
"""
not_valid_partner = self.env['res.partner'].new(partner_values)

# Extracted only message creation from res.partner.check_vat
vat_country_code, vat_number = not_valid_partner._split_vat(
not_valid_partner.vat,
)
partner_country_code = not_valid_partner.commercial_partner_id.country_id.code
country_code = partner_country_code or vat_country_code
vat_not_valid_message = not_valid_partner._construct_constraint_msg(
country_code.lower() if country_code else None,
)
return vat_not_valid_message

def _create_partner(self, partner_values, raise_if_vat_not_valid=True):
"""Create the partner using `partner_values`.
:param raise_if_vat_not_valid: If False and the partner's VAT is not valid,
an empty partner is returned instead of raising an exception.
"""
try:
with self.env.cr.savepoint():
partner = self.env['res.partner'].create(partner_values)
except ValidationError as ve:
if not raise_if_vat_not_valid:
# Do not raise the exception only if the partner
# has been discarded due to its VAT being not valid
ve_message = ve.args[0]
vat_not_valid_message = self._get_vat_not_valid_message(partner_values)
is_vat_not_valid = ve_message == vat_not_valid_message
if is_vat_not_valid:
self.log_inconsistency(ve_message)
partner = self.env['res.partner'].browse()
else:
raise ve
else:
raise ve
return partner

def getPartnerBase(self, DatiAnagrafici, supplier=True,
raise_if_duplicated=True, raise_if_vat_not_valid=True):
if not DatiAnagrafici:
return False
cf = DatiAnagrafici.CodiceFiscale or False
Expand All @@ -351,7 +396,9 @@ def getPartnerBase(self, DatiAnagrafici, supplier=True, raise_if_duplicated=True
else:
# partner to be created
vals = self._prepare_partner_values(DatiAnagrafici, cf, vat, supplier)
found_partner = self.env['res.partner'].create(vals)
found_partner = self._create_partner(
vals, raise_if_vat_not_valid=raise_if_vat_not_valid,
)
return found_partner.id

def getCedPrest(self, cedPrest):
Expand Down Expand Up @@ -475,6 +522,7 @@ def getCarrirerPartner(self, Carrier):
partner_id = self.getPartnerBase(
Carrier.DatiAnagraficiVettore,
raise_if_duplicated=False,
raise_if_vat_not_valid=False,
)
no_contact_update = False
if partner_id:
Expand Down Expand Up @@ -1783,6 +1831,7 @@ def importFatturaPA(self):
Intermediary.DatiAnagrafici,
supplier=False,
raise_if_duplicated=False,
raise_if_vat_not_valid=False,
)
invoice.write(
{
Expand Down

0 comments on commit b25abec

Please sign in to comment.