diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index b72d2b69aa8..eecc683341c 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -787,12 +787,6 @@ class AccountMove(models.Model): currency = self.env['res.currency'].browse(taxes_map_entry['grouping_dict']['currency_id']) - # Don't create tax lines with zero balance. - if currency.is_zero(taxes_map_entry['amount']): - if taxes_map_entry['tax_line'] and not recompute_tax_base_amount: - self.line_ids -= taxes_map_entry['tax_line'] - continue - # tax_base_amount field is expressed using the company currency. tax_base_amount = currency._convert(taxes_map_entry['tax_base_amount'], self.company_currency_id, self.company_id, self.date or fields.Date.context_today(self)) diff --git a/addons/account/tests/test_account_move_line_tax_details.py b/addons/account/tests/test_account_move_line_tax_details.py index 2f942dd6c26..4e8d5669e11 100644 --- a/addons/account/tests/test_account_move_line_tax_details.py +++ b/addons/account/tests/test_account_move_line_tax_details.py @@ -1167,3 +1167,88 @@ class TestAccountTaxDetailsReport(AccountTestInvoicingCommon): ], ) self.assertTotalAmounts(invoice, tax_details) + + def test_zero_amount_tax(self): + """ Ensure the tax details is generated for 0% tax. """ + zero_tax = self.env['account.tax'].create({ + 'name': "zero_tax", + 'amount_type': 'percent', + 'amount': 0.0, + }) + + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': '2019-01-01', + 'invoice_line_ids': [ + Command.create({ + 'name': 'line1', + 'account_id': self.company_data['default_account_revenue'].id, + 'price_unit': 1000.0, + 'tax_ids': [Command.set(zero_tax.ids)], + }), + Command.create({ + 'name': 'line2', + 'account_id': self.company_data['default_account_revenue'].id, + 'price_unit': 1000.0, + 'tax_ids': [Command.set(zero_tax.ids)], + }), + ] + }) + base_lines, tax_lines = self._dispatch_move_lines(invoice) + + tax_details = self._get_tax_details() + self.assertTaxDetailsValues( + tax_details, + [ + { + 'base_line_id': base_lines[0].id, + 'tax_line_id': tax_lines[0].id, + 'base_amount': -1000.0, + 'tax_amount': 0.0, + }, + { + 'base_line_id': base_lines[1].id, + 'tax_line_id': tax_lines[0].id, + 'base_amount': -1000.0, + 'tax_amount': 0.0, + }, + ], + ) + self.assertTotalAmounts(invoice, tax_details) + + # Same with a group of taxes + + tax_group = self.env['account.tax'].create({ + 'name': "tax_group", + 'amount_type': 'group', + 'children_tax_ids': [Command.set(zero_tax.ids)], + }) + + invoice.write({ + 'invoice_line_ids': [ + Command.update(base_lines[0].id, {'tax_ids': [Command.set(tax_group.ids)]}), + Command.update(base_lines[1].id, {'tax_ids': [Command.set(tax_group.ids)]}), + ], + }) + base_lines, tax_lines = self._dispatch_move_lines(invoice) + + tax_details = self._get_tax_details() + self.assertTaxDetailsValues( + tax_details, + [ + { + 'base_line_id': base_lines[0].id, + 'tax_line_id': tax_lines[0].id, + 'base_amount': -1000.0, + 'tax_amount': 0.0, + }, + { + 'base_line_id': base_lines[1].id, + 'tax_line_id': tax_lines[0].id, + 'base_amount': -1000.0, + 'tax_amount': 0.0, + }, + ], + ) + self.assertTotalAmounts(invoice, tax_details) diff --git a/addons/account/tests/test_account_move_out_invoice.py b/addons/account/tests/test_account_move_out_invoice.py index 7af8ef5af2e..fe2e7b63f05 100644 --- a/addons/account/tests/test_account_move_out_invoice.py +++ b/addons/account/tests/test_account_move_out_invoice.py @@ -2802,7 +2802,7 @@ class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon): }) self.assertEqual(len(invoice.invoice_line_ids), 1) - self.assertEqual(len(invoice.line_ids), 2) + self.assertEqual(len(invoice.line_ids), 3) def test_out_invoice_recomputation_receivable_lines(self): ''' Test a tricky specific case caused by some framework limitations. Indeed, when diff --git a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py index d611af5c0bc..1da8b017ada 100644 --- a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py +++ b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py @@ -80,7 +80,7 @@ class ValuationReconciliationTestCommon(AccountTestInvoicingCommon): def check_reconciliation(self, invoice, picking, full_reconcile=True, operation='purchase'): interim_account_id = self.company_data['default_account_stock_in'].id if operation == 'purchase' else self.company_data['default_account_stock_out'].id - invoice_line = invoice.line_ids.filtered(lambda line: line.account_id.id == interim_account_id) + invoice_line = invoice.line_ids.filtered(lambda line: line.account_id.id == interim_account_id and not line.tax_line_id) stock_moves = picking.move_ids