Skip to content

Commit b719a73

Browse files
committed
[IMP] l10n_it_edi_extension: add TD29
1 parent af9f849 commit b719a73

File tree

4 files changed

+163
-0
lines changed

4 files changed

+163
-0
lines changed

l10n_it_edi_extension/models/account_move.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@
1313
class AccountMoveInherit(models.Model):
1414
_inherit = "account.move"
1515

16+
l10n_it_edi_is_td29 = fields.Boolean(
17+
string="TD29 - Omitted/Irregular Invoice Communication",
18+
copy=False,
19+
help="Check this box to generate a TD29 communication for omitted or "
20+
"irregular invoicing by the Italian seller/provider "
21+
"(art. 6, comma 8, D.Lgs. 471/97).",
22+
)
1623
l10n_it_edi_protocol_number = fields.Char(size=64, copy=False)
1724
l10n_it_edi_tax_representative_id = fields.Many2one(
1825
"res.partner", string="Tax Representative"
@@ -132,6 +139,14 @@ class AccountMoveInherit(models.Model):
132139
# Computes
133140
# -------------------------------------------------------------------------
134141

142+
@api.depends("move_type", "line_ids.tax_tag_ids", "l10n_it_edi_is_td29")
143+
def _compute_l10n_it_edi_is_self_invoice(self):
144+
res = super()._compute_l10n_it_edi_is_self_invoice()
145+
for move in self:
146+
if move.l10n_it_edi_is_td29:
147+
move.l10n_it_edi_is_self_invoice = True
148+
return res
149+
135150
@api.depends("l10n_it_edi_attachment_id")
136151
def _compute_l10n_it_edi_attachment_preview_link(self):
137152
for move in self:
@@ -236,6 +251,11 @@ def action_l10n_it_edi_ext_attachment_in_preview(self):
236251
# Helpers
237252
# -------------------------------------------------------------------------
238253

254+
def _l10n_it_edi_get_document_type(self):
255+
if self.l10n_it_edi_is_td29:
256+
return "TD29"
257+
return super()._l10n_it_edi_get_document_type()
258+
239259
def _l10n_it_edi_add_base_lines_xml_values(
240260
self, base_lines_aggregated_values, is_downpayment
241261
):
@@ -288,6 +308,11 @@ def _l10n_it_edi_get_values(self, pdf_values=None):
288308

289309
res["causale"] = causale_list
290310

311+
if self.l10n_it_edi_is_td29:
312+
# TD29: CodiceDestinatario must always be "0000000"
313+
# and PECDestinatario must not be filled
314+
res["buyer_info"] = dict(res["buyer_info"], pa_index="0000000")
315+
291316
return res
292317

293318
def _l10n_it_edi_get_extra_info(
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<p:FatturaElettronica
2+
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
3+
xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
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"
6+
versione="FPR12"
7+
>
8+
<FatturaElettronicaHeader>
9+
<DatiTrasmissione>
10+
<IdTrasmittente>
11+
<IdPaese>IT</IdPaese>
12+
<IdCodice>01234560157</IdCodice>
13+
</IdTrasmittente>
14+
<ProgressivoInvio>2024010001</ProgressivoInvio>
15+
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
16+
<CodiceDestinatario>0000000</CodiceDestinatario>
17+
<ContattiTrasmittente>
18+
<Telefono>0266766700</Telefono>
19+
<Email>test@test.it</Email>
20+
</ContattiTrasmittente>
21+
</DatiTrasmissione>
22+
<CedentePrestatore>
23+
<DatiAnagrafici>
24+
<IdFiscaleIVA>
25+
<IdPaese>IT</IdPaese>
26+
<IdCodice>00465840031</IdCodice>
27+
</IdFiscaleIVA>
28+
<CodiceFiscale>93026890017</CodiceFiscale>
29+
<Anagrafica>
30+
<Denominazione>Alessi</Denominazione>
31+
</Anagrafica>
32+
<RegimeFiscale>RF18</RegimeFiscale>
33+
</DatiAnagrafici>
34+
<Sede>
35+
<Indirizzo>Via Privata Alessi 6</Indirizzo>
36+
<CAP>28887</CAP>
37+
<Comune>Milan</Comune>
38+
<Nazione>IT</Nazione>
39+
</Sede>
40+
</CedentePrestatore>
41+
<CessionarioCommittente>
42+
<DatiAnagrafici>
43+
<IdFiscaleIVA>
44+
<IdPaese>IT</IdPaese>
45+
<IdCodice>01234560157</IdCodice>
46+
</IdFiscaleIVA>
47+
<CodiceFiscale>01234560157</CodiceFiscale>
48+
<Anagrafica>
49+
<Denominazione>company_2_data</Denominazione>
50+
</Anagrafica>
51+
</DatiAnagrafici>
52+
<Sede>
53+
<Indirizzo>1234 Test Street</Indirizzo>
54+
<CAP>12345</CAP>
55+
<Comune>Prova</Comune>
56+
<Nazione>IT</Nazione>
57+
</Sede>
58+
</CessionarioCommittente>
59+
</FatturaElettronicaHeader>
60+
<FatturaElettronicaBody>
61+
<DatiGenerali>
62+
<DatiGeneraliDocumento>
63+
<TipoDocumento>TD29</TipoDocumento>
64+
<Divisa>EUR</Divisa>
65+
<Data>2024-01-01</Data>
66+
<Numero>BILL/2024/01/0001</Numero>
67+
<ImportoTotaleDocumento>122.00</ImportoTotaleDocumento>
68+
</DatiGeneraliDocumento>
69+
</DatiGenerali>
70+
<DatiBeniServizi>
71+
<DettaglioLinee>
72+
<NumeroLinea>1</NumeroLinea>
73+
<Descrizione>test line</Descrizione>
74+
<Quantita>1.00</Quantita>
75+
<PrezzoUnitario>100.00000000</PrezzoUnitario>
76+
<PrezzoTotale>100.00000000</PrezzoTotale>
77+
<AliquotaIVA>22.00</AliquotaIVA>
78+
</DettaglioLinee>
79+
<DatiRiepilogo>
80+
<AliquotaIVA>22.00</AliquotaIVA>
81+
<ImponibileImporto>100.00</ImponibileImporto>
82+
<Imposta>22.00</Imposta>
83+
<EsigibilitaIVA>I</EsigibilitaIVA>
84+
</DatiRiepilogo>
85+
</DatiBeniServizi>
86+
</FatturaElettronicaBody>
87+
</p:FatturaElettronica>

l10n_it_edi_extension/tests/test_export.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,45 @@ def test_us_partner_shipping(self):
9595
)
9696
invoice.action_post()
9797
self._assert_export_invoice(invoice, "us_partner_shipping.xml")
98+
99+
def test_td29_communication(self):
100+
"""A vendor bill flagged as TD29 generates a communication XML
101+
for omitted or irregular invoicing."""
102+
purchase_tax_22 = (
103+
self.env["account.tax"]
104+
.with_company(self.company)
105+
.create(
106+
{
107+
"name": "22% purchase",
108+
"amount": 22.0,
109+
"amount_type": "percent",
110+
"type_tax_use": "purchase",
111+
}
112+
)
113+
)
114+
bill = (
115+
self.env["account.move"]
116+
.with_company(self.company)
117+
.create(
118+
{
119+
"move_type": "in_invoice",
120+
"invoice_date": "2024-01-01",
121+
"date": "2024-01-01",
122+
"partner_id": self.italian_partner_a.id,
123+
"l10n_it_edi_is_td29": True,
124+
"invoice_line_ids": [
125+
Command.create(
126+
{
127+
"name": "test line",
128+
"price_unit": 100.0,
129+
"quantity": 1,
130+
"tax_ids": [Command.set(purchase_tax_22.ids)],
131+
}
132+
),
133+
],
134+
}
135+
)
136+
)
137+
bill.action_post()
138+
self.assertEqual(bill.l10n_it_edi_is_self_invoice, True)
139+
self._assert_export_invoice(bill, "td29_communication.xml")

l10n_it_edi_extension/views/l10n_it_view.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@
1818
/>
1919
</div>
2020
</xpath>
21+
<xpath
22+
expr="//page[@name='electronic_invoicing']//group/group[1]"
23+
position="inside"
24+
>
25+
<field
26+
name="l10n_it_edi_is_td29"
27+
invisible="move_type not in ('in_invoice', 'in_refund') or country_code != 'IT'"
28+
/>
29+
</xpath>
2130
<xpath
2231
expr="//field[@name='invoice_line_ids']/list/field[@name='analytic_distribution']"
2332
position="after"

0 commit comments

Comments
 (0)