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

2150 lines
99 KiB
Python

from odoo import Command
from odoo.addons.account.tests.common import TestTaxCommon
from odoo.tests import tagged
@tagged('post_install', '-at_install')
class TestTaxesDownPayment(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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'total_amount_currency': 0.73,
'total_amount': 0.15,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 0.71,
'base_amount': 0.14,
'tax_amount_currency': 0.02,
'tax_amount': 0.0,
'display_base_amount_currency': 0.71,
'display_base_amount': 0.14,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 2, expected_values
yield "round_per_line, price_excluded", document, True, 'fixed', 0.73, expected_values
# Down Payment 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * percent / 100.0)}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
# Down Payment 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 2.23,
'base_amount': 0.43,
'tax_amount_currency': 0.33,
'tax_amount': 0.08,
'total_amount_currency': 2.56,
'total_amount': 0.51,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 2.23,
'base_amount': 0.43,
'tax_amount_currency': 0.33,
'tax_amount': 0.08,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 2.22,
'base_amount': 0.45,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.45,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 2.22,
'base_amount': 0.45,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.45,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 2.49,
'base_amount': 0.5,
'tax_amount_currency': 0.07,
'tax_amount': 0.02,
'display_base_amount_currency': 2.49,
'display_base_amount': 0.5,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 7, expected_values
yield "round_per_line, price_excluded", document, True, 'fixed', 2.56, expected_values
# Down Payment 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * percent / 100.0)}
yield "round_per_line, price_excluded", document, True, 'percent', percent, expected_values
# Down Payment 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'total_amount_currency': 6.6,
'total_amount': 1.32,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 6.4,
'base_amount': 1.28,
'tax_amount_currency': 0.19,
'tax_amount': 0.04,
'display_base_amount_currency': 6.4,
'display_base_amount': 1.28,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 18, expected_values
yield "round_per_line, price_excluded", document, True, 'fixed', 6.6, expected_values
# Down Payment 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.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': 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'total_amount_currency': 0.73,
'total_amount': 0.15,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 0.71,
'base_amount': 0.14,
'tax_amount_currency': 0.02,
'tax_amount': 0.0,
'display_base_amount_currency': 0.71,
'display_base_amount': 0.14,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 2, expected_values
yield "round_globally, price_excluded", document, True, 'fixed', 0.73, expected_values
# Down Payment 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * percent / 100.0)}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
# Down Payment 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 2.24,
'base_amount': 0.44,
'tax_amount_currency': 0.33,
'tax_amount': 0.07,
'total_amount_currency': 2.57,
'total_amount': 0.51,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 2.24,
'base_amount': 0.44,
'tax_amount_currency': 0.33,
'tax_amount': 0.07,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 2.22,
'base_amount': 0.45,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.45,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 2.22,
'base_amount': 0.45,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.45,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 2.49,
'base_amount': 0.5,
'tax_amount_currency': 0.07,
'tax_amount': 0.01,
'display_base_amount_currency': 2.49,
'display_base_amount': 0.5,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 7, expected_values
yield "round_globally, price_excluded", document, True, 'fixed', 2.57, expected_values
# Down Payment 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * percent / 100.0)}
yield "round_globally, price_excluded", document, True, 'percent', percent, expected_values
# Down Payment 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'total_amount_currency': 6.6,
'total_amount': 1.32,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 6.41,
'base_amount': 1.28,
'tax_amount_currency': 0.19,
'tax_amount': 0.04,
'display_base_amount_currency': 6.41,
'display_base_amount': 1.28,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 18, expected_values
yield "round_globally, price_excluded", document, True, 'fixed', 6.6, expected_values
# Down Payment 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'total_amount_currency': 0.73,
'total_amount': 0.15,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 0.71,
'base_amount': 0.14,
'tax_amount_currency': 0.02,
'tax_amount': 0.0,
'display_base_amount_currency': 0.71,
'display_base_amount': 0.14,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 2, expected_values
yield "round_per_line, price_included", document, True, 'fixed', 0.73, expected_values
# Down Payment 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * percent / 100.0)}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
# Down Payment 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 2.23,
'base_amount': 0.43,
'tax_amount_currency': 0.33,
'tax_amount': 0.08,
'total_amount_currency': 2.56,
'total_amount': 0.51,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 2.23,
'base_amount': 0.43,
'tax_amount_currency': 0.33,
'tax_amount': 0.08,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 2.22,
'base_amount': 0.45,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.45,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 2.22,
'base_amount': 0.45,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.45,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 2.49,
'base_amount': 0.5,
'tax_amount_currency': 0.07,
'tax_amount': 0.02,
'display_base_amount_currency': 2.49,
'display_base_amount': 0.5,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 7, expected_values
yield "round_per_line, price_included", document, True, 'fixed', 2.56, expected_values
# Down Payment 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.64 * percent / 100.0)}
yield "round_per_line, price_included", document, True, 'percent', percent, expected_values
# Down Payment 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'total_amount_currency': 6.6,
'total_amount': 1.32,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 6.4,
'base_amount': 1.28,
'tax_amount_currency': 0.19,
'tax_amount': 0.04,
'display_base_amount_currency': 6.4,
'display_base_amount': 1.28,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 18, expected_values
yield "round_per_line, price_included", document, True, 'fixed', 6.6, expected_values
# Down Payment 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.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': 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'total_amount_currency': 0.73,
'total_amount': 0.15,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.63,
'base_amount': 0.13,
'tax_amount_currency': 0.1,
'tax_amount': 0.02,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.64,
'base_amount': 0.13,
'tax_amount_currency': 0.04,
'tax_amount': 0.01,
'display_base_amount_currency': 0.64,
'display_base_amount': 0.13,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 0.71,
'base_amount': 0.14,
'tax_amount_currency': 0.02,
'tax_amount': 0.0,
'display_base_amount_currency': 0.71,
'display_base_amount': 0.14,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 2, expected_values
yield "round_globally, price_included", document, True, 'fixed', 0.73, expected_values
# Down Payment 3-6%
for percent in range(3, 7):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.66 * percent / 100.0)}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
# Down Payment 7%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 2.24,
'base_amount': 0.44,
'tax_amount_currency': 0.33,
'tax_amount': 0.07,
'total_amount_currency': 2.57,
'total_amount': 0.51,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 2.24,
'base_amount': 0.44,
'tax_amount_currency': 0.33,
'tax_amount': 0.07,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 2.22,
'base_amount': 0.44,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.44,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 2.22,
'base_amount': 0.44,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.22,
'display_base_amount': 0.44,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 2.49,
'base_amount': 0.5,
'tax_amount_currency': 0.07,
'tax_amount': 0.01,
'display_base_amount_currency': 2.49,
'display_base_amount': 0.5,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 7, expected_values
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 2.23,
'base_amount': 0.44,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'total_amount_currency': 2.57,
'total_amount': 0.51,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 2.23,
'base_amount': 0.44,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 2.23,
'base_amount': 0.44,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.23,
'display_base_amount': 0.44,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 2.23,
'base_amount': 0.44,
'tax_amount_currency': 0.13,
'tax_amount': 0.03,
'display_base_amount_currency': 2.23,
'display_base_amount': 0.44,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 2.51,
'base_amount': 0.5,
'tax_amount_currency': 0.07,
'tax_amount': 0.02,
'display_base_amount_currency': 2.51,
'display_base_amount': 0.5,
},
],
},
],
}
yield "round_globally, price_included", document, True, 'fixed', 2.57, expected_values
# Down Payment 8-17%
for percent in range(8, 18):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.66 * percent / 100.0)}
yield "round_globally, price_included", document, True, 'percent', percent, expected_values
# Down Payment 18%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'total_amount_currency': 6.6,
'total_amount': 1.32,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 5.73,
'base_amount': 1.14,
'tax_amount_currency': 0.87,
'tax_amount': 0.18,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 5.72,
'base_amount': 1.14,
'tax_amount_currency': 0.34,
'tax_amount': 0.07,
'display_base_amount_currency': 5.72,
'display_base_amount': 1.14,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 6.4,
'base_amount': 1.28,
'tax_amount_currency': 0.19,
'tax_amount': 0.04,
'display_base_amount_currency': 6.4,
'display_base_amount': 1.28,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 18, expected_values
yield "round_globally, price_included", document, True, 'fixed', 6.6, expected_values
# Down Payment 19-20%
for percent in range(19, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(36.67 * 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_down_payment(document, amount_type, amount, {'tax_totals': 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'total_amount_currency': 1.92,
'total_amount': 0.64,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.1,
'tax_amount': 0.03,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.06,
'tax_amount': 0.02,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.01,
'tax_amount': 0.0,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.17,
'tax_amount': 0.06,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.29,
'tax_amount': 0.1,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'total_amount_currency': 1.92,
'total_amount': 0.64,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.1,
'tax_amount': 0.03,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.06,
'tax_amount': 0.02,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.01,
'tax_amount': 0.0,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.17,
'tax_amount': 0.06,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.29,
'tax_amount': 0.1,
'display_base_amount_currency': 1.29,
'display_base_amount': 0.43,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'total_amount_currency': 1.92,
'total_amount': 0.64,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.1,
'tax_amount': 0.03,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.06,
'tax_amount': 0.02,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.01,
'tax_amount': 0.0,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.17,
'tax_amount': 0.06,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.29,
'tax_amount': 0.1,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * 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,
},
],
},
],
})
# Down Payment 2%
expected_values = {
'same_tax_base': False,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'total_amount_currency': 1.92,
'total_amount': 0.64,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.63,
'tax_amount': 0.21,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.1,
'tax_amount': 0.03,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[1].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.06,
'tax_amount': 0.02,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[2].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.01,
'tax_amount': 0.0,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[3].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.17,
'tax_amount': 0.06,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
{
'id': self.tax_groups[4].id,
'base_amount_currency': 1.29,
'base_amount': 0.43,
'tax_amount_currency': 0.29,
'tax_amount': 0.1,
'display_base_amount_currency': 1.92,
'display_base_amount': 0.64,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(96.0 * 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_down_payment(document, amount_type, amount, {'tax_totals': 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,
},
],
},
],
})
# Down payment 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'total_amount_currency': 0.86,
'total_amount': 1.72,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'tax_groups': [
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'display_base_amount_currency': 0.71,
'display_base_amount': 1.42,
},
],
},
],
}
yield "round_per_line, price_excluded", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.06 * 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,
},
],
},
],
})
# Down payment 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'total_amount_currency': 0.86,
'total_amount': 1.72,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'tax_groups': [
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'display_base_amount_currency': 0.71,
'display_base_amount': 1.42,
},
],
},
],
}
yield "round_globally, price_excluded", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.05 * 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,
},
],
},
],
})
# Down payment 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'total_amount_currency': 0.86,
'total_amount': 1.72,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'tax_groups': [
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'display_base_amount_currency': 0.71,
'display_base_amount': 1.42,
},
],
},
],
}
yield "round_per_line, price_included", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.06 * 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,
},
],
},
],
})
# Down payment 2%
expected_values = {
'same_tax_base': True,
'currency_id': self.foreign_currency.id,
'company_currency_id': self.currency.id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'total_amount_currency': 0.86,
'total_amount': 1.72,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'tax_groups': [
{
'id': self.tax_groups[1].id,
'base_amount_currency': 0.71,
'base_amount': 1.42,
'tax_amount_currency': 0.15,
'tax_amount': 0.3,
'display_base_amount_currency': 0.71,
'display_base_amount': 1.42,
},
],
},
],
}
yield "round_globally, price_included", document, False, 'percent', 2, expected_values
# Down Payment 3-20%
for percent in range(3, 21):
expected_values = {'total_amount_currency': self.foreign_currency.round(43.06 * 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_down_payment(document, amount_type, amount, {'tax_totals': expected_values}, soft_checking=soft_checking)
self._run_js_tests()
def _test_taxes_fixed_tax_last_position(self):
tax1 = self.percent_tax(20)
tax2 = self.fixed_tax(10)
taxes = tax1 + tax2
document_params = self.init_document(lines=[{'price_unit': 100.0, 'tax_ids': taxes}])
document = self.populate_document(document_params)
expected_values = {
'same_tax_base': False,
'currency_id': self.currency.id,
'base_amount_currency': 55.0,
'tax_amount_currency': 10.0,
'total_amount_currency': 65.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 55.0,
'tax_amount_currency': 10.0,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 50.0,
'tax_amount_currency': 10.0,
'display_base_amount_currency': 50.0,
},
],
},
],
}
yield "include_base_amount=False", document, 'percent', 50.0, expected_values
tax2.include_base_amount = True
yield "include_base_amount=True", document, 'percent', 50.0, expected_values
def test_taxes_fixed_tax_last_position_generic_helpers(self):
for test_mode, document, amount_type, amount, expected_values in self._test_taxes_fixed_tax_last_position():
with self.subTest(test_code=test_mode, amount=amount):
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values})
self._run_js_tests()
def _test_no_taxes(self):
document_params = self.init_document(lines=[
{'price_unit': 35.0},
{'price_unit': -5.0},
{'price_unit': 30.0},
{'price_unit': 15.0},
{'price_unit': 15.0},
])
document = self.populate_document(document_params)
expected_values = {
'same_tax_base': True,
'currency_id': self.currency.id,
'base_amount_currency': 45.0,
'tax_amount_currency': 0.0,
'total_amount_currency': 45.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 45.0,
'tax_amount_currency': 0.0,
'tax_groups': [],
},
],
}
return document, 'percent', 50.0, expected_values
def test_no_taxes_generic_helpers(self):
document, amount_type, amount, expected_values = self._test_no_taxes()
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values})
self._run_js_tests()
def _test_reverse_charge_tax(self):
tax = self.percent_tax(
21,
invoice_repartition_line_ids=[
Command.create({'factor_percent': 100, 'repartition_type': 'base'}),
Command.create({'factor_percent': 100, 'repartition_type': 'tax'}),
Command.create({'factor_percent': -100, 'repartition_type': 'tax'}),
],
refund_repartition_line_ids=[
Command.create({'factor_percent': 100, 'repartition_type': 'base'}),
Command.create({'factor_percent': 100, 'repartition_type': 'tax'}),
Command.create({'factor_percent': -100, 'repartition_type': 'tax'}),
],
)
document_params = self.init_document(lines=[
{'price_unit': 12.0, 'tax_ids': tax},
])
document = self.populate_document(document_params)
expected_tax_totals_values = {
'same_tax_base': True,
'currency_id': self.currency.id,
'base_amount_currency': 3.0,
'tax_amount_currency': 0.0,
'total_amount_currency': 3.0,
'subtotals': [
{
'name': "Untaxed Amount",
'base_amount_currency': 3.0,
'tax_amount_currency': 0.0,
'tax_groups': [
{
'id': self.tax_groups[0].id,
'base_amount_currency': 3.0,
'tax_amount_currency': 0.0,
'display_base_amount_currency': 3.0,
},
],
},
],
}
expected_base_line_tax_details_values = [
{
'total_excluded': 3.0,
'total_excluded_currency': 3.0,
'total_included': 3.0,
'total_included_currency': 3.0,
'delta_total_excluded': 0.0,
'delta_total_excluded_currency': 0.0,
'manual_total_excluded': 3.0,
'manual_total_excluded_currency': 3.0,
'manual_tax_amounts': {
str(tax.id): {
'tax_amount': 0.63,
'tax_amount_currency': 0.63,
'base_amount': 3.0,
'base_amount_currency': 3.0,
},
},
'taxes_data': [
{
'tax_id': tax.id,
'tax_amount': 0.63,
'tax_amount_currency': 0.63,
'base_amount': 3.0,
'base_amount_currency': 3.0,
},
{
'tax_id': tax.id,
'tax_amount': -0.63,
'tax_amount_currency': -0.63,
'base_amount': 3.0,
'base_amount_currency': 3.0,
},
],
}
]
return document, 'fixed', 3.0, {
'tax_totals': expected_tax_totals_values,
'base_lines_tax_details': expected_base_line_tax_details_values,
}
def test_reverse_charge_generic_helpers(self):
document, amount_type, amount, expected_values = self._test_reverse_charge_tax()
self.assert_down_payment(document, amount_type, amount, expected_values)
self._run_js_tests()