Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion hr_expense_invoice/models/hr_expense.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# Copyright 2017 Tecnativa - Vicent Cubells
# Copyright 2020 Tecnativa - David Vidal
# Copyright 2021 Tecnativa - Víctor Martínez
# Copyright 2021-2026 Tecnativa - Víctor Martínez
# Copyright 2015-2024 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import Command, api, fields, models
from odoo.exceptions import UserError
from odoo.tools import float_compare, float_is_zero


class HrExpense(models.Model):
Expand Down Expand Up @@ -57,6 +58,34 @@ def _prepare_invoice_values(self):
"invoice_line_ids": invoice_lines,
}

def _adjust_invoice_tax_amount(self, invoice):
"""If the tax amount does not match due to rounding, we will adjust
it manually, similar to how it is done in the interface using the pencil icon.
Example: Expense 10 (8.7 + 1.30). The invoice generated should also
include 1.30 in taxes.
"""
tax_amount = self.tax_amount_currency
if float_is_zero(tax_amount, precision_rounding=self.currency_id.rounding):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why adding this condition? Isn't enough with the following one?

return
if (
float_compare(
invoice.amount_tax,
tax_amount,
precision_rounding=self.currency_id.rounding,
)
!= 0
):
tax_totals = invoice.tax_totals
tax_totals["tax_amount_currency"] = tax_amount
tax_totals["tax_amount"] = tax_amount
subtotals = tax_totals["subtotals"]
subtotals[0]["tax_amount_currency"] = tax_amount
subtotals[0]["tax_amount"] = tax_amount
subtotals[0]["tax_groups"][0]["tax_amount_currency"] = tax_amount
subtotals[0]["tax_groups"][0]["tax_amount"] = tax_amount
tax_totals["subtotals"] = subtotals
invoice.tax_totals = tax_totals

def _prepare_own_account_transfer_move_vals(self):
self.ensure_one()
self = self.with_company(self.company_id)
Expand Down Expand Up @@ -102,6 +131,7 @@ def _prepare_own_account_transfer_move_vals(self):

def action_expense_create_invoice(self):
invoice = self.env["account.move"].create(self._prepare_invoice_values())
self._adjust_invoice_tax_amount(invoice)
attachments = self.env["ir.attachment"].search(
[("res_model", "=", self._name), ("res_id", "in", self.ids)]
)
Expand Down
18 changes: 17 additions & 1 deletion hr_expense_invoice/tests/test_hr_expense_invoice.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# Copyright 2017 Tecnativa - Vicent Cubells
# Copyright 2021 Tecnativa - Pedro M. Baeza
# Copyright 2021-2023 Tecnativa - Víctor Martínez
# Copyright 2021-2026 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import base64

from odoo import fields
from odoo.exceptions import UserError, ValidationError
from odoo.tests import Form, tagged
from odoo.tools import mute_logger

from odoo.addons.hr_expense.tests.common import TestExpenseCommon

Expand Down Expand Up @@ -289,3 +290,18 @@ def test_6_hr_expense_mixed_invoice_same_sheet(self):
self.assertEqual(self.invoice2.payment_state, "paid")
# 2 ap moves and 1 vendor bill
self.assertEqual(len(sheet.account_move_ids), 3)

@mute_logger("odoo.models.unlink")
def test_7_hr_expense_invoice_tax_amount(self):
expense = self.create_expense({"total_amount_currency": 10})
self.assertEqual(expense.untaxed_amount_currency, 8.7)
self.assertEqual(expense.tax_amount_currency, 1.30)
sheet = self._action_submit_expenses(expense)
self.assertEqual(sheet.total_amount, 10)
sheet.action_submit_sheet()
sheet.action_approve_expense_sheets()
expense.action_expense_create_invoice()
self.assertTrue(expense.invoice_id)
self.assertEqual(expense.invoice_id.amount_untaxed, 8.7)
self.assertEqual(expense.invoice_id.amount_total, 10)
self.assertEqual(sheet.total_amount, 10)
Loading