mirror of
https://github.com/bringout/oca-financial.git
synced 2026-04-27 04:02:01 +02:00
179 lines
6.2 KiB
Python
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,
|
|
)
|