diff --git a/l10n_es_ticketbai_api/models/ticketbai_invoice_tax.py b/l10n_es_ticketbai_api/models/ticketbai_invoice_tax.py index d25b23229a7..d8ea1a85a98 100644 --- a/l10n_es_ticketbai_api/models/ticketbai_invoice_tax.py +++ b/l10n_es_ticketbai_api/models/ticketbai_invoice_tax.py @@ -22,6 +22,7 @@ class VATRegimeKey(tbai_utils.EnumValues): K13 = "13" K14 = "14" K15 = "15" + K17 = "17" K51 = "51" K52 = "52" K53 = "53" diff --git a/l10n_es_ticketbai_oss/README.rst b/l10n_es_ticketbai_oss/README.rst index 31db55a3d4f..408d2d66685 100644 --- a/l10n_es_ticketbai_oss/README.rst +++ b/l10n_es_ticketbai_oss/README.rst @@ -17,13 +17,13 @@ TicketBAI - OSS :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--spain-lightgray.png?logo=github - :target: https://github.com/OCA/l10n-spain/tree/15.0/l10n_es_ticketbai_oss + :target: https://github.com/OCA/l10n-spain/tree/16.0/l10n_es_ticketbai_oss :alt: OCA/l10n-spain .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/l10n-spain-15-0/l10n-spain-15-0-l10n_es_ticketbai_oss + :target: https://translation.odoo-community.org/projects/l10n-spain-16-0/l10n-spain-16-0-l10n_es_ticketbai_oss :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-spain&target_branch=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-spain&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -56,7 +56,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -96,6 +96,6 @@ Current `maintainer `__: |maintainer-ao-landoo| -This module is part of the `OCA/l10n-spain `_ project on GitHub. +This module is part of the `OCA/l10n-spain `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_es_ticketbai_oss/__manifest__.py b/l10n_es_ticketbai_oss/__manifest__.py index 0c3950e7d5e..40491651b41 100644 --- a/l10n_es_ticketbai_oss/__manifest__.py +++ b/l10n_es_ticketbai_oss/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "TicketBAI - OSS", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "category": "Accounting & Finance", "website": "https://github.com/OCA/l10n-spain", "author": "Landoo Sistemas de Información S.L, Odoo Community Association (OCA)", @@ -15,8 +15,10 @@ "depends": [ "l10n_es_ticketbai", "l10n_eu_oss_oca", + "l10n_es_ticketbai_api", ], "data": [ "data/vat_regime_key_data.xml", + "views/account_tax_views.xml", ], } diff --git a/l10n_es_ticketbai_oss/models/__init__.py b/l10n_es_ticketbai_oss/models/__init__.py index 27def0cc153..f5ed6e2fa58 100644 --- a/l10n_es_ticketbai_oss/models/__init__.py +++ b/l10n_es_ticketbai_oss/models/__init__.py @@ -1 +1,2 @@ -from . import ticketbai_invoice_tax +from . import account_tax +from . import tbai_invoice_tax diff --git a/l10n_es_ticketbai_oss/models/account_tax.py b/l10n_es_ticketbai_oss/models/account_tax.py new file mode 100644 index 00000000000..cb896dac202 --- /dev/null +++ b/l10n_es_ticketbai_oss/models/account_tax.py @@ -0,0 +1,55 @@ +# Copyright 2022 Binovo IT Human Project SL +# Copyright 2024 Avanzosc +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountTax(models.Model): + _inherit = "account.tax" + + tbai_tax_map_id = fields.Many2one( + comodel_name="tbai.tax.map", string="Tbai Tax Map" + ) + not_subject_to_cause = fields.Selection( + selection=[ + ( + "OT", + "OT - No sujeto por el artículo 7 de la Norma Foral de IVA Otros" + " supuestos de no sujeción.", + ), + ("RL", "RL - No sujeto por reglas de localización."), + ( + "IE", + "IE - No sujeto en el TAI por reglas de localización, pero repercute" + " impuesto extranjero, IPS/IGIC o IVA de otro estado miembro UE.", + ), + ], + string="Not Subject to Cause", + ) + + def tbai_is_subject_to_tax(self): + if self.tbai_tax_map_id and self.tbai_tax_map_id.code in ("SNS", "BNS"): + return False + return super().tbai_is_subject_to_tax() + + def tbai_es_entrega(self): + return super(AccountTax, self).tbai_es_entrega() or ( + self + in self.env["account.tax"].search( + [ + ("oss_country_id", "!=", False), + ("company_id", "=", self.company_id.id), + ] + ) + ) + + def tbai_es_prestacion_servicios(self): + if self.tbai_tax_map_id: + return self.tbai_tax_map_id.code in ("SNS", "SIE", "S", "SER") + return False + + def tbai_get_value_causa(self, invoice_id): + if self.not_subject_to_cause: + return self.not_subject_to_cause + return super().tbai_get_value_causa(invoice_id) diff --git a/l10n_es_ticketbai_oss/models/tbai_invoice_tax.py b/l10n_es_ticketbai_oss/models/tbai_invoice_tax.py new file mode 100644 index 00000000000..30d777e3b96 --- /dev/null +++ b/l10n_es_ticketbai_oss/models/tbai_invoice_tax.py @@ -0,0 +1,8 @@ +# Copyright 2022 Landoo Sistemas de Informacion SL +from odoo import fields, models + + +class TicketBAITax(models.Model): + _inherit = "tbai.invoice.tax" + + not_subject_to_cause = fields.Selection(selection_add=[("IE", "IE")]) diff --git a/l10n_es_ticketbai_oss/models/ticketbai_invoice_tax.py b/l10n_es_ticketbai_oss/models/ticketbai_invoice_tax.py deleted file mode 100644 index c789cd39766..00000000000 --- a/l10n_es_ticketbai_oss/models/ticketbai_invoice_tax.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2022 Landoo Sistemas de Informacion SL -from odoo import _, api, exceptions, models - -from odoo.addons.l10n_es_ticketbai_api.ticketbai.xml_schema import TicketBaiSchema -from odoo.addons.l10n_es_ticketbai_api.utils import utils as tbai_utils - - -class VATRegimeKey(tbai_utils.EnumValues): - K17 = "17" - - -class TicketBAIInvoice(models.Model): - _inherit = "tbai.invoice" - - @api.constrains("vat_regime_key") - def _check_vat_regime_key(self): - try: - return super(TicketBAIInvoice, self)._check_vat_regime_key() - except exceptions.ValidationError as ve: - for record in self: - if record.schema == TicketBaiSchema.TicketBai.value and ( - not record.vat_regime_key - or record.vat_regime_key not in VATRegimeKey.values() - ): - raise exceptions.ValidationError( - _("TicketBAI Invoice %s: VAT Regime Key not valid.") - % record.name - ) from ve - - -class AccountTax(models.Model): - _inherit = "account.tax" - - def tbai_is_subject_to_tax(self): - return super(AccountTax, self).tbai_is_subject_to_tax() and ( - self - not in self.env["account.tax"].search( - [ - ("oss_country_id", "!=", False), - ("company_id", "=", self.company_id.id), - ] - ) - ) - - def tbai_es_entrega(self): - return super(AccountTax, self).tbai_es_entrega() or ( - self - in self.env["account.tax"].search( - [ - ("oss_country_id", "!=", False), - ("company_id", "=", self.company_id.id), - ] - ) - ) diff --git a/l10n_es_ticketbai_oss/static/description/index.html b/l10n_es_ticketbai_oss/static/description/index.html index 4f1d0d15fbd..19b6e600c25 100644 --- a/l10n_es_ticketbai_oss/static/description/index.html +++ b/l10n_es_ticketbai_oss/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,7 +369,7 @@

TicketBAI - OSS

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:77f55c0935e6f03a4348e40c14de67abf243905f44db57cbb9517deef8c04f4c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/l10n-spain Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/l10n-spain Translate me on Weblate Try me on Runboat

Este módulo contabiliza el envío a TicketBAI de las facturas de comercio B2C a los países intracomunitarios según el marco de la normativa europea One-Stop Shop (OSS).

Table of contents

@@ -405,7 +405,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -428,13 +428,15 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

Current maintainer:

ao-landoo

-

This module is part of the OCA/l10n-spain project on GitHub.

+

This module is part of the OCA/l10n-spain project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/l10n_es_ticketbai_oss/tests/__init__.py b/l10n_es_ticketbai_oss/tests/__init__.py new file mode 100644 index 00000000000..04e0f1e393a --- /dev/null +++ b/l10n_es_ticketbai_oss/tests/__init__.py @@ -0,0 +1 @@ +from . import test_invoice_oss diff --git a/l10n_es_ticketbai_oss/tests/test_invoice_oss.py b/l10n_es_ticketbai_oss/tests/test_invoice_oss.py new file mode 100644 index 00000000000..4d0b9a113ce --- /dev/null +++ b/l10n_es_ticketbai_oss/tests/test_invoice_oss.py @@ -0,0 +1,84 @@ +from odoo.tests.common import TransactionCase, tagged + + +@tagged("post_install", "-at_install") +class TestInvoiceAddress(TransactionCase): + def setUp(self): + super(TestInvoiceAddress, self).setUp() + self.currency = self.env.ref("base.EUR") + self.company = self.env.ref("base.main_company") + + vals = { + "company_id": self.company.id, + "type": "sale", + "code": "TEST", + "name": "Journal Test", + } + self.journal = self.env["account.journal"].create(vals) + + vals = { + "name": "Customer", + } + self.partner = self.env["res.partner"].create(vals) + + receivable_account_type = self.env["account.account"].search( + [("account_type", "=", "asset_receivable")], limit=1 + ) + + if not receivable_account_type: + receivable_account_type = self.env["account.account"].create( + { + "name": "Receivables Account", + "code": "REC", + "company_id": self.company.id, + "account_type": "asset_receivable", + } + ) + + self.account = self.env["account.account"].create( + { + "name": "Receivables Account", + "code": "REC", + "company_id": self.company.id, + "account_type": "asset_receivable", + } + ) + + tbai_tax_map_id = self.env["tbai.tax.map"].search([("code", "=", "BNS")]).id + vals = { + "name": "Tax 22%", + "amount": 22, + "price_include": False, + "not_subject_to_cause": "IE", + "tbai_tax_map_id": tbai_tax_map_id, + } + self.tax = self.env["account.tax"].create(vals) + + def test_no_subject_invoice(self): + vals = { + "currency_id": self.currency.id, + "partner_id": self.partner.id, + "journal_id": self.journal.id, + "ref": "INV/12345", + } + invoice = self.env["account.move"].create(vals) + + vals = { + "name": "Product 001", + "quantity": 1, + "price_unit": 100, + "tax_ids": [(6, 0, [self.tax.id])], + "move_id": invoice.id, + "account_id": self.account.id, + } + self.env["account.move.line"].create(vals) + + self.assertEqual(len(invoice.invoice_line_ids), 1) + + is_subject_tax = invoice.invoice_line_ids[0].tax_ids.tbai_is_subject_to_tax() + self.assertFalse(is_subject_tax) + + self.assertEqual(len(invoice.line_ids.tax_ids), 1) + self.assertFalse(invoice.line_ids.tax_ids.tbai_es_entrega()) + self.assertFalse(invoice.line_ids.tax_ids.tbai_es_prestacion_servicios()) + self.assertEqual(invoice.line_ids.tax_ids.tbai_get_value_causa(invoice), "IE") diff --git a/l10n_es_ticketbai_oss/views/account_tax_views.xml b/l10n_es_ticketbai_oss/views/account_tax_views.xml new file mode 100644 index 00000000000..61093e0bce3 --- /dev/null +++ b/l10n_es_ticketbai_oss/views/account_tax_views.xml @@ -0,0 +1,17 @@ + + + + account.tax.tbai.form + account.tax + + + + + + + + +