Skip to content

Commit c34d69a

Browse files
[IMP] l10n_it_fatturapa_in: Skip Duplicated Partners for some fields
Only CedentePrestatore and CessionarioCommittente are checked for VAT Groups, when other partner fields match multiple partners just log an inconsistency Co-authored-by: SirAionTech <simone.rubino@aion-tech.it>
1 parent 76eea6b commit c34d69a

File tree

2 files changed

+72
-34
lines changed

2 files changed

+72
-34
lines changed

l10n_it_fatturapa_in/tests/data/IT03309970733_VATG2.xml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.
3333
<Nazione>IT</Nazione>
3434
</Sede>
3535
</CedentePrestatore>
36+
<RappresentanteFiscale>
37+
<DatiAnagrafici>
38+
<IdFiscaleIVA>
39+
<IdPaese>IT</IdPaese>
40+
<IdCodice>03309970733</IdCodice>
41+
</IdFiscaleIVA>
42+
<Anagrafica>
43+
<Denominazione>Rappresentante fiscale</Denominazione>
44+
</Anagrafica>
45+
</DatiAnagrafici>
46+
</RappresentanteFiscale>
3647
<CessionarioCommittente>
3748
<DatiAnagrafici>
3849
<CodiceFiscale>80213330584</CodiceFiscale>
@@ -48,6 +59,17 @@ xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.
4859
<Nazione>IT</Nazione>
4960
</Sede>
5061
</CessionarioCommittente>
62+
<TerzoIntermediarioOSoggettoEmittente>
63+
<DatiAnagrafici>
64+
<IdFiscaleIVA>
65+
<IdPaese>IT</IdPaese>
66+
<IdCodice>03309970733</IdCodice>
67+
</IdFiscaleIVA>
68+
<Anagrafica>
69+
<Denominazione>Terzo Intermediario</Denominazione>
70+
</Anagrafica>
71+
</DatiAnagrafici>
72+
</TerzoIntermediarioOSoggettoEmittente>
5173
</FatturaElettronicaHeader>
5274
<FatturaElettronicaBody>
5375
<DatiGenerali>
@@ -58,6 +80,17 @@ xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.
5880
<Numero>FT/2015/0009</Numero>
5981
<Causale>Rif ordine MAPA: --- Nr. Identificativo Ordine 1234567</Causale>
6082
</DatiGeneraliDocumento>
83+
<DatiTrasporto>
84+
<DatiAnagraficiVettore>
85+
<IdFiscaleIVA>
86+
<IdPaese>IT</IdPaese>
87+
<IdCodice>03309970733</IdCodice>
88+
</IdFiscaleIVA>
89+
<Anagrafica>
90+
<Denominazione>Trasporto spa</Denominazione>
91+
</Anagrafica>
92+
</DatiAnagraficiVettore>
93+
</DatiTrasporto>
6194
</DatiGenerali>
6295
<DatiBeniServizi>
6396
<DettaglioLinee>

l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,8 @@ def _get_commercial_partner(self, partners):
314314
commercial_partner = self.env["res.partner"].browse()
315315
return commercial_partner
316316

317-
def getPartnerBase(self, DatiAnagrafici): # noqa: C901
318-
if not DatiAnagrafici:
319-
return False
320-
partner_model = self.env["res.partner"]
321-
cf = DatiAnagrafici.CodiceFiscale or False
317+
def _extract_vat(self, DatiAnagrafici):
318+
"""Extract VAT from node DatiAnagrafici."""
322319
vat = False
323320
if DatiAnagrafici.IdFiscaleIVA:
324321
id_paese = DatiAnagrafici.IdFiscaleIVA.IdPaese.upper()
@@ -330,43 +327,51 @@ def getPartnerBase(self, DatiAnagrafici): # noqa: C901
330327
# XXX maybe San Marino needs special formatting too?
331328
else:
332329
vat = id_codice
330+
return vat
331+
332+
def _prepare_partner_values(self, DatiAnagrafici, cf, vat):
333+
country_id = False
334+
if DatiAnagrafici.IdFiscaleIVA:
335+
CountryCode = DatiAnagrafici.IdFiscaleIVA.IdPaese
336+
countries = self.CountryByCode(CountryCode)
337+
if countries:
338+
country_id = countries[0].id
339+
else:
340+
raise UserError(_("Country Code %s not found in system.") % CountryCode)
341+
vals = {
342+
"vat": vat,
343+
"fiscalcode": cf,
344+
"is_company": (DatiAnagrafici.Anagrafica.Denominazione and True or False),
345+
"eori_code": DatiAnagrafici.Anagrafica.CodEORI or "",
346+
"country_id": country_id,
347+
}
348+
if DatiAnagrafici.Anagrafica.Nome:
349+
vals["firstname"] = DatiAnagrafici.Anagrafica.Nome
350+
if DatiAnagrafici.Anagrafica.Cognome:
351+
vals["lastname"] = DatiAnagrafici.Anagrafica.Cognome
352+
if DatiAnagrafici.Anagrafica.Denominazione:
353+
vals["name"] = DatiAnagrafici.Anagrafica.Denominazione
354+
return vals
355+
356+
def getPartnerBase(self, DatiAnagrafici): # noqa: C901
357+
if not DatiAnagrafici:
358+
return False
359+
partner_model = self.env["res.partner"]
360+
cf = DatiAnagrafici.CodiceFiscale or False
361+
vat = self._extract_vat(DatiAnagrafici)
333362
partners = self._search_partner_by_vat_fc(vat, cf)
334363
commercial_partner = self._get_commercial_partner(partners)
335364
if len(partners) > 1 and not commercial_partner:
336-
return False
365+
found_partner = partner_model.browse()
337366
elif commercial_partner:
338367
commercial_partner_id = commercial_partner.id
339368
self.check_partner_base_data(commercial_partner_id, DatiAnagrafici)
340-
return commercial_partner_id
369+
found_partner = commercial_partner
341370
else:
342371
# partner to be created
343-
country_id = False
344-
if DatiAnagrafici.IdFiscaleIVA:
345-
CountryCode = DatiAnagrafici.IdFiscaleIVA.IdPaese
346-
countries = self.CountryByCode(CountryCode)
347-
if countries:
348-
country_id = countries[0].id
349-
else:
350-
raise UserError(
351-
_("Country Code %s not found in system.") % CountryCode
352-
)
353-
vals = {
354-
"vat": vat,
355-
"fiscalcode": cf,
356-
"is_company": (
357-
DatiAnagrafici.Anagrafica.Denominazione and True or False
358-
),
359-
"eori_code": DatiAnagrafici.Anagrafica.CodEORI or "",
360-
"country_id": country_id,
361-
}
362-
if DatiAnagrafici.Anagrafica.Nome:
363-
vals["firstname"] = DatiAnagrafici.Anagrafica.Nome
364-
if DatiAnagrafici.Anagrafica.Cognome:
365-
vals["lastname"] = DatiAnagrafici.Anagrafica.Cognome
366-
if DatiAnagrafici.Anagrafica.Denominazione:
367-
vals["name"] = DatiAnagrafici.Anagrafica.Denominazione
368-
369-
return partner_model.create(vals).id
372+
vals = self._prepare_partner_values(DatiAnagrafici, cf, vat)
373+
found_partner = partner_model.create(vals)
374+
return found_partner.id
370375

371376
def getCedPrest(self, cedPrest):
372377
partner_model = self.env["res.partner"]

0 commit comments

Comments
 (0)