diff options
Diffstat (limited to 'addons/account/tests/test_reconciliation.py')
| -rw-r--r-- | addons/account/tests/test_reconciliation.py | 918 |
1 files changed, 388 insertions, 530 deletions
diff --git a/addons/account/tests/test_reconciliation.py b/addons/account/tests/test_reconciliation.py index 0a35310f8a7..641ff761fa8 100644 --- a/addons/account/tests/test_reconciliation.py +++ b/addons/account/tests/test_reconciliation.py @@ -1,7 +1,7 @@ from odoo import api, fields from odoo.addons.account.tests.account_test_classes import AccountingTestCase from odoo.exceptions import UserError -from odoo.tests import tagged +from odoo.tests import Form, tagged import time import unittest @@ -18,22 +18,20 @@ class TestReconciliation(AccountingTestCase): def setUp(self): super(TestReconciliation, self).setUp() - self.account_invoice_model = self.env['account.invoice'] - self.account_invoice_line_model = self.env['account.invoice.line'] self.acc_bank_stmt_model = self.env['account.bank.statement'] self.acc_bank_stmt_line_model = self.env['account.bank.statement.line'] self.res_currency_model = self.registry('res.currency') self.res_currency_rate_model = self.registry('res.currency.rate') - partner_agrolait = self.env.ref("base.res_partner_2") - self.partner_agrolait_id = partner_agrolait.id + self.partner_agrolait = self.env.ref("base.res_partner_2") + self.partner_agrolait_id = self.partner_agrolait.id self.currency_swiss_id = self.env.ref("base.CHF").id self.currency_usd_id = self.env.ref("base.USD").id self.currency_euro_id = self.env.ref("base.EUR").id company = self.env.ref('base.main_company') self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [self.currency_euro_id, company.id]) - self.account_rcv = partner_agrolait.property_account_receivable_id or self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1) - self.account_rsa = partner_agrolait.property_account_payable_id or self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_payable').id)], limit=1) + self.account_rcv = self.partner_agrolait.property_account_receivable_id or self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1) + self.account_rsa = self.partner_agrolait.property_account_payable_id or self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_payable').id)], limit=1) self.product = self.env.ref("product.product_product_4") self.bank_journal_euro = self.env['account.journal'].create({'name': 'Bank', 'type': 'bank', 'code': 'BNK67'}) @@ -133,31 +131,29 @@ class TestReconciliation(AccountingTestCase): }) def create_invoice(self, type='out_invoice', invoice_amount=50, currency_id=None): - #we create an invoice in given currency - invoice = self.account_invoice_model.create({'partner_id': self.partner_agrolait_id, - 'currency_id': currency_id, - 'name': type == 'out_invoice' and 'invoice to client' or 'invoice to vendor', - 'account_id': self.account_rcv.id, + invoice_vals = { 'type': type, - 'date_invoice': time.strftime('%Y') + '-07-01', - }) - self.account_invoice_line_model.create({'product_id': self.product.id, - 'quantity': 1, - 'price_unit': invoice_amount, - 'invoice_id': invoice.id, - 'name': 'product that cost ' + str(invoice_amount), - 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id, - }) - - #validate invoice - invoice.action_invoice_open() + 'partner_id': self.partner_agrolait_id, + 'invoice_date': time.strftime('%Y') + '-07-01', + 'date': time.strftime('%Y') + '-07-01', + 'invoice_line_ids': [(0, 0, { + 'name': 'product that cost %s' % invoice_amount, + 'quantity': 1, + 'price_unit': invoice_amount, + 'tax_ids': [(6, 0, [])], + })] + } + if currency_id: + invoice_vals['currency_id'] = currency_id + invoice = self.env['account.move'].with_context(default_type=type).create(invoice_vals) + invoice.post() return invoice def make_payment(self, invoice_record, bank_journal, amount=0.0, amount_currency=0.0, currency_id=None): bank_stmt = self.acc_bank_stmt_model.create({ 'journal_id': bank_journal.id, 'date': time.strftime('%Y') + '-07-15', - 'name': 'payment' + invoice_record.number + 'name': 'payment' + invoice_record.name }) bank_stmt_line = self.acc_bank_stmt_line_model.create({'name': 'payment', @@ -166,13 +162,9 @@ class TestReconciliation(AccountingTestCase): 'amount': amount, 'amount_currency': amount_currency, 'currency_id': currency_id, - 'date': time.strftime('%Y') + '-07-15',}) - - #reconcile the payment with the invoice - for l in invoice_record.move_id.line_ids: - if l.account_id.id == self.account_rcv.id: - line_id = l - break + 'date': time.strftime('%Y') + '-07-15', + }) + line_id = invoice_record.line_ids.filtered(lambda line: line.account_id.user_type_id.type in ('receivable', 'payable')) amount_in_widget = currency_id and amount_currency or amount bank_stmt_line.process_reconciliation(counterpart_aml_dicts=[{ 'move_line': line_id, @@ -203,135 +195,146 @@ class TestReconciliationExec(TestReconciliation): def test_statement_usd_invoice_eur_transaction_eur(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_euro_id, 30, self.bank_journal_usd, 42, 30, self.currency_euro_id) self.assertRecordValues(customer_move_lines, [ - {'debit': 30.0, 'credit': 0.0, 'amount_currency': 42, 'currency_id': self.currency_usd_id}, {'debit': 0.0, 'credit': 30.0, 'amount_currency': -42, 'currency_id': self.currency_usd_id}, + {'debit': 30.0, 'credit': 0.0, 'amount_currency': 42, 'currency_id': self.currency_usd_id}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 30.0, 'amount_currency': -42, 'currency_id': self.currency_usd_id}, {'debit': 30.0, 'credit': 0.0, 'amount_currency': 42, 'currency_id': self.currency_usd_id}, + {'debit': 0.0, 'credit': 30.0, 'amount_currency': -42, 'currency_id': self.currency_usd_id}, ]) def test_statement_usd_invoice_usd_transaction_usd(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_usd_id, 50, self.bank_journal_usd, 50, 0, False) self.assertRecordValues(customer_move_lines, [ - {'debit': 32.70, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, {'debit': 0.0, 'credit': 32.70, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, + {'debit': 32.70, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 32.70, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, {'debit': 32.70, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, + {'debit': 0.0, 'credit': 32.70, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, ]) def test_statement_usd_invoice_usd_transaction_eur(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_usd_id, 50, self.bank_journal_usd, 50, 40, self.currency_euro_id) self.assertRecordValues(customer_move_lines, [ - {'debit': 40.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, {'debit': 0.0, 'credit': 40.0, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, + {'debit': 40.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, ]) exchange_lines = customer_move_lines.mapped('full_reconcile_id.exchange_move_id.line_ids') self.assertRecordValues(exchange_lines, [ - {'debit': 0.0, 'credit': 7.30, 'account_id': self.diff_income_account.id}, {'debit': 7.30, 'credit': 0.0, 'account_id': self.account_rcv.id}, + {'debit': 0.0, 'credit': 7.30, 'account_id': self.diff_income_account.id}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 40.0, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, {'debit': 40.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, + {'debit': 0.0, 'credit': 40.0, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, ]) exchange_lines = supplier_move_lines.mapped('full_reconcile_id.exchange_move_id.line_ids') self.assertRecordValues(exchange_lines, [ + {'debit': 0.0, 'credit': 7.30, 'account_id': self.account_rsa.id}, {'debit': 7.30, 'credit': 0.0, 'account_id': self.diff_expense_account.id}, - {'debit': 0.0, 'credit': 7.30, 'account_id': self.account_rcv.id}, ]) def test_statement_usd_invoice_chf_transaction_chf(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_swiss_id, 50, self.bank_journal_usd, 42, 50, self.currency_swiss_id) self.assertRecordValues(customer_move_lines, [ - {'debit': 27.47, 'credit': 0.0, 'amount_currency': 42, 'currency_id': self.currency_usd_id}, {'debit': 0.0, 'credit': 27.47, 'amount_currency': -50, 'currency_id': self.currency_swiss_id}, + {'debit': 27.47, 'credit': 0.0, 'amount_currency': 42, 'currency_id': self.currency_usd_id}, ]) exchange_lines = customer_move_lines.mapped('full_reconcile_id.exchange_move_id.line_ids') self.assertRecordValues(exchange_lines, [ - {'debit': 10.74, 'credit': 0.0, 'account_id': self.diff_expense_account.id}, {'debit': 0.0, 'credit': 10.74, 'account_id': self.account_rcv.id}, + {'debit': 10.74, 'credit': 0.0, 'account_id': self.diff_expense_account.id}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 27.47, 'amount_currency': -42, 'currency_id': self.currency_usd_id}, {'debit': 27.47, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_swiss_id}, + {'debit': 0.0, 'credit': 27.47, 'amount_currency': -42, 'currency_id': self.currency_usd_id}, ]) exchange_lines = supplier_move_lines.mapped('full_reconcile_id.exchange_move_id.line_ids') self.assertRecordValues(exchange_lines, [ + {'debit': 10.74, 'credit': 0.0, 'account_id': self.account_rsa.id}, {'debit': 0.0, 'credit': 10.74, 'account_id': self.diff_income_account.id}, - {'debit': 10.74, 'credit': 0.0, 'account_id': self.account_rcv.id}, ]) def test_statement_eur_invoice_usd_transaction_usd(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_usd_id, 50, self.bank_journal_euro, 40, 50, self.currency_usd_id) self.assertRecordValues(customer_move_lines, [ - {'debit': 40.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, {'debit': 0.0, 'credit': 40.0, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, + {'debit': 40.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, ]) exchange_lines = customer_move_lines.mapped('full_reconcile_id.exchange_move_id.line_ids') self.assertRecordValues(exchange_lines, [ - {'debit': 0.0, 'credit': 7.30, 'account_id': self.diff_income_account.id}, {'debit': 7.30, 'credit': 0.0, 'account_id': self.account_rcv.id}, + {'debit': 0.0, 'credit': 7.30, 'account_id': self.diff_income_account.id}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 40.0, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, {'debit': 40.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_usd_id}, + {'debit': 0.0, 'credit': 40.0, 'amount_currency': -50, 'currency_id': self.currency_usd_id}, ]) exchange_lines = supplier_move_lines.mapped('full_reconcile_id.exchange_move_id.line_ids') self.assertRecordValues(exchange_lines, [ + {'debit': 0.0, 'credit': 7.30, 'account_id': self.account_rsa.id}, {'debit': 7.30, 'credit': 0.0, 'account_id': self.diff_expense_account.id}, - {'debit': 0.0, 'credit': 7.30, 'account_id': self.account_rcv.id}, ]) def test_statement_eur_invoice_usd_transaction_eur(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_usd_id, 50, self.bank_journal_euro, 40, 0.0, False) self.assertRecordValues(customer_move_lines, [ - {'debit': 40.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False}, {'debit': 0.0, 'credit': 40.0, 'amount_currency': 0.0, 'currency_id': False}, + {'debit': 40.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 40.0, 'amount_currency': 0.0, 'currency_id': False}, {'debit': 40.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False}, + {'debit': 0.0, 'credit': 40.0, 'amount_currency': 0.0, 'currency_id': False}, ]) def test_statement_euro_invoice_usd_transaction_chf(self): customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_usd_id, 50, self.bank_journal_euro, 42, 50, self.currency_swiss_id) self.assertRecordValues(customer_move_lines, [ - {'debit': 42.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_swiss_id}, {'debit': 0.0, 'credit': 42.0, 'amount_currency': -50, 'currency_id': self.currency_swiss_id}, + {'debit': 42.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_swiss_id}, ]) self.assertRecordValues(supplier_move_lines, [ - {'debit': 0.0, 'credit': 42.0, 'amount_currency': -50, 'currency_id': self.currency_swiss_id}, {'debit': 42.0, 'credit': 0.0, 'amount_currency': 50, 'currency_id': self.currency_swiss_id}, + {'debit': 0.0, 'credit': 42.0, 'amount_currency': -50, 'currency_id': self.currency_swiss_id}, ]) def test_statement_euro_invoice_usd_transaction_euro_full(self): - #we create an invoice in given invoice_currency - invoice_record = self.create_invoice(type='out_invoice', invoice_amount=50, currency_id=self.currency_usd_id) - #we encode a payment on it, on the given bank_journal with amount, amount_currency and transaction_currency given - bank_stmt = self.acc_bank_stmt_model.create({ - 'journal_id': self.bank_journal_euro.id, - 'date': time.strftime('%Y') + '-01-01', + # Create a customer invoice of 50 USD. + partner = self.env['res.partner'].create({'name': 'test'}) + move = self.env['account.move'].with_context(default_type='out_invoice').create({ + 'type': 'out_invoice', + 'partner_id': partner.id, + 'invoice_date': '%s-07-01' % time.strftime('%Y'), + 'date': '%s-07-01' % time.strftime('%Y'), + 'currency_id': self.currency_usd_id, + 'invoice_line_ids': [ + (0, 0, {'quantity': 1, 'price_unit': 50.0, 'name': 'test'}) + ], }) + move.post() - bank_stmt_line = self.acc_bank_stmt_line_model.create({'name': 'payment', - 'statement_id': bank_stmt.id, - 'partner_id': self.partner_agrolait_id, - 'amount': 40, - 'date': time.strftime('%Y') + '-01-01',}) + # Create a bank statement of 40 EURO. + bank_stmt = self.env['account.bank.statement'].create({ + 'journal_id': self.bank_journal_euro.id, + 'date': '%s-01-01' % time.strftime('%Y'), + 'line_ids': [ + (0, 0, { + 'name': 'test', + 'partner_id': partner.id, + 'amount': 40.0, + 'date': '%s-01-01' % time.strftime('%Y') + }) + ], + }) - #reconcile the payment with the invoice - for l in invoice_record.move_id.line_ids: - if l.account_id.id == self.account_rcv.id: - line_id = l - break - bank_stmt_line.process_reconciliation(counterpart_aml_dicts=[{ - 'move_line': line_id, + # Reconcile the bank statement with the invoice. + receivable_line = move.line_ids.filtered(lambda line: line.account_id.user_type_id.type in ('receivable', 'payable')) + bank_stmt.line_ids[0].process_reconciliation(counterpart_aml_dicts=[{ + 'move_line': receivable_line, 'debit': 0.0, 'credit': 32.7, 'name': 'test_statement_euro_invoice_usd_transaction_euro_full', @@ -343,18 +346,17 @@ class TestReconciliationExec(TestReconciliation): }]) self.assertRecordValues(bank_stmt.move_line_ids, [ - {'debit': 40.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False}, - {'debit': 0.0, 'credit': 32.7, 'amount_currency': 0.0, 'currency_id': False}, {'debit': 0.0, 'credit': 7.3, 'amount_currency': 0.0, 'currency_id': False}, + {'debit': 0.0, 'credit': 32.7, 'amount_currency': 0.0, 'currency_id': False}, + {'debit': 40.0, 'credit': 0.0, 'amount_currency': 0.0, 'currency_id': False}, ]) # The invoice should be paid, as the payments totally cover its total - self.assertEquals(invoice_record.state, 'paid', 'The invoice should be paid by now') - invoice_rec_line = invoice_record.move_id.line_ids.filtered(lambda x: x.account_id.reconcile) - self.assertTrue(invoice_rec_line.reconciled, 'The invoice should be totally reconciled') - self.assertTrue(invoice_rec_line.full_reconcile_id, 'The invoice should have a full reconcile number') - self.assertEquals(invoice_rec_line.amount_residual, 0, 'The invoice should be totally reconciled') - self.assertEquals(invoice_rec_line.amount_residual_currency, 0, 'The invoice should be totally reconciled') + self.assertEquals(move.invoice_payment_state, 'paid', 'The invoice should be paid by now') + self.assertTrue(receivable_line.reconciled, 'The invoice should be totally reconciled') + self.assertTrue(receivable_line.full_reconcile_id, 'The invoice should have a full reconcile number') + self.assertEquals(receivable_line.amount_residual, 0, 'The invoice should be totally reconciled') + self.assertEquals(receivable_line.amount_residual_currency, 0, 'The invoice should be totally reconciled') @unittest.skip('adapt to new accounting') def test_balanced_exchanges_gain_loss(self): @@ -376,7 +378,8 @@ class TestReconciliationExec(TestReconciliation): 'name': 'Foreign invoice with exchange gain', 'account_id': self.account_rcv_id, 'type': 'out_invoice', - 'date_invoice': time.strftime('%Y-%m-%d'), + 'invoice_date': time.strftime('%Y-%m-%d'), + 'date': time.strftime('%Y-%m-%d'), 'journal_id': self.bank_journal_usd_id, 'invoice_line': [ (0, 0, { @@ -386,7 +389,7 @@ class TestReconciliationExec(TestReconciliation): }) ] }) - invoice.action_invoice_open() + invoice.post() # We create a bank statement with two lines of 1.00 USD each. statement = self.acc_bank_stmt_model.create({ 'journal_id': self.bank_journal_usd_id, @@ -409,7 +412,7 @@ class TestReconciliationExec(TestReconciliation): # We process the reconciliation of the invoice line with the two bank statement lines line_id = None - for l in invoice.move_id.line_id: + for l in invoice.line_id: if l.account_id.id == self.account_rcv_id: line_id = l break @@ -581,16 +584,10 @@ class TestReconciliationExec(TestReconciliation): 'currency_id': self.currency_usd_id, 'payment_date': time.strftime('%Y') + '-07-15', 'journal_id': self.bank_journal_usd.id, + 'invoice_ids': [(6, 0, invoice.ids)], }) payment.post() - payment_move_line = False - bank_move_line = False - for l in payment.move_line_ids: - if l.account_id.id == self.account_rcv.id: - payment_move_line = l - else: - bank_move_line = l - invoice.register_payment(payment_move_line) + bank_move_line = payment.move_line_ids.filtered(lambda line: line.account_id.internal_type == 'liquidity') # create bank statement bank_stmt = self.acc_bank_stmt_model.create({ @@ -659,7 +656,6 @@ class TestReconciliationExec(TestReconciliation): # Counterpart Credit goes in Exchange diff dest_journal_id = self.env['account.journal'].search([('type', '=', 'purchase'), ('company_id', '=', self.env.ref('base.main_company').id)], limit=1) - account_expenses = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_expenses').id)], limit=1) self.bank_journal_euro.write({'default_debit_account_id': self.account_rsa.id, 'default_credit_account_id': self.account_rsa.id}) @@ -682,38 +678,27 @@ class TestReconciliationExec(TestReconciliation): 'company_id': self.env.ref('base.main_company').id}) # Preparing Invoices (from vendor) - invoice_a = self.account_invoice_model.create({'partner_id': self.partner_agrolait_id, - 'currency_id': self.currency_usd_id, - 'name': 'invoice to vendor', - 'account_id': self.account_rsa.id, + invoice_a = self.env['account.move'].with_context(default_type='in_invoice').create({ 'type': 'in_invoice', - 'date_invoice': time.strftime('%Y') + '-' + '07' + '-01', - }) - self.account_invoice_line_model.create({'product_id': self.product.id, - 'quantity': 1, - 'price_unit': 50, - 'invoice_id': invoice_a.id, - 'name': 'product that cost ' + str(50), - 'account_id': account_expenses.id, - }) - - invoice_b = self.account_invoice_model.create({'partner_id': self.partner_agrolait_id, + 'partner_id': self.partner_agrolait_id, 'currency_id': self.currency_usd_id, - 'name': 'invoice to vendor', - 'account_id': self.account_rsa.id, + 'invoice_date': '%s-07-01' % time.strftime('%Y'), + 'date': '%s-07-01' % time.strftime('%Y'), + 'invoice_line_ids': [ + (0, 0, {'product_id': self.product.id, 'quantity': 1, 'price_unit': 50.0}) + ], + }) + invoice_b = self.env['account.move'].with_context(default_type='in_invoice').create({ 'type': 'in_invoice', - 'date_invoice': time.strftime('%Y') + '-' + '08' + '-01', - }) - self.account_invoice_line_model.create({'product_id': self.product.id, - 'quantity': 1, - 'price_unit': 50, - 'invoice_id': invoice_b.id, - 'name': 'product that cost ' + str(50), - 'account_id': account_expenses.id, + 'partner_id': self.partner_agrolait_id, + 'currency_id': self.currency_usd_id, + 'invoice_date': '%s-08-01' % time.strftime('%Y'), + 'date': '%s-08-01' % time.strftime('%Y'), + 'invoice_line_ids': [ + (0, 0, {'product_id': self.product.id, 'quantity': 1, 'price_unit': 50.0}) + ], }) - - invoice_a.action_invoice_open() - invoice_b.action_invoice_open() + (invoice_a + invoice_b).post() # Preparing Payments # One partial for invoice_a (fully assigned to it) @@ -761,27 +746,27 @@ class TestReconciliationExec(TestReconciliation): debit_line_b = payment_b.move_line_ids.filtered(lambda l: l.debit and l.account_id == dest_journal_id.default_debit_account_id) debit_line_c = payment_c.move_line_ids.filtered(lambda l: l.debit and l.account_id == dest_journal_id.default_debit_account_id) - invoice_a.assign_outstanding_credit(debit_line_a.id) - invoice_a.assign_outstanding_credit(debit_line_b.id) - invoice_b.assign_outstanding_credit(debit_line_b.id) - invoice_b.assign_outstanding_credit(debit_line_c.id) + invoice_a.js_assign_outstanding_line(debit_line_a.id) + invoice_a.js_assign_outstanding_line(debit_line_b.id) + invoice_b.js_assign_outstanding_line(debit_line_b.id) + invoice_b.js_assign_outstanding_line(debit_line_c.id) # Asserting correctness (only in the payable account) full_reconcile = False - for inv in (invoice_a + invoice_b): - self.assertTrue(inv.reconciled) - for aml in (inv.payment_move_line_ids + inv.move_id.line_ids).filtered(lambda l: l.account_id == self.account_rsa): - self.assertEqual(aml.amount_residual, 0.0) - self.assertEqual(aml.amount_residual_currency, 0.0) - self.assertTrue(aml.reconciled) - if not full_reconcile: - full_reconcile = aml.full_reconcile_id - else: - self.assertTrue(aml.full_reconcile_id == full_reconcile) + reconciled_amls = (debit_line_a + debit_line_b + debit_line_c + (invoice_a + invoice_b).mapped('line_ids'))\ + .filtered(lambda l: l.account_id == self.account_rsa) + for aml in reconciled_amls: + self.assertEqual(aml.amount_residual, 0.0) + self.assertEqual(aml.amount_residual_currency, 0.0) + self.assertTrue(aml.reconciled) + if not full_reconcile: + full_reconcile = aml.full_reconcile_id + else: + self.assertTrue(aml.full_reconcile_id == full_reconcile) full_rec_move = full_reconcile.exchange_move_id # Globally check whether the amount is correct - self.assertEqual(full_rec_move.amount, 18.75) + self.assertEqual(sum(full_rec_move.mapped('line_ids.debit')), 18.75) # Checking if the direction of the move is correct full_rec_payable = full_rec_move.line_ids.filtered(lambda l: l.account_id == self.account_rsa) @@ -806,22 +791,19 @@ class TestReconciliationExec(TestReconciliation): credit_aml = payment.move_line_ids.filtered('credit') # Check residual before assignation - self.assertAlmostEquals(inv1.residual, 10) - self.assertAlmostEquals(inv2.residual, 20) + self.assertAlmostEquals(inv1.amount_residual, 10) + self.assertAlmostEquals(inv2.amount_residual, 20) # Assign credit and residual - inv1.assign_outstanding_credit(credit_aml.id) - inv2.assign_outstanding_credit(credit_aml.id) - self.assertAlmostEquals(inv1.residual, 0) - self.assertAlmostEquals(inv2.residual, 0) + inv1.js_assign_outstanding_line(credit_aml.id) + inv2.js_assign_outstanding_line(credit_aml.id) + self.assertAlmostEquals(inv1.amount_residual, 0) + self.assertAlmostEquals(inv2.amount_residual, 0) # Unreconcile one invoice at a time and check residual - credit_aml.with_context(invoice_id=inv1.id).remove_move_reconcile() - self.assertAlmostEquals(inv1.residual, 10) - self.assertAlmostEquals(inv2.residual, 0) - credit_aml.with_context(invoice_id=inv2.id).remove_move_reconcile() - self.assertAlmostEquals(inv1.residual, 10) - self.assertAlmostEquals(inv2.residual, 20) + credit_aml.remove_move_reconcile() + self.assertAlmostEquals(inv1.amount_residual, 10) + self.assertAlmostEquals(inv2.amount_residual, 20) def test_unreconcile_exchange(self): # Use case: @@ -860,16 +842,16 @@ class TestReconciliationExec(TestReconciliation): credit_aml = payment.move_line_ids.filtered('credit') # Check residual before assignation - self.assertAlmostEquals(inv.residual, 111) + self.assertAlmostEquals(inv.amount_residual, 111) # Assign credit, check exchange move and residual - inv.assign_outstanding_credit(credit_aml.id) + inv.js_assign_outstanding_line(credit_aml.id) self.assertEqual(len(payment.move_line_ids.mapped('full_reconcile_id').exchange_move_id), 1) - self.assertAlmostEquals(inv.residual, 0) + self.assertAlmostEquals(inv.amount_residual, 0) # Unreconcile invoice and check residual credit_aml.with_context(invoice_id=inv.id).remove_move_reconcile() - self.assertAlmostEquals(inv.residual, 111) + self.assertAlmostEquals(inv.amount_residual, 111) def test_revert_payment_and_reconcile(self): payment = self.env['account.payment'].create({ @@ -896,9 +878,8 @@ class TestReconciliationExec(TestReconciliation): move = bank_line.move_id # Reversing the payment's move - reversed_move_list = move.reverse_moves('2018-06-04') - self.assertEqual(len(reversed_move_list), 1) - reversed_move = self.env['account.move'].browse(reversed_move_list[0]) + reversed_move = move._reverse_moves([{'date': '2018-06-04'}]) + self.assertEqual(len(reversed_move), 1) self.assertEqual(len(reversed_move.line_ids), 2) @@ -914,26 +895,22 @@ class TestReconciliationExec(TestReconciliation): self.assertEqual(reversed_bank_line.full_reconcile_id.id, bank_line.full_reconcile_id.id) self.assertEqual(reversed_customer_line.full_reconcile_id.id, customer_line.full_reconcile_id.id) - def create_invoice_partner(self, type='out_invoice', invoice_amount=50, currency_id=None, partner_id=False): - #we create an invoice in given currency - invoice = self.account_invoice_model.create({'partner_id': partner_id, - 'currency_id': currency_id, - 'name': type == 'out_invoice' and 'invoice to client' or 'invoice to vendor', - 'account_id': self.account_rcv.id, + def create_invoice_partner(self, type='out_invoice', invoice_amount=50, currency_id=None, partner_id=False, payment_term_id=False): + move = self.env['account.move'].with_context(default_type=type).create({ 'type': type, - 'date_invoice': time.strftime('%Y') + '-07-01', - }) - self.account_invoice_line_model.create({'product_id': self.product.id, - 'quantity': 1, - 'price_unit': invoice_amount, - 'invoice_id': invoice.id, - 'name': 'product that cost ' + str(invoice_amount), - 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id, + 'partner_id': partner_id, + 'invoice_date': time.strftime('%Y') + '-07-01', + 'date': time.strftime('%Y') + '-07-01', + 'currency_id': currency_id, + 'invoice_payment_term_id': payment_term_id, + 'invoice_line_ids': [(0, 0, { + 'quantity': 1, + 'price_unit': invoice_amount, + 'name': 'product that cost ' + str(invoice_amount), + })], }) - - #validate invoice - invoice.action_invoice_open() - return invoice + move.post() + return move def test_aged_report(self): AgedReport = self.env['report.account.report_agedpartnerbalance'].with_context(include_nullified_amount=True) @@ -963,7 +940,7 @@ class TestReconciliationExec(TestReconciliation): # Case 2: The invoice and payment are not reconciled: we should have one line on the report # and 2 amls - invoice.move_id.line_ids.with_context(invoice_id=invoice.id).remove_move_reconcile() + invoice.line_ids.with_context(invoice_id=invoice.id).remove_move_reconcile() report_lines, total, amls = AgedReport._get_partner_move_lines(account_type, report_date_to, 'posted', 30) partner_lines = [line for line in report_lines if line['partner_id'] == partner.id] @@ -1028,17 +1005,17 @@ class TestReconciliationExec(TestReconciliation): payment.post() credit_aml = payment.move_line_ids.filtered('credit') - inv.assign_outstanding_credit(credit_aml.id) - self.assertTrue(inv.state == 'paid', 'The invoice should be paid') + inv.js_assign_outstanding_line(credit_aml.id) + self.assertTrue(inv.invoice_payment_state == 'paid', 'The invoice should be paid') exchange_reconcile = payment.move_line_ids.mapped('full_reconcile_id') exchange_move = exchange_reconcile.exchange_move_id payment_move = payment.move_line_ids[0].move_id - reverted_payment_move = self.env['account.move'].browse(payment_move.reverse_moves(time.strftime('%Y') + '-08-01')) + reverted_payment_move = payment_move._reverse_moves([{'date': time.strftime('%Y') + '-08-01'}], cancel=True) # After reversal of payment, the invoice should be open - self.assertTrue(inv.state == 'open', 'The invoice should be open again') + self.assertTrue(inv.state == 'posted', 'The invoice should be open again') self.assertFalse(exchange_reconcile.exists()) reverted_exchange_move = self.env['account.move'].search([('journal_id', '=', exchange_move.journal_id.id), ('ref', 'ilike', exchange_move.name)], limit=1) @@ -1061,12 +1038,12 @@ class TestReconciliationExec(TestReconciliation): # Also, in this case, there can be only 1 partial_reconcile statement_partial_id = statement.move_line_ids.mapped(lambda l: l.matched_credit_ids + l.matched_debit_ids) self.env.cr.execute('UPDATE account_partial_reconcile SET create_date = %(date)s WHERE id = %(partial_id)s', - {'date': invoice.date_invoice, + {'date': invoice.invoice_date, 'partial_id': statement_partial_id.id}) # Case 1: report date is invoice date # There should be an entry for the partner - report_date_to = invoice.date_invoice + report_date_to = invoice.invoice_date report_lines, total, amls = AgedReport._get_partner_move_lines(account_type, report_date_to, 'posted', 30) partner_lines = [line for line in report_lines if line['partner_id'] == partner.id] @@ -1129,9 +1106,6 @@ class TestReconciliationExec(TestReconciliation): # * Dr. 100 USD / 50 EUR - Accounts receivable # * Cr. 100 USD / 50 EUR - Revenue #### - account_revenue = self.env['account.account'].search( - [('user_type_id', '=', self.env.ref( - 'account.data_account_type_revenue').id)], limit=1) dest_journal_id = self.env['account.journal'].search( [('type', '=', 'purchase'), ('company_id', '=', self.env.ref('base.main_company').id)], @@ -1148,24 +1122,18 @@ class TestReconciliationExec(TestReconciliation): 'rate': 2, }) - invoice_cust_1 = self.account_invoice_model.create({ - 'partner_id': self.partner_agrolait_id, - 'account_id': self.account_rcv.id, + invoice_cust_1 = self.env['account.move'].with_context(default_type='out_invoice').create({ 'type': 'out_invoice', + 'partner_id': self.partner_agrolait_id, + 'invoice_date': '%s-01-01' % time.strftime('%Y'), + 'date': '%s-01-01' % time.strftime('%Y'), 'currency_id': self.currency_usd_id, - 'date_invoice': time.strftime('%Y') + '-01-01', - }) - self.account_invoice_line_model.create({ - 'quantity': 1.0, - 'price_unit': 100.0, - 'invoice_id': invoice_cust_1.id, - 'name': 'product that cost 100', - 'account_id': account_revenue.id, - }) - invoice_cust_1.action_invoice_open() - self.assertEqual(invoice_cust_1.residual_company_signed, 50.0) - aml = invoice_cust_1.move_id.mapped('line_ids').filtered( - lambda x: x.account_id == account_revenue) + 'invoice_line_ids': [ + (0, 0, {'quantity': 1, 'price_unit': 100.0, 'name': 'product that cost 100'}) + ], + }) + invoice_cust_1.post() + aml = invoice_cust_1.invoice_line_ids[0] self.assertEqual(aml.credit, 50.0) ##### # Day 2: Receive payment for half invoice Cust/1 (in USD) @@ -1193,17 +1161,12 @@ class TestReconciliationExec(TestReconciliation): 'currency_id': self.currency_usd_id, 'payment_date': time.strftime('%Y') + '-01-02', 'journal_id': dest_journal_id.id, + 'invoice_ids': [(6, 0, invoice_cust_1.ids)], }) payment.post() - payment_move_line = False - for l in payment.move_line_ids: - if l.account_id == invoice_cust_1.account_id: - payment_move_line = l - invoice_cust_1.register_payment(payment_move_line) # We expect at this point that the invoice should still be open, # because they owe us still 50 CC. - self.assertEqual(invoice_cust_1.state, 'open', - 'Invoice is in status %s' % invoice_cust_1.state) + self.assertEqual(invoice_cust_1.invoice_payment_state, 'not_paid', 'Invoice is in status %s' % invoice_cust_1.state) def test_multiple_term_reconciliation_opw_1906665(self): '''Test that when registering a payment to an invoice with multiple @@ -1228,25 +1191,11 @@ class TestReconciliationExec(TestReconciliation): }) # can't use self.create_invoice because it validates and we need to set payment_term_id - invoice = self.account_invoice_model.create({ - 'partner_id': self.partner_agrolait_id, - 'payment_term_id': payment_term.id, - 'currency_id': self.currency_usd_id, - 'name': 'Multiple payment terms', - 'account_id': self.account_rcv.id, - 'type': 'out_invoice', - 'date_invoice': time.strftime('%Y') + '-07-01', - }) - self.account_invoice_line_model.create({ - 'product_id': self.product.id, - 'quantity': 1, - 'price_unit': 50, - 'invoice_id': invoice.id, - 'name': self.product.display_name, - 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id, - }) - - invoice.action_invoice_open() + invoice = self.create_invoice_partner( + partner_id=self.partner_agrolait_id, + payment_term_id=payment_term.id, + currency_id=self.currency_usd_id, + ) payment = self.env['account.payment'].create({ 'payment_type': 'inbound', @@ -1259,10 +1208,10 @@ class TestReconciliationExec(TestReconciliation): }) payment.post() - invoice.assign_outstanding_credit(payment.move_line_ids.filtered('credit').id) + receivable_line = payment.move_line_ids.filtered('credit') + invoice.js_assign_outstanding_line(receivable_line.id) - receivable_lines = invoice.move_id.line_ids.filtered(lambda line: line.account_id == self.account_rcv).sorted('date_maturity')[0] - self.assertTrue(receivable_lines.matched_credit_ids) + self.assertTrue(receivable_line.matched_debit_ids) def test_reconciliation_cash_basis01(self): # Simulates an expense made up by 2 lines @@ -1272,61 +1221,31 @@ class TestReconciliationExec(TestReconciliation): company = self.env.ref('base.main_company') company.tax_cash_basis_journal_id = self.cash_basis_journal - AccountMoveLine = self.env['account.move.line'].with_context(check_move_validity=False) - - # Purchase purchase_move = self.env['account.move'].create({ - 'name': 'purchase', 'journal_id': self.purchase_journal.id, - }) - - purchase_payable_line0 = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'credit': 100, - 'move_id': purchase_move.id, - }) - purchase_payable_line1 = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'credit': 50, - 'move_id': purchase_move.id, - }) - AccountMoveLine.create({ - 'name': 'expensNoTax', - 'account_id': self.expense_account.id, - 'debit': 50, - 'move_id': purchase_move.id, - }) - AccountMoveLine.create({ - 'name': 'expenseTaxed', - 'account_id': self.expense_account.id, - 'debit': 83.33, - 'move_id': purchase_move.id, - 'tax_ids': [(4, self.tax_cash_basis.id, False)], - }) - tax_line = AccountMoveLine.create({ - 'name': 'TaxLine', - 'account_id': self.tax_waiting_account.id, - 'debit': 16.67, - 'move_id': purchase_move.id, - 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, - 'tax_base_amount': 83.33, + 'line_ids': [ + (0, 0, {'account_id': self.account_rsa.id, 'debit': 0.0, 'credit': 100.0}), + (0, 0, {'account_id': self.account_rsa.id, 'debit': 0.0, 'credit': 50.0}), + (0, 0, {'account_id': self.expense_account.id, 'debit': 50.0, 'credit': 0.0}), + (0, 0, {'account_id': self.expense_account.id, 'debit': 83.33, 'credit': 0.0, 'tax_ids': [(4, self.tax_cash_basis.id)], 'tax_exigible': False}), + (0, 0, { + 'account_id': self.tax_waiting_account.id, + 'debit': 16.67, + 'credit': 0.0, + 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, + 'tax_base_amount': 83.33, + 'tax_exigible': False + }), + ], }) purchase_move.post() - # Payment Move payment_move = self.env['account.move'].create({ - 'name': 'payment', 'journal_id': self.bank_journal_euro.id, - }) - payment_payable_line = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'debit': 150, - 'move_id': payment_move.id, - }) - AccountMoveLine.create({ - 'account_id': self.account_euro.id, - 'credit': 150, - 'move_id': payment_move.id, + 'line_ids': [ + (0, 0, {'account_id': self.account_rsa.id, 'debit': 150.0, 'credit': 0.0}), + (0, 0, {'account_id': self.account_euro.id, 'debit': 0.0, 'credit': 150.0}), + ], }) payment_move.post() @@ -1339,21 +1258,21 @@ class TestReconciliationExec(TestReconciliation): self.assertTrue(cash_basis_moves.exists()) # check reconciliation in Payable account - self.assertTrue(purchase_payable_line0.full_reconcile_id.exists()) - self.assertEqual(purchase_payable_line0.full_reconcile_id.reconciled_line_ids, - purchase_payable_line0 + purchase_payable_line1 + payment_payable_line) + self.assertTrue(purchase_move.line_ids[0].full_reconcile_id.exists()) + self.assertEqual(purchase_move.line_ids[0].full_reconcile_id.reconciled_line_ids, + purchase_move.line_ids[0] + purchase_move.line_ids[1] + payment_move.line_ids[0]) cash_basis_aml_ids = cash_basis_moves.mapped('line_ids') # check reconciliation in the tax waiting account - self.assertTrue(tax_line.full_reconcile_id.exists()) - self.assertEqual(tax_line.full_reconcile_id.reconciled_line_ids, - cash_basis_aml_ids.filtered(lambda l: l.account_id == self.tax_waiting_account) + tax_line) + self.assertTrue(purchase_move.line_ids[4].full_reconcile_id.exists()) + self.assertEqual(purchase_move.line_ids[4].full_reconcile_id.reconciled_line_ids, + cash_basis_aml_ids.filtered(lambda l: l.account_id == self.tax_waiting_account) + purchase_move.line_ids[4]) self.assertEqual(len(cash_basis_aml_ids), 8) # check amounts - cash_basis_move1 = cash_basis_moves.filtered(lambda m: m.amount == 33.34) - cash_basis_move2 = cash_basis_moves.filtered(lambda m: m.amount == 66.66) + cash_basis_move1 = cash_basis_moves.filtered(lambda m: m.amount_total == 33.34) + cash_basis_move2 = cash_basis_moves.filtered(lambda m: m.amount_total == 66.66) self.assertTrue(cash_basis_move1.exists()) self.assertTrue(cash_basis_move2.exists()) @@ -1396,88 +1315,50 @@ class TestReconciliationExec(TestReconciliation): 'code': 'TWAIT1', }) - - AccountMoveLine = self.env['account.move.line'].with_context(check_move_validity=False) - - # Purchase purchase_move = self.env['account.move'].create({ - 'name': 'invoice', 'journal_id': self.purchase_journal.id, - }) - - purchase_payable_line0 = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'credit': 105, - 'move_id': purchase_move.id, - }) - purchase_payable_line1 = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'credit': 50, - 'move_id': purchase_move.id, - }) - AccountMoveLine.create({ - 'name': 'expenseTaxed 10%', - 'account_id': self.expense_account.id, - 'debit': 50, - 'move_id': purchase_move.id, - 'tax_ids': [(4, tax_cash_basis10percent.id, False)], - }) - tax_line0 = AccountMoveLine.create({ - 'name': 'TaxLine0', - 'account_id': tax_waiting_account10.id, - 'debit': 5, - 'move_id': purchase_move.id, - 'tax_repartition_line_id': tax_cash_basis10percent.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, - 'tax_base_amount': 50, - }) - AccountMoveLine.create({ - 'name': 'expenseTaxed 20%', - 'account_id': self.expense_account.id, - 'debit': 83.33, - 'move_id': purchase_move.id, - 'tax_ids': [(4, self.tax_cash_basis.id, False)], - }) - tax_line1 = AccountMoveLine.create({ - 'name': 'TaxLine1', - 'account_id': self.tax_waiting_account.id, - 'debit': 16.67, - 'move_id': purchase_move.id, - 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, - 'tax_base_amount': 83.33, + 'line_ids': [ + (0, 0, {'account_id': self.account_rsa.id, 'debit': 0.0, 'credit': 50.0}), + (0, 0, {'account_id': self.account_rsa.id, 'debit': 0.0, 'credit': 105.0}), + (0, 0, {'name': 'expenseTaxed 10%', 'account_id': self.expense_account.id, 'debit': 50.0, 'credit': 0.0, 'tax_ids': [(4, tax_cash_basis10percent.id)], 'tax_exigible': False}), + (0, 0, { + 'name': 'TaxLine0', + 'account_id': tax_waiting_account10.id, + 'debit': 5.0, + 'credit': 0.0, + 'tax_repartition_line_id': tax_cash_basis10percent.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, + 'tax_exigible': False, + 'tax_base_amount': 50.00, + }), + (0, 0, {'name': 'expenseTaxed 20%', 'account_id': self.expense_account.id, 'debit': 83.33, 'credit': 0.0, 'tax_ids': [(4, self.tax_cash_basis.id)], 'tax_exigible': False}), + (0, 0, { + 'name': 'TaxLine1', + 'account_id': self.tax_waiting_account.id, + 'debit': 16.67, + 'credit': 0.0, + 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, + 'tax_exigible': False, + 'tax_base_amount': 83.33, + }), + ], }) purchase_move.post() - # Payment Move payment_move0 = self.env['account.move'].create({ - 'name': 'payment', 'journal_id': self.bank_journal_euro.id, - }) - payment_payable_line0 = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'debit': 40, - 'move_id': payment_move0.id, - }) - AccountMoveLine.create({ - 'account_id': self.account_euro.id, - 'credit': 40, - 'move_id': payment_move0.id, + 'line_ids': [ + (0, 0, {'account_id': self.account_rsa.id, 'debit': 40.0, 'credit': 0.0}), + (0, 0, {'account_id': self.account_euro.id, 'debit': 0.0, 'credit': 40.0}), + ], }) payment_move0.post() - # Payment Move payment_move1 = self.env['account.move'].create({ - 'name': 'payment', 'journal_id': self.bank_journal_euro.id, - }) - payment_payable_line1 = AccountMoveLine.create({ - 'account_id': self.account_rsa.id, - 'debit': 115, - 'move_id': payment_move1.id, - }) - AccountMoveLine.create({ - 'account_id': self.account_euro.id, - 'credit': 115, - 'move_id': payment_move1.id, + 'line_ids': [ + (0, 0, {'account_id': self.account_rsa.id, 'debit': 115.0, 'credit': 0.0}), + (0, 0, {'account_id': self.account_euro.id, 'debit': 0.0, 'credit': 115.0}), + ], }) payment_move1.post() @@ -1490,32 +1371,32 @@ class TestReconciliationExec(TestReconciliation): self.assertTrue(cash_basis_moves.exists()) # check reconciliation in Payable account - self.assertTrue(purchase_payable_line0.full_reconcile_id.exists()) - self.assertEqual(purchase_payable_line0.full_reconcile_id.reconciled_line_ids, - purchase_payable_line0 + purchase_payable_line1 + payment_payable_line0 + payment_payable_line1) + self.assertTrue(purchase_move.line_ids[0].full_reconcile_id.exists()) + self.assertEqual(purchase_move.line_ids[0].full_reconcile_id.reconciled_line_ids, + (purchase_move + payment_move0 + payment_move1).mapped('line_ids').filtered(lambda l: l.account_id.internal_type == 'payable')) cash_basis_aml_ids = cash_basis_moves.mapped('line_ids') # check reconciliation in the tax waiting account - self.assertTrue(tax_line0.full_reconcile_id.exists()) - self.assertEqual(tax_line0.full_reconcile_id.reconciled_line_ids, - cash_basis_aml_ids.filtered(lambda l: l.account_id == tax_waiting_account10) + tax_line0) + self.assertTrue(purchase_move.line_ids[3].full_reconcile_id.exists()) + self.assertEqual(purchase_move.line_ids[3].full_reconcile_id.reconciled_line_ids, + cash_basis_aml_ids.filtered(lambda l: l.account_id == tax_waiting_account10) + purchase_move.line_ids[3]) - self.assertTrue(tax_line1.full_reconcile_id.exists()) - self.assertEqual(tax_line1.full_reconcile_id.reconciled_line_ids, - cash_basis_aml_ids.filtered(lambda l: l.account_id == self.tax_waiting_account) + tax_line1) + self.assertTrue(purchase_move.line_ids[5].full_reconcile_id.exists()) + self.assertEqual(purchase_move.line_ids[5].full_reconcile_id.reconciled_line_ids, + cash_basis_aml_ids.filtered(lambda l: l.account_id == self.tax_waiting_account) + purchase_move.line_ids[5]) self.assertEqual(len(cash_basis_aml_ids), 24) # check amounts expected_move_amounts = [ {'base_20': 56.45, 'tax_20': 11.29, 'base_10': 33.87, 'tax_10': 3.39}, - {'base_20': 21.50, 'tax_20': 4.30, 'base_10': 12.90, 'tax_10': 1.29}, {'base_20': 5.38, 'tax_20': 1.08, 'base_10': 3.23, 'tax_10': 0.32}, + {'base_20': 21.50, 'tax_20': 4.30, 'base_10': 12.90, 'tax_10': 1.29}, ] index = 0 - for cb_move in cash_basis_moves.sorted('amount', reverse=True): + for cb_move in cash_basis_moves: expected = expected_move_amounts[index] move_lines = cb_move.line_ids base_amount_tax_lines20per = move_lines.filtered(lambda l: l.account_id == self.tax_base_amount_account and '20%' in l.name) @@ -1564,9 +1445,9 @@ class TestReconciliationExec(TestReconciliation): previous_name = st_line.move_name with self.assertRaises(UserError): #you need edition mode to be able to change it - st_line.with_context(edition_mode=False).process_reconciliation( + st_line.with_context(suspense_moves_mode=False).process_reconciliation( counterpart_aml_dicts=[], - new_aml_dicts = [{ + new_aml_dicts=[{ 'debit': 0, 'credit': 50, 'name': 'exchange difference', @@ -1574,9 +1455,9 @@ class TestReconciliationExec(TestReconciliation): }], ) - st_line.with_context(edition_mode=True).process_reconciliation( + st_line.with_context(suspense_moves_mode=True).process_reconciliation( counterpart_aml_dicts=[], - new_aml_dicts = [{ + new_aml_dicts=[{ 'debit': 0, 'credit': 50, 'name': 'exchange difference', @@ -1628,83 +1509,70 @@ class TestReconciliationExec(TestReconciliation): company.country_id = self.ref('base.us') company.tax_cash_basis_journal_id = self.cash_basis_journal - aml_obj = self.env['account.move.line'].with_context( - check_move_validity=False) - # Purchase purchase_move = self.env['account.move'].create({ - 'name': 'purchase', 'journal_id': self.purchase_journal.id, - }) - - aml_obj.create({ - 'name': 'expenseTaxed', - 'account_id': self.expense_account.id, - 'debit': 106841.65, - 'move_id': purchase_move.id, - 'tax_ids': [(4, self.tax_cash_basis.id, False)], - 'currency_id': self.currency_usd_id, - 'amount_currency': 5301.00, - }) - aml_obj.create({ - 'name': 'TaxLine', - 'account_id': self.tax_waiting_account.id, - 'debit': 17094.66, - 'move_id': purchase_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 848.16, - 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, - 'tax_base_amount': 106841.65, - }) - purchase_payable_line0 = aml_obj.create({ - 'name': 'Payable', - 'account_id': self.account_rsa.id, - 'credit': 123936.31, - 'move_id': purchase_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': -6149.16, + 'line_ids': [ + (0, 0, { + 'name': 'expenseTaxed', + 'account_id': self.expense_account.id, + 'currency_id': self.currency_usd_id, + 'tax_ids': [(4, self.tax_cash_basis.id)], + 'tax_exigible': False, + 'debit': 106841.65, 'credit': 0.0, 'amount_currency': 5301.00, + }), + (0, 0, { + 'name': 'TaxLine', + 'account_id': self.tax_waiting_account.id, + 'currency_id': self.currency_usd_id, + 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, + 'tax_exigible': False, + 'tax_base_amount': 106841.65, + 'debit': 17094.66, 'credit': 0.0, 'amount_currency': 848.16, + }), + (0, 0, { + 'name': 'Payable', + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 123936.31, 'amount_currency': -6149.16, + }), + ], }) purchase_move.post() # FX 01 Move fx_move_01 = self.env['account.move'].create({ - 'name': 'FX 01', 'journal_id': self.fx_journal.id, - }) - fx_01_payable_line = aml_obj.create({ - 'account_id': self.account_rsa.id, - 'debit': 167.86, - 'move_id': fx_move_01.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 0.00, - }) - aml_obj.create({ - 'account_id': self.diff_income_account.id, - 'credit': 167.86, - 'move_id': fx_move_01.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 0.00, + 'line_ids': [ + (0, 0, { + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 167.86, 'credit': 0.0, 'amount_currency': 0.00, + }), + (0, 0, { + 'account_id': self.diff_income_account.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 167.86, 'amount_currency': 0.0, + }), + ], }) fx_move_01.post() # Payment Move payment_move = self.env['account.move'].create({ - 'name': 'payment', 'journal_id': self.bank_journal_usd.id, - }) - payment_payable_line = aml_obj.create({ - 'account_id': self.account_rsa.id, - 'debit': 123768.45, - 'move_id': payment_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 6149.16, - }) - aml_obj.create({ - 'account_id': self.account_usd.id, - 'credit': 123768.45, - 'move_id': payment_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': -6149.16, + 'line_ids': [ + (0, 0, { + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 123768.45, 'credit': 0.0, 'amount_currency': 6149.16, + }), + (0, 0, { + 'account_id': self.account_usd.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 123768.45, 'amount_currency': -6149.16, + }), + ], }) payment_move.post() @@ -1714,10 +1582,10 @@ class TestReconciliationExec(TestReconciliation): to_reconcile.reconcile() # check reconciliation in Payable account - self.assertTrue(purchase_payable_line0.full_reconcile_id.exists()) + self.assertTrue(purchase_move.line_ids[2].full_reconcile_id.exists()) self.assertEqual( - purchase_payable_line0.full_reconcile_id.reconciled_line_ids, - purchase_payable_line0 + fx_01_payable_line + payment_payable_line) + purchase_move.line_ids[2].full_reconcile_id.reconciled_line_ids, + purchase_move.line_ids[2] + fx_move_01.line_ids[0] + payment_move.line_ids[0]) # check cash basis cash_basis_moves = self.env['account.move'].search( @@ -1734,7 +1602,7 @@ class TestReconciliationExec(TestReconciliation): self.assertTrue(cash_basis_move1.exists()) # For first move - move_lines = cash_basis_move1.line_ids + move_lines = cash_basis_moves.line_ids base_amount_tax_lines = move_lines.filtered( lambda l: l.account_id == self.tax_base_amount_account) self.assertEqual(len(base_amount_tax_lines), 2) @@ -1801,104 +1669,88 @@ class TestReconciliationExec(TestReconciliation): company.country_id = self.ref('base.us') company.tax_cash_basis_journal_id = self.cash_basis_journal - aml_obj = self.env['account.move.line'].with_context( - check_move_validity=False) - # Purchase purchase_move = self.env['account.move'].create({ - 'name': 'purchase', 'journal_id': self.purchase_journal.id, - }) - - aml_obj.create({ - 'name': 'expenseTaxed', - 'account_id': self.expense_account.id, - 'debit': 106841.65, - 'move_id': purchase_move.id, - 'tax_ids': [(4, self.tax_cash_basis.id, False)], - 'currency_id': self.currency_usd_id, - 'amount_currency': 5301.00, - }) - aml_obj.create({ - 'name': 'TaxLine', - 'account_id': self.tax_waiting_account.id, - 'debit': 17094.66, - 'move_id': purchase_move.id, - 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, - 'tax_base_amount': 106841.65, - 'currency_id': self.currency_usd_id, - 'amount_currency': 848.16, - }) - purchase_payable_line0 = aml_obj.create({ - 'name': 'Payable', - 'account_id': self.account_rsa.id, - 'credit': 123936.31, - 'move_id': purchase_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': -6149.16, + 'line_ids': [ + (0, 0, { + 'name': 'expenseTaxed', + 'account_id': self.expense_account.id, + 'currency_id': self.currency_usd_id, + 'tax_ids': [(4, self.tax_cash_basis.id)], + 'tax_exigible': False, + 'debit': 106841.65, 'credit': 0.0, 'amount_currency': 5301.00, + }), + (0, 0, { + 'name': 'TaxLine', + 'account_id': self.tax_waiting_account.id, + 'currency_id': self.currency_usd_id, + 'tax_repartition_line_id': self.tax_cash_basis.invoice_repartition_line_ids.filtered(lambda x: x.repartition_type == 'tax').id, + 'tax_exigible': False, + 'tax_base_amount': 106841.65, + 'debit': 17094.66, 'credit': 0.0, 'amount_currency': 848.16, + }), + (0, 0, { + 'name': 'Payable', + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 123936.31, 'amount_currency': -6149.16, + }), + ], }) purchase_move.post() # FX 01 Move fx_move_01 = self.env['account.move'].create({ - 'name': 'FX 01', 'journal_id': self.fx_journal.id, - }) - fx_01_payable_line = aml_obj.create({ - 'account_id': self.account_rsa.id, - 'credit': 1572.96, - 'move_id': fx_move_01.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 0.00, - }) - aml_obj.create({ - 'account_id': self.diff_expense_account.id, - 'debit': 1572.96, - 'move_id': fx_move_01.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 0.00, + 'line_ids': [ + (0, 0, { + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 1572.96, 'amount_currency': 0.00, + }), + (0, 0, { + 'account_id': self.diff_expense_account.id, + 'currency_id': self.currency_usd_id, + 'debit': 1572.96, 'credit': 0.0, 'amount_currency': 0.0, + }), + ], }) fx_move_01.post() # FX 02 Move fx_move_02 = self.env['account.move'].create({ - 'name': 'FX 02', 'journal_id': self.fx_journal.id, - }) - fx_02_payable_line = aml_obj.create({ - 'account_id': self.account_rsa.id, - 'debit': 1740.82, - 'move_id': fx_move_02.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 0.00, - }) - aml_obj.create({ - 'account_id': self.diff_income_account.id, - 'credit': 1740.82, - 'move_id': fx_move_02.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 0.00, + 'line_ids': [ + (0, 0, { + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 1740.82, 'credit': 0.0, 'amount_currency': 0.00, + }), + (0, 0, { + 'account_id': self.diff_income_account.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 1740.82, 'amount_currency': 0.0, + }), + ], }) fx_move_02.post() # Payment Move payment_move = self.env['account.move'].create({ - 'name': 'payment', 'journal_id': self.bank_journal_usd.id, - }) - payment_payable_line = aml_obj.create({ - 'account_id': self.account_rsa.id, - 'debit': 123768.45, - 'move_id': payment_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': 6149.16, - }) - aml_obj.create({ - 'account_id': self.account_usd.id, - 'credit': 123768.45, - 'move_id': payment_move.id, - 'currency_id': self.currency_usd_id, - 'amount_currency': -6149.16, + 'line_ids': [ + (0, 0, { + 'account_id': self.account_rsa.id, + 'currency_id': self.currency_usd_id, + 'debit': 123768.45, 'credit': 0.0, 'amount_currency': 6149.16, + }), + (0, 0, { + 'account_id': self.account_usd.id, + 'currency_id': self.currency_usd_id, + 'debit': 0.0, 'credit': 123768.45, 'amount_currency': -6149.16, + }), + ], }) payment_move.post() @@ -1909,11 +1761,11 @@ class TestReconciliationExec(TestReconciliation): to_reconcile.reconcile() # check reconciliation in Payable account - self.assertTrue(purchase_payable_line0.full_reconcile_id.exists()) + self.assertTrue(purchase_move.line_ids[2].full_reconcile_id.exists()) self.assertEqual( - purchase_payable_line0.full_reconcile_id.reconciled_line_ids, - purchase_payable_line0 + fx_01_payable_line + fx_02_payable_line + - payment_payable_line) + purchase_move.line_ids[2].full_reconcile_id.reconciled_line_ids, + purchase_move.line_ids[2] + fx_move_01.line_ids[0] + fx_move_02.line_ids[0] + + payment_move.line_ids[0]) # check cash basis cash_basis_moves = self.env['account.move'].search( @@ -2004,7 +1856,7 @@ class TestReconciliationExec(TestReconciliation): }) purchase_move.post() - reverted = self.env['account.move'].browse(purchase_move.reverse_moves()) + reverted = purchase_move._reverse_moves(cancel=True) self.assertTrue(reverted.exists()) for inv_line in [purchase_payable_line0, tax_line0, tax_line1]: @@ -2026,24 +1878,30 @@ class TestReconciliationExec(TestReconciliation): 'currency_id': self.currency_usd_id, 'company_id': self.env.ref('base.main_company').id, }) - invoice = self.create_invoice( - type='out_invoice', invoice_amount=50, - currency_id=self.currency_usd_id) - invoice.journal_id.update_posted = True - invoice.action_cancel() - invoice.state = 'draft' - invoice.invoice_line_ids.write({ - 'invoice_line_tax_ids': [(6, 0, [self.tax_cash_basis.id])]}) - invoice.compute_taxes() - invoice.action_invoice_open() + + move_form = Form(self.env['account.move'].with_context(default_type='out_invoice')) + move_form.partner_id = self.partner_agrolait + move_form.currency_id = self.env.ref('base.USD') + move_form.invoice_date = time.strftime('%Y') + '-07-01' + with move_form.invoice_line_ids.new() as line_form: + line_form.name = 'test line' + line_form.price_unit = 50 + line_form.tax_ids.clear() + invoice = move_form.save() + move_form = Form(invoice) + with move_form.invoice_line_ids.edit(0) as line_form: + line_form.tax_ids.add(self.tax_cash_basis) + invoice = move_form.save() + invoice.post() self.assertTrue(invoice.currency_id != self.env.user.company_id.currency_id) # First Payment - payment0 = self.make_payment(invoice, journal, invoice.amount_total - 0.01) - self.assertEqual(invoice.residual, 0.01) + payment0 = self.make_payment(invoice, journal, amount=59.99) + self.assertEqual(invoice.amount_residual, 0.01) - tax_waiting_line = invoice.move_id.line_ids.filtered(lambda l: l.account_id == self.tax_waiting_account) + tax_waiting_line = invoice.line_ids.filtered(lambda l: l.account_id == self.tax_waiting_account) + self.assertTrue(tax_waiting_line.exists()) self.assertFalse(tax_waiting_line.reconciled) move_caba0 = tax_waiting_line.matched_debit_ids.debit_move_id.move_id @@ -2056,8 +1914,8 @@ class TestReconciliationExec(TestReconciliation): # Second Payment payment1 = self.make_payment(invoice, journal, 0.01) - self.assertEqual(invoice.residual, 0) - self.assertEqual(invoice.state, 'paid') + self.assertEqual(invoice.amount_residual, 0) + self.assertEqual(invoice.invoice_payment_state, 'paid') self.assertTrue(tax_waiting_line.reconciled) move_caba1 = tax_waiting_line.matched_debit_ids.mapped('debit_move_id').mapped('move_id').filtered(lambda m: m != move_caba0) @@ -2211,4 +2069,4 @@ class TestReconciliationExec(TestReconciliation): }]) writeoff_line = self.env['account.move.line'].search([('name', '=', 'writeoff')]) - self.assertEquals(writeoff_line.credit, 15.0)
\ No newline at end of file + self.assertEquals(writeoff_line.credit, 15.0) |
