Skip to content

Commit f15933b

Browse files
committed
[18.0][IMP] l10n_es_vat_book: map IGIC servicios (_s) en libro IVA
Añade mapeo de impuestos IGIC de servicios (sufijo _s) en el libro de IVA. Incluye datos de mapa CSV (tax lines, account lines) y tests unitarios.
1 parent 49f5319 commit f15933b

5 files changed

Lines changed: 210 additions & 0 deletions

File tree

l10n_es_vat_book/data/aeat.vat.book.map.line.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ aeat_vat_book_map_line_s_req,,"issued","Z","Y","Recargo Eq.","req","l10n_es_aeat
66
aeat_vat_book_map_line_p_req,,"received","AF","AE","Recargo Eq.","req","l10n_es_aeat.aeat_tax_agency_spain","p_req0,p_req05,p_req062,p_req014,p_req52"
77
aeat_vat_book_map_line_s_irpf,,"issued","AF","AE","Retención del IRPF","irpf","l10n_es_aeat.aeat_tax_agency_spain","s_irpf1,s_irpf2,s_irpf7,s_irpf9,s_irpf15,s_irpf18,s_irpf19,s_irpf19a,s_irpf195a,s_irpf20,s_irpf20a,s_irpf21,s_irpf21a"
88
aeat_vat_book_map_line_p_irpf,,"received","AL","AK","Retención del IRPF","irpf","l10n_es_aeat.aeat_tax_agency_spain","p_irpf1,p_irpf2,p_irpf7,p_irpf9,p_irpf15,p_irpf18,p_irpf19,p_irpf19a,p_irpf195a,p_irpf20,p_irpf20a,p_irpf21a,p_irpf21p"
9+
atc_vat_book_igic_map_line_s_igic,,"issued","AN","AM","IGIC Repercutido","","l10n_es_aeat.aeat_tax_agency_canarias","igic_r_0,igic_r_3,igic_r_7,igic_r_9_5,igic_r_15,igic_r_20,igic_s_ISP0,igic_ex_0,igic_re_ex,igic_cmino"
10+
atc_vat_book_igic_map_line_p_igic,"","received","AP","AO","IGIC Soportado","","l10n_es_aeat.aeat_tax_agency_canarias","igic_p_ex,igic_sop_0,igic_sop_3,igic_sop_7,igic_sop_9_5,igic_sop_15,igic_sop_20,igic_sop_0_s,igic_sop_3_s,igic_sop_5_s,igic_sop_7_s,igic_sop_9_5_s,igic_sop_15_s,igic_sop_20_s,igic_sop_0_inv,igic_sop_3_inv,igic_sop_7_inv,igic_sop_9_5_inv,igic_sop_15_inv,igic_sop_20_inv,igic_sop_i_0,igic_sop_i_3,igic_sop_i_7,igic_sop_i_9_5,igic_sop_i_15,igic_sop_i_20,igic_sop_i_0_inv,igic_sop_i_3_inv,igic_sop_i_7_inv,igic_sop_i_9_5_inv,igic_sop_i_15_inv,igic_sop_i_20_inv,igic_ISP0,igic_ISP3,igic_ISP7,igic_ISP95,igic_ISP15,igic_ISP20"
11+
atc_vat_book_igic_map_line_p_req,,"received","AR","AQ","Recargo Eq.","req","l10n_es_aeat.aeat_tax_agency_canarias","igic_p_re0,igic_p_re03,igic_p_re07,igic_p_re095,igic_p_re15,igic_p_re20"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
id,name
22
common_472,account_common_472
33
common_477,account_common_477
4+
common_canary_4727,account_common_canary_4727

l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,57 @@ p_irpf21a,account_tax_template_p_irpf21a
129129
p_irpf21p,account_tax_template_p_irpf21p
130130
s_irpf24,account_tax_template_s_irpf24
131131
p_irpf24,account_tax_template_p_irpf24
132+
igic_r_0,account_tax_template_igic_r_0
133+
igic_r_3,account_tax_template_igic_r_3
134+
igic_r_7,account_tax_template_igic_r_7
135+
igic_r_9_5,account_tax_template_igic_r_9_5
136+
igic_r_15,account_tax_template_igic_r_15
137+
igic_r_20,account_tax_template_igic_r_20
138+
igic_s_ISP0,account_tax_template_igic_s_ISP0
139+
igic_ex_0,account_tax_template_igic_ex_0
140+
igic_re_ex,account_tax_template_igic_re_ex
141+
igic_cmino,account_tax_template_igic_cmino
142+
igic_p_ex,account_tax_template_igic_p_ex
143+
igic_sop_0,account_tax_template_igic_sop_0
144+
igic_sop_3,account_tax_template_igic_sop_3
145+
igic_sop_7,account_tax_template_igic_sop_7
146+
igic_sop_9_5,account_tax_template_igic_sop_9_5
147+
igic_sop_15,account_tax_template_igic_sop_15
148+
igic_sop_20,account_tax_template_igic_sop_20
149+
igic_sop_0_s,account_tax_template_igic_sop_0_s
150+
igic_sop_3_s,account_tax_template_igic_sop_3_s
151+
igic_sop_5_s,account_tax_template_igic_sop_5_s
152+
igic_sop_7_s,account_tax_template_igic_sop_7_s
153+
igic_sop_9_5_s,account_tax_template_igic_sop_9_5_s
154+
igic_sop_15_s,account_tax_template_igic_sop_15_s
155+
igic_sop_20_s,account_tax_template_igic_sop_20_s
156+
igic_sop_0_inv,account_tax_template_igic_sop_0_inv
157+
igic_sop_3_inv,account_tax_template_igic_sop_3_inv
158+
igic_sop_7_inv,account_tax_template_igic_sop_7_inv
159+
igic_sop_9_5_inv,account_tax_template_igic_sop_9_5_inv
160+
igic_sop_15_inv,account_tax_template_igic_sop_15_inv
161+
igic_sop_20_inv,account_tax_template_igic_sop_20_inv
162+
igic_sop_i_0,account_tax_template_igic_sop_i_0
163+
igic_sop_i_3,account_tax_template_igic_sop_i_3
164+
igic_sop_i_7,account_tax_template_igic_sop_i_7
165+
igic_sop_i_9_5,account_tax_template_igic_sop_i_9_5
166+
igic_sop_i_15,account_tax_template_igic_sop_i_15
167+
igic_sop_i_20,account_tax_template_igic_sop_i_20
168+
igic_sop_i_0_inv,account_tax_template_igic_sop_i_0_inv
169+
igic_sop_i_3_inv,account_tax_template_igic_sop_i_3_inv
170+
igic_sop_i_7_inv,account_tax_template_igic_sop_i_7_inv
171+
igic_sop_i_9_5_inv,account_tax_template_igic_sop_i_9_5_inv
172+
igic_sop_i_15_inv,account_tax_template_igic_sop_i_15_inv
173+
igic_sop_i_20_inv,account_tax_template_igic_sop_i_20_inv
174+
igic_ISP0,account_tax_template_igic_ISP0
175+
igic_ISP3,account_tax_template_igic_ISP3
176+
igic_ISP7,account_tax_template_igic_ISP7
177+
igic_ISP95,account_tax_template_igic_ISP95
178+
igic_ISP15,account_tax_template_igic_ISP15
179+
igic_ISP20,account_tax_template_igic_ISP20
180+
igic_p_re0,account_tax_template_igic_p_re0
181+
igic_p_re03,account_tax_template_igic_p_re03
182+
igic_p_re07,account_tax_template_igic_p_re07
183+
igic_p_re095,account_tax_template_igic_p_re095
184+
igic_p_re15,account_tax_template_igic_p_re15
185+
igic_p_re20,account_tax_template_igic_p_re20

l10n_es_vat_book/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import test_l10n_es_aeat_vat_book
2+
from . import test_l10n_es_aeat_vat_book_igic
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
# Copyright 2024 Binhex - Nicolás Ramos (http://binhex.es)
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
import logging
5+
6+
from odoo import fields
7+
from odoo.tests import tagged
8+
9+
from odoo.addons.l10n_es_aeat.tests.test_l10n_es_aeat_mod_base import (
10+
TestL10nEsAeatModBase,
11+
)
12+
13+
_logger = logging.getLogger("aeat.vat.book.igic")
14+
15+
16+
@tagged("post_install", "-at_install")
17+
class TestL10nEsVatBookIgic(TestL10nEsAeatModBase):
18+
debug = False
19+
taxes_sale = {
20+
# tax code: (base, tax_amount)
21+
"IGIC_R_7": (1500, 105),
22+
}
23+
taxes_purchase = {
24+
# tax code: (base, tax_amount)
25+
"IGIC_SOP_7": (230, 16.1),
26+
"IGIC_SOP_7_S": (1000, 70.0),
27+
"IGIC_SOP_I_7": (200, 14),
28+
"IGIC_SOP_0": (100, 0),
29+
}
30+
31+
@classmethod
32+
def _chart_of_accounts_create(cls):
33+
"""Load Canary chart so IGIC taxes exist for the company."""
34+
_logger.debug("Creating chart of account (Canary)")
35+
cls.company = cls.env["res.company"].create(
36+
{
37+
"name": "Canarias test company",
38+
"currency_id": cls.env.ref("base.EUR").id,
39+
}
40+
)
41+
cls.env.ref("base.group_multi_company").write({"users": [(4, cls.env.uid)]})
42+
cls.env.user.write(
43+
{"company_ids": [(4, cls.company.id)], "company_id": cls.company.id}
44+
)
45+
chart = cls.env["account.chart.template"]
46+
chart.try_loading(
47+
template_code="es_canary_pymes", company=cls.company, install_demo=False
48+
)
49+
cls.with_context(company_id=cls.company.id)
50+
return True
51+
52+
def test_model_vat_book(self):
53+
# Purchase invoices
54+
self._invoice_purchase_create("2024-01-01")
55+
# Sale invoices
56+
sale = self._invoice_sale_create("2024-01-13")
57+
self._invoice_refund(sale, "2024-01-14")
58+
# Create model
59+
self.company.vat = "ES12345678Z"
60+
vat_book = self.env["l10n.es.vat.book"].create(
61+
{
62+
"name": "Test VAT Book IGIC",
63+
"company_id": self.company.id,
64+
"company_vat": "1234567890",
65+
"contact_name": "Test owner",
66+
"statement_type": "N",
67+
"support_type": "T",
68+
"contact_phone": "911234455",
69+
"year": 2024,
70+
"period_type": "1T",
71+
"date_start": "2024-01-01",
72+
"date_end": "2024-03-31",
73+
}
74+
)
75+
_logger.debug("Calculate VAT Book 1T 2024")
76+
77+
vat_book.button_calculate()
78+
# Check issued invoices
79+
for line in vat_book.issued_line_ids:
80+
self.assertEqual(fields.Date.to_string(line.invoice_date), "2024-01-13")
81+
self.assertEqual(line.partner_id, self.customer)
82+
for tax_line in line.tax_line_ids:
83+
self.assertEqual(tax_line.base_amount, 1500)
84+
self.assertEqual(tax_line.tax_amount, 105)
85+
# Check issued refund invoices
86+
for line in vat_book.rectification_issued_line_ids:
87+
self.assertEqual(fields.Date.to_string(line.invoice_date), "2024-01-14")
88+
self.assertEqual(line.partner_id, self.customer)
89+
for tax_line in line.tax_line_ids:
90+
self.assertEqual(tax_line.base_amount, -1500)
91+
self.assertEqual(tax_line.tax_amount, -105)
92+
# Check tax summary for issued invoices
93+
for line in vat_book.issued_tax_summary_ids:
94+
self.assertEqual(line.base_amount, 0.0)
95+
self.assertEqual(line.tax_amount, 0.0)
96+
# Check tax summary for received invoices
97+
self.assertEqual(len(vat_book.received_tax_summary_ids), 4)
98+
99+
rec_summaries = sorted(
100+
vat_book.received_tax_summary_ids,
101+
key=lambda line: line.tax_amount,
102+
reverse=True,
103+
)
104+
# IGIC_SOP_7_S - 7% IGIC servicios
105+
line = rec_summaries[0]
106+
self.assertAlmostEqual(line.base_amount, 1000)
107+
self.assertAlmostEqual(line.tax_amount, 70.0)
108+
109+
# IGIC_SOP_7 - 7% IGIC bienes
110+
line = rec_summaries[1]
111+
self.assertAlmostEqual(line.base_amount, 230)
112+
self.assertAlmostEqual(line.tax_amount, 16.1)
113+
114+
# IGIC_SOP_I_7 - 7% IGIC inversión sujeto pasivo
115+
line = rec_summaries[2]
116+
self.assertAlmostEqual(line.base_amount, 200)
117+
self.assertAlmostEqual(line.tax_amount, 14)
118+
119+
# IGIC_SOP_0 - 0% IGIC
120+
line = rec_summaries[3]
121+
self.assertAlmostEqual(line.base_amount, 100)
122+
self.assertAlmostEqual(line.tax_amount, 0)
123+
124+
# Print to PDF
125+
report_pdf = self.env["ir.actions.report"]._render(
126+
"l10n_es_vat_book.act_report_vat_book_invoices_issued_pdf", vat_book.ids
127+
)
128+
self.assertGreaterEqual(len(report_pdf[0]), 1)
129+
report_pdf = self.env["ir.actions.report"]._render(
130+
"l10n_es_vat_book.act_report_vat_book_invoices_received_pdf", vat_book.ids
131+
)
132+
self.assertGreaterEqual(len(report_pdf[0]), 1)
133+
# Export to XLSX
134+
report_xlsx = self.env["ir.actions.report"]._render(
135+
"l10n_es_vat_book.l10n_es_vat_book_xlsx", vat_book.ids
136+
)
137+
self.assertGreaterEqual(len(report_xlsx[0]), 1)
138+
self.assertEqual(report_xlsx[1], "xlsx")
139+
# Check empty Vat Book
140+
vat_book.write(
141+
{
142+
"tax_agency_ids": [
143+
(6, 0, [self.env.ref("l10n_es_aeat.aeat_tax_agency_araba").id])
144+
],
145+
}
146+
)
147+
148+
vat_book.button_calculate()
149+
self.assertEqual(len(vat_book.issued_line_ids), 0)
150+
self.assertEqual(len(vat_book.rectification_issued_line_ids), 0)
151+
self.assertEqual(len(vat_book.issued_tax_summary_ids), 0)

0 commit comments

Comments
 (0)