From 7c1be25bc784e42ee3cbc00bbd18bb2186aa983e Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Tue, 25 Jun 2024 11:27:33 +0200 Subject: [PATCH] [IMP] l10n_es_vat_porate: Use a proper account on investments and assets --- l10n_es_vat_prorate/models/account_move.py | 5 +- l10n_es_vat_prorate/models/res_company.py | 47 ++++++++++++++++++- l10n_es_vat_prorate/tests/test_vat_prorate.py | 34 ++++++++++++++ .../views/res_company_views.xml | 8 ++++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/l10n_es_vat_prorate/models/account_move.py b/l10n_es_vat_prorate/models/account_move.py index 3e528da9aef..636f9479cde 100644 --- a/l10n_es_vat_prorate/models/account_move.py +++ b/l10n_es_vat_prorate/models/account_move.py @@ -103,7 +103,10 @@ def _compute_all_tax(self): new_key.update( { "vat_prorate": True, - "account_id": line.account_id.id, + "account_id": line.company_id._get_tax_prorrate_account_map().get( + line.account_id.account_type + ) + or line.account_id.id, "analytic_distribution": line.analytic_distribution, } ) diff --git a/l10n_es_vat_prorate/models/res_company.py b/l10n_es_vat_prorate/models/res_company.py index b2ca6d582d0..af3dd6d9dea 100644 --- a/l10n_es_vat_prorate/models/res_company.py +++ b/l10n_es_vat_prorate/models/res_company.py @@ -2,7 +2,7 @@ # Copyright 2023 Tecnativa Carolina Fernandez # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import _, api, fields, models +from odoo import _, api, fields, models, tools from odoo.exceptions import ValidationError from odoo.tools import ormcache @@ -19,6 +19,36 @@ class ResCompany(models.Model): vat_prorate_ids = fields.One2many( "res.company.vat.prorate", inverse_name="company_id" ) + prorrate_asset_account_id = fields.Many2one( + "account.account", + domain="[('company_id', '=', id)]", + compute="_compute_prorrate_accounts", + store=True, + readonly=False, + ) + prorrate_investment_account_id = fields.Many2one( + "account.account", + domain="[('company_id', '=', id)]", + compute="_compute_prorrate_accounts", + store=True, + readonly=False, + ) + + @api.depends("chart_template_id", "with_vat_prorate") + def _compute_prorrate_accounts(self): + for record in self: + if record.with_vat_prorate and record.chart_template_id: + record.prorrate_asset_account_id = self.env.ref( + "l10n_es.%s_account_common_6341" % record.id, + raise_if_not_found=False, + ) + record.prorrate_investment_account_id = self.env.ref( + "l10n_es.%s_account_common_6342" % record.id, + raise_if_not_found=False, + ) + else: + record.prorrate_asset_account_id = False + record.prorrate_investment_account_id = False @ormcache("self") def _get_prorate_accounts(self): @@ -50,6 +80,21 @@ def _check_vat_prorate_ids(self): if rec.with_vat_prorate and not rec.vat_prorate_ids: raise ValidationError(_("You must complete VAT prorate information")) + @tools.ormcache( + "self.id", + "self.prorrate_asset_account_id.id", + "self.prorrate_investment_account_id.id", + ) + def _get_tax_prorrate_account_map(self): + """Get the account mapping according user type""" + return { + "asset_current": self.prorrate_asset_account_id.id, + "asset_non_current": self.prorrate_asset_account_id.id, + "asset_fixed": self.prorrate_asset_account_id.id, + "liability_current": self.prorrate_investment_account_id.id, + "liability_non_current": self.prorrate_investment_account_id.id, + } + class ResCompanyVatProrate(models.Model): _name = "res.company.vat.prorate" diff --git a/l10n_es_vat_prorate/tests/test_vat_prorate.py b/l10n_es_vat_prorate/tests/test_vat_prorate.py index def3d065d2d..4843923ec1d 100644 --- a/l10n_es_vat_prorate/tests/test_vat_prorate.py +++ b/l10n_es_vat_prorate/tests/test_vat_prorate.py @@ -71,6 +71,14 @@ def test_no_company_vat_prorate_information(self): with self.assertRaises(exceptions.ValidationError): self.env.company.write({"vat_prorate_ids": False}) + def test_company_configuration(self): + self.assertTrue(self.env.company.with_vat_prorate) + self.assertTrue(self.env.company.prorrate_asset_account_id) + self.assertTrue(self.env.company.prorrate_investment_account_id) + self.env.company.write({"with_vat_prorate": False}) + self.assertFalse(self.env.company.prorrate_asset_account_id) + self.assertFalse(self.env.company.prorrate_investment_account_id) + def test_no_prorate_in_invoice(self): self.env.company.write( {"with_vat_prorate": False} @@ -87,6 +95,18 @@ def test_prorate_different_accounts_in_invoice(self): ) self.assertEqual(6, len(invoice.line_ids)) self.assertEqual(3, len(invoice.line_ids.filtered(lambda r: r.tax_line_id))) + self.assertTrue( + invoice.line_ids.filtered( + lambda r: r.tax_line_id + and r.account_id == self.product_a.property_account_expense_id + ) + ) + self.assertTrue( + invoice.line_ids.filtered( + lambda r: r.tax_line_id + and r.account_id == self.product_b.property_account_expense_id + ) + ) # Deal with analytics invoice.line_ids[0].analytic_distribution = {self.analytic_account.id: 100} self.assertEqual(6, len(invoice.line_ids)) @@ -124,6 +144,20 @@ def test_prorate_same_accounts_in_invoice(self): # One of the tax lines should have expense account and the other the tax account self.assertNotEqual(tax_lines[0].account_id, tax_lines[1].account_id) + def test_prorate_asset_in_invoice(self): + self.product_b.property_account_expense_id = self.company_data[ + "default_account_assets" + ] + invoice = self.init_invoice("in_invoice", products=[self.product_b]) + self.assertEqual(4, len(invoice.line_ids)) + self.assertEqual(2, len(invoice.line_ids.filtered(lambda r: r.tax_line_id))) + self.assertFalse( + invoice.line_ids.filtered( + lambda r: r.tax_line_id + and r.account_id == self.product_b.property_account_expense_id + ) + ) + def test_no_prorate_in_refund(self): self.env.company.write( {"with_vat_prorate": False} diff --git a/l10n_es_vat_prorate/views/res_company_views.xml b/l10n_es_vat_prorate/views/res_company_views.xml index 52864431687..2f0198cf5e1 100644 --- a/l10n_es_vat_prorate/views/res_company_views.xml +++ b/l10n_es_vat_prorate/views/res_company_views.xml @@ -18,6 +18,14 @@ + +