From 34336f04e23c1623ba94b28b13b9551d6ea9cad7 Mon Sep 17 00:00:00 2001 From: Christopher Ormaza Date: Tue, 26 Dec 2023 08:07:24 -0500 Subject: [PATCH] [16.0][FIX] account_avatax_oca, skip exception raise on lines with not product in display_type --- account_avatax_oca/__init__.py | 1 + account_avatax_oca/__manifest__.py | 1 + account_avatax_oca/hooks.py | 87 ++++++++++++++++++++++++ account_avatax_oca/models/account_tax.py | 39 +++++++---- 4 files changed, 115 insertions(+), 13 deletions(-) diff --git a/account_avatax_oca/__init__.py b/account_avatax_oca/__init__.py index 0759f9486..df33df4e7 100644 --- a/account_avatax_oca/__init__.py +++ b/account_avatax_oca/__init__.py @@ -1,3 +1,4 @@ from . import models from . import wizard from .hooks import pre_init_hook +from .hooks import post_load_hook diff --git a/account_avatax_oca/__manifest__.py b/account_avatax_oca/__manifest__.py index 1f02478fb..10c0b0354 100644 --- a/account_avatax_oca/__manifest__.py +++ b/account_avatax_oca/__manifest__.py @@ -9,6 +9,7 @@ "website": "https://github.com/OCA/account-fiscal-rule", "depends": ["sale_stock", "base_geolocalize"], "pre_init_hook": "pre_init_hook", + "post_load": "post_load_hook", "data": [ "security/avalara_salestax_security.xml", "security/ir.model.access.csv", diff --git a/account_avatax_oca/hooks.py b/account_avatax_oca/hooks.py index 6ccc07dea..5475bd362 100644 --- a/account_avatax_oca/hooks.py +++ b/account_avatax_oca/hooks.py @@ -1,6 +1,11 @@ # Copyright (C) 2022 Open Source Integrators # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import _, api +from odoo.tools import frozendict + +from odoo.addons.account.models.account_move_line import AccountMoveLine + def pre_init_hook(cr): # Preserve key data when moving from account_avatax to account_avatax_oca @@ -13,3 +18,85 @@ def pre_init_hook(cr): WHERE name in ('avatax_fiscal_position_us', 'account_avatax') """ ) + + +def post_load_hook(): # noqa: C901 + @api.depends( + "tax_ids", + "currency_id", + "partner_id", + "analytic_distribution", + "balance", + "partner_id", + "move_id.partner_id", + "price_unit", + "quantity", + ) + def _compute_all_tax_new(self): + for line in self: + sign = line.move_id.direction_sign + if line.display_type == "tax": + line.compute_all_tax = {} + line.compute_all_tax_dirty = False + continue + if line.display_type == "product" and line.move_id.is_invoice(True): + amount_currency = sign * line.price_unit * (1 - line.discount / 100) + handle_price_include = True + quantity = line.quantity + else: + amount_currency = line.amount_currency + handle_price_include = False + quantity = 1 + compute_all_currency = line.tax_ids.with_context( + current_aml=line.id + ).compute_all( + amount_currency, + currency=line.currency_id, + quantity=quantity, + product=line.product_id, + partner=line.move_id.partner_id or line.partner_id, + is_refund=line.is_refund, + handle_price_include=handle_price_include, + include_caba_tags=line.move_id.always_tax_exigible, + fixed_multiplicator=sign, + ) + rate = line.amount_currency / line.balance if line.balance else 1 + line.compute_all_tax_dirty = True + line.compute_all_tax = { + frozendict( + { + "tax_repartition_line_id": tax["tax_repartition_line_id"], + "group_tax_id": tax["group"] and tax["group"].id or False, + "account_id": tax["account_id"] or line.account_id.id, + "currency_id": line.currency_id.id, + "analytic_distribution": ( + (tax["analytic"] or not tax["use_in_tax_closing"]) + and line.move_id.state == "draft" + ) + and line.analytic_distribution, + "tax_ids": [(6, 0, tax["tax_ids"])], + "tax_tag_ids": [(6, 0, tax["tag_ids"])], + "partner_id": line.move_id.partner_id.id or line.partner_id.id, + "move_id": line.move_id.id, + "display_type": line.display_type, + } + ): { + "name": tax["name"] + + (" " + _("(Discount)") if line.display_type == "epd" else ""), + "balance": tax["amount"] / rate, + "amount_currency": tax["amount"], + "tax_base_amount": tax["base"] + / rate + * (-1 if line.tax_tag_invert else 1), + } + for tax in compute_all_currency["taxes"] + if tax["amount"] + } + if not line.tax_repartition_line_id: + line.compute_all_tax[frozendict({"id": line.id})] = { + "tax_tag_ids": [(6, 0, compute_all_currency["base_tags"])], + } + + if not hasattr(AccountMoveLine, "_compute_all_tax_origin"): + AccountMoveLine._compute_all_tax_origin = AccountMoveLine._compute_all_tax + AccountMoveLine._compute_all_tax = _compute_all_tax_new diff --git a/account_avatax_oca/models/account_tax.py b/account_avatax_oca/models/account_tax.py index d10ca402d..6978a9a1c 100644 --- a/account_avatax_oca/models/account_tax.py +++ b/account_avatax_oca/models/account_tax.py @@ -82,6 +82,16 @@ def compute_all( fixed_multiplicator, ) avatax_invoice = self.env.context.get("avatax_invoice") + current_aml = False + if "current_aml" in self.env.context: + current_aml = self.env["account.move.line"].browse( + self.env.context.get("current_aml") + ) + if not ( + current_aml.display_type == "product" + and current_aml.account_type != "asset_receivable" + ): + avatax_invoice = False if avatax_invoice: # Find the Avatax amount in the invoice Lines # Looks up the line for the current product, price_unit, and quantity @@ -89,19 +99,22 @@ def compute_all( base = res["total_excluded"] digits = 6 avatax_amount = None - for line in avatax_invoice.invoice_line_ids: - price_unit = line.currency_id._convert( - price_unit, - avatax_invoice.company_id.currency_id, - avatax_invoice.company_id, - avatax_invoice.date, - ) - if ( - line.product_id == product - and float_compare(line.quantity, quantity, digits) == 0 - ): - avatax_amount = copysign(line.avatax_amt_line, base) - break + if current_aml: + avatax_amount = copysign(current_aml.avatax_amt_line, base) + else: + for line in avatax_invoice.invoice_line_ids: + price_unit = line.currency_id._convert( + price_unit, + avatax_invoice.company_id.currency_id, + avatax_invoice.company_id, + avatax_invoice.date, + ) + if ( + line.product_id == product + and float_compare(line.quantity, quantity, digits) == 0 + ): + avatax_amount = copysign(line.avatax_amt_line, base) + break if avatax_amount is None: avatax_amount = 0.0 raise exceptions.UserError(