summaryrefslogtreecommitdiff
path: root/addons/account/tests/test_reconciliation.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/account/tests/test_reconciliation.py')
-rw-r--r--addons/account/tests/test_reconciliation.py918
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)