account-reconcile/account_reconcile_restrict_.../tests/test_reconciliation.py

118 lines
4.0 KiB
Python

# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.exceptions import UserError
from odoo.tests.common import TransactionCase
class TestReconciliation(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(
context=dict(
cls.env.context, tracking_disable=True, test_partner_mismatch=True
)
)
cls.partner = cls.env.ref("base.res_partner_2")
cls.partner_id = cls.partner.id
cls.account_rcv = cls.env["account.account"].create(
{
"code": "RA1000",
"name": "Test Receivable Account",
"account_type": "asset_receivable",
"reconcile": True,
}
)
cls.account_rsa = cls.env["account.account"].create(
{
"code": "PA1000",
"name": "Test Payable Account",
"account_type": "liability_payable",
"reconcile": True,
}
)
cls.bank_journal = cls.env["account.journal"].create(
{"name": "Bank", "type": "bank", "code": "BNK67"}
)
cls.aml = cls.init_moves()
@classmethod
def create_move(cls, name, amount):
debit_line_vals = {
"name": name,
"debit": amount > 0 and amount or 0.0,
"credit": amount < 0 and -amount or 0.0,
"account_id": cls.account_rcv.id,
}
credit_line_vals = debit_line_vals.copy()
credit_line_vals["debit"] = debit_line_vals["credit"]
credit_line_vals["credit"] = debit_line_vals["debit"]
credit_line_vals["account_id"] = cls.account_rsa.id
vals = {
"journal_id": cls.bank_journal.id,
"line_ids": [(0, 0, debit_line_vals), (0, 0, credit_line_vals)],
}
return (
cls.env["account.move"]
.with_context(default_journal_id=cls.bank_journal.id)
.create(vals)
.id
)
@classmethod
def init_moves(cls):
move_list_vals = [
("1", -1.83),
("2", 728.35),
("3", -4.46),
("4", 0.32),
("5", 14.72),
("6", -737.10),
]
move_ids = []
for name, amount in move_list_vals:
move_ids.append(cls.create_move(name, amount))
aml_recs = cls.env["account.move.line"].search(
[("move_id", "in", move_ids), ("account_id", "=", cls.account_rcv.id)]
)
return aml_recs
def test_reconcile_no_partner(self):
self.aml.move_id.action_post()
self.aml.reconcile()
self.assertTrue(all(self.aml.mapped("reconciled")))
def test_reconcile_partner_mismatch(self):
self.aml[0].partner_id = self.partner.id
with self.assertRaises(UserError):
self.aml.reconcile()
# all lines with same partner allowed
self.aml.write({"partner_id": self.partner.id})
self.aml.move_id.action_post()
self.aml.reconcile()
self.assertTrue(all(self.aml.mapped("reconciled")))
def test_reconcile_accounts_excluded(self):
self.aml[0].partner_id = self.partner.id
with self.assertRaises(UserError):
self.aml.reconcile()
# reconciliation forbiden only for certain types of accounts
account = self.env["account.account"].create(
{
"code": "CAA1000",
"name": "Test Current Assets Account",
"account_type": "asset_current",
"reconcile": True,
}
)
self.aml[0].account_id = account.id
with self.assertRaises(UserError):
self.aml.reconcile()
# reconciliation for different partners allowed
# for not forbidden types
self.aml.write({"account_id": account.id})
self.aml.move_id.action_post()
self.aml.reconcile()
self.assertTrue(all(self.aml.mapped("reconciled")))