From 38f131e5a090fa273d9856158a313524fa24167e Mon Sep 17 00:00:00 2001 From: Saran440 Date: Tue, 24 Sep 2024 17:05:42 +0700 Subject: [PATCH] [FIX] budget_control_expense: compute without tax --- budget_control/models/budget_period.py | 3 ++- budget_control_expense/__manifest__.py | 2 +- .../models/account_move_line.py | 21 ++++++++++++------- budget_control_expense/models/hr_expense.py | 16 +++++++++----- .../tests/test_budget_expense.py | 1 + 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/budget_control/models/budget_period.py b/budget_control/models/budget_period.py index 736891f5..45965c87 100644 --- a/budget_control/models/budget_period.py +++ b/budget_control/models/budget_period.py @@ -261,7 +261,8 @@ def check_budget_precommit(self, doclines, doc_type="account"): if budget_move: budget_moves.append(budget_move) # Update database, so we can check budget with query - budget_move.flush_model() + if budget_move: + budget_move.flush_model() # Check Budget self.env["budget.period"].check_budget(doclines, doc_type=doc_type) # Remove commits diff --git a/budget_control_expense/__manifest__.py b/budget_control_expense/__manifest__.py index 78d5293f..01722124 100644 --- a/budget_control_expense/__manifest__.py +++ b/budget_control_expense/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Budget Control on Expense", - "version": "16.0.1.0.0", + "version": "16.0.1.0.1", "license": "AGPL-3", "author": "Ecosoft, Odoo Community Association (OCA)", "website": "https://github.com/ecosoft-odoo/budgeting", diff --git a/budget_control_expense/models/account_move_line.py b/budget_control_expense/models/account_move_line.py index 2f44d8a7..ffe989a8 100644 --- a/budget_control_expense/models/account_move_line.py +++ b/budget_control_expense/models/account_move_line.py @@ -11,12 +11,18 @@ def _init_docline_budget_vals(self, budget_vals, analytic_id): self.ensure_one() res = super()._init_docline_budget_vals(budget_vals, analytic_id) expense = self.expense_id - if expense: # case expense (support with include tax) - budget_vals["amount_currency"] = ( - (expense.quantity * expense.unit_amount) - if expense.product_has_cost - else expense.total_amount - ) + if expense: + # Amount from expense is tax included, need to convert to amount_untaxed + base_lines = [ + expense._convert_to_tax_base_line_dict( + price_unit=expense.unit_amount, quantity=expense.quantity + ) + ] + taxes_totals = self.env["account.tax"]._compute_taxes(base_lines)["totals"][ + expense.currency_id + ] + total_amount = taxes_totals["amount_untaxed"] + budget_vals["amount_currency"] = total_amount return res def uncommit_expense_budget(self): @@ -24,7 +30,8 @@ def uncommit_expense_budget(self): Expense = self.env["hr.expense"] for ml in self: inv_state = ml.move_id.state - if not ml.move_id.expense_sheet_id: + # Skip if not expense or tax line + if not ml.move_id.expense_sheet_id or ml.display_type == "tax": continue if inv_state == "posted": expense = ml.expense_id.filtered("amount_commit") diff --git a/budget_control_expense/models/hr_expense.py b/budget_control_expense/models/hr_expense.py index 09aac182..becc0d46 100644 --- a/budget_control_expense/models/hr_expense.py +++ b/budget_control_expense/models/hr_expense.py @@ -93,12 +93,18 @@ def recompute_budget_move(self): def _init_docline_budget_vals(self, budget_vals, analytic_id): self.ensure_one() if not budget_vals.get("amount_currency", False): + # Amount expense is always include tax. so, we need to compute amount without tax + base_lines = [ + self._convert_to_tax_base_line_dict( + price_unit=self.unit_amount, quantity=self.quantity + ) + ] + taxes_totals = self.env["account.tax"]._compute_taxes(base_lines)["totals"][ + self.currency_id + ] + total_amount = taxes_totals["amount_untaxed"] + # Percent analytic percent_analytic = self[self._budget_analytic_field].get(str(analytic_id)) - total_amount = ( - (self.quantity * self.unit_amount) - if self.product_has_cost - else self.total_amount - ) budget_vals["amount_currency"] = total_amount * percent_analytic / 100 budget_vals["tax_ids"] = self.tax_ids.ids # Document specific vals diff --git a/budget_control_expense/tests/test_budget_expense.py b/budget_control_expense/tests/test_budget_expense.py index d75ec8bc..d864030f 100644 --- a/budget_control_expense/tests/test_budget_expense.py +++ b/budget_control_expense/tests/test_budget_expense.py @@ -56,6 +56,7 @@ def _create_expense_sheet(self, ex_lines): ex.total_amount = ex_line["price_unit"] * ex_line["product_qty"] ex.analytic_distribution = ex_line["analytic_distribution"] expense = ex.save() + expense.tax_ids = False # test without tax expense_ids.append(expense.id) expense_sheet = self.env["hr.expense.sheet"].create( {