Odoo18-Base/addons/account/tests/test_taxes_computation.py

895 lines
28 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
from odoo.addons.account.tests.common import TestTaxCommon
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestTaxesComputation(TestTaxCommon):
def test_taxes_ordering(self):
tax_division = self.division_tax(10.0, sequence=1)
tax_fixed = self.fixed_tax(10.0, sequence=2)
tax_percent = self.percent_tax(10.0, sequence=3)
tax_group = self.group_of_taxes(tax_fixed + tax_percent, sequence=4)
self.assert_taxes_computation(
tax_group | tax_division,
200.0,
{
'total_included': 252.22,
'total_excluded': 200.0,
'taxes_data': (
(200.0, 22.22),
(200.0, 10.0),
(200.0, 20.0),
),
},
)
tax_percent1 = self.percent_tax(0.0, price_include_override='tax_included')
tax_percent2 = self.percent_tax(8.0, price_include_override='tax_included')
tax_group1 = self.group_of_taxes(tax_percent1, sequence=5)
tax_group2 = self.group_of_taxes(tax_percent2, sequence=6)
self.assert_taxes_computation(
tax_group1 | tax_group2,
124.4,
{
'total_included': 124.4,
'total_excluded': 115.19,
'taxes_data': (
(115.19, 0.0),
(115.19, 9.21),
),
},
)
self._run_js_tests()
def test_random_case_1(self):
tax_percent_8_price_included = self.percent_tax(8.0, price_include_override='tax_included')
tax_percent_0_price_included = self.percent_tax(0.0, price_include_override='tax_included')
self.assert_taxes_computation(
tax_percent_8_price_included + tax_percent_0_price_included,
124.40,
{
'total_included': 124.40,
'total_excluded': 115.19,
'taxes_data': (
(115.19, 9.21),
(115.19, 0.0),
),
},
rounding_method='round_per_line',
)
self.assert_taxes_computation(
tax_percent_8_price_included + tax_percent_0_price_included,
124.40,
{
'total_included': 124.40,
'total_excluded': 115.185185,
'taxes_data': (
(115.185185, 9.214815),
(115.185185, 0.0),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_2(self):
tax_percent_5_price_included = self.percent_tax(5.0, price_include_override='tax_included')
currency_dp_half = 0.05
self.assert_taxes_computation(
tax_percent_5_price_included,
5.0,
{
'total_included': 5.0,
'total_excluded': 4.75,
'taxes_data': (
(4.75, 0.25),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_half,
)
self.assert_taxes_computation(
tax_percent_5_price_included,
10.0,
{
'total_included': 10.0,
'total_excluded': 9.5,
'taxes_data': (
(9.5, 0.5),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_half,
)
self.assert_taxes_computation(
tax_percent_5_price_included,
50.0,
{
'total_included': 50.0,
'total_excluded': 47.6,
'taxes_data': (
(47.6, 2.4),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_half,
)
self.assert_taxes_computation(
tax_percent_5_price_included,
5.0,
{
'total_included': 5.0,
'total_excluded': 4.761905,
'taxes_data': (
(4.761905, 0.238095),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_5_price_included,
10.0,
{
'total_included': 10.0,
'total_excluded': 9.52381,
'taxes_data': (
(9.52381, 0.47619),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_5_price_included,
50.0,
{
'total_included': 50.0,
'total_excluded': 47.619048,
'taxes_data': (
(47.619048, 2.380952),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_3(self):
tax_percent_15_price_excluded = self.percent_tax(15.0)
tax_percent_5_5_price_included = self.percent_tax(5.5, price_include_override='tax_included')
self.assert_taxes_computation(
tax_percent_15_price_excluded + tax_percent_5_5_price_included,
2300.0,
{
'total_included': 2627.01,
'total_excluded': 2180.09,
'taxes_data': (
(2180.09, 327.01),
(2180.09, 119.91),
),
},
rounding_method='round_per_line',
)
self.assert_taxes_computation(
tax_percent_15_price_excluded + tax_percent_5_5_price_included,
2300.0,
{
'total_included': 2627.014218,
'total_excluded': 2180.094787,
'taxes_data': (
(2180.094787, 327.014218),
(2180.094787, 119.905213),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_4(self):
tax_percent_12_price_included = self.percent_tax(12.0, price_include_override='tax_included')
self.assert_taxes_computation(
tax_percent_12_price_included,
52.50,
{
'total_included': 52.50,
'total_excluded': 46.87,
'taxes_data': (
(46.87, 5.63),
),
},
rounding_method='round_per_line',
)
self.assert_taxes_computation(
tax_percent_12_price_included,
52.50,
{
'total_included': 52.50,
'total_excluded': 46.875,
'taxes_data': (
(46.875, 5.625),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_5(self):
tax_percent_19 = self.percent_tax(19.0)
tax_percent_19_price_included = self.percent_tax(19.0, price_include_override='tax_included')
currency_dp_0 = 1.0
self.assert_taxes_computation(
tax_percent_19,
22689.0,
{
'total_included': 27000.0,
'total_excluded': 22689.0,
'taxes_data': (
(22689, 4311),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_0,
)
self.assert_taxes_computation(
tax_percent_19,
9176.0,
{
'total_included': 10919.0,
'total_excluded': 9176.0,
'taxes_data': (
(9176, 1743),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_0,
)
self.assert_taxes_computation(
tax_percent_19_price_included,
27000.0,
{
'total_included': 27000.0,
'total_excluded': 22689.0,
'taxes_data': (
(22689.0, 4311.0),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_0,
)
self.assert_taxes_computation(
tax_percent_19_price_included,
10920.0,
{
'total_included': 10920.0,
'total_excluded': 9176.0,
'taxes_data': (
(9176.0, 1744.0),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_0,
)
self.assert_taxes_computation(
tax_percent_19,
22689.0,
{
'total_included': 26999.91,
'total_excluded': 22689.0,
'taxes_data': (
(22689, 4310.91),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_19,
9176.0,
{
'total_included': 10919.44,
'total_excluded': 9176.0,
'taxes_data': (
(9176, 1743.44),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_19_price_included,
27000.0,
{
'total_included': 27000.0,
'total_excluded': 22689.07563,
'taxes_data': (
(22689.07563, 4310.92437),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_19_price_included,
10920.0,
{
'total_included': 10920.0,
'total_excluded': 9176.470588,
'taxes_data': (
(9176.470588, 1743.529412),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_6(self):
tax_percent_20_price_included = self.percent_tax(20.0, price_include_override='tax_included')
currency_dp_6 = 0.000001
self.assert_taxes_computation(
tax_percent_20_price_included,
399.999999,
{
'total_included': 399.999999,
'total_excluded': 333.333332,
'taxes_data': (
# 399.999999 / 1.20 * 0.20 ~= 66.666667
# 399.999999 - 66.666667 = 333.333332
(333.333332, 66.666667),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_6,
)
self.assert_taxes_computation(
tax_percent_20_price_included,
399.999999,
{
'total_included': 399.999999,
'total_excluded': 333.3333325,
'taxes_data': (
(333.3333325, 66.6666665),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_7(self):
tax_percent_21_price_included = self.percent_tax(21.0, price_include_override='tax_included')
currency_dp_6 = 0.000001
self.assert_taxes_computation(
tax_percent_21_price_included,
11.90,
{
'total_included': 11.90,
'total_excluded': 9.83,
'taxes_data': (
(9.83, 2.07),
),
},
rounding_method='round_per_line',
)
self.assert_taxes_computation(
tax_percent_21_price_included,
2.80,
{
'total_included': 2.80,
'total_excluded': 2.31,
'taxes_data': (
(2.31, 0.49),
),
},
rounding_method='round_per_line',
)
self.assert_taxes_computation(
tax_percent_21_price_included,
7.0,
{
'total_included': 7.0,
'total_excluded': 5.785124,
'taxes_data': (
(5.785124, 1.214876),
),
},
rounding_method='round_per_line',
precision_rounding=currency_dp_6,
)
self.assert_taxes_computation(
tax_percent_21_price_included,
11.90,
{
'total_included': 11.90,
'total_excluded': 9.834711,
'taxes_data': (
(9.834711, 2.065289),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_21_price_included,
2.80,
{
'total_included': 2.80,
'total_excluded': 2.31405,
'taxes_data': (
(2.31405, 0.48595),
),
},
rounding_method='round_globally',
)
self.assert_taxes_computation(
tax_percent_21_price_included,
7.0,
{
'total_included': 7.0,
'total_excluded': 5.785124,
'taxes_data': (
(5.785124, 1.214876),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_random_case_8(self):
tax_percent_20_withholding = self.percent_tax(-20.0)
tax_percent_4 = self.percent_tax(4.0, include_base_amount=True)
tax_percent_22 = self.percent_tax(22.0)
taxes = tax_percent_20_withholding + tax_percent_4 + tax_percent_22
self.assert_taxes_computation(
taxes,
50.0,
{
'total_included': 53.44,
'total_excluded': 50.0,
'taxes_data': (
(50.0, -10.0),
(50.0, 2.0),
(52.0, 11.44),
),
},
)
self._run_js_tests()
def test_random_case_9(self):
tax_division_100 = self.division_tax(100.0, price_include_override='tax_included')
self.assert_taxes_computation(
tax_division_100,
100.0,
{
'total_included': 100.0,
'total_excluded': 0.0,
'taxes_data': (
(0.0, 100.0),
),
},
)
self._run_js_tests()
def test_fixed_tax_price_included_affect_base_on_0(self):
tax = self.fixed_tax(0.05, price_include_override='tax_included', include_base_amount=True)
self.assert_taxes_computation(
tax,
0.0,
{
'total_included': 0.0,
'total_excluded': -0.05,
'taxes_data': (
(-0.05, 0.05),
),
},
)
self._run_js_tests()
def test_percent_taxes_for_l10n_in(self):
tax1 = self.percent_tax(6)
tax2 = self.percent_tax(6)
tax3 = self.percent_tax(3)
self.assert_taxes_computation(
tax1 + tax2 + tax3,
100.0,
{
'total_included': 115.0,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 6.0),
(100.0, 6.0),
(100.0, 3.0),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount is_base_affected
# ----------------------------------------------------------------
# tax1 T T
# tax2 T
# tax3 T
tax1.include_base_amount = True
self.assert_taxes_computation(
tax1 + tax2 + tax3,
100.0,
{
'total_included': 115.54,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 6.0),
(106.0, 6.36),
(106.0, 3.18),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount is_base_affected
# ----------------------------------------------------------------
# tax1 T T
# tax2 T T
# tax3 T
tax2.include_base_amount = True
self.assert_taxes_computation(
tax1 + tax2 + tax3,
100.0,
{
'total_included': 115.7308,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 6.0),
(106.0, 6.36),
(112.36, 3.3708),
),
},
rounding_method='round_globally',
excluded_special_modes=['total_included'], # Impossible.
)
# tax price_incl incl_base_amount is_base_affected
# ----------------------------------------------------------------
# tax1 T T
# tax2 T
# tax3 T
tax2.is_base_affected = False
self.assert_taxes_computation(
tax1 + tax2 + tax3,
100.0,
{
'total_included': 115.36,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 6.0),
(100.0, 6.0),
(112.0, 3.36),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount is_base_affected
# ----------------------------------------------------------------
# tax1 T T T
# tax2 T T
# tax3 T
tax1.price_include_override = 'tax_included'
tax2.price_include_override = 'tax_included'
self.assert_taxes_computation(
tax1 + tax2 + tax3,
112.0,
{
'total_included': 115.36,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 6.0),
(100.0, 6.0),
(112.0, 3.36),
),
},
rounding_method='round_globally',
)
# Ensure tax1 & tax2 give always the same result.
self.assert_taxes_computation(
tax1 + tax2,
17.79,
{
'total_included': 17.79,
'total_excluded': 15.883929,
'taxes_data': (
(15.883929, 0.953036),
(15.883929, 0.953036),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_division_taxes_for_l10n_br(self):
tax1 = self.division_tax(5)
tax2 = self.division_tax(3)
tax3 = self.division_tax(0.65)
tax4 = self.division_tax(9)
tax5 = self.division_tax(15)
# Same of tax4/tax5 except the amount is based on 32% of the base amount.
self.assert_taxes_computation(
tax1 + tax2 + tax3 + tax4 + tax5,
32.33,
{
'total_included': 48.00297,
'total_excluded': 32.33,
'taxes_data': (
(32.33, 2.400148),
(32.33, 1.440089),
(32.33, 0.312019),
(32.33, 4.320267),
(32.33, 7.200445),
),
},
rounding_method='round_globally',
)
(tax1 + tax2 + tax3 + tax4 + tax5).price_include_override = 'tax_included'
self.assert_taxes_computation(
tax1 + tax2 + tax3 + tax4 + tax5,
48.0,
{
'total_included': 48.0,
'total_excluded': 32.328,
'taxes_data': (
(32.328, 2.4),
(32.328, 1.44),
(32.328, 0.312),
(32.328, 4.32),
(32.328, 7.2),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_fixed_taxes_for_l10n_be(self):
tax1 = self.fixed_tax(1)
tax2 = self.percent_tax(21)
tax3 = self.fixed_tax(2)
self.assert_taxes_computation(
tax1 + tax2 + tax3,
20.0,
{
'total_included': 136.0,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 5.0),
(100.0, 21.0),
(100.0, 10.0),
),
},
quantity=5,
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1 T
# tax2
# tax3
tax1.include_base_amount = True
self.assert_taxes_computation(
tax1 + tax2 + tax3,
19.0,
{
'total_included': 131.0,
'total_excluded': 95.0,
'taxes_data': (
(95.0, 5.0),
(100.0, 21.0),
(100.0, 10.0),
),
},
quantity=5,
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1 T
# tax2 T
# tax3
tax2.price_include_override = 'tax_included'
self.assert_taxes_computation(
tax1 + tax2 + tax3,
120.0,
{
'total_included': 123.0,
'total_excluded': 99.0,
'taxes_data': (
(99.0, 1.0),
(100.0, 21.0),
(121.0, 2.0),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1 T
# tax2 T T
# tax3
tax2.include_base_amount = True
self.assert_taxes_computation(
tax1 + tax2 + tax3,
120.0,
{
'total_included': 123.0,
'total_excluded': 99.0,
'taxes_data': (
(99.0, 1.0),
(100.0, 21.0),
(121.0, 2.0),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1
# tax2 T T
# tax3
tax1.include_base_amount = False
self.assert_taxes_computation(
tax1 + tax2 + tax3,
121.0,
{
'total_included': 124.0,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 1.0),
(100.0, 21.0),
(121.0, 2.0),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1
# tax2 T
# tax3
tax2.price_include_override = 'tax_excluded'
self.assert_taxes_computation(
tax1 + tax2 + tax3,
100.0,
{
'total_included': 124.0,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 1.0),
(100.0, 21.0),
(121.0, 2.0),
),
},
rounding_method='round_globally'
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1 T
# tax2 T T
# tax3
tax1.price_include_override = 'tax_included'
tax2.price_include_override = 'tax_included'
self.assert_taxes_computation(
tax1 + tax2 + tax3,
122.0,
{
'total_included': 124.0,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 1.0),
(100.0, 21.0),
(122.0, 2.0),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1 T
# tax2 T
# tax3
tax2.include_base_amount = False
self.assert_taxes_computation(
tax1 + tax2 + tax3,
122.0,
{
'total_included': 124.0,
'total_excluded': 100.0,
'taxes_data': (
(100.0, 1.0),
(100.0, 21.0),
(122.0, 2.0),
),
},
rounding_method='round_globally',
)
# tax price_incl incl_base_amount
# -----------------------------------------------
# tax1 T T
# tax2 T T
# tax3
tax1.include_base_amount = True
tax2.include_base_amount = True
self.assert_taxes_computation(
tax1 + tax2 + tax3,
121.0,
{
'total_included': 123.0,
'total_excluded': 99.0,
'taxes_data': (
(99.0, 1.0),
(100.0, 21.0),
(121.0, 2.0),
),
},
rounding_method='round_globally',
)
self._run_js_tests()
def test_adapt_price_unit_to_another_taxes(self):
tax_fixed_incl = self.fixed_tax(10, price_include_override='tax_included')
tax_fixed_excl = self.fixed_tax(10, price_include_override='tax_excluded')
tax_include_src = self.percent_tax(21, price_include_override='tax_included')
tax_include_dst = self.percent_tax(6, price_include_override='tax_included')
tax_exclude_src = self.percent_tax(15, price_include_override='tax_excluded')
tax_exclude_dst = self.percent_tax(21, price_include_override='tax_excluded')
self.assert_adapt_price_unit_to_another_taxes(
121.0,
tax_include_src,
tax_include_dst,
106.0,
)
self.assert_adapt_price_unit_to_another_taxes(
100.0,
tax_exclude_src,
tax_include_dst,
100.0,
)
self.assert_adapt_price_unit_to_another_taxes(
121.0,
tax_include_src,
tax_exclude_dst,
100.0,
)
self.assert_adapt_price_unit_to_another_taxes(
100.0,
tax_exclude_src,
tax_exclude_dst,
100.0,
)
self.assert_adapt_price_unit_to_another_taxes(
100.0,
tax_fixed_incl + tax_exclude_src,
tax_fixed_incl + tax_include_dst,
100.0,
)
self.assert_adapt_price_unit_to_another_taxes(
100.0,
tax_fixed_excl + tax_include_src,
tax_fixed_excl + tax_exclude_dst,
100.0,
)
self._run_js_tests()