Skip to content

Commit 90274ba

Browse files
committed
[ADD] l10n_es_edi_verifactu{,_pos}: Veri*Factu support
Spain introduces a new EDI called "Veri*Factu" to send invoicing records to the Spanish tax agency (AEAT). It is mandatory for most tax payers (that cannot use any of the other Spanish EDIs like SII or TicketBAI). This commit adds 2 modules to enable Veri*Factu compliance - `l10n_es_edi_verifactu` for invoicing / accounting - `l10n_es_edi_verifactu_pos` for Point of Sale (PoS) Their setup and usage is briefly described in the documentation (see the related documentation PR). The main features of the new modules are as follows. - `l10n_es_edi_verifactu` - The "Send & Print" wizard can be used to generate and send Veri*Factu documents. - A QR code is added to the PDF of invoices send with the Veri*Factu option. It can be used to check whether the invoice is known to the AEAT. - A "Veri*Factu" tab is added to the account move form view. It i.e. gives an overview about the send documents and their status. - `l10n_es_edi_verifactu_pos` - A Veri*Factu documents is generated and sent when validating each order. - A QR code is added to the PDF of PoS order receipts. It can be used to check whether the order is known to the AEAT. - A "Veri*Factu" tab is added to the pos order form view. It i.e. gives an overview about the send documents and their status. I.e. note the following about Veri*Factu documents - Each document has a fingerprint (hash of some important values) called `Huella`. - All documents belonging to one company are linked together in a single chain in generation order. (Each document refers to the previous document including the `Huella` of the previous document) - There is a waiting time between submissions of documents (usually 60s). We sent the document immediately if possible. But due to the waiting time this is not always possible. - We still generate / store the needed values when the invoice is sent (mandated by Veri*Factu spec). - Documents can be sent in batches. - Due to the waiting time we sent all "waiting" documents at once. - In case of 1000 documents the waiting time can be / is ignored - A "Veri*Factu Document" in Odoo only represents a single invoice / PoS order. - The needed document values mandated by Veri*Factu are stored in JSON format on each invoice / order. - The actual "communication" with AEAT is done via SOAP. (So we sent / receive XML files) - We do not store the actual batch XML we sent to the AEAT or the received responses. - For the responses we extract the necessary information and store them on each of the document It can happen that the document reached the AEAT but the response timed out for some reason (Read-Timeout). - The AEAT has (potentially) registered the document but we have not received the response they sent. - The document will be marked with an error starting with `[Read-Timeout] `. and automatically be sent again as soon as possible - When the document is resend successfully we receive a response that the document was rejected with error `[3000] Registro de facturación duplicado.` (Assuming the AEAT registered / not rejected the document when it was sent originally.) But the response also contains some information about the state and potential errors of the record / duplicate. - Since the duplicate is the document we previously sent we just take the state from there. There are 2 ways to create a correcting Veri*Factu document for invoices - Correction by difference: Done via "Reverse" in credit note wizard We just send a document representing the credit note as "correction by difference". The document references the corrected invoice. - Correction by substitution: Done via "Reverse and Create Invoice" in credit note wizard We first send a document representing the reversing credit note (it does not reference the original invoice and is send as an "invoice type"). And then we send the new invoice created by the wizard. It is send as a "correction by substitution" and references the original invoice. To link the new invoice to the original invoice a new field was added - We do not support correcting multiple documents with a single new documents (neither correction by difference nor correction by substitution) The "Veri*Factu" tab on the invoice form view also gives information about which invoice was refunded or substituted. Limitations - In Veri*Factu there is some dedicated way to handle the substitution of simplified invoices with "real" invoices. This is not implemented currently. - In Veri*Factu multiple tax types (`Impuesto`) and regimen keys (`ClaveRegimen`) can be indicated (one per `DetalleDesglose` element). We currently only allow a single tax type and regimen key for the whole document. - In Veri*Factu it is possible to send a "Subsanación" in case a change is made that does not require updating the invoice PDF. This is currently not supported. - I.e. we do not support sending new submission documents for already registered (possibly with errors) records. - It is not possible to reset registered (possibly with errors) records back to draft. - In Veri*Factu it is possible to send a cancellation for records that are otherwise known to the AEAT (not Veri*Factu). We do not support sending cancellations for records that are not Veri*Factu registered within Odoo. - For simplified invoices there are the special keys / fields `FacturaSimplificadaArt7273` and `FacturaSinIdentifDestinatarioArt61d`. Currently we never set them (so they are assumed to be `N` by the AEAT). task-3745982 closes odoo#197635 Signed-off-by: Sven Führ (svfu) <[email protected]> X-original-commit: 0834a4e
1 parent fe7e05e commit 90274ba

File tree

78 files changed

+8213
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+8213
-1
lines changed

addons/l10n_es/models/account_tax.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
# Part of Odoo. See LICENSE file for full copyright and licensing details.
3-
from odoo import fields, models
3+
from odoo import api, fields, models
44

55

66
class AccountTax(models.Model):
@@ -53,3 +53,11 @@ def _l10n_es_get_regime_code(self):
5353
return '02'
5454

5555
return '01'
56+
57+
@api.model
58+
def _l10n_es_get_sujeto_tax_types(self):
59+
return ['sujeto', 'sujeto_isp', 'sujeto_agricultura']
60+
61+
@api.model
62+
def _l10n_es_get_main_tax_types(self):
63+
return {'exento', 'sujeto', 'sujeto_agricultura', 'sujeto_isp', 'no_sujeto', 'no_sujeto_loc', 'no_deducible'}

addons/l10n_es/models/res_partner.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def _l10n_es_is_foreign(self):
1010
return self.country_id.code not in ('ES', False) or (self.vat or '').startswith("ESN")
1111

1212
def _l10n_es_edi_get_partner_info(self):
13+
""" Used in SII and Veri*factu"""
1314
self.ensure_one()
1415
eu_country_codes = set(self.env.ref('base.europe').country_ids.mapped('code'))
1516

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
2+
3+
from . import models
4+
from . import wizard
5+
6+
7+
def _l10n_es_edi_verifactu_post_init_hook(env):
8+
for company in env['res.company'].search([('chart_template', 'like', r'es\_%'), ('parent_id', '=', False)]):
9+
Template = env['account.chart.template'].with_company(company)
10+
if company.chart_template.startswith("es_canary"):
11+
tax_data = Template._get_es_verifactu_account_tax_es_canary_common()
12+
else:
13+
tax_data = Template._get_es_verifactu_account_tax_es_common_mainland()
14+
Template._load_data({
15+
'account.tax': tax_data,
16+
})
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
2+
3+
{
4+
'name': 'Spain - Veri*Factu',
5+
'version': '1.0',
6+
'category': 'Accounting/Localizations/EDI',
7+
'summary': "Module for sending Spanish Veri*Factu XML to the AEAT",
8+
'website': "https://www.odoo.com/documentation/18.0/applications/finance/fiscal_localizations/spain.html#veri-factu",
9+
'depends': ['l10n_es'],
10+
'data': [
11+
'security/ir.model.access.csv',
12+
'wizard/account_move_reversal_views.xml',
13+
'views/account_move_views.xml',
14+
'views/account_tax_views.xml',
15+
'views/certificate_certificate_views.xml',
16+
'views/l10n_es_edi_verifactu_document_views.xml',
17+
'views/report_invoice.xml',
18+
'views/res_company_views.xml',
19+
'views/res_config_settings_views.xml',
20+
'data/ir_cron.xml',
21+
],
22+
'demo': [
23+
'demo/demo_certificate.xml',
24+
'demo/demo_company.xml',
25+
],
26+
'post_init_hook': '_l10n_es_edi_verifactu_post_init_hook',
27+
'assets': {
28+
'web.assets_backend': [
29+
'l10n_es_edi_verifactu/static/src/css/warning.scss',
30+
],
31+
},
32+
'installable': True,
33+
'author': 'Odoo S.A.',
34+
'license': 'LGPL-3',
35+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<odoo noupdate="1">
2+
<record id="cron_verifactu_batch" model="ir.cron">
3+
<field name="name">Veri*Factu: Submit / Cancel Records</field>
4+
<field name="model_id" ref="model_l10n_es_edi_verifactu_document"/>
5+
<field name="state">code</field>
6+
<field name="code">model.trigger_next_batch()</field>
7+
<field name="interval_type">days</field>
8+
<field name="interval_number">1</field>
9+
<field name="active">True</field>
10+
</record>
11+
</odoo>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
UPDATE res_company
2+
SET l10n_es_edi_verifactu_test_environment = TRUE
3+
;
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
"id","l10n_es_applicability"
2+
"account_tax_template_igic_r_7","03"
3+
"account_tax_template_igic_r_0","03"
4+
"account_tax_template_igic_r_3","03"
5+
"account_tax_template_igic_r_5","03"
6+
"account_tax_template_igic_r_9_5","03"
7+
"account_tax_template_igic_r_15","03"
8+
"account_tax_template_igic_r_20","03"
9+
"account_tax_template_igic_s_ISP0","03"
10+
"account_tax_template_igic_ex_0","03"
11+
"account_tax_template_igic_re_ex","03"
12+
"account_tax_template_igic_cmino","03"
13+
"account_tax_template_igic_sop_cmino","03"
14+
"account_tax_template_igic_sop_3_cmino","03"
15+
"account_tax_template_igic_sop_7_cmino","03"
16+
"account_tax_template_igic_sop_9_5_cmino","03"
17+
"account_tax_template_igic_sop_15_cmino","03"
18+
"account_tax_template_igic_sop_20_cmino","03"
19+
"account_tax_template_s_igic_ns","03"
20+
"account_tax_template_igic_p_ex","03"
21+
"account_tax_template_igic_sop_0","03"
22+
"account_tax_template_igic_sop_3","03"
23+
"account_tax_template_igic_sop_5","03"
24+
"account_tax_template_igic_sop_7","03"
25+
"account_tax_template_igic_sop_9_5","03"
26+
"account_tax_template_igic_sop_15","03"
27+
"account_tax_template_igic_sop_20","03"
28+
"account_tax_template_igic_sop_0_inv","03"
29+
"account_tax_template_igic_sop_3_inv","03"
30+
"account_tax_template_igic_sop_5_inv","03"
31+
"account_tax_template_igic_sop_7_inv","03"
32+
"account_tax_template_igic_sop_9_5_inv","03"
33+
"account_tax_template_igic_sop_15_inv","03"
34+
"account_tax_template_igic_sop_20_inv","03"
35+
"account_tax_template_igic_sop_i_0","03"
36+
"account_tax_template_igic_sop_i_3","03"
37+
"account_tax_template_igic_sop_i_7","03"
38+
"account_tax_template_igic_sop_i_9_5","03"
39+
"account_tax_template_igic_sop_i_15","03"
40+
"account_tax_template_igic_sop_i_20","03"
41+
"account_tax_template_igic_sop_i_0_inv","03"
42+
"account_tax_template_igic_sop_i_3_inv","03"
43+
"account_tax_template_igic_sop_i_7_inv","03"
44+
"account_tax_template_igic_sop_i_9_5_inv","03"
45+
"account_tax_template_igic_sop_i_15_inv","03"
46+
"account_tax_template_igic_sop_i_20_inv","03"
47+
"account_tax_template_igic_ISP0","03"
48+
"account_tax_template_igic_ISP3","03"
49+
"account_tax_template_igic_ISP7","03"
50+
"account_tax_template_igic_ISP95","03"
51+
"account_tax_template_igic_ISP15","03"
52+
"account_tax_template_igic_ISP20","03"
53+
"account_tax_template_igic_p_re0","03"
54+
"account_tax_template_igic_p_re03","03"
55+
"account_tax_template_igic_p_re07","03"
56+
"account_tax_template_igic_p_re095","03"
57+
"account_tax_template_igic_p_re15","03"
58+
"account_tax_template_igic_p_re20","03"
59+
"account_tax_template_p_igic_ns","03"
60+
"account_tax_template_s_irpf19a",""
61+
"account_tax_template_p_irpf19a",""
62+
"account_tax_template_s_irpf195a",""
63+
"account_tax_template_p_irpf195a",""
64+
"account_tax_template_s_irpf20a",""
65+
"account_tax_template_p_irpf20a",""
66+
"account_tax_template_s_irpf21a",""
67+
"account_tax_template_p_irpf21a",""
68+
"account_tax_template_s_irpf21",""
69+
"account_tax_template_p_irpf21p",""
70+
"account_tax_template_p_irpf21t",""
71+
"account_tax_template_p_irpf21td",""
72+
"account_tax_template_p_irpf21te",""
73+
"account_tax_template_s_irpf20",""
74+
"account_tax_template_p_irpf20",""
75+
"account_tax_template_s_irpf24",""
76+
"account_tax_template_p_irpf24",""
77+
"account_tax_template_s_irpf24_rdc",""
78+
"account_tax_template_p_irpf24_rdc",""
79+
"account_tax_template_p_irpf35cya",""
80+
"account_tax_template_s_irpf15",""
81+
"account_tax_template_p_irpf15",""
82+
"account_tax_template_p_irpf15e",""
83+
"account_tax_template_s_irpf18",""
84+
"account_tax_template_p_irpf18",""
85+
"account_tax_template_s_irpf19",""
86+
"account_tax_template_p_irpf19",""
87+
"account_tax_template_p_irpf19ca",""
88+
"account_tax_template_p_irpf19cs",""
89+
"account_tax_template_s_irpf9",""
90+
"account_tax_template_p_irpf9",""
91+
"account_tax_template_s_irpf7",""
92+
"account_tax_template_p_irpf7",""
93+
"account_tax_template_p_irpf7e",""
94+
"account_tax_template_s_irpf2",""
95+
"account_tax_template_p_irpf2",""
96+
"account_tax_template_s_irpf1",""
97+
"account_tax_template_p_irpf1",""
98+
"account_tax_template_s_irpfnrue0",""
99+
"account_tax_template_p_irpfnrue0p",""
100+
"account_tax_template_s_irpfnrue19",""
101+
"account_tax_template_p_irpfnrue19p",""
102+
"account_tax_template_p_irpfnrnue0p",""
103+
"account_tax_template_s_irpfnrnue0",""
104+
"account_tax_template_s_irpfnrnue24",""
105+
"account_tax_template_p_irpfnrnue24p",""
106+
"account_tax_template_p_rp19",""
107+
"account_tax_template_p_rrD19",""
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
"id","l10n_es_applicability"
2+
"account_tax_template_oss_s_iva_ns","01"
3+
"account_tax_template_oss_s_iva_ns_b","01"
4+
"account_tax_template_p_dua_exempt","01"
5+
"account_tax_template_s_iva21b","01"
6+
"account_tax_template_p_iva2_bc","01"
7+
"account_tax_template_p_iva2_ibc","01"
8+
"account_tax_template_p_iva2_ic_bc","01"
9+
"account_tax_template_p_iva2_ic_sc","01"
10+
"account_tax_template_p_iva2_isc","01"
11+
"account_tax_template_p_iva2_nd","01"
12+
"account_tax_template_p_iva2_sc","01"
13+
"account_tax_template_p_iva4_bc","01"
14+
"account_tax_template_p_iva4_ibc","01"
15+
"account_tax_template_p_iva4_ibc_group","01"
16+
"account_tax_template_p_iva4_sc","01"
17+
"account_tax_template_p_iva4_sp_ex","01"
18+
"account_tax_template_p_iva4_bi","01"
19+
"account_tax_template_p_iva4_ibi","01"
20+
"account_tax_template_p_iva4_nd","01"
21+
"account_tax_template_p_iva5_bc","01"
22+
"account_tax_template_p_iva5_bi","01"
23+
"account_tax_template_p_iva5_ibc","01"
24+
"account_tax_template_p_iva5_ibi","01"
25+
"account_tax_template_p_iva5_ic_bc","01"
26+
"account_tax_template_p_iva5_ic_bi","01"
27+
"account_tax_template_p_iva5_ic_sc","01"
28+
"account_tax_template_p_iva5_isc","01"
29+
"account_tax_template_p_iva5_nd","01"
30+
"account_tax_template_p_iva5_sc","01"
31+
"account_tax_template_p_iva7-5_bc","01"
32+
"account_tax_template_p_iva7-5_ibc","01"
33+
"account_tax_template_p_iva7-5_ic_bc","01"
34+
"account_tax_template_p_iva7-5_ic_sc","01"
35+
"account_tax_template_p_iva7-5_isc","01"
36+
"account_tax_template_p_iva7-5_nd","01"
37+
"account_tax_template_p_iva7-5_sc","01"
38+
"account_tax_template_p_iva10_bc","01"
39+
"account_tax_template_p_iva10_ibc","01"
40+
"account_tax_template_p_iva10_ibc_group","01"
41+
"account_tax_template_p_iva10_sc","01"
42+
"account_tax_template_p_iva10_sp_ex","01"
43+
"account_tax_template_p_iva10_bi","01"
44+
"account_tax_template_p_iva10_ibi","01"
45+
"account_tax_template_p_iva10_nd","01"
46+
"account_tax_template_p_iva21_bc","01"
47+
"account_tax_template_p_iva21_ibc","01"
48+
"account_tax_template_p_iva21_ibc_group","01"
49+
"account_tax_template_p_iva21_sc","01"
50+
"account_tax_template_p_iva21_sp_ex","01"
51+
"account_tax_template_p_iva21_bi","01"
52+
"account_tax_template_p_iva21_ibi","01"
53+
"account_tax_template_s_iva4b","01"
54+
"account_tax_template_s_iva0_e","01"
55+
"account_tax_template_s_iva4s","01"
56+
"account_tax_template_s_iva_e","01"
57+
"account_tax_template_s_iva10b","01"
58+
"account_tax_template_s_iva10s","01"
59+
"account_tax_template_s_iva21s","01"
60+
"account_tax_template_p_iva4_ic_bc","01"
61+
"account_tax_template_p_iva4_sp_in","01"
62+
"account_tax_template_p_iva4_ic_bi","01"
63+
"account_tax_template_p_iva10_ic_bc","01"
64+
"account_tax_template_p_iva10_sp_in","01"
65+
"account_tax_template_p_iva10_ic_bi","01"
66+
"account_tax_template_p_iva21_ic_bc","01"
67+
"account_tax_template_p_iva21_sp_in","01"
68+
"account_tax_template_p_iva21_ic_bi","01"
69+
"account_tax_template_s_iva0_ic","01"
70+
"account_tax_template_s_iva0_sp_i","01"
71+
"account_tax_template_p_iva0_ns_b","01"
72+
"account_tax_template_p_iva0_ns","01"
73+
"account_tax_template_p_iva0_ibc","01"
74+
"account_tax_template_p_iva0_ic_bc","01"
75+
"account_tax_template_p_iva0_ic_sc","01"
76+
"account_tax_template_p_iva0_isc","01"
77+
"account_tax_template_p_iva0_nd","01"
78+
"account_tax_template_p_iva0_s_bc","01"
79+
"account_tax_template_p_iva0_s_sc","01"
80+
"account_tax_template_p_iva_isub","01"
81+
"account_tax_template_s_iva_ns_b","01"
82+
"account_tax_template_s_iva_ns","01"
83+
"account_tax_template_s_req0",""
84+
"account_tax_template_s_req026",""
85+
"account_tax_template_s_req05",""
86+
"account_tax_template_s_req062",""
87+
"account_tax_template_s_req014",""
88+
"account_tax_template_s_req1",""
89+
"account_tax_template_s_req52",""
90+
"account_tax_template_p_req0",""
91+
"account_tax_template_p_req026",""
92+
"account_tax_template_p_req062",""
93+
"account_tax_template_p_req1",""
94+
"account_tax_template_p_req05",""
95+
"account_tax_template_p_req014",""
96+
"account_tax_template_p_req52",""
97+
"account_tax_template_s_iva0_isp","01"
98+
"account_tax_template_s_iva0","01"
99+
"account_tax_template_s_iva0_art22","01"
100+
"account_tax_template_s_iva0_art23","01"
101+
"account_tax_template_s_iva0b","01"
102+
"account_tax_template_p_iva0_bc","01"
103+
"account_tax_template_s_iva0_ns","01"
104+
"account_tax_template_s_iva0_nsd","01"
105+
"account_tax_template_s_iva0s","01"
106+
"account_tax_template_s_iva2b","01"
107+
"account_tax_template_s_iva2s","01"
108+
"account_tax_template_s_iva5b","01"
109+
"account_tax_template_s_iva5s","01"
110+
"account_tax_template_s_iva7-5b","01"
111+
"account_tax_template_s_iva7-5s","01"
112+
"account_tax_template_p_iva4_isp","01"
113+
"account_tax_template_p_iva4_isp_bi","01"
114+
"account_tax_template_p_iva10_isp","01"
115+
"account_tax_template_p_iva10_isp_bi","01"
116+
"account_tax_template_p_iva21_isp","01"
117+
"account_tax_template_p_iva21_isp_bi","01"
118+
"account_tax_template_p_iva12_agr","01"
119+
"account_tax_template_p_iva105_gan","01"
120+
"account_tax_template_s_iva0_g_i","01"
121+
"account_tax_template_s_iva0_g_e","01"
122+
"account_tax_template_s_irpf19a",""
123+
"account_tax_template_p_irpf19a",""
124+
"account_tax_template_s_irpf195a",""
125+
"account_tax_template_p_irpf195a",""
126+
"account_tax_template_s_irpf20a",""
127+
"account_tax_template_p_irpf20a",""
128+
"account_tax_template_s_irpf21a",""
129+
"account_tax_template_p_irpf21a",""
130+
"account_tax_template_s_irpf21",""
131+
"account_tax_template_p_irpf21p",""
132+
"account_tax_template_p_irpf21t",""
133+
"account_tax_template_p_irpf21td",""
134+
"account_tax_template_p_irpf21te",""
135+
"account_tax_template_s_irpf20",""
136+
"account_tax_template_p_irpf20",""
137+
"account_tax_template_s_irpf24",""
138+
"account_tax_template_p_irpf24",""
139+
"account_tax_template_s_irpf24_rdc",""
140+
"account_tax_template_p_irpf24_rdc",""
141+
"account_tax_template_p_irpf35cya",""
142+
"account_tax_template_s_irpf15",""
143+
"account_tax_template_p_irpf15",""
144+
"account_tax_template_p_irpf15e",""
145+
"account_tax_template_s_irpf18",""
146+
"account_tax_template_p_irpf18",""
147+
"account_tax_template_s_irpf19",""
148+
"account_tax_template_p_irpf19",""
149+
"account_tax_template_p_irpf19ca",""
150+
"account_tax_template_p_irpf19cs",""
151+
"account_tax_template_s_irpf9",""
152+
"account_tax_template_p_irpf9",""
153+
"account_tax_template_s_irpf7",""
154+
"account_tax_template_p_irpf7",""
155+
"account_tax_template_p_irpf7e",""
156+
"account_tax_template_s_irpf2",""
157+
"account_tax_template_p_irpf2",""
158+
"account_tax_template_s_irpf1",""
159+
"account_tax_template_p_irpf1",""
160+
"account_tax_template_s_irpfnrue0",""
161+
"account_tax_template_p_irpfnrue0p",""
162+
"account_tax_template_s_irpfnrue19",""
163+
"account_tax_template_p_irpfnrue19p",""
164+
"account_tax_template_p_irpfnrnue0p",""
165+
"account_tax_template_s_irpfnrnue0",""
166+
"account_tax_template_s_irpfnrnue24",""
167+
"account_tax_template_p_irpfnrnue24p",""
168+
"account_tax_template_p_rp19",""
169+
"account_tax_template_p_rrD19",""
170+
"account_tax_template_s_gd0",""

0 commit comments

Comments
 (0)