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