account-reconcile/account_mass_reconcile/tests/test_scenario_reconcile.py

246 lines
9.2 KiB
Python

# © 2014-2016 Camptocamp SA (Damien Crier)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import timedelta
import odoo.tests
from odoo import fields
from odoo.addons.account.tests.common import TestAccountReconciliationCommon
@odoo.tests.tagged("post_install", "-at_install")
class TestScenarioReconcile(TestAccountReconciliationCommon):
@classmethod
def setUpClass(cls):
super(TestScenarioReconcile, cls).setUpClass()
cls.rec_history_obj = cls.env["mass.reconcile.history"]
cls.mass_rec_obj = cls.env["account.mass.reconcile"]
cls.invoice_obj = cls.env["account.move"]
cls.bk_stmt_obj = cls.env["account.bank.statement"]
cls.bk_stmt_line_obj = cls.env["account.bank.statement.line"]
cls.acc_move_line_obj = cls.env["account.move.line"]
cls.mass_rec_method_obj = cls.env["account.mass.reconcile.method"]
cls.acs_model = cls.env["res.config.settings"]
cls.company = cls.company_data["company"]
cls.bank_journal = cls.company_data["default_journal_bank"]
cls.sale_journal = cls.company_data["default_journal_sale"]
acs_ids = cls.acs_model.search([("company_id", "=", cls.company.id)])
values = {"group_multi_currency": True}
if acs_ids:
acs_ids.write(values)
else:
default_vals = cls.acs_model.default_get([])
default_vals.update(values)
acs_ids = cls.acs_model.create(default_vals)
def test_scenario_reconcile(self):
invoice = self.create_invoice()
self.assertEqual("posted", invoice.state)
receivalble_account_id = invoice.partner_id.property_account_receivable_id.id
# create payment
payment = self.env["account.payment"].create(
{
"partner_type": "customer",
"payment_type": "inbound",
"partner_id": invoice.partner_id.id,
"destination_account_id": receivalble_account_id,
"amount": 50.0,
"journal_id": self.bank_journal.id,
}
)
payment.action_post()
# create the mass reconcile record
mass_rec = self.mass_rec_obj.create(
{
"name": "mass_reconcile_1",
"account": invoice.partner_id.property_account_receivable_id.id,
"reconcile_method": [(0, 0, {"name": "mass.reconcile.simple.partner"})],
}
)
# call the automatic reconciliation method
mass_rec.run_reconcile()
self.assertEqual("paid", invoice.payment_state)
def test_scenario_reconcile_currency(self):
currency_rate = (
self.env["res.currency.rate"]
.sudo()
.search(
[
("currency_id", "=", self.ref("base.USD")),
("company_id", "=", self.ref("base.main_company")),
]
)
.filtered(lambda r: r.name == fields.Date.today())
)
if not currency_rate:
# create currency rate
self.env["res.currency.rate"].create(
{
"name": fields.Date.today(),
"currency_id": self.ref("base.USD"),
"rate": 1.5,
}
)
else:
currency_rate = fields.first(currency_rate)
currency_rate.rate = 1.5
# create invoice
invoice = self._create_invoice(
currency_id=self.ref("base.USD"),
date_invoice=fields.Date.today(),
auto_validate=True,
)
self.assertEqual("posted", invoice.state)
self.env["res.currency.rate"].create(
{
"name": fields.Date.today() - timedelta(days=3),
"currency_id": self.ref("base.USD"),
"rate": 2,
}
)
receivable_account_id = invoice.partner_id.property_account_receivable_id.id
# create payment
payment = self.env["account.payment"].create(
{
"partner_type": "customer",
"payment_type": "inbound",
"partner_id": invoice.partner_id.id,
"destination_account_id": receivable_account_id,
"amount": 50.0,
"currency_id": self.ref("base.USD"),
"journal_id": self.bank_journal.id,
"date": fields.Date.today() - timedelta(days=2),
}
)
payment.action_post()
# create the mass reconcile record
mass_rec = self.mass_rec_obj.create(
{
"name": "mass_reconcile_1",
"account": invoice.partner_id.property_account_receivable_id.id,
"reconcile_method": [(0, 0, {"name": "mass.reconcile.simple.partner"})],
}
)
# call the automatic reconciliation method
mass_rec.run_reconcile()
self.assertEqual("paid", invoice.payment_state)
def test_scenario_reconcile_partial(self):
invoice1 = self.create_invoice()
invoice1.ref = "test ref"
# create payment
receivable_account_id = invoice1.partner_id.property_account_receivable_id.id
payment = self.env["account.payment"].create(
{
"partner_type": "customer",
"payment_type": "inbound",
"partner_id": invoice1.partner_id.id,
"destination_account_id": receivable_account_id,
"amount": 500.0,
"journal_id": self.bank_journal.id,
"ref": "test ref",
}
)
payment.action_post()
line_payment = payment.line_ids.filtered(
lambda l: l.account_id.id == receivable_account_id
)
self.assertEqual(line_payment.reconciled, False)
invoice1_line = invoice1.line_ids.filtered(
lambda l: l.account_id.id == receivable_account_id
)
self.assertEqual(invoice1_line.reconciled, False)
# Create the mass reconcile record
reconcile_method_vals = {
"name": "mass.reconcile.advanced.ref",
"write_off": 0.1,
}
mass_rec = self.mass_rec_obj.create(
{
"name": "mass_reconcile_1",
"account": receivable_account_id,
"reconcile_method": [(0, 0, reconcile_method_vals)],
}
)
mass_rec.run_reconcile()
self.assertEqual(line_payment.amount_residual, -450.0)
self.assertEqual(invoice1_line.reconciled, True)
invoice2 = self._create_invoice(invoice_amount=500, auto_validate=True)
invoice2.ref = "test ref"
invoice2_line = invoice2.line_ids.filtered(
lambda l: l.account_id.id == receivable_account_id
)
mass_rec.run_reconcile()
self.assertEqual(line_payment.reconciled, True)
self.assertEqual(invoice2_line.reconciled, False)
self.assertEqual(invoice2_line.amount_residual, 50.0)
def test_reconcile_with_writeoff(self):
invoice = self.create_invoice()
receivable_account_id = invoice.partner_id.property_account_receivable_id.id
# create payment
payment = self.env["account.payment"].create(
{
"partner_type": "customer",
"payment_type": "inbound",
"partner_id": invoice.partner_id.id,
"destination_account_id": receivable_account_id,
"amount": 50.1,
"journal_id": self.bank_journal.id,
}
)
payment.action_post()
# create the mass reconcile record
mass_rec = self.mass_rec_obj.create(
{
"name": "mass_reconcile_1",
"account": invoice.partner_id.property_account_receivable_id.id,
"reconcile_method": [
(
0,
0,
{
"name": "mass.reconcile.simple.partner",
"account_lost_id": self.company_data[
"default_account_expense"
].id,
"account_profit_id": self.company_data[
"default_account_revenue"
].id,
"journal_id": self.company_data["default_journal_misc"].id,
"write_off": 0.05,
},
)
],
}
)
# call the automatic reconciliation method
mass_rec.run_reconcile()
self.assertEqual("not_paid", invoice.payment_state)
mass_rec.reconcile_method.write_off = 0.11
mass_rec.run_reconcile()
self.assertEqual("paid", invoice.payment_state)
full_reconcile = invoice.line_ids.mapped("full_reconcile_id")
writeoff_line = full_reconcile.reconciled_line_ids.filtered(
lambda l: l.debit == 0.1
)
self.assertEqual(len(writeoff_line), 1)
self.assertEqual(
writeoff_line.move_id.journal_id.id,
self.company_data["default_journal_misc"].id,
)