From 1c4d1365ff05731ddf7e724166614e901062e3ad Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 15 Jul 2026 10:16:58 +0100 Subject: [PATCH 1/3] [18.0][IMP] l10n_es_vat_book: map IGIC servicios (_s) en libro IVA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../data/aeat.vat.book.map.line.csv | 3 + .../l10n.es.aeat.map.tax.line.account.csv | 1 + .../data/l10n.es.aeat.map.tax.line.tax.csv | 54 +++++++ l10n_es_vat_book/tests/__init__.py | 1 + .../tests/test_l10n_es_aeat_vat_book_igic.py | 151 ++++++++++++++++++ 5 files changed, 210 insertions(+) create mode 100644 l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py diff --git a/l10n_es_vat_book/data/aeat.vat.book.map.line.csv b/l10n_es_vat_book/data/aeat.vat.book.map.line.csv index e92f3756496..6723df51038 100644 --- a/l10n_es_vat_book/data/aeat.vat.book.map.line.csv +++ b/l10n_es_vat_book/data/aeat.vat.book.map.line.csv @@ -6,3 +6,6 @@ aeat_vat_book_map_line_s_req,,"issued","Z","Y","Recargo Eq.","req","l10n_es_aeat 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" 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" 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" +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" +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" +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" diff --git a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.account.csv b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.account.csv index a7c72049bc2..cf3a3fb3b4d 100644 --- a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.account.csv +++ b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.account.csv @@ -1,3 +1,4 @@ id,name common_472,account_common_472 common_477,account_common_477 +common_canary_4727,account_common_canary_4727 diff --git a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv index ee2e9c75edf..23af9e9b38c 100644 --- a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv +++ b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv @@ -129,3 +129,57 @@ p_irpf21a,account_tax_template_p_irpf21a p_irpf21p,account_tax_template_p_irpf21p s_irpf24,account_tax_template_s_irpf24 p_irpf24,account_tax_template_p_irpf24 +igic_r_0,account_tax_template_igic_r_0 +igic_r_3,account_tax_template_igic_r_3 +igic_r_7,account_tax_template_igic_r_7 +igic_r_9_5,account_tax_template_igic_r_9_5 +igic_r_15,account_tax_template_igic_r_15 +igic_r_20,account_tax_template_igic_r_20 +igic_s_ISP0,account_tax_template_igic_s_ISP0 +igic_ex_0,account_tax_template_igic_ex_0 +igic_re_ex,account_tax_template_igic_re_ex +igic_cmino,account_tax_template_igic_cmino +igic_p_ex,account_tax_template_igic_p_ex +igic_sop_0,account_tax_template_igic_sop_0 +igic_sop_3,account_tax_template_igic_sop_3 +igic_sop_7,account_tax_template_igic_sop_7 +igic_sop_9_5,account_tax_template_igic_sop_9_5 +igic_sop_15,account_tax_template_igic_sop_15 +igic_sop_20,account_tax_template_igic_sop_20 +igic_sop_0_s,account_tax_template_igic_sop_0_s +igic_sop_3_s,account_tax_template_igic_sop_3_s +igic_sop_5_s,account_tax_template_igic_sop_5_s +igic_sop_7_s,account_tax_template_igic_sop_7_s +igic_sop_9_5_s,account_tax_template_igic_sop_9_5_s +igic_sop_15_s,account_tax_template_igic_sop_15_s +igic_sop_20_s,account_tax_template_igic_sop_20_s +igic_sop_0_inv,account_tax_template_igic_sop_0_inv +igic_sop_3_inv,account_tax_template_igic_sop_3_inv +igic_sop_7_inv,account_tax_template_igic_sop_7_inv +igic_sop_9_5_inv,account_tax_template_igic_sop_9_5_inv +igic_sop_15_inv,account_tax_template_igic_sop_15_inv +igic_sop_20_inv,account_tax_template_igic_sop_20_inv +igic_sop_i_0,account_tax_template_igic_sop_i_0 +igic_sop_i_3,account_tax_template_igic_sop_i_3 +igic_sop_i_7,account_tax_template_igic_sop_i_7 +igic_sop_i_9_5,account_tax_template_igic_sop_i_9_5 +igic_sop_i_15,account_tax_template_igic_sop_i_15 +igic_sop_i_20,account_tax_template_igic_sop_i_20 +igic_sop_i_0_inv,account_tax_template_igic_sop_i_0_inv +igic_sop_i_3_inv,account_tax_template_igic_sop_i_3_inv +igic_sop_i_7_inv,account_tax_template_igic_sop_i_7_inv +igic_sop_i_9_5_inv,account_tax_template_igic_sop_i_9_5_inv +igic_sop_i_15_inv,account_tax_template_igic_sop_i_15_inv +igic_sop_i_20_inv,account_tax_template_igic_sop_i_20_inv +igic_ISP0,account_tax_template_igic_ISP0 +igic_ISP3,account_tax_template_igic_ISP3 +igic_ISP7,account_tax_template_igic_ISP7 +igic_ISP95,account_tax_template_igic_ISP95 +igic_ISP15,account_tax_template_igic_ISP15 +igic_ISP20,account_tax_template_igic_ISP20 +igic_p_re0,account_tax_template_igic_p_re0 +igic_p_re03,account_tax_template_igic_p_re03 +igic_p_re07,account_tax_template_igic_p_re07 +igic_p_re095,account_tax_template_igic_p_re095 +igic_p_re15,account_tax_template_igic_p_re15 +igic_p_re20,account_tax_template_igic_p_re20 diff --git a/l10n_es_vat_book/tests/__init__.py b/l10n_es_vat_book/tests/__init__.py index 8dcfb2af6c9..2c26e032c5d 100644 --- a/l10n_es_vat_book/tests/__init__.py +++ b/l10n_es_vat_book/tests/__init__.py @@ -1 +1,2 @@ from . import test_l10n_es_aeat_vat_book +from . import test_l10n_es_aeat_vat_book_igic diff --git a/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py b/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py new file mode 100644 index 00000000000..7280e404d9f --- /dev/null +++ b/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py @@ -0,0 +1,151 @@ +# Copyright 2024 Binhex - Nicolás Ramos (http://binhex.es) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import logging + +from odoo import fields +from odoo.tests import tagged + +from odoo.addons.l10n_es_aeat.tests.test_l10n_es_aeat_mod_base import ( + TestL10nEsAeatModBase, +) + +_logger = logging.getLogger("aeat.vat.book.igic") + + +@tagged("post_install", "-at_install") +class TestL10nEsVatBookIgic(TestL10nEsAeatModBase): + debug = False + taxes_sale = { + # tax code: (base, tax_amount) + "IGIC_R_7": (1500, 105), + } + taxes_purchase = { + # tax code: (base, tax_amount) + "IGIC_SOP_7": (230, 16.1), + "IGIC_SOP_7_S": (1000, 70.0), + "IGIC_SOP_I_7": (200, 14), + "IGIC_SOP_0": (100, 0), + } + + @classmethod + def _chart_of_accounts_create(cls): + """Load Canary chart so IGIC taxes exist for the company.""" + _logger.debug("Creating chart of account (Canary)") + cls.company = cls.env["res.company"].create( + { + "name": "Canarias test company", + "currency_id": cls.env.ref("base.EUR").id, + } + ) + cls.env.ref("base.group_multi_company").write({"users": [(4, cls.env.uid)]}) + cls.env.user.write( + {"company_ids": [(4, cls.company.id)], "company_id": cls.company.id} + ) + chart = cls.env["account.chart.template"] + chart.try_loading( + template_code="es_canary_pymes", company=cls.company, install_demo=False + ) + cls.with_context(company_id=cls.company.id) + return True + + def test_model_vat_book(self): + # Purchase invoices + self._invoice_purchase_create("2024-01-01") + # Sale invoices + sale = self._invoice_sale_create("2024-01-13") + self._invoice_refund(sale, "2024-01-14") + # Create model + self.company.vat = "ES12345678Z" + vat_book = self.env["l10n.es.vat.book"].create( + { + "name": "Test VAT Book IGIC", + "company_id": self.company.id, + "company_vat": "1234567890", + "contact_name": "Test owner", + "statement_type": "N", + "support_type": "T", + "contact_phone": "911234455", + "year": 2024, + "period_type": "1T", + "date_start": "2024-01-01", + "date_end": "2024-03-31", + } + ) + _logger.debug("Calculate VAT Book 1T 2024") + + vat_book.button_calculate() + # Check issued invoices + for line in vat_book.issued_line_ids: + self.assertEqual(fields.Date.to_string(line.invoice_date), "2024-01-13") + self.assertEqual(line.partner_id, self.customer) + for tax_line in line.tax_line_ids: + self.assertEqual(tax_line.base_amount, 1500) + self.assertEqual(tax_line.tax_amount, 105) + # Check issued refund invoices + for line in vat_book.rectification_issued_line_ids: + self.assertEqual(fields.Date.to_string(line.invoice_date), "2024-01-14") + self.assertEqual(line.partner_id, self.customer) + for tax_line in line.tax_line_ids: + self.assertEqual(tax_line.base_amount, -1500) + self.assertEqual(tax_line.tax_amount, -105) + # Check tax summary for issued invoices + for line in vat_book.issued_tax_summary_ids: + self.assertEqual(line.base_amount, 0.0) + self.assertEqual(line.tax_amount, 0.0) + # Check tax summary for received invoices + self.assertEqual(len(vat_book.received_tax_summary_ids), 4) + + rec_summaries = sorted( + vat_book.received_tax_summary_ids, + key=lambda line: line.tax_amount, + reverse=True, + ) + # IGIC_SOP_7_S - 7% IGIC servicios + line = rec_summaries[0] + self.assertAlmostEqual(line.base_amount, 1000) + self.assertAlmostEqual(line.tax_amount, 70.0) + + # IGIC_SOP_7 - 7% IGIC bienes + line = rec_summaries[1] + self.assertAlmostEqual(line.base_amount, 230) + self.assertAlmostEqual(line.tax_amount, 16.1) + + # IGIC_SOP_I_7 - 7% IGIC inversión sujeto pasivo + line = rec_summaries[2] + self.assertAlmostEqual(line.base_amount, 200) + self.assertAlmostEqual(line.tax_amount, 14) + + # IGIC_SOP_0 - 0% IGIC + line = rec_summaries[3] + self.assertAlmostEqual(line.base_amount, 100) + self.assertAlmostEqual(line.tax_amount, 0) + + # Print to PDF + report_pdf = self.env["ir.actions.report"]._render( + "l10n_es_vat_book.act_report_vat_book_invoices_issued_pdf", vat_book.ids + ) + self.assertGreaterEqual(len(report_pdf[0]), 1) + report_pdf = self.env["ir.actions.report"]._render( + "l10n_es_vat_book.act_report_vat_book_invoices_received_pdf", vat_book.ids + ) + self.assertGreaterEqual(len(report_pdf[0]), 1) + # Export to XLSX + report_xlsx = self.env["ir.actions.report"]._render( + "l10n_es_vat_book.l10n_es_vat_book_xlsx", vat_book.ids + ) + self.assertGreaterEqual(len(report_xlsx[0]), 1) + self.assertEqual(report_xlsx[1], "xlsx") + # Check empty Vat Book + vat_book.write( + { + "tax_agency_ids": [ + (6, 0, [self.env.ref("l10n_es_aeat.aeat_tax_agency_araba").id]) + ], + } + ) + + vat_book.button_calculate() + self.assertEqual(len(vat_book.issued_line_ids), 0) + self.assertEqual(len(vat_book.rectification_issued_line_ids), 0) + self.assertEqual(len(vat_book.issued_tax_summary_ids), 0) From 4ee44074288cdcbf2e88c841657dec5af270185b Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 29 Jul 2026 15:44:08 +0100 Subject: [PATCH 2/3] [18.0][IMP] l10n_es_vat_book: mapear IGIC venta no sujeto (s_igic_ns) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Incluye account_tax_template_s_igic_ns en el mapa de libro IVA emitido de Canarias para que las ventas no sujetas por localización aparezcan en los libros sin depender de l10n_es_atc_sii_oca. --- l10n_es_vat_book/data/aeat.vat.book.map.line.csv | 2 +- .../data/l10n.es.aeat.map.tax.line.tax.csv | 1 + .../tests/test_l10n_es_aeat_vat_book_igic.py | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/l10n_es_vat_book/data/aeat.vat.book.map.line.csv b/l10n_es_vat_book/data/aeat.vat.book.map.line.csv index 6723df51038..de082d4b548 100644 --- a/l10n_es_vat_book/data/aeat.vat.book.map.line.csv +++ b/l10n_es_vat_book/data/aeat.vat.book.map.line.csv @@ -6,6 +6,6 @@ aeat_vat_book_map_line_s_req,,"issued","Z","Y","Recargo Eq.","req","l10n_es_aeat 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" 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" 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" -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" +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,s_igic_ns" 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" 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" diff --git a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv index 23af9e9b38c..e44e4e576f8 100644 --- a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv +++ b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv @@ -139,6 +139,7 @@ igic_s_ISP0,account_tax_template_igic_s_ISP0 igic_ex_0,account_tax_template_igic_ex_0 igic_re_ex,account_tax_template_igic_re_ex igic_cmino,account_tax_template_igic_cmino +s_igic_ns,account_tax_template_s_igic_ns igic_p_ex,account_tax_template_igic_p_ex igic_sop_0,account_tax_template_igic_sop_0 igic_sop_3,account_tax_template_igic_sop_3 diff --git a/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py b/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py index 7280e404d9f..919f822eff3 100644 --- a/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py +++ b/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py @@ -49,6 +49,16 @@ def _chart_of_accounts_create(cls): cls.with_context(company_id=cls.company.id) return True + def test_igic_ns_mapped_in_issued_book(self): + """IGIC sale not subject must be selectable in issued VAT book map.""" + map_line = self.env.ref("l10n_es_vat_book.atc_vat_book_igic_map_line_s_igic") + tax_names = map_line.tax_xmlid_ids.mapped("name") + self.assertIn("account_tax_template_s_igic_ns", tax_names) + self.assertTrue( + self.env.ref("l10n_es_vat_book.s_igic_ns", raise_if_not_found=False), + "s_igic_ns must be loaded as AEAT map tax template", + ) + def test_model_vat_book(self): # Purchase invoices self._invoice_purchase_create("2024-01-01") From 78b529630e9a6c220e1663e37e10ac06a9344f79 Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 29 Jul 2026 16:38:54 +0100 Subject: [PATCH 3/3] [18.0][IMP] l10n_es_vat_book: completar mapa IGIC ATC con tipos del plan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añade al libro IVA los impuestos IGIC existentes en el plan canario que faltaban (5%, ISP5, recargo 0,5%, cmino, DUA group, no sujeto compra), sin incluir el 1% pendiente de localización. --- .../data/aeat.vat.book.map.line.csv | 6 +++--- .../data/l10n.es.aeat.map.tax.line.tax.csv | 21 +++++++++++++++++++ .../tests/test_l10n_es_aeat_vat_book_igic.py | 17 +++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/l10n_es_vat_book/data/aeat.vat.book.map.line.csv b/l10n_es_vat_book/data/aeat.vat.book.map.line.csv index de082d4b548..b496a47bd74 100644 --- a/l10n_es_vat_book/data/aeat.vat.book.map.line.csv +++ b/l10n_es_vat_book/data/aeat.vat.book.map.line.csv @@ -6,6 +6,6 @@ aeat_vat_book_map_line_s_req,,"issued","Z","Y","Recargo Eq.","req","l10n_es_aeat 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" 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" 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" -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,s_igic_ns" -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" -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" +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_5,igic_r_7,igic_r_9_5,igic_r_15,igic_r_20,igic_s_ISP0,igic_ex_0,igic_re_ex,igic_cmino,s_igic_ns" +atc_vat_book_igic_map_line_p_igic,"","received","AP","AO","IGIC Soportado","","l10n_es_aeat.aeat_tax_agency_canarias","igic_p_ex,p_igic_ns,igic_sop_0,igic_sop_3,igic_sop_5,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_5_inv,igic_sop_7_inv,igic_sop_9_5_inv,igic_sop_15_inv,igic_sop_20_inv,igic_sop_cmino,igic_sop_3_cmino,igic_sop_5_cmino,igic_sop_7_cmino,igic_sop_9_5_cmino,igic_sop_15_cmino,igic_sop_20_cmino,igic_sop_i_0,igic_sop_i_3,igic_sop_i_5,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_5_inv,igic_sop_i_7_inv,igic_sop_i_9_5_inv,igic_sop_i_15_inv,igic_sop_i_20_inv,igic_sop_i_3_group,igic_sop_i_5_group,igic_sop_i_7_group,igic_sop_i_9_5_group,igic_sop_i_15_group,igic_sop_i_20_group,igic_ISP0,igic_ISP3,igic_ISP5,igic_ISP7,igic_ISP95,igic_ISP15,igic_ISP20" +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_re05,igic_p_re07,igic_p_re095,igic_p_re15,igic_p_re20" diff --git a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv index e44e4e576f8..eb1de23baf1 100644 --- a/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv +++ b/l10n_es_vat_book/data/l10n.es.aeat.map.tax.line.tax.csv @@ -131,6 +131,7 @@ s_irpf24,account_tax_template_s_irpf24 p_irpf24,account_tax_template_p_irpf24 igic_r_0,account_tax_template_igic_r_0 igic_r_3,account_tax_template_igic_r_3 +igic_r_5,account_tax_template_igic_r_5 igic_r_7,account_tax_template_igic_r_7 igic_r_9_5,account_tax_template_igic_r_9_5 igic_r_15,account_tax_template_igic_r_15 @@ -141,8 +142,10 @@ igic_re_ex,account_tax_template_igic_re_ex igic_cmino,account_tax_template_igic_cmino s_igic_ns,account_tax_template_s_igic_ns igic_p_ex,account_tax_template_igic_p_ex +p_igic_ns,account_tax_template_p_igic_ns igic_sop_0,account_tax_template_igic_sop_0 igic_sop_3,account_tax_template_igic_sop_3 +igic_sop_5,account_tax_template_igic_sop_5 igic_sop_7,account_tax_template_igic_sop_7 igic_sop_9_5,account_tax_template_igic_sop_9_5 igic_sop_15,account_tax_template_igic_sop_15 @@ -156,30 +159,48 @@ igic_sop_15_s,account_tax_template_igic_sop_15_s igic_sop_20_s,account_tax_template_igic_sop_20_s igic_sop_0_inv,account_tax_template_igic_sop_0_inv igic_sop_3_inv,account_tax_template_igic_sop_3_inv +igic_sop_5_inv,account_tax_template_igic_sop_5_inv igic_sop_7_inv,account_tax_template_igic_sop_7_inv igic_sop_9_5_inv,account_tax_template_igic_sop_9_5_inv igic_sop_15_inv,account_tax_template_igic_sop_15_inv igic_sop_20_inv,account_tax_template_igic_sop_20_inv +igic_sop_cmino,account_tax_template_igic_sop_cmino +igic_sop_3_cmino,account_tax_template_igic_sop_3_cmino +igic_sop_5_cmino,account_tax_template_igic_sop_5_cmino +igic_sop_7_cmino,account_tax_template_igic_sop_7_cmino +igic_sop_9_5_cmino,account_tax_template_igic_sop_9_5_cmino +igic_sop_15_cmino,account_tax_template_igic_sop_15_cmino +igic_sop_20_cmino,account_tax_template_igic_sop_20_cmino igic_sop_i_0,account_tax_template_igic_sop_i_0 igic_sop_i_3,account_tax_template_igic_sop_i_3 +igic_sop_i_5,account_tax_template_igic_sop_i_5 igic_sop_i_7,account_tax_template_igic_sop_i_7 igic_sop_i_9_5,account_tax_template_igic_sop_i_9_5 igic_sop_i_15,account_tax_template_igic_sop_i_15 igic_sop_i_20,account_tax_template_igic_sop_i_20 igic_sop_i_0_inv,account_tax_template_igic_sop_i_0_inv igic_sop_i_3_inv,account_tax_template_igic_sop_i_3_inv +igic_sop_i_5_inv,account_tax_template_igic_sop_i_5_inv igic_sop_i_7_inv,account_tax_template_igic_sop_i_7_inv igic_sop_i_9_5_inv,account_tax_template_igic_sop_i_9_5_inv igic_sop_i_15_inv,account_tax_template_igic_sop_i_15_inv igic_sop_i_20_inv,account_tax_template_igic_sop_i_20_inv +igic_sop_i_3_group,account_tax_template_igic_sop_i_3_group +igic_sop_i_5_group,account_tax_template_igic_sop_i_5_group +igic_sop_i_7_group,account_tax_template_igic_sop_i_7_group +igic_sop_i_9_5_group,account_tax_template_igic_sop_i_9_5_group +igic_sop_i_15_group,account_tax_template_igic_sop_i_15_group +igic_sop_i_20_group,account_tax_template_igic_sop_i_20_group igic_ISP0,account_tax_template_igic_ISP0 igic_ISP3,account_tax_template_igic_ISP3 +igic_ISP5,account_tax_template_igic_ISP5 igic_ISP7,account_tax_template_igic_ISP7 igic_ISP95,account_tax_template_igic_ISP95 igic_ISP15,account_tax_template_igic_ISP15 igic_ISP20,account_tax_template_igic_ISP20 igic_p_re0,account_tax_template_igic_p_re0 igic_p_re03,account_tax_template_igic_p_re03 +igic_p_re05,account_tax_template_igic_p_re05 igic_p_re07,account_tax_template_igic_p_re07 igic_p_re095,account_tax_template_igic_p_re095 igic_p_re15,account_tax_template_igic_p_re15 diff --git a/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py b/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py index 919f822eff3..6e2dcabdc56 100644 --- a/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py +++ b/l10n_es_vat_book/tests/test_l10n_es_aeat_vat_book_igic.py @@ -54,11 +54,28 @@ def test_igic_ns_mapped_in_issued_book(self): map_line = self.env.ref("l10n_es_vat_book.atc_vat_book_igic_map_line_s_igic") tax_names = map_line.tax_xmlid_ids.mapped("name") self.assertIn("account_tax_template_s_igic_ns", tax_names) + self.assertIn("account_tax_template_igic_r_5", tax_names) self.assertTrue( self.env.ref("l10n_es_vat_book.s_igic_ns", raise_if_not_found=False), "s_igic_ns must be loaded as AEAT map tax template", ) + def test_igic_chart_taxes_mapped_in_received_book(self): + """Chart IGIC purchase rates (incl. 5%) must be in received VAT book maps.""" + received = self.env.ref("l10n_es_vat_book.atc_vat_book_igic_map_line_p_igic") + req = self.env.ref("l10n_es_vat_book.atc_vat_book_igic_map_line_p_req") + received_names = received.tax_xmlid_ids.mapped("name") + req_names = req.tax_xmlid_ids.mapped("name") + for xmlid in ( + "account_tax_template_igic_sop_5", + "account_tax_template_igic_sop_5_inv", + "account_tax_template_igic_sop_i_5", + "account_tax_template_igic_ISP5", + "account_tax_template_p_igic_ns", + ): + self.assertIn(xmlid, received_names) + self.assertIn("account_tax_template_igic_p_re05", req_names) + def test_model_vat_book(self): # Purchase invoices self._invoice_purchase_create("2024-01-01")