forked from Mapan/odoo17e
777 lines
40 KiB
Python
777 lines
40 KiB
Python
# pylint: disable=C0326
|
|
from .common import TestAccountReportsCommon
|
|
from odoo import fields, Command
|
|
from odoo.tests import tagged
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestReconciliationReport(TestAccountReportsCommon):
|
|
|
|
@classmethod
|
|
def setUpClass(cls, chart_template_ref=None):
|
|
super().setUpClass(chart_template_ref=chart_template_ref)
|
|
|
|
cls.currency_data_2 = cls.setup_multi_currency_data({
|
|
'name': 'Dark Chocolate Coin',
|
|
'symbol': '🍫',
|
|
'currency_unit_label': 'Dark Choco',
|
|
'currency_subunit_label': 'Dark Cacao Powder',
|
|
}, rate2016=10.0, rate2017=20.0)
|
|
|
|
def test_reconciliation_report_single_currency(self):
|
|
"""
|
|
Tests the impact of positive/negative payments/statements on the reconciliation report in a single-currency
|
|
environment.
|
|
"""
|
|
bank_journal = self.env['account.journal'].create({
|
|
'name': 'Bank',
|
|
'code': 'BNKKK',
|
|
'type': 'bank',
|
|
'company_id': self.company_data['company'].id,
|
|
})
|
|
|
|
# ==== Statements ====
|
|
|
|
self.env['account.bank.statement'].create({
|
|
'name': 'statement_1',
|
|
'date': '2014-12-31',
|
|
'balance_start': 0.0,
|
|
'balance_end_real': 100.0,
|
|
'line_ids': [
|
|
Command.create({'payment_ref': 'line_1', 'amount': 600.0, 'date': '2014-12-31', 'journal_id': bank_journal.id}),
|
|
Command.create({'payment_ref': 'line_2', 'amount': -500.0, 'date': '2014-12-31', 'journal_id': bank_journal.id}),
|
|
],
|
|
})
|
|
|
|
statement_2 = self.env['account.bank.statement'].create({
|
|
'name': 'statement_2',
|
|
'date': '2015-01-05',
|
|
'balance_start': 200.0, # create an unexplained difference of 100.0.
|
|
'balance_end_real': - 200.0,
|
|
'journal_id': bank_journal.id,
|
|
'line_ids': [
|
|
Command.create({'payment_ref': 'line_1', 'amount': 100.0, 'date': '2015-01-01', 'partner_id': self.partner_a.id, 'journal_id': bank_journal.id}),
|
|
Command.create({'payment_ref': 'line_2', 'amount': 200.0, 'date': '2015-01-02', 'journal_id': bank_journal.id}),
|
|
Command.create({'payment_ref': 'line_3', 'amount': -300.0, 'date': '2015-01-03', 'partner_id': self.partner_a.id, 'journal_id': bank_journal.id}),
|
|
Command.create({'payment_ref': 'line_4', 'amount': -400.0, 'date': '2015-01-04', 'journal_id': bank_journal.id}),
|
|
],
|
|
})
|
|
|
|
# ==== Payments ====
|
|
self.inbound_payment_method_line.journal_id = bank_journal.id
|
|
self.outbound_payment_method_line.journal_id = bank_journal.id
|
|
payment_1 = self.env['account.payment'].create({
|
|
'amount': 150.0,
|
|
'payment_type': 'inbound',
|
|
'partner_type': 'customer',
|
|
'date': '2015-01-01',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'payment_method_line_id': self.inbound_payment_method_line.id,
|
|
})
|
|
|
|
payment_2 = self.env['account.payment'].create({
|
|
'amount': 250.0,
|
|
'payment_type': 'outbound',
|
|
'partner_type': 'supplier',
|
|
'date': '2015-01-02',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'payment_method_line_id': self.outbound_payment_method_line.id,
|
|
})
|
|
|
|
payment_3 = self.env['account.payment'].create({
|
|
'amount': 350.0,
|
|
'payment_type': 'outbound',
|
|
'partner_type': 'customer',
|
|
'date': '2015-01-03',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'payment_method_line_id': self.inbound_payment_method_line.id,
|
|
})
|
|
|
|
payment_4 = self.env['account.payment'].create({
|
|
'amount': 450.0,
|
|
'payment_type': 'inbound',
|
|
'partner_type': 'supplier',
|
|
'date': '2015-01-04',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'payment_method_line_id': self.outbound_payment_method_line.id,
|
|
})
|
|
|
|
(payment_1 + payment_2 + payment_3 + payment_4).action_post()
|
|
|
|
# ==== Reconciliation ====
|
|
|
|
st_line = statement_2.line_ids.filtered(lambda line: line.payment_ref == 'line_1')
|
|
payment_line = payment_1.line_ids.filtered(lambda line: line.account_id == bank_journal.company_id.account_journal_payment_debit_account_id)
|
|
wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({})
|
|
wizard._action_add_new_amls(payment_line, allow_partial=False)
|
|
wizard._action_validate()
|
|
|
|
st_line = statement_2.line_ids.filtered(lambda line: line.payment_ref == 'line_3')
|
|
payment_line = payment_2.line_ids.filtered(lambda line: line.account_id == bank_journal.company_id.account_journal_payment_credit_account_id)
|
|
wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({})
|
|
wizard._action_add_new_amls(payment_line, allow_partial=False)
|
|
wizard._action_validate()
|
|
|
|
# ==== Report ====
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model=bank_journal._name
|
|
)
|
|
|
|
options = self._generate_options(report, '2016-01-02', '2016-01-02')
|
|
options['unfold_all'] = True
|
|
lines = report._get_lines(options)
|
|
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101405 Bank\'', '', -200.0),
|
|
('Last statement balance', '', -200.0),
|
|
('Including Unreconciled Receipts', '', 200.0),
|
|
('BNKKK/2015/00002', '01/02/2015', 200.0),
|
|
('Including Unreconciled Payments', '', -400.0),
|
|
('BNKKK/2015/00004', '01/04/2015', -400.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 100.0),
|
|
('(+) Outstanding Receipts', '', 450.0),
|
|
('PBNKKK/2015/00004', '01/04/2015', 450.0),
|
|
('(-) Outstanding Payments', '', -350.0),
|
|
('PBNKKK/2015/00003', '01/03/2015', -350.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
def test_reconciliation_report_multi_currencies(self):
|
|
""" Tests the management of multi-currencies in the reconciliation report. """
|
|
self.env.user.groups_id |= self.env.ref('base.group_multi_currency')
|
|
self.env.user.groups_id |= self.env.ref('base.group_no_one')
|
|
|
|
company_currency = self.company_data['currency'] # USD
|
|
journal_currency = self.currency_data['currency'] # Gol
|
|
choco_currency = self.currency_data_2['currency'] # Dar
|
|
|
|
# ==== Journal with a foreign currency ====
|
|
|
|
bank_journal = self.env['account.journal'].create({
|
|
'name': 'Bank',
|
|
'code': 'BNKKK',
|
|
'type': 'bank',
|
|
'company_id': self.company_data['company'].id,
|
|
'currency_id': journal_currency.id
|
|
})
|
|
|
|
# ==== Statement ====
|
|
|
|
bank_statement = self.env['account.bank.statement'].create({
|
|
'name': 'statement',
|
|
'line_ids': [
|
|
|
|
# Transaction in the company currency.
|
|
(0, 0, {
|
|
'payment_ref': 'line_1',
|
|
'date': '2016-01-01',
|
|
'amount': 100.0,
|
|
'journal_id': bank_journal.id,
|
|
'amount_currency': 50.01,
|
|
'foreign_currency_id': company_currency.id,
|
|
}),
|
|
|
|
# Transaction in a third currency.
|
|
(0, 0, {
|
|
'payment_ref': 'line_3',
|
|
'date': '2016-01-01',
|
|
'amount': 100.0,
|
|
'journal_id': bank_journal.id,
|
|
'amount_currency': 999.99,
|
|
'foreign_currency_id': choco_currency.id,
|
|
}),
|
|
|
|
],
|
|
})
|
|
|
|
# Partially reconcile the suspense amount associated with each bank statement line
|
|
suspense_account = bank_journal.suspense_account_id
|
|
other_account = bank_journal.company_id.default_cash_difference_income_account_id
|
|
|
|
# the first is in company currency
|
|
bank_move_1 = bank_statement.line_ids[0].move_id
|
|
bank_move_1_suspense_line = bank_move_1.line_ids.filtered(lambda l: l.account_id == suspense_account)
|
|
bank_move_1.write({'line_ids': [
|
|
Command.create({'account_id': other_account.id, 'credit': 10.00}),
|
|
Command.update(bank_move_1_suspense_line.id, {'credit': 40.01}),
|
|
]})
|
|
|
|
# the second is in neither company nor journal currency
|
|
bank_move_2 = bank_statement.line_ids[1].move_id
|
|
bank_move_2_suspense_line = bank_move_2.line_ids.filtered(lambda l: l.account_id == suspense_account)
|
|
bank_move_2.write({'line_ids': [
|
|
Command.create({
|
|
'account_id': other_account.id,
|
|
'currency_id': bank_move_2_suspense_line.currency_id.id,
|
|
'credit': 3.33,
|
|
'amount_currency': -99.99
|
|
}),
|
|
Command.update(bank_move_2_suspense_line.id, {
|
|
'credit': 30.0,
|
|
'amount_currency': -900.0
|
|
}),
|
|
]})
|
|
|
|
# ==== Payments ====
|
|
self.inbound_payment_method_line.journal_id = bank_journal.id
|
|
# Payment in the company's currency.
|
|
payment_1 = self.env['account.payment'].create({
|
|
'amount': 1000.0,
|
|
'payment_type': 'inbound',
|
|
'partner_type': 'customer',
|
|
'date': '2016-01-01',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'currency_id': company_currency.id,
|
|
'payment_method_line_id': self.inbound_payment_method_line.id,
|
|
})
|
|
|
|
# Payment in the same foreign currency as the journal.
|
|
payment_2 = self.env['account.payment'].create({
|
|
'amount': 2000.0,
|
|
'payment_type': 'inbound',
|
|
'partner_type': 'customer',
|
|
'date': '2016-01-01',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'currency_id': journal_currency.id,
|
|
'payment_method_line_id': self.inbound_payment_method_line.id,
|
|
})
|
|
|
|
# Payment in a third foreign currency.
|
|
payment_3 = self.env['account.payment'].create({
|
|
'amount': 3000.0,
|
|
'payment_type': 'inbound',
|
|
'partner_type': 'customer',
|
|
'date': '2016-01-01',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'currency_id': choco_currency.id,
|
|
'payment_method_line_id': self.inbound_payment_method_line.id,
|
|
})
|
|
(payment_1 + payment_2 + payment_3).action_post()
|
|
|
|
# ==== Report ====
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model=bank_journal._name
|
|
)
|
|
|
|
with self.debug_mode(report):
|
|
options = self._generate_options(report, '2016-01-02', '2016-01-02')
|
|
options['unfold_all'] = True
|
|
lines = report._get_lines(options)
|
|
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Am. Cur. Cur. Amount
|
|
[0, 1, 3, 4, 5],
|
|
[
|
|
('Balance of \'101405 Bank\'', '', '', '', 200.0),
|
|
('Last statement balance', '', '', '', 200.0),
|
|
('Including Unreconciled Receipts', '', '', '', 170.005),
|
|
('BNKKK/2016/00002', '01/01/2016', 900.00, choco_currency.name, 90.001),
|
|
('BNKKK/2016/00001', '01/01/2016', 40.01, company_currency.name, 80.004),
|
|
('Including Unreconciled Payments', '', '', '', 0.0),
|
|
('Transactions without statement', '', '', '', 0.0),
|
|
('Including Unreconciled Receipts', '', '', '', 0.0),
|
|
('Including Unreconciled Payments', '', '', '', 0.0),
|
|
('Misc. operations', '', '', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', '', '', 5900.0),
|
|
('(+) Outstanding Receipts', '', '', '', 5900.0),
|
|
('PBNKKK/2016/00003', '01/01/2016', 3000.0, choco_currency.name, 900.0),
|
|
('PBNKKK/2016/00002', '01/01/2016', '', '', 2000.0),
|
|
('PBNKKK/2016/00001', '01/01/2016', 1000.0, company_currency.name, 3000.0),
|
|
('(-) Outstanding Payments', '', '', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={
|
|
3: {'currency_code_index': 4},
|
|
5: {'currency': journal_currency},
|
|
},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
def test_reconciliation_change_date(self):
|
|
"""
|
|
Tests the impact of positive/negative payments/statements on the reconciliation report in a single-currency
|
|
environment.
|
|
"""
|
|
bank_journal = self.company_data['default_journal_bank']
|
|
|
|
statement = self.env['account.bank.statement'].create({
|
|
'name': 'statement_1',
|
|
'date': '2019-01-10',
|
|
'balance_start': 0.0,
|
|
'balance_end_real': 130.0,
|
|
'line_ids': [
|
|
(0, 0, {'payment_ref': 'line_1', 'amount': 10.0, 'date': '2019-01-01', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_2', 'amount': 20.0, 'date': '2019-01-02', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_3', 'amount': 30.0, 'date': '2019-01-03', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_4', 'amount': -40.0, 'date': '2019-01-04', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_5', 'amount': 50.0, 'date': '2019-01-05', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_6', 'amount': 60.0, 'date': '2019-01-06', 'journal_id': bank_journal.id}),
|
|
],
|
|
})
|
|
|
|
# This will allow to test if the balance of the bank account is changed
|
|
statement['balance_end_real'] = 140.0
|
|
|
|
payment = self.env['account.payment'].create({
|
|
'amount': 1000.0,
|
|
'payment_type': 'inbound',
|
|
'partner_type': 'customer',
|
|
'date': '2019-01-03',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
})
|
|
payment.action_post()
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model='account.journal'
|
|
)
|
|
|
|
options = self._generate_options(report, fields.Date.from_string('2019-01-01'), fields.Date.from_string('2019-01-01'))
|
|
options['all_entries'] = True
|
|
options['unfold_all'] = True
|
|
|
|
# The last statement is taken into account cause it has a line corresponding to the date of the report.
|
|
lines = report._get_lines(options)
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101401 Bank\'', '', 140.0),
|
|
('Last statement balance', '', 140.0),
|
|
('Including Unreconciled Receipts', '', 10.0),
|
|
('BNK1/2019/00001', '01/01/2019', 10.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
options = self._generate_options(report, fields.Date.from_string('2019-01-01'), fields.Date.from_string('2019-01-04'))
|
|
options['all_entries'] = True
|
|
options['unfold_all'] = True
|
|
lines = report._get_lines(options)
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101401 Bank\'', '', 140.0),
|
|
('Last statement balance', '', 140.0),
|
|
('Including Unreconciled Receipts', '', 60.0),
|
|
('BNK1/2019/00003', '01/03/2019', 30.0),
|
|
('BNK1/2019/00002', '01/02/2019', 20.0),
|
|
('BNK1/2019/00001', '01/01/2019', 10.0),
|
|
('Including Unreconciled Payments', '', -40.0),
|
|
('BNK1/2019/00004', '01/04/2019', -40.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 1000.0),
|
|
('(+) Outstanding Receipts', '', 1000.0),
|
|
('PBNK1/2019/00001', '01/03/2019', 1000.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
def test_reconciliation_report_non_statement_payment(self):
|
|
"""
|
|
Test that moves not linked to a bank statement/payment but linked for example to expenses are all showing in the
|
|
report
|
|
"""
|
|
bank_journal = self.env['account.journal'].create({
|
|
'name': 'Bank',
|
|
'code': 'BNKKK',
|
|
'type': 'bank',
|
|
'company_id': self.company_data['company'].id,
|
|
})
|
|
|
|
# ==== Misc ====
|
|
self.env['account.move'].create({
|
|
'journal_id': bank_journal.id,
|
|
'date': '2014-12-31',
|
|
'line_ids': [
|
|
(0, 0, {
|
|
'name': 'Source',
|
|
'debit': 800,
|
|
'credit': 0,
|
|
'account_id': self.company_data['default_account_expense'].id,
|
|
}),
|
|
(0, 0, {
|
|
'name': 'Destination',
|
|
'debit': 0,
|
|
'credit': 800,
|
|
'account_id': bank_journal.company_id.account_journal_payment_credit_account_id.id,
|
|
}),
|
|
]
|
|
}).action_post()
|
|
|
|
self.env['account.move'].create({
|
|
'journal_id': bank_journal.id,
|
|
'date': '2015-12-31',
|
|
'line_ids': [
|
|
(0, 0, {
|
|
'name': 'Source',
|
|
'debit': 500,
|
|
'credit': 0,
|
|
'account_id': self.company_data['default_account_expense'].id,
|
|
}),
|
|
(0, 0, {
|
|
'name': 'Destination',
|
|
'debit': 0,
|
|
'credit': 500,
|
|
'account_id': bank_journal.company_id.account_journal_payment_credit_account_id.id,
|
|
}),
|
|
]
|
|
}).action_post()
|
|
|
|
# ==== Report ====
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model='account.journal'
|
|
)
|
|
|
|
options = self._generate_options(report, '2016-01-02', '2016-01-02')
|
|
options['unfold_all'] = True
|
|
lines = report._get_lines(options)
|
|
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101405 Bank\'', '', 0.0),
|
|
('Last statement balance', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', -1300.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', -1300.0),
|
|
('BNKKK/2015/00001', '12/31/2015', -500.00),
|
|
('BNKKK/2014/00001', '12/31/2014', -800.00),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
def test_reconciliation_report_misc_entry(self):
|
|
""" This test will check if the report correctly display the misc entry """
|
|
bank_journal = self.env['account.journal'].create({
|
|
'name': 'Bank',
|
|
'code': 'BNKKK',
|
|
'type': 'bank',
|
|
'company_id': self.company_data['company'].id,
|
|
})
|
|
|
|
# ==== Misc ====
|
|
self.env['account.move'].create({
|
|
'journal_id': bank_journal.id,
|
|
'date': '2016-01-02',
|
|
'line_ids': [
|
|
(0, 0, {
|
|
'name': 'Source',
|
|
'debit': 800,
|
|
'credit': 0,
|
|
'account_id': bank_journal.default_account_id.id,
|
|
}),
|
|
(0, 0, {
|
|
'name': 'Destination',
|
|
'debit': 0,
|
|
'credit': 800,
|
|
'account_id': self.company_data['default_account_expense'].id,
|
|
}),
|
|
]
|
|
}).action_post()
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model='account.journal'
|
|
)
|
|
|
|
options = self._generate_options(report, '2016-01-02', '2016-01-02')
|
|
options['unfold_all'] = True
|
|
lines = report._get_lines(options)
|
|
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101405 Bank\'', '', 800.0),
|
|
('Last statement balance', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 800.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
# With the domain, since the date of the misc is not in the same year, the misc is not present
|
|
options = self._generate_options(report, '2014-01-02', '2014-01-02')
|
|
options['unfold_all'] = True
|
|
lines = report._get_lines(options)
|
|
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101405 Bank\'', '', 0.0),
|
|
('Last statement balance', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
def test_reconciliation_report_delete_statement(self):
|
|
""" This test will do a basic flow where we create a statement and then we delete it to see how the report react"""
|
|
|
|
bank_journal = self.company_data['default_journal_bank']
|
|
|
|
statement = self.env['account.bank.statement'].create({
|
|
'name': 'statement_1',
|
|
'date': '2019-01-10',
|
|
'balance_start': 0.0,
|
|
'balance_end_real': 130.0,
|
|
'line_ids': [
|
|
(0, 0, {'payment_ref': 'line_1', 'amount': 10.0, 'date': '2019-01-01', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_2', 'amount': 20.0, 'date': '2019-01-02', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_3', 'amount': 30.0, 'date': '2019-01-03', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_4', 'amount': -40.0, 'date': '2019-01-04', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_5', 'amount': 50.0, 'date': '2019-01-05', 'journal_id': bank_journal.id}),
|
|
(0, 0, {'payment_ref': 'line_6', 'amount': 60.0, 'date': '2019-01-06', 'journal_id': bank_journal.id}),
|
|
],
|
|
})
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model='account.journal'
|
|
)
|
|
|
|
options = self._generate_options(report, fields.Date.from_string('2019-01-01'), fields.Date.from_string('2019-01-12'))
|
|
options['all_entries'] = True
|
|
options['unfold_all'] = True
|
|
|
|
lines = report._get_lines(options)
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101401 Bank\'', '', 130.0),
|
|
('Last statement balance', '', 130.0),
|
|
('Including Unreconciled Receipts', '', 170.0),
|
|
('BNK1/2019/00006', '01/06/2019', 60.0),
|
|
('BNK1/2019/00005', '01/05/2019', 50.0),
|
|
('BNK1/2019/00003', '01/03/2019', 30.0),
|
|
('BNK1/2019/00002', '01/02/2019', 20.0),
|
|
('BNK1/2019/00001', '01/01/2019', 10.0),
|
|
('Including Unreconciled Payments', '', -40.0),
|
|
('BNK1/2019/00004', '01/04/2019', -40.0),
|
|
('Transactions without statement', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
statement.unlink()
|
|
|
|
options = self._generate_options(report, fields.Date.from_string('2019-01-01'), fields.Date.from_string('2019-01-12'))
|
|
options['all_entries'] = True
|
|
options['unfold_all'] = True
|
|
|
|
lines = report._get_lines(options)
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101401 Bank\'', '', 130.0),
|
|
('Last statement balance', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 130.0),
|
|
('Including Unreconciled Receipts', '', 170.0),
|
|
('BNK1/2019/00006', '01/06/2019', 60.0),
|
|
('BNK1/2019/00005', '01/05/2019', 50.0),
|
|
('BNK1/2019/00003', '01/03/2019', 30.0),
|
|
('BNK1/2019/00002', '01/02/2019', 20.0),
|
|
('BNK1/2019/00001', '01/01/2019', 10.0),
|
|
('Including Unreconciled Payments', '', -40.0),
|
|
('BNK1/2019/00004', '01/04/2019', -40.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
def test_reconciliation_report_transaction_without_statement(self):
|
|
"""
|
|
This test will ensure that the section transaction without statement section contains the reconcile entries.
|
|
So the section should not always be the sum of his children.
|
|
"""
|
|
bank_journal = self.company_data['default_journal_bank']
|
|
|
|
bank_statement_lines = self.env['account.bank.statement.line'].create([
|
|
{
|
|
'payment_ref': 'Initial balance',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'amount': 1000.0,
|
|
'date': '2019-01-01',
|
|
},
|
|
{
|
|
'payment_ref': 'To be reconciled',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
'amount': 100.0,
|
|
'date': '2019-01-01',
|
|
}
|
|
])
|
|
|
|
report = self.env.ref('account_reports.bank_reconciliation_report').with_context(
|
|
active_id=bank_journal.id,
|
|
active_model='account.journal'
|
|
)
|
|
options = self._generate_options(report, '2019-01-01', '2019-01-12')
|
|
options['all_entries'] = True
|
|
options['unfold_all'] = True
|
|
|
|
lines = report._get_lines(options)
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101401 Bank\'', '', 1100.0),
|
|
('Last statement balance', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 1100.0),
|
|
('Including Unreconciled Receipts', '', 1100.0),
|
|
('BNK1/2019/00002', '01/01/2019', 100.0),
|
|
('BNK1/2019/00001', '01/01/2019', 1000.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|
|
|
|
payment = self.env['account.payment'].create({
|
|
'amount': 100.0,
|
|
'payment_type': 'inbound',
|
|
'date': '2019-01-01',
|
|
'journal_id': bank_journal.id,
|
|
'partner_id': self.partner_a.id,
|
|
})
|
|
payment.action_post()
|
|
|
|
payment_line = payment.line_ids.filtered(lambda line: line.account_id == bank_journal.company_id.account_journal_payment_debit_account_id)
|
|
wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=bank_statement_lines[1].id).new({})
|
|
wizard._action_add_new_amls(payment_line, allow_partial=False)
|
|
wizard._action_validate()
|
|
|
|
options = self._generate_options(report, '2019-01-01', '2019-01-12')
|
|
options['all_entries'] = True
|
|
options['unfold_all'] = True
|
|
|
|
lines = report._get_lines(options)
|
|
self.assertLinesValues(
|
|
lines,
|
|
# Name Date Amount
|
|
[0, 1, 3],
|
|
[
|
|
('Balance of \'101401 Bank\'', '', 1100.0),
|
|
('Last statement balance', '', 0.0),
|
|
('Including Unreconciled Receipts', '', 0.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Transactions without statement', '', 1100.0),
|
|
('Including Unreconciled Receipts', '', 1000.0),
|
|
('BNK1/2019/00001', '01/01/2019', 1000.0),
|
|
('Including Unreconciled Payments', '', 0.0),
|
|
('Misc. operations', '', 0.0),
|
|
('Outstanding Receipts/Payments', '', 0.0),
|
|
('(+) Outstanding Receipts', '', 0.0),
|
|
('(-) Outstanding Payments', '', 0.0),
|
|
],
|
|
options,
|
|
currency_map={3: {'currency': bank_journal.currency_id}},
|
|
ignore_folded=False,
|
|
)
|