Skip to content

Commit f53ba4c

Browse files
committed
[FIX] account, sale: Reverse Charge Tax With Down Payment
When creating an invoice with down payment from a sales order, the reverse charge tax amount goes into the debit side. Make sure the reverse charge tax amount goes into the credit side. opw-5172402 closes odoo#238448 X-original-commit: 28911f6 Signed-off-by: Laurent Smet (las) <[email protected]> Signed-off-by: Abdulrahman Mongy (abmn) <[email protected]>
1 parent 2c229a3 commit f53ba4c

File tree

6 files changed

+120
-47
lines changed

6 files changed

+120
-47
lines changed

addons/account/models/account_tax.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3102,6 +3102,8 @@ def _fix_base_lines_tax_details_on_manual_tax_amounts(self, base_lines, company,
31023102
)
31033103
base_line['manual_tax_amounts'] = {}
31043104
for tax_data in taxes_data:
3105+
if tax_data['is_reverse_charge']:
3106+
continue
31053107
tax = tax_data['tax']
31063108
tax_id_str = str(tax.id)
31073109
base_line['manual_tax_amounts'][tax_id_str] = {}

addons/account/static/src/components/tests_shared_js_python/tests_shared_js_python.js

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -111,26 +111,16 @@ export class TestsSharedJsPython extends Component {
111111
document.company,
112112
{cash_rounding: document.cash_rounding}
113113
);
114-
return {tax_totals: taxTotals, soft_checking: params.soft_checking};
114+
return {
115+
tax_totals: taxTotals,
116+
soft_checking: params.soft_checking,
117+
base_lines_tax_details: this.extractBaseLinesDetails(document),
118+
};
115119
}
116120
if (params.test === "base_lines_tax_details") {
117121
const document = this.populateDocument(params.document);
118122
return {
119-
base_lines_tax_details: document.lines.map(line => ({
120-
total_excluded_currency: line.tax_details.total_excluded_currency,
121-
total_excluded: line.tax_details.total_excluded,
122-
total_included_currency: line.tax_details.total_included_currency,
123-
total_included: line.tax_details.total_included,
124-
delta_total_excluded_currency: line.tax_details.delta_total_excluded_currency,
125-
delta_total_excluded: line.tax_details.delta_total_excluded,
126-
taxes_data: line.tax_details.taxes_data.map(tax_data => ({
127-
tax_id: tax_data.tax.id,
128-
tax_amount_currency: tax_data.tax_amount_currency,
129-
tax_amount: tax_data.tax_amount,
130-
base_amount_currency: tax_data.base_amount_currency,
131-
base_amount: tax_data.base_amount,
132-
})),
133-
})),
123+
base_lines_tax_details: this.extractBaseLinesDetails(document),
134124
};
135125
}
136126
}
@@ -151,6 +141,27 @@ export class TestsSharedJsPython extends Component {
151141
lines: base_lines,
152142
}
153143
}
144+
145+
extractBaseLinesDetails(document) {
146+
return document.lines.map(line => ({
147+
total_excluded_currency: line.tax_details.total_excluded_currency,
148+
total_excluded: line.tax_details.total_excluded,
149+
total_included_currency: line.tax_details.total_included_currency,
150+
total_included: line.tax_details.total_included,
151+
delta_total_excluded_currency: line.tax_details.delta_total_excluded_currency,
152+
delta_total_excluded: line.tax_details.delta_total_excluded,
153+
manual_total_excluded_currency: line.manual_total_excluded_currency,
154+
manual_total_excluded: line.manual_total_excluded,
155+
manual_tax_amounts: line.manual_tax_amounts,
156+
taxes_data: line.tax_details.taxes_data.map(tax_data => ({
157+
tax_id: tax_data.tax.id,
158+
tax_amount_currency: tax_data.tax_amount_currency,
159+
tax_amount: tax_data.tax_amount,
160+
base_amount_currency: tax_data.base_amount_currency,
161+
base_amount: tax_data.base_amount,
162+
})),
163+
}));
164+
}
154165
}
155166

156167
registry.category("public_components").add("account.tests_shared_js_python", TestsSharedJsPython);

addons/account/static/src/helpers/account_tax.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,9 @@ export const accountTaxHelpers = {
16971697
tax_details.total_excluded + tax_details.delta_total_excluded;
16981698
base_line.manual_tax_amounts = {};
16991699
for (const tax_data of taxes_data) {
1700+
if (tax_data.is_reverse_charge) {
1701+
continue;
1702+
}
17001703
const tax = tax_data.tax;
17011704
const tax_id_str = tax.id.toString();
17021705
base_line.manual_tax_amounts[tax_id_str] = {};

addons/account/tests/common.py

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,35 +1802,40 @@ def assert_adapt_price_unit_to_another_taxes(self, price_unit, original_taxes, n
18021802
# base_lines_tax_details
18031803
# -------------------------------------------------------------------------
18041804

1805+
def _extract_base_lines_details(self, document):
1806+
return [
1807+
{
1808+
'total_excluded_currency': base_line['tax_details']['total_excluded_currency'],
1809+
'total_excluded': base_line['tax_details']['total_excluded'],
1810+
'total_included_currency': base_line['tax_details']['total_included_currency'],
1811+
'total_included': base_line['tax_details']['total_included'],
1812+
'delta_total_excluded_currency': base_line['tax_details']['delta_total_excluded_currency'],
1813+
'delta_total_excluded': base_line['tax_details']['delta_total_excluded'],
1814+
'manual_total_excluded': base_line['manual_total_excluded'],
1815+
'manual_total_excluded_currency': base_line['manual_total_excluded_currency'],
1816+
'manual_tax_amounts': base_line['manual_tax_amounts'],
1817+
'taxes_data': [
1818+
{
1819+
'tax_id': tax_data['tax'].id,
1820+
'tax_amount_currency': tax_data['tax_amount_currency'],
1821+
'tax_amount': tax_data['tax_amount'],
1822+
'base_amount_currency': tax_data['base_amount_currency'],
1823+
'base_amount': tax_data['base_amount'],
1824+
}
1825+
for tax_data in base_line['tax_details']['taxes_data']
1826+
],
1827+
}
1828+
for base_line in document['lines']
1829+
]
1830+
18051831
def _assert_sub_test_base_lines_tax_details(self, results, expected_values):
18061832
self.assertEqual(len(results['base_lines_tax_details']), len(expected_values['base_lines_tax_details']))
18071833
for result, expected in zip(results['base_lines_tax_details'], expected_values['base_lines_tax_details']):
18081834
self.assertDictEqual(result, expected)
18091835

18101836
def _create_py_sub_test_base_lines_tax_details(self, document):
1811-
base_lines = document['lines']
18121837
return {
1813-
'base_lines_tax_details': [
1814-
{
1815-
'total_excluded_currency': base_line['tax_details']['total_excluded_currency'],
1816-
'total_excluded': base_line['tax_details']['total_excluded'],
1817-
'total_included_currency': base_line['tax_details']['total_included_currency'],
1818-
'total_included': base_line['tax_details']['total_included'],
1819-
'delta_total_excluded_currency': base_line['tax_details']['delta_total_excluded_currency'],
1820-
'delta_total_excluded': base_line['tax_details']['delta_total_excluded'],
1821-
'taxes_data': [
1822-
{
1823-
'tax_id': tax_data['tax'].id,
1824-
'tax_amount_currency': tax_data['tax_amount_currency'],
1825-
'tax_amount': tax_data['tax_amount'],
1826-
'base_amount_currency': tax_data['base_amount_currency'],
1827-
'base_amount': tax_data['base_amount'],
1828-
}
1829-
for tax_data in base_line['tax_details']['taxes_data']
1830-
],
1831-
}
1832-
for base_line in base_lines
1833-
]
1838+
'base_lines_tax_details': self._extract_base_lines_details(document),
18341839
}
18351840

18361841
def _create_js_sub_test_base_lines_tax_details(self, document):
@@ -1948,9 +1953,11 @@ def assert_global_discount(self, document, amount_type, amount, expected_values,
19481953
def _assert_sub_test_down_payment(self, results, expected_results):
19491954
self._assert_tax_totals_summary(
19501955
results['tax_totals'],
1951-
expected_results,
1956+
expected_results['tax_totals'],
19521957
soft_checking=results['soft_checking'],
19531958
)
1959+
if 'base_lines_tax_details' in expected_results:
1960+
self._assert_sub_test_base_lines_tax_details(results, expected_results)
19541961

19551962
def _create_py_sub_test_down_payment(self, document, amount_type, amount, soft_checking):
19561963
AccountTax = self.env['account.tax']
@@ -1971,7 +1978,11 @@ def _create_py_sub_test_down_payment(self, document, amount_type, amount, soft_c
19711978
company=self.env.company,
19721979
cash_rounding=new_document['cash_rounding'],
19731980
)
1974-
return {'tax_totals': tax_totals, 'soft_checking': soft_checking}
1981+
return {
1982+
'tax_totals': tax_totals,
1983+
'soft_checking': soft_checking,
1984+
'base_lines_tax_details': self._extract_base_lines_details(new_document),
1985+
}
19751986

19761987
def _create_js_sub_test_down_payment(self, document, amount_type, amount, soft_checking):
19771988
return {

addons/account/tests/test_taxes_base_lines_tax_details.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ def test_dispatch_delta_on_base_lines(self):
2525
'total_included_currency': 10.94,
2626
'delta_total_excluded': 0.0,
2727
'delta_total_excluded_currency': 0.0,
28+
'manual_total_excluded': None,
29+
'manual_total_excluded_currency': None,
30+
'manual_tax_amounts': None,
2831
'taxes_data': [
2932
{
3033
'tax_id': tax_21.id,
@@ -42,6 +45,9 @@ def test_dispatch_delta_on_base_lines(self):
4245
'total_included_currency': 1.14,
4346
'delta_total_excluded': 0.0,
4447
'delta_total_excluded_currency': 0.0,
48+
'manual_total_excluded': None,
49+
'manual_total_excluded_currency': None,
50+
'manual_tax_amounts': None,
4551
'taxes_data': [
4652
{
4753
'tax_id': tax_21.id,
@@ -87,3 +93,4 @@ def test_dispatch_delta_on_base_lines(self):
8793
}
8894

8995
self.assert_base_lines_tax_details(document, expected_values)
96+
self._run_js_tests()

addons/account/tests/test_taxes_downpayment.py

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,7 @@ def _test_taxes_l10n_in(self):
10081008
def test_taxes_l10n_in_generic_helpers(self):
10091009
for test_mode, document, soft_checking, amount_type, amount, expected_values in self._test_taxes_l10n_in():
10101010
with self.subTest(test_code=test_mode, amount=amount):
1011-
self.assert_down_payment(document, amount_type, amount, expected_values, soft_checking=soft_checking)
1011+
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values}, soft_checking=soft_checking)
10121012
self._run_js_tests()
10131013

10141014
def _test_taxes_l10n_br(self):
@@ -1624,7 +1624,7 @@ def _test_taxes_l10n_br(self):
16241624
def test_taxes_l10n_br_generic_helpers(self):
16251625
for test_mode, document, soft_checking, amount_type, amount, expected_values in self._test_taxes_l10n_br():
16261626
with self.subTest(test_code=test_mode, amount=amount):
1627-
self.assert_down_payment(document, amount_type, amount, expected_values, soft_checking=soft_checking)
1627+
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values}, soft_checking=soft_checking)
16281628
self._run_js_tests()
16291629

16301630
def _test_taxes_l10n_be(self):
@@ -1985,7 +1985,7 @@ def _test_taxes_l10n_be(self):
19851985
def test_taxes_l10n_be_generic_helpers(self):
19861986
for test_mode, document, soft_checking, amount_type, amount, expected_values in self._test_taxes_l10n_be():
19871987
with self.subTest(test_code=test_mode, amount=amount):
1988-
self.assert_down_payment(document, amount_type, amount, expected_values, soft_checking=soft_checking)
1988+
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values}, soft_checking=soft_checking)
19891989
self._run_js_tests()
19901990

19911991
def _test_taxes_fixed_tax_last_position(self):
@@ -2027,7 +2027,7 @@ def _test_taxes_fixed_tax_last_position(self):
20272027
def test_taxes_fixed_tax_last_position_generic_helpers(self):
20282028
for test_mode, document, amount_type, amount, expected_values in self._test_taxes_fixed_tax_last_position():
20292029
with self.subTest(test_code=test_mode, amount=amount):
2030-
self.assert_down_payment(document, amount_type, amount, expected_values)
2030+
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values})
20312031
self._run_js_tests()
20322032

20332033
def _test_no_taxes(self):
@@ -2059,7 +2059,7 @@ def _test_no_taxes(self):
20592059

20602060
def test_no_taxes_generic_helpers(self):
20612061
document, amount_type, amount, expected_values = self._test_no_taxes()
2062-
self.assert_down_payment(document, amount_type, amount, expected_values)
2062+
self.assert_down_payment(document, amount_type, amount, {'tax_totals': expected_values})
20632063
self._run_js_tests()
20642064

20652065
def _test_reverse_charge_tax(self):
@@ -2081,7 +2081,7 @@ def _test_reverse_charge_tax(self):
20812081
])
20822082
document = self.populate_document(document_params)
20832083

2084-
expected_values = {
2084+
expected_tax_totals_values = {
20852085
'same_tax_base': True,
20862086
'currency_id': self.currency.id,
20872087
'base_amount_currency': 3.0,
@@ -2103,7 +2103,46 @@ def _test_reverse_charge_tax(self):
21032103
},
21042104
],
21052105
}
2106-
return document, 'fixed', 3.0, expected_values
2106+
expected_base_line_tax_details_values = [
2107+
{
2108+
'total_excluded': 3.0,
2109+
'total_excluded_currency': 3.0,
2110+
'total_included': 3.0,
2111+
'total_included_currency': 3.0,
2112+
'delta_total_excluded': 0.0,
2113+
'delta_total_excluded_currency': 0.0,
2114+
'manual_total_excluded': 3.0,
2115+
'manual_total_excluded_currency': 3.0,
2116+
'manual_tax_amounts': {
2117+
str(tax.id): {
2118+
'tax_amount': 0.63,
2119+
'tax_amount_currency': 0.63,
2120+
'base_amount': 3.0,
2121+
'base_amount_currency': 3.0,
2122+
},
2123+
},
2124+
'taxes_data': [
2125+
{
2126+
'tax_id': tax.id,
2127+
'tax_amount': 0.63,
2128+
'tax_amount_currency': 0.63,
2129+
'base_amount': 3.0,
2130+
'base_amount_currency': 3.0,
2131+
},
2132+
{
2133+
'tax_id': tax.id,
2134+
'tax_amount': -0.63,
2135+
'tax_amount_currency': -0.63,
2136+
'base_amount': 3.0,
2137+
'base_amount_currency': 3.0,
2138+
},
2139+
],
2140+
}
2141+
]
2142+
return document, 'fixed', 3.0, {
2143+
'tax_totals': expected_tax_totals_values,
2144+
'base_lines_tax_details': expected_base_line_tax_details_values,
2145+
}
21072146

21082147
def test_reverse_charge_generic_helpers(self):
21092148
document, amount_type, amount, expected_values = self._test_reverse_charge_tax()

0 commit comments

Comments
 (0)