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

179 lines
6.2 KiB
Python

# Copyright 2021 Open Source Integrators
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from unittest.mock import patch
from odoo.tests import Form, common
from .mock_avatax import mock_response
class TestAvatax(common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.fiscal_position = cls.env["account.fiscal.position"].create(
{
"name": "Avatax Demo",
"is_avatax": True,
}
)
cls.customer = cls.env["res.partner"].create(
{
"name": "Customer",
"property_account_position_id": cls.fiscal_position.id,
"property_tax_exempt": True,
"property_exemption_number": "12321",
"property_exemption_code_id": cls.env.ref(
"account_avatax_oca.resale_type"
),
}
)
cls.invoice = cls.env["account.move"].create(
{
"move_type": "out_invoice",
"partner_id": cls.customer.id,
"invoice_line_ids": [
(0, 0, {"name": "Invoice Line", "price_unit": 10, "quantity": 10})
],
}
)
def test_100_onchange_customer_exempt(self):
self.invoice.partner_id = self.customer
self.assertEqual(
self.invoice.exemption_code, self.customer.property_exemption_number
)
@patch(
"odoo.addons.account_avatax_oca.models.res_company.Company.get_avatax_config_company"
)
@patch(
"odoo.addons.account_avatax_oca.models.avalara_salestax.AvalaraSalestax.create_transaction" # noqa: B950
)
def test_avatax_compute_tax(
self, mock_create_transaction, mock_get_avatax_config_company
):
avatax_config = self.env["avalara.salestax"].create(
{
"account_number": "123456",
"license_key": "123456",
"company_code": "DEFAULT",
"disable_tax_calculation": False,
"invoice_calculate_tax": False,
}
)
mock_get_avatax_config_company.return_value = avatax_config
# Force empty taxes to check only avatax taxes
self.invoice.invoice_line_ids.write(
{
"tax_ids": [(6, 0, [])],
}
)
invoice_line_data = [
{
"product_id": self.env["product.product"].create({"name": "Product 1"}),
"quantity": 5,
"price_unit": 102.5,
"rate": 0.06448,
},
{
"product_id": self.env["product.product"].create({"name": "Product 2"}),
"quantity": 4,
"price_unit": 25.5,
"rate": 0.03448,
},
]
self.invoice.invoice_line_ids.unlink()
invoice_form = Form(self.invoice)
for line_data in invoice_line_data:
with invoice_form.invoice_line_ids.new() as line:
line.product_id = line_data.get("product_id")
line.quantity = line_data.get("quantity")
line.price_unit = line_data.get("price_unit")
line.tax_ids.clear()
self.assertFalse(invoice_form.calculate_tax_on_save)
self.invoice = invoice_form.save()
self.assertFalse(self.invoice.calculate_tax_on_save)
mock_create_transaction.return_value = mock_response(
[
{
"product": line.product_id,
"quantity": line.quantity,
"price_unit": line.price_unit,
"discount_amount": line.price_subtotal
- ((line.price_unit * line.quantity) * (1 - line.discount * 100.0)),
"rate_expected": line_data.get("rate"),
"line_id": line.id,
}
for line, line_data in zip(
self.invoice.invoice_line_ids, invoice_line_data
)
]
)
self.invoice.invalidate_model(["invoice_line_ids"])
for line in self.invoice.invoice_line_ids:
self.assertFalse(bool(line.tax_ids))
self.invoice.action_post()
for line in self.invoice.invoice_line_ids:
self.assertTrue(bool(line.tax_ids))
self.assertEqual(
self.invoice.amount_tax + self.invoice.amount_untaxed,
self.invoice.amount_residual,
)
mock_get_avatax_config_company.assert_called()
mock_create_transaction.assert_called()
self.invoice.button_draft()
avatax_config.write(
{
"invoice_calculate_tax": True,
}
)
self.invoice.invoice_line_ids.unlink()
invoice_form = Form(self.invoice)
for line_data in invoice_line_data:
with invoice_form.invoice_line_ids.new() as line:
line.product_id = line_data.get("product_id")
line.quantity = line_data.get("quantity")
line.price_unit = line_data.get("price_unit")
line.tax_ids.clear()
self.assertTrue(invoice_form.calculate_tax_on_save)
self.invoice = invoice_form.save()
mock_create_transaction.return_value = mock_response(
[
{
"product": line.product_id,
"quantity": line.quantity,
"price_unit": line.price_unit,
"discount_amount": line.price_subtotal
- ((line.price_unit * line.quantity) * (1 - line.discount * 100.0)),
"rate_expected": line_data.get("rate"),
"line_id": line.id,
}
for line, line_data in zip(
self.invoice.invoice_line_ids, invoice_line_data
)
]
)
self.assertFalse(self.invoice.calculate_tax_on_save)
self.invoice.action_post()
for line in self.invoice.invoice_line_ids:
self.assertTrue(bool(line.tax_ids))
self.assertEqual(
self.invoice.amount_tax + self.invoice.amount_untaxed,
self.invoice.amount_residual,
)