oca-financial/odoo-bringout-oca-account-fiscal-rule-account_avatax_oca/account_avatax_oca/hooks.py
2025-08-29 15:43:04 +02:00

102 lines
4.1 KiB
Python

# 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
# The process is to first install account_avatax_oca
# and then uninstall account_avatax
cr.execute(
"""
UPDATE ir_model_data
SET module = 'account_avatax_oca'
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