oca-ocb-accounting/odoo-bringout-oca-ocb-account/account/tests/test_taxes_global_discount.py
Ernad Husremovic 768b70e05e 19.0 vanilla
2026-03-09 09:30:07 +01:00

1986 lines
93 KiB
Python

from odoo.addons.account.tests.common import TestTaxCommon
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestTaxesGlobalDiscount(TestTaxCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.currency = cls.env.company.currency_id
cls.foreign_currency = cls.setup_other_currency('EUR')
cls.tax_groups = cls.env['account.tax.group'].create([
{'name': str(i), 'sequence': str(i)}
for i in range(1, 6)
])
def _test_taxes_l10n_in(self):
""" Test suite for the complex GST taxes in l10n_in. This case implies 3 percentage taxes:
t1: % tax, include_base_amount
t2: same % as t1, include_base_amount, not is_base_affected
t3: % tax
This case is complex because the amounts of t1 and t2 must always be the same.
Furthermore, it's a complicated setup due to the usage of include_base_amount / is_base_affected.
"""
tax1 = self.percent_tax(6, include_base_amount=True, tax_group_id=self.tax_groups[0].id)
tax2 = self.percent_tax(6, include_base_amount=True, is_base_affected=False, tax_group_id=self.tax_groups[1].id)
tax3 = self.percent_tax(3, tax_group_id=self.tax_groups[2].id)
taxes = tax1 + tax2 + tax3
document_params = self.init_document(
lines=[
{'price_unit': 15.89, 'tax_ids': taxes},
{'price_unit': 15.89, 'tax_ids': taxes},
],
currency=self.foreign_currency,
rate=5.0,
)
with self.with_tax_calculation_rounding_method('round_per_line'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 4.86,
'tax_amount': 0.98,
'total_amount_currency': 36.64,
'total_amount': 7.34,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 4.86,
'tax_amount': 0.98,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 1.9,
'tax_amount': 0.38,
'display_base_amount_currency': 31.78,
'display_base_amount': 6.36,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 1.9,
'tax_amount': 0.38,
'display_base_amount_currency': 31.78,
'display_base_amount': 6.36,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 35.58,
'base_amount': 7.12,
'tax_amount_currency': 1.06,
'tax_amount': 0.22,
'display_base_amount_currency': 35.58,
'display_base_amount': 7.12,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.15,
'base_amount': 6.23,
'tax_amount_currency': 4.76,
'tax_amount': 0.96,
'total_amount_currency': 35.91,
'total_amount': 7.19,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.15,
'base_amount': 6.23,
'tax_amount_currency': 4.76,
'tax_amount': 0.96,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.14,
'base_amount': 6.23,
'tax_amount_currency': 1.86,
'tax_amount': 0.37,
'display_base_amount_currency': 31.14,
'display_base_amount': 6.23,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.14,
'base_amount': 6.23,
'tax_amount_currency': 1.86,
'tax_amount': 0.37,
'display_base_amount_currency': 31.1414,
'display_base_amount': 6.23,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 34.87,
'base_amount': 6.98,
'tax_amount_currency': 1.04,
'tax_amount': 0.22,
'display_base_amount_currency': 34.87,
'display_base_amount': 6.98,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 2, expected_values
# Discount 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * (100 - percent) / 100.0)}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
# Discount 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 29.55,
'base_amount': 5.93,
'tax_amount_currency': 4.53,
'tax_amount': 0.9,
'total_amount_currency': 34.08,
'total_amount': 6.83,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 29.55,
'base_amount': 5.93,
'tax_amount_currency': 4.53,
'tax_amount': 0.9,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 29.56,
'base_amount': 5.91,
'tax_amount_currency': 1.77,
'tax_amount': 0.35,
'display_base_amount_currency': 29.56,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 29.56,
'base_amount': 5.91,
'tax_amount_currency': 1.77,
'tax_amount': 0.35,
'display_base_amount_currency': 29.56,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 33.09,
'base_amount': 6.62,
'tax_amount_currency': 0.99,
'tax_amount': 0.2,
'display_base_amount_currency': 33.09,
'display_base_amount': 6.62,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 7, expected_values
# Discount 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * (100 - percent) / 100.0)}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
# Discount 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 26.05,
'base_amount': 5.22,
'tax_amount_currency': 3.99,
'tax_amount': 0.8,
'total_amount_currency': 30.04,
'total_amount': 6.02,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 26.05,
'base_amount': 5.22,
'tax_amount_currency': 3.99,
'tax_amount': 0.8,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 26.06,
'base_amount': 5.22,
'tax_amount_currency': 1.56,
'tax_amount': 0.31,
'display_base_amount_currency': 26.06,
'display_base_amount': 5.22,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 26.06,
'base_amount': 5.22,
'tax_amount_currency': 1.56,
'tax_amount': 0.31,
'display_base_amount_currency': 26.06,
'display_base_amount': 5.22,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 29.18,
'base_amount': 5.84,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'display_base_amount_currency': 29.18,
'display_base_amount': 5.84,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 18, expected_values
# Discount 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * (100 - percent) / 100.0)}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
with self.with_tax_calculation_rounding_method('round_globally'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 4.89,
'tax_amount': 0.97,
'total_amount_currency': 36.67,
'total_amount': 7.33,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 4.89,
'tax_amount': 0.97,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 1.91,
'tax_amount': 0.38,
'display_base_amount_currency': 31.78,
'display_base_amount': 6.36,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 1.91,
'tax_amount': 0.38,
'display_base_amount_currency': 31.78,
'display_base_amount': 6.36,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 35.59,
'base_amount': 7.12,
'tax_amount_currency': 1.07,
'tax_amount': 0.21,
'display_base_amount_currency': 35.59,
'display_base_amount': 7.12,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.15,
'base_amount': 6.23,
'tax_amount_currency': 4.79,
'tax_amount': 0.95,
'total_amount_currency': 35.94,
'total_amount': 7.18,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.15,
'base_amount': 6.23,
'tax_amount_currency': 4.79,
'tax_amount': 0.95,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.14,
'base_amount': 6.23,
'tax_amount_currency': 1.87,
'tax_amount': 0.37,
'display_base_amount_currency': 31.14,
'display_base_amount': 6.23,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.14,
'base_amount': 6.23,
'tax_amount_currency': 1.87,
'tax_amount': 0.37,
'display_base_amount_currency': 31.14,
'display_base_amount': 6.23,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 34.88,
'base_amount': 6.98,
'tax_amount_currency': 1.05,
'tax_amount': 0.21,
'display_base_amount_currency': 34.88,
'display_base_amount': 6.98,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 2, expected_values
# Discount 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * (100 - percent) / 100.0)}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
# Discount 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 29.54,
'base_amount': 5.92,
'tax_amount_currency': 4.56,
'tax_amount': 0.9,
'total_amount_currency': 34.1,
'total_amount': 6.82,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 29.54,
'base_amount': 5.92,
'tax_amount_currency': 4.56,
'tax_amount': 0.9,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 29.56,
'base_amount': 5.91,
'tax_amount_currency': 1.78,
'tax_amount': 0.35,
'display_base_amount_currency': 29.56,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 29.56,
'base_amount': 5.91,
'tax_amount_currency': 1.78,
'tax_amount': 0.35,
'display_base_amount_currency': 29.56,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 33.1,
'base_amount': 6.62,
'tax_amount_currency': 1.0,
'tax_amount': 0.20,
'display_base_amount_currency': 33.1,
'display_base_amount': 6.62,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 7, expected_values
# Discount 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * (100 - percent) / 100.0)}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
# Discount 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 26.05,
'base_amount': 5.22,
'tax_amount_currency': 4.02,
'tax_amount': 0.79,
'total_amount_currency': 30.07,
'total_amount': 6.01,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 26.05,
'base_amount': 5.22,
'tax_amount_currency': 4.02,
'tax_amount': 0.79,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 26.06,
'base_amount': 5.22,
'tax_amount_currency': 1.57,
'tax_amount': 0.31,
'display_base_amount_currency': 26.06,
'display_base_amount': 5.22,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 26.06,
'base_amount': 5.22,
'tax_amount_currency': 1.57,
'tax_amount': 0.31,
'display_base_amount_currency': 26.06,
'display_base_amount': 5.22,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 29.18,
'base_amount': 5.84,
'tax_amount_currency': 0.88,
'tax_amount': 0.17,
'display_base_amount_currency': 29.18,
'display_base_amount': 5.84,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 18, expected_values
# Discount 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * (100 - percent) / 100.0)}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
tax1.price_include_override = 'tax_included'
tax2.price_include_override = 'tax_included'
document_params = self.init_document(
lines=[
{'price_unit': 17.79, 'tax_ids': taxes},
{'price_unit': 17.79, 'tax_ids': taxes},
],
currency=self.foreign_currency,
rate=5.0,
)
with self.with_tax_calculation_rounding_method('round_per_line'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 4.86,
'tax_amount': 0.98,
'total_amount_currency': 36.64,
'total_amount': 7.34,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 4.86,
'tax_amount': 0.98,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 1.9,
'tax_amount': 0.38,
'display_base_amount_currency': 31.78,
'display_base_amount': 6.36,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.78,
'base_amount': 6.36,
'tax_amount_currency': 1.9,
'tax_amount': 0.38,
'display_base_amount_currency': 31.78,
'display_base_amount': 6.36,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 35.58,
'base_amount': 7.12,
'tax_amount_currency': 1.06,
'tax_amount': 0.22,
'display_base_amount_currency': 35.58,
'display_base_amount': 7.12,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.15,
'base_amount': 6.23,
'tax_amount_currency': 4.76,
'tax_amount': 0.96,
'total_amount_currency': 35.91,
'total_amount': 7.19,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.15,
'base_amount': 6.23,
'tax_amount_currency': 4.76,
'tax_amount': 0.96,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.14,
'base_amount': 6.23,
'tax_amount_currency': 1.86,
'tax_amount': 0.37,
'display_base_amount_currency': 31.14,
'display_base_amount': 6.23,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.14,
'base_amount': 6.23,
'tax_amount_currency': 1.86,
'tax_amount': 0.37,
'display_base_amount_currency': 31.14,
'display_base_amount': 6.23,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 34.87,
'base_amount': 6.98,
'tax_amount_currency': 1.04,
'tax_amount': 0.22,
'display_base_amount_currency': 34.87,
'display_base_amount': 6.98,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 2, expected_values
# Discount 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * (100 - percent) / 100.0)}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
# Discount 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 29.55,
'base_amount': 5.93,
'tax_amount_currency': 4.53,
'tax_amount': 0.9,
'total_amount_currency': 34.08,
'total_amount': 6.83,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 29.55,
'base_amount': 5.93,
'tax_amount_currency': 4.53,
'tax_amount': 0.9,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 29.56,
'base_amount': 5.91,
'tax_amount_currency': 1.77,
'tax_amount': 0.35,
'display_base_amount_currency': 29.56,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 29.56,
'base_amount': 5.91,
'tax_amount_currency': 1.77,
'tax_amount': 0.35,
'display_base_amount_currency': 29.56,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 33.09,
'base_amount': 6.62,
'tax_amount_currency': 0.99,
'tax_amount': 0.2,
'display_base_amount_currency': 33.09,
'display_base_amount': 6.62,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 7, expected_values
# Discount 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * (100 - percent) / 100.0)}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
# Discount 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 26.05,
'base_amount': 5.22,
'tax_amount_currency': 3.99,
'tax_amount': 0.8,
'total_amount_currency': 30.04,
'total_amount': 6.02,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 26.05,
'base_amount': 5.22,
'tax_amount_currency': 3.99,
'tax_amount': 0.8,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 26.06,
'base_amount': 5.22,
'tax_amount_currency': 1.56,
'tax_amount': 0.31,
'display_base_amount_currency': 26.06,
'display_base_amount': 5.22,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 26.06,
'base_amount': 5.22,
'tax_amount_currency': 1.56,
'tax_amount': 0.31,
'display_base_amount_currency': 26.06,
'display_base_amount': 5.22,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 29.18,
'base_amount': 5.84,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'display_base_amount_currency': 29.18,
'display_base_amount': 5.84,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 18, expected_values
# Discount 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * (100 - percent) / 100.0)}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
with self.with_tax_calculation_rounding_method('round_globally'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.77,
'base_amount': 6.35,
'tax_amount_currency': 4.89,
'tax_amount': 0.97,
'total_amount_currency': 36.66,
'total_amount': 7.32,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.77,
'base_amount': 6.35,
'tax_amount_currency': 4.89,
'tax_amount': 0.97,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.76,
'base_amount': 6.35,
'tax_amount_currency': 1.91,
'tax_amount': 0.38,
'display_base_amount_currency': 31.76,
'display_base_amount': 6.35,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.76,
'base_amount': 6.35,
'tax_amount_currency': 1.91,
'tax_amount': 0.38,
'display_base_amount_currency': 31.76,
'display_base_amount': 6.35,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 35.58,
'base_amount': 7.12,
'tax_amount_currency': 1.07,
'tax_amount': 0.21,
'display_base_amount_currency': 35.58,
'display_base_amount': 7.12,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 31.14,
'base_amount': 6.22,
'tax_amount_currency': 4.79,
'tax_amount': 0.95,
'total_amount_currency': 35.93,
'total_amount': 7.17,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 31.14,
'base_amount': 6.22,
'tax_amount_currency': 4.79,
'tax_amount': 0.95,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 31.12,
'base_amount': 6.22,
'tax_amount_currency': 1.87,
'tax_amount': 0.37,
'display_base_amount_currency': 31.12,
'display_base_amount': 6.22,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 31.12,
'base_amount': 6.22,
'tax_amount_currency': 1.87,
'tax_amount': 0.37,
'display_base_amount_currency': 31.12,
'display_base_amount': 6.22,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 34.87,
'base_amount': 6.98,
'tax_amount_currency': 1.05,
'tax_amount': 0.21,
'display_base_amount_currency': 34.87,
'display_base_amount': 6.98,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 2, expected_values
# Discount 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.66 * (100 - percent) / 100.0)}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
# Discount 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 29.53,
'base_amount': 5.91,
'tax_amount_currency': 4.56,
'tax_amount': 0.9,
'total_amount_currency': 34.09,
'total_amount': 6.81,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 29.53,
'base_amount': 5.91,
'tax_amount_currency': 4.56,
'tax_amount': 0.9,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 29.54,
'base_amount': 5.91,
'tax_amount_currency': 1.78,
'tax_amount': 0.35,
'display_base_amount_currency': 29.54,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 29.54,
'base_amount': 5.91,
'tax_amount_currency': 1.78,
'tax_amount': 0.35,
'display_base_amount_currency': 29.54,
'display_base_amount': 5.91,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 33.09,
'base_amount': 6.62,
'tax_amount_currency': 1.0,
'tax_amount': 0.20,
'display_base_amount_currency': 33.09,
'display_base_amount': 6.62,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 7, expected_values
# Discount 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.66 * (100 - percent) / 100.0)}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
# Discount 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 26.04,
'base_amount': 5.21,
'tax_amount_currency': 4.02,
'tax_amount': 0.79,
'total_amount_currency': 30.06,
'total_amount': 6.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 26.04,
'base_amount': 5.21,
'tax_amount_currency': 4.02,
'tax_amount': 0.79,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 26.04,
'base_amount': 5.21,
'tax_amount_currency': 1.57,
'tax_amount': 0.31,
'display_base_amount_currency': 26.04,
'display_base_amount': 5.21,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 26.04,
'base_amount': 5.21,
'tax_amount_currency': 1.57,
'tax_amount': 0.31,
'display_base_amount_currency': 26.04,
'display_base_amount': 5.21,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 29.18,
'base_amount': 5.84,
'tax_amount_currency': 0.88,
'tax_amount': 0.17,
'display_base_amount_currency': 29.18,
'display_base_amount': 5.84,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 18, expected_values
# Discount 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.66 * (100 - percent) / 100.0)}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
def test_taxes_l10n_in_generic_helpers(self):
for test_mode, document, soft_checking, amount_type, amount, expected_values in self._test_taxes_l10n_in():
with self.subTest(test_code=test_mode, amount=amount):
self.assert_global_discount(document, amount_type, amount, expected_values, soft_checking=soft_checking)
self._run_js_tests()
def _test_taxes_l10n_br(self):
""" Test suite for the complex division taxes in l10n_be. This case implies 5 division taxes
and is quite complicated to handle because they have to be computed all together and are
computed as part of the price_unit.
"""
tax1 = self.division_tax(5, tax_group_id=self.tax_groups[0].id)
tax2 = self.division_tax(3, tax_group_id=self.tax_groups[1].id)
tax3 = self.division_tax(0.65, tax_group_id=self.tax_groups[2].id)
tax4 = self.division_tax(9, tax_group_id=self.tax_groups[3].id)
tax5 = self.division_tax(15, tax_group_id=self.tax_groups[4].id)
taxes = tax1 + tax2 + tax3 + tax4 + tax5
document_params = self.init_document(
lines=[
{'price_unit': 32.33, 'tax_ids': taxes},
{'price_unit': 32.33, 'tax_ids': taxes},
],
currency=self.foreign_currency,
rate=3.0,
)
with self.with_tax_calculation_rounding_method('round_per_line'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 31.34,
'tax_amount': 10.44,
'total_amount_currency': 96.0,
'total_amount': 32.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 31.34,
'tax_amount': 10.44,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 4.8,
'tax_amount': 1.6,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.56,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 2.88,
'tax_amount': 0.96,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.56,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 0.62,
'tax_amount': 0.2,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.56,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 8.64,
'tax_amount': 2.88,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.56,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 14.4,
'tax_amount': 4.8,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.56,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 30.71,
'tax_amount': 10.23,
'total_amount_currency': 94.08,
'total_amount': 31.36,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 30.71,
'tax_amount': 10.23,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 4.7,
'tax_amount': 1.57,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.13,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 2.82,
'tax_amount': 0.94,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.13,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 0.61,
'tax_amount': 0.20,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.13,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 8.47,
'tax_amount': 2.82,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.13,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 14.11,
'tax_amount': 4.7,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.13,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * (100 - percent) / 100.0)}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
with self.with_tax_calculation_rounding_method('round_globally'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 31.34,
'tax_amount': 10.45,
'total_amount_currency': 96.0,
'total_amount': 32.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 31.34,
'tax_amount': 10.45,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 4.8,
'tax_amount': 1.6,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.55,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 2.88,
'tax_amount': 0.96,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.55,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 0.62,
'tax_amount': 0.21,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.55,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 8.64,
'tax_amount': 2.88,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.55,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 14.4,
'tax_amount': 4.8,
'display_base_amount_currency': 64.66,
'display_base_amount': 21.55,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 30.71,
'tax_amount': 10.24,
'total_amount_currency': 94.08,
'total_amount': 31.36,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 30.71,
'tax_amount': 10.24,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 4.7,
'tax_amount': 1.57,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.12,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 2.82,
'tax_amount': 0.94,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.12,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 0.61,
'tax_amount': 0.21,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.12,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 8.47,
'tax_amount': 2.82,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.12,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 14.11,
'tax_amount': 4.7,
'display_base_amount_currency': 63.37,
'display_base_amount': 21.12,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * (100 - percent) / 100.0)}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
taxes.price_include_override = 'tax_included'
document_params = self.init_document(
lines=[
{'price_unit': 48.0, 'tax_ids': taxes},
{'price_unit': 48.0, 'tax_ids': taxes},
],
currency=self.foreign_currency,
rate=3.0,
)
with self.with_tax_calculation_rounding_method('round_per_line'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 31.34,
'tax_amount': 10.44,
'total_amount_currency': 96.0,
'total_amount': 32.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 31.34,
'tax_amount': 10.44,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 4.8,
'tax_amount': 1.6,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 2.88,
'tax_amount': 0.96,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 0.62,
'tax_amount': 0.2,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 8.64,
'tax_amount': 2.88,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 64.66,
'base_amount': 21.56,
'tax_amount_currency': 14.4,
'tax_amount': 4.8,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 30.71,
'tax_amount': 10.23,
'total_amount_currency': 94.08,
'total_amount': 31.36,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 30.71,
'tax_amount': 10.23,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 4.7,
'tax_amount': 1.57,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 2.82,
'tax_amount': 0.94,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 0.61,
'tax_amount': 0.2,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 8.47,
'tax_amount': 2.82,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 63.37,
'base_amount': 21.13,
'tax_amount_currency': 14.11,
'tax_amount': 4.7,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * (100 - percent) / 100.0)}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
with self.with_tax_calculation_rounding_method('round_globally'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 31.34,
'tax_amount': 10.45,
'total_amount_currency': 96.0,
'total_amount': 32.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 31.34,
'tax_amount': 10.45,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 4.8,
'tax_amount': 1.6,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 2.88,
'tax_amount': 0.96,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 0.62,
'tax_amount': 0.21,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 8.64,
'tax_amount': 2.88,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 64.66,
'base_amount': 21.55,
'tax_amount_currency': 14.4,
'tax_amount': 4.8,
'display_base_amount_currency': 96.0,
'display_base_amount': 32.0,
},
],
},
],
})
# Discount 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 30.71,
'tax_amount': 10.24,
'total_amount_currency': 94.08,
'total_amount': 31.36,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 30.71,
'tax_amount': 10.24,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 4.7,
'tax_amount': 1.57,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 2.82,
'tax_amount': 0.94,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 0.61,
'tax_amount': 0.21,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 8.47,
'tax_amount': 2.82,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 63.37,
'base_amount': 21.12,
'tax_amount_currency': 14.11,
'tax_amount': 4.7,
'display_base_amount_currency': 94.08,
'display_base_amount': 31.36,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * (100 - percent) / 100.0)}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
def test_taxes_l10n_br_generic_helpers(self):
for test_mode, document, soft_checking, amount_type, amount, expected_values in self._test_taxes_l10n_br():
with self.subTest(test_code=test_mode, amount=amount):
self.assert_global_discount(document, amount_type, amount, expected_values, soft_checking=soft_checking)
self._run_js_tests()
def _test_taxes_l10n_be(self):
""" Test suite for the mixing of fixed and percentage taxes in l10n_be. This case implies a fixed tax that affect
the base of the following percentage tax. We also have to maintain the case in which the fixed tax is after the percentage
one.
"""
tax1 = self.fixed_tax(1, include_base_amount=True, tax_group_id=self.tax_groups[0].id)
tax2 = self.percent_tax(21, tax_group_id=self.tax_groups[1].id)
taxes = tax1 + tax2
document_params = self.init_document(
lines=[
{'price_unit': 16.79, 'tax_ids': taxes},
{'price_unit': 16.79, 'tax_ids': taxes},
],
currency=self.foreign_currency,
rate=0.5,
)
with self.with_tax_calculation_rounding_method('round_per_line'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 9.48,
'tax_amount': 18.96,
'total_amount_currency': 43.06,
'total_amount': 86.12,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 9.48,
'tax_amount': 18.96,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 35.58,
'base_amount': 71.16,
'tax_amount_currency': 7.48,
'tax_amount': 14.96,
'display_base_amount_currency': 35.58,
'display_base_amount': 71.16,
},
],
},
],
})
# Discount 2%
# The total of the document will be 43.06.
# However, only the percentage tax is considered in the discount. So the discount will be based on:
# 2 * 16.79 * 1.21 = 40.6318 ~= 40.63
# For a discount of 2%,
# 40.63 * 0.02 = 0.81 is the discount amount.
# 43.06 - 0.81 = 42.25 is the total amount after discount.
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 32.91,
'base_amount': 65.81,
'tax_amount_currency': 9.34,
'tax_amount': 18.68,
'total_amount_currency': 42.25,
'total_amount': 84.49,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 32.91,
'base_amount': 65.81,
'tax_amount_currency': 9.34,
'tax_amount': 18.68,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 34.91,
'base_amount': 69.82,
'tax_amount_currency': 7.34,
'tax_amount': 14.68,
'display_base_amount_currency': 34.91,
'display_base_amount': 69.82,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.06 - (40.64 * percent / 100.0))}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
with self.with_tax_calculation_rounding_method('round_globally'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 9.47,
'tax_amount': 18.94,
'total_amount_currency': 43.05,
'total_amount': 86.1,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 9.47,
'tax_amount': 18.94,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 35.58,
'base_amount': 71.16,
'tax_amount_currency': 7.47,
'tax_amount': 14.94,
'display_base_amount_currency': 35.58,
'display_base_amount': 71.16,
},
],
},
],
})
# Discount 2%
# The total of the document will be 43.05.
# However, only the percentage tax is considered in the discount. So the discount will be based on:
# 2 * 16.79 * 1.21 = 40.6318 ~= 40.63
# For a discount of 2%,
# 40.63 * 0.02 = 0.81 is the discount amount.
# 43.05 - 0.81 = 42.24 is the total amount after discount.
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 32.91,
'base_amount': 65.81,
'tax_amount_currency': 9.33,
'tax_amount': 18.66,
'total_amount_currency': 42.24,
'total_amount': 84.47,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 32.91,
'base_amount': 65.81,
'tax_amount_currency': 9.33,
'tax_amount': 18.66,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 34.91,
'base_amount': 69.82,
'tax_amount_currency': 7.33,
'tax_amount': 14.66,
'display_base_amount_currency': 34.91,
'display_base_amount': 69.82,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.05 - (40.63 * percent / 100.0))}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
taxes.price_include_override = 'tax_included'
document_params = self.init_document(
lines=[
{'price_unit': 21.53, 'tax_ids': taxes},
{'price_unit': 21.53, 'tax_ids': taxes},
],
currency=self.foreign_currency,
rate=0.5,
)
with self.with_tax_calculation_rounding_method('round_per_line'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 9.48,
'tax_amount': 18.96,
'total_amount_currency': 43.06,
'total_amount': 86.12,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 9.48,
'tax_amount': 18.96,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 35.58,
'base_amount': 71.16,
'tax_amount_currency': 7.48,
'tax_amount': 14.96,
'display_base_amount_currency': 35.58,
'display_base_amount': 71.16,
},
],
},
],
})
# Discount 2%
# The total of the document will be 43.06.
# However, only the percentage tax is considered in the discount. So the discount will be based on:
# 2 * 16.79338843 * 1.21 = 40.64
# For a discount of 2%,
# 40.64 * 0.02 = 0.81 is the discount amount.
# 43.06 - 0.81 = 42.25 is the total amount after discount.
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 32.91,
'base_amount': 65.81,
'tax_amount_currency': 9.34,
'tax_amount': 18.68,
'total_amount_currency': 42.25,
'total_amount': 84.49,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 32.91,
'base_amount': 65.81,
'tax_amount_currency': 9.34,
'tax_amount': 18.68,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.58,
'base_amount': 67.16,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 34.91,
'base_amount': 69.82,
'tax_amount_currency': 7.34,
'tax_amount': 14.68,
'display_base_amount_currency': 34.91,
'display_base_amount': 69.82,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.06 - (40.64 * percent / 100.0))}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
with self.with_tax_calculation_rounding_method('round_globally'):
document = self.populate_document(document_params)
self.assert_py_tax_totals_summary(document, {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 33.59,
'base_amount': 67.17,
'tax_amount_currency': 9.47,
'tax_amount': 18.95,
'total_amount_currency': 43.06,
'total_amount': 86.12,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 33.59,
'base_amount': 67.17,
'tax_amount_currency': 9.47,
'tax_amount': 18.95,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.59,
'base_amount': 67.17,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 35.59,
'base_amount': 71.17,
'tax_amount_currency': 7.47,
'tax_amount': 14.95,
'display_base_amount_currency': 35.59,
'display_base_amount': 71.17,
},
],
},
],
})
# Discount 2%
# The total of the document will be 43.06.
# However, only the percentage tax is considered in the discount. So the discount will be based on:
# 2 * 16.79338843 * 1.21 = 40.64
# For a discount of 2%,
# 40.64 * 0.02 = 0.81 is the discount amount.
# 43.06 - 0.81 = 42.25 is the total amount after discount.
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 32.92,
'base_amount': 65.82,
'tax_amount_currency': 9.33,
'tax_amount': 18.67,
'total_amount_currency': 42.25,
'total_amount': 84.49,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 32.92,
'base_amount': 65.82,
'tax_amount_currency': 9.33,
'tax_amount': 18.67,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 33.59,
'base_amount': 67.17,
'tax_amount_currency': 2.0,
'tax_amount': 4.0,
'display_base_amount_currency': False,
'display_base_amount': False,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 34.92,
'base_amount': 69.83,
'tax_amount_currency': 7.33,
'tax_amount': 14.67,
'display_base_amount_currency': 34.92,
'display_base_amount': 69.83,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 2, expected_values
# Discount 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.06 - (40.64 * percent / 100.0))}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
def test_taxes_l10n_be_generic_helpers(self):
for test_mode, document, soft_checking, amount_type, amount, expected_values in self._test_taxes_l10n_be():
with self.subTest(test_code=test_mode, amount=amount):
self.assert_global_discount(document, amount_type, amount, expected_values, soft_checking=soft_checking)
self._run_js_tests()