diff options
Diffstat (limited to 'addons/account/tests/test_account_payment_register.py')
| -rw-r--r-- | addons/account/tests/test_account_payment_register.py | 800 |
1 files changed, 800 insertions, 0 deletions
diff --git a/addons/account/tests/test_account_payment_register.py b/addons/account/tests/test_account_payment_register.py new file mode 100644 index 00000000..1515ca48 --- /dev/null +++ b/addons/account/tests/test_account_payment_register.py @@ -0,0 +1,800 @@ +# -*- coding: utf-8 -*- +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.exceptions import UserError +from odoo.tests import tagged + + +@tagged('post_install', '-at_install') +class TestAccountPaymentRegister(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + + cls.currency_data_3 = cls.setup_multi_currency_data({ + 'name': "Umbrella", + 'symbol': '☂', + 'currency_unit_label': "Umbrella", + 'currency_subunit_label': "Broken Umbrella", + }, rate2017=0.01) + + cls.payment_debit_account_id = cls.company_data['default_journal_bank'].payment_debit_account_id.copy() + cls.payment_credit_account_id = cls.company_data['default_journal_bank'].payment_credit_account_id.copy() + + cls.custom_payment_method_in = cls.env['account.payment.method'].create({ + 'name': 'custom_payment_method_in', + 'code': 'CUSTOMIN', + 'payment_type': 'inbound', + }) + cls.manual_payment_method_in = cls.env.ref('account.account_payment_method_manual_in') + + cls.custom_payment_method_out = cls.env['account.payment.method'].create({ + 'name': 'custom_payment_method_out', + 'code': 'CUSTOMOUT', + 'payment_type': 'outbound', + }) + cls.manual_payment_method_out = cls.env.ref('account.account_payment_method_manual_out') + + cls.company_data['default_journal_bank'].write({ + 'payment_debit_account_id': cls.payment_debit_account_id.id, + 'payment_credit_account_id': cls.payment_credit_account_id.id, + 'inbound_payment_method_ids': [(6, 0, ( + cls.manual_payment_method_in.id, + cls.custom_payment_method_in.id, + ))], + 'outbound_payment_method_ids': [(6, 0, ( + cls.env.ref('account.account_payment_method_manual_out').id, + cls.custom_payment_method_out.id, + cls.manual_payment_method_out.id, + ))], + }) + + # Customer invoices sharing the same batch. + cls.out_invoice_1 = cls.env['account.move'].create({ + 'move_type': 'out_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_a.id, + 'currency_id': cls.currency_data['currency'].id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 1000.0})], + }) + cls.out_invoice_2 = cls.env['account.move'].create({ + 'move_type': 'out_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_a.id, + 'currency_id': cls.currency_data['currency'].id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 2000.0})], + }) + cls.out_invoice_3 = cls.env['account.move'].create({ + 'move_type': 'out_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_a.id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 12.01})], + }) + cls.out_invoice_4 = cls.env['account.move'].create({ + 'move_type': 'out_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_a.id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 11.99})], + }) + (cls.out_invoice_1 + cls.out_invoice_2 + cls.out_invoice_3 + cls.out_invoice_4).action_post() + + # Vendor bills, in_invoice_1 + in_invoice_2 are sharing the same batch but not in_invoice_3. + cls.in_invoice_1 = cls.env['account.move'].create({ + 'move_type': 'in_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_a.id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 1000.0})], + }) + cls.in_invoice_2 = cls.env['account.move'].create({ + 'move_type': 'in_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_a.id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 2000.0})], + }) + cls.in_invoice_3 = cls.env['account.move'].create({ + 'move_type': 'in_invoice', + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'partner_id': cls.partner_b.id, + 'currency_id': cls.currency_data['currency'].id, + 'invoice_line_ids': [(0, 0, {'product_id': cls.product_a.id, 'price_unit': 3000.0})], + }) + (cls.in_invoice_1 + cls.in_invoice_2 + cls.in_invoice_3).action_post() + + def test_register_payment_single_batch_grouped_keep_open_lower_amount(self): + ''' Pay 800.0 with 'open' as payment difference handling on two customer invoices (1000 + 2000). ''' + active_ids = (self.out_invoice_1 + self.out_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'amount': 800.0, + 'group_payment': True, + 'payment_difference_handling': 'open', + 'currency_id': self.currency_data['currency'].id, + 'payment_method_id': self.custom_payment_method_in.id, + })._create_payments() + + self.assertRecordValues(payments, [{ + 'ref': 'INV/2017/01/0001 INV/2017/01/0002', + 'payment_method_id': self.custom_payment_method_in.id, + }]) + self.assertRecordValues(payments.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 400.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -800.0, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 400.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 800.0, + 'reconciled': False, + }, + ]) + + def test_register_payment_single_batch_grouped_keep_open_higher_amount(self): + ''' Pay 3100.0 with 'open' as payment difference handling on two customer invoices (1000 + 2000). ''' + active_ids = (self.out_invoice_1 + self.out_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'amount': 3100.0, + 'group_payment': True, + 'payment_difference_handling': 'open', + 'currency_id': self.currency_data['currency'].id, + 'payment_method_id': self.custom_payment_method_in.id, + })._create_payments() + + self.assertRecordValues(payments, [{ + 'ref': 'INV/2017/01/0001 INV/2017/01/0002', + 'payment_method_id': self.custom_payment_method_in.id, + }]) + self.assertRecordValues(payments.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 1550.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -3100.0, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 1550.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 3100.0, + 'reconciled': False, + }, + ]) + + def test_register_payment_single_batch_grouped_writeoff_lower_amount_debit(self): + ''' Pay 800.0 with 'reconcile' as payment difference handling on two customer invoices (1000 + 2000). ''' + active_ids = (self.out_invoice_1 + self.out_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'amount': 800.0, + 'group_payment': True, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + 'payment_method_id': self.custom_payment_method_in.id, + })._create_payments() + + self.assertRecordValues(payments, [{ + 'ref': 'INV/2017/01/0001 INV/2017/01/0002', + 'payment_method_id': self.custom_payment_method_in.id, + }]) + self.assertRecordValues(payments.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 1500.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -3000.0, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 400.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 800.0, + 'reconciled': False, + }, + # Writeoff line: + { + 'debit': 1100.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 2200.0, + 'reconciled': False, + }, + ]) + + def test_register_payment_single_batch_grouped_writeoff_higher_amount_debit(self): + ''' Pay 3100.0 with 'reconcile' as payment difference handling on two customer invoices (1000 + 2000). ''' + active_ids = (self.out_invoice_1 + self.out_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'amount': 3100.0, + 'group_payment': True, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + 'payment_method_id': self.custom_payment_method_in.id, + })._create_payments() + + self.assertRecordValues(payments, [{ + 'ref': 'INV/2017/01/0001 INV/2017/01/0002', + 'payment_method_id': self.custom_payment_method_in.id, + }]) + self.assertRecordValues(payments.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 1500.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -3000.0, + 'reconciled': True, + }, + # Writeoff line: + { + 'debit': 0.0, + 'credit': 50.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -100.0, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 1550.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 3100.0, + 'reconciled': False, + }, + ]) + + def test_register_payment_single_batch_grouped_writeoff_lower_amount_credit(self): + ''' Pay 800.0 with 'reconcile' as payment difference handling on two vendor billes (1000 + 2000). ''' + active_ids = (self.in_invoice_1 + self.in_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'amount': 800.0, + 'group_payment': True, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + 'payment_method_id': self.custom_payment_method_in.id, + })._create_payments() + + self.assertRecordValues(payments, [{ + 'ref': 'BILL/2017/01/0001 BILL/2017/01/0002', + 'payment_method_id': self.custom_payment_method_in.id, + }]) + self.assertRecordValues(payments.line_ids.sorted('balance'), [ + # Writeoff line: + { + 'debit': 0.0, + 'credit': 2200.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': -2200.0, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 0.0, + 'credit': 800.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': -800.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 3000.0, + 'credit': 0.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': 3000.0, + 'reconciled': True, + }, + ]) + + def test_register_payment_single_batch_grouped_writeoff_higher_amount_credit(self): + ''' Pay 3100.0 with 'reconcile' as payment difference handling on two vendor billes (1000 + 2000). ''' + active_ids = (self.in_invoice_1 + self.in_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'amount': 3100.0, + 'group_payment': True, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + 'payment_method_id': self.custom_payment_method_in.id, + })._create_payments() + + self.assertRecordValues(payments, [{ + 'ref': 'BILL/2017/01/0001 BILL/2017/01/0002', + 'payment_method_id': self.custom_payment_method_in.id, + }]) + self.assertRecordValues(payments.line_ids.sorted('balance'), [ + # Liquidity line: + { + 'debit': 0.0, + 'credit': 3100.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': -3100.0, + 'reconciled': False, + }, + # Writeoff line: + { + 'debit': 100.0, + 'credit': 0.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': 100.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 3000.0, + 'credit': 0.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': 3000.0, + 'reconciled': True, + }, + ]) + + def test_register_payment_single_batch_not_grouped(self): + ''' Choose to pay two customer invoices with separated payments (1000 + 2000). ''' + active_ids = (self.out_invoice_1 + self.out_invoice_2).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'group_payment': False, + })._create_payments() + + self.assertRecordValues(payments, [ + { + 'ref': 'INV/2017/01/0001', + 'payment_method_id': self.manual_payment_method_in.id, + }, + { + 'ref': 'INV/2017/01/0002', + 'payment_method_id': self.manual_payment_method_in.id, + }, + ]) + self.assertRecordValues(payments[0].line_ids.sorted('balance') + payments[1].line_ids.sorted('balance'), [ + # == Payment 1: to pay out_invoice_1 == + # Receivable line: + { + 'debit': 0.0, + 'credit': 500.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -1000.0, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 500.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 1000.0, + 'reconciled': False, + }, + # == Payment 2: to pay out_invoice_2 == + # Receivable line: + { + 'debit': 0.0, + 'credit': 1000.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -2000.0, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 1000.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 2000.0, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_batches_grouped(self): + ''' Choose to pay multiple batches, one with two customer invoices (1000 + 2000) + and one with a vendor bill of 600, by grouping payments. + ''' + active_ids = (self.in_invoice_1 + self.in_invoice_2 + self.in_invoice_3).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'group_payment': True, + })._create_payments() + + self.assertRecordValues(payments, [ + { + 'ref': 'BILL/2017/01/0001 BILL/2017/01/0002', + 'payment_method_id': self.manual_payment_method_out.id, + }, + { + 'ref': 'BILL/2017/01/0003', + 'payment_method_id': self.manual_payment_method_out.id, + }, + ]) + self.assertRecordValues(payments[0].line_ids.sorted('balance') + payments[1].line_ids.sorted('balance'), [ + # == Payment 1: to pay in_invoice_1 & in_invoice_2 == + # Liquidity line: + { + 'debit': 0.0, + 'credit': 3000.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': -3000.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 3000.0, + 'credit': 0.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': 3000.0, + 'reconciled': True, + }, + # == Payment 2: to pay in_invoice_3 == + # Liquidity line: + { + 'debit': 0.0, + 'credit': 1500.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -3000.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 1500.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 3000.0, + 'reconciled': True, + }, + ]) + + def test_register_payment_multi_batches_not_grouped(self): + ''' Choose to pay multiple batches, one with two customer invoices (1000 + 2000) + and one with a vendor bill of 600, by splitting payments. + ''' + active_ids = (self.in_invoice_1 + self.in_invoice_2 + self.in_invoice_3).ids + payments = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=active_ids).create({ + 'group_payment': False, + })._create_payments() + + self.assertRecordValues(payments, [ + { + 'ref': 'BILL/2017/01/0001', + 'payment_method_id': self.manual_payment_method_out.id, + }, + { + 'ref': 'BILL/2017/01/0002', + 'payment_method_id': self.manual_payment_method_out.id, + }, + { + 'ref': 'BILL/2017/01/0003', + 'payment_method_id': self.manual_payment_method_out.id, + }, + ]) + self.assertRecordValues(payments[0].line_ids.sorted('balance') + payments[1].line_ids.sorted('balance') + payments[2].line_ids.sorted('balance'), [ + # == Payment 1: to pay in_invoice_1 == + # Liquidity line: + { + 'debit': 0.0, + 'credit': 1000.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': -1000.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 1000.0, + 'credit': 0.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': 1000.0, + 'reconciled': True, + }, + # == Payment 2: to pay in_invoice_2 == + # Liquidity line: + { + 'debit': 0.0, + 'credit': 2000.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': -2000.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 2000.0, + 'credit': 0.0, + 'currency_id': self.company_data['currency'].id, + 'amount_currency': 2000.0, + 'reconciled': True, + }, + # == Payment 3: to pay in_invoice_3 == + # Liquidity line: + { + 'debit': 0.0, + 'credit': 1500.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': -3000.0, + 'reconciled': False, + }, + # Payable line: + { + 'debit': 1500.0, + 'credit': 0.0, + 'currency_id': self.currency_data['currency'].id, + 'amount_currency': 3000.0, + 'reconciled': True, + }, + ]) + + def test_register_payment_constraints(self): + # Test to register a payment for a draft journal entry. + self.out_invoice_1.button_draft() + with self.assertRaises(UserError), self.cr.savepoint(): + self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_1.ids)\ + .create({}) + + # Test to register a payment for an already fully reconciled journal entry. + self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_2.ids)\ + .create({})\ + ._create_payments() + with self.assertRaises(UserError), self.cr.savepoint(): + self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_2.ids)\ + .create({}) + + def test_register_payment_multi_currency_rounding_issue_positive_delta(self): + ''' When registering a payment using a different currency than the invoice one, the invoice must be fully paid + at the end whatever the currency rate. + ''' + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_3.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.12, + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 12.01, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.12, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 12.01, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.12, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_currency_rounding_issue_negative_delta(self): + ''' When registering a payment using a different currency than the invoice one, the invoice must be fully paid + at the end whatever the currency rate. + ''' + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_4.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.12, + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 11.99, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.12, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 11.99, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.12, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_currency_rounding_issue_writeoff_lower_amount_keep_open(self): + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_3.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.08, + 'payment_difference_handling': 'open', + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 8.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.08, + 'reconciled': True, + }, + # Liquidity line: + { + 'debit': 8.0, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.08, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_currency_rounding_issue_writeoff_lower_amount_reconcile_positive_delta(self): + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_3.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.08, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 12.01, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.12, + 'reconciled': True, + }, + # Write-off line: + { + 'debit': 4.0, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.04, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 8.01, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.08, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_currency_rounding_issue_writeoff_lower_amount_reconcile_negative_delta(self): + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_4.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.08, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 11.99, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.12, + 'reconciled': True, + }, + # Write-off line: + { + 'debit': 4.0, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.04, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 7.99, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.08, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_currency_rounding_issue_writeoff_higher_amount_reconcile_positive_delta(self): + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_3.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.16, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 12.01, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.12, + 'reconciled': True, + }, + # Write-off line: + { + 'debit': 0.0, + 'credit': 4.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.04, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 16.01, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.16, + 'reconciled': False, + }, + ]) + + def test_register_payment_multi_currency_rounding_issue_writeoff_higher_amount_reconcile_negative_delta(self): + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=self.out_invoice_4.ids)\ + .create({ + 'currency_id': self.currency_data_3['currency'].id, + 'amount': 0.16, + 'payment_difference_handling': 'reconcile', + 'writeoff_account_id': self.company_data['default_account_revenue'].id, + 'writeoff_label': 'writeoff', + })\ + ._create_payments() + + self.assertRecordValues(payment.line_ids.sorted('balance'), [ + # Receivable line: + { + 'debit': 0.0, + 'credit': 11.99, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.12, + 'reconciled': True, + }, + # Write-off line: + { + 'debit': 0.0, + 'credit': 4.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': -0.04, + 'reconciled': False, + }, + # Liquidity line: + { + 'debit': 15.99, + 'credit': 0.0, + 'currency_id': self.currency_data_3['currency'].id, + 'amount_currency': 0.16, + 'reconciled': False, + }, + ]) |
