mirror of
https://github.com/OCA/account-reconcile.git
synced 2025-01-20 12:27:39 +02:00
[MIG] account_reconcile_model_strict_match_amount: Migration to 13.0
This commit is contained in:
committed by
Simone Orsi
parent
57dea6cb72
commit
7a873632f8
@@ -3,13 +3,13 @@
|
||||
{
|
||||
"name": "Account Reconciliation Model Strict Match Amount",
|
||||
"summary": "Restrict reconciliation propositions to matching amount parameter",
|
||||
"version": "12.0.1.0.0",
|
||||
"version": "13.0.1.0.0",
|
||||
"category": "Accounting",
|
||||
"website": "https://github.com/OCA/account-reconcile",
|
||||
"author": "Camptocamp, Odoo Community Association (OCA)",
|
||||
"license": "AGPL-3",
|
||||
"application": False,
|
||||
"installable": True,
|
||||
"depends": ["account",],
|
||||
"data": ["views/account_reconcile_model.xml",],
|
||||
"depends": ["account"],
|
||||
"data": ["views/account_reconcile_model.xml"],
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Copyright 2020 Camptocamp SA
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
||||
from odoo import api, fields, models
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class AccountReconcileModel(models.Model):
|
||||
@@ -13,26 +13,36 @@ class AccountReconcileModel(models.Model):
|
||||
"statement line communication matching exactly existing entries.",
|
||||
)
|
||||
|
||||
@api.multi
|
||||
# flake8: noqa
|
||||
|
||||
def _get_select_communication_flag(self):
|
||||
if not self.match_total_amount or not self.strict_match_total_amount:
|
||||
return super()._get_select_communication_flag()
|
||||
else:
|
||||
regexp = r"'[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'), '\s+'"
|
||||
return r"""
|
||||
-- Determine a matching or not with the statement line communication using the move.name or move.ref.
|
||||
-- only digits are considered and reference are split by any space characters
|
||||
-- Determine a matching or not with the statement line communication using the aml.name, move.name or move.ref.
|
||||
COALESCE(
|
||||
regexp_split_to_array(substring(REGEXP_REPLACE(move.name, {regexp})
|
||||
&& regexp_split_to_array(substring(REGEXP_REPLACE(st_line.name, {regexp})
|
||||
OR
|
||||
(
|
||||
move.ref IS NOT NULL
|
||||
AND
|
||||
regexp_split_to_array(substring(REGEXP_REPLACE(move.ref, {regexp})
|
||||
&&
|
||||
regexp_split_to_array(substring(REGEXP_REPLACE(st_line.name, {regexp})
|
||||
), FALSE)
|
||||
(
|
||||
aml.name IS NOT NULL
|
||||
AND
|
||||
substring(REGEXP_REPLACE(aml.name, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*') != ''
|
||||
AND
|
||||
regexp_split_to_array(substring(REGEXP_REPLACE(aml.name, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'),'\s+')
|
||||
&& regexp_split_to_array(substring(REGEXP_REPLACE(st_line.name, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'), '\s+')
|
||||
)
|
||||
OR
|
||||
regexp_split_to_array(substring(REGEXP_REPLACE(move.name, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'),'\s+')
|
||||
&& regexp_split_to_array(substring(REGEXP_REPLACE(st_line.name, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'), '\s+')
|
||||
OR
|
||||
(
|
||||
move.ref IS NOT NULL
|
||||
AND
|
||||
substring(REGEXP_REPLACE(move.ref, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*') != ''
|
||||
AND
|
||||
regexp_split_to_array(substring(REGEXP_REPLACE(move.ref, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'),'\s+')
|
||||
&& regexp_split_to_array(substring(REGEXP_REPLACE(st_line.name, '[^0-9|^\s]', '', 'g'), '\S(?:.*\S)*'), '\s+')
|
||||
)
|
||||
, FALSE)
|
||||
AND
|
||||
CASE
|
||||
WHEN abs(st_line.amount) < abs(aml.balance) THEN abs(st_line.amount) / abs(aml.balance) * 100
|
||||
@@ -40,5 +50,27 @@ class AccountReconcileModel(models.Model):
|
||||
ELSE 100
|
||||
END >= {match_total_amount_param} AS communication_flag
|
||||
""".format(
|
||||
regexp=regexp, match_total_amount_param=self.match_total_amount_param
|
||||
match_total_amount_param=self.match_total_amount_param
|
||||
)
|
||||
|
||||
def _get_select_payment_reference_flag(self):
|
||||
if not self.match_total_amount or not self.strict_match_total_amount:
|
||||
return super()._get_select_payment_reference_flag()
|
||||
else:
|
||||
return r"""
|
||||
-- Determine a matching or not with the statement line communication using the move.invoice_payment_ref.
|
||||
COALESCE
|
||||
(
|
||||
move.invoice_payment_ref IS NOT NULL
|
||||
AND
|
||||
regexp_replace(move.invoice_payment_ref, '\s+', '', 'g') = regexp_replace(st_line.name, '\s+', '', 'g')
|
||||
, FALSE)
|
||||
AND
|
||||
CASE
|
||||
WHEN abs(st_line.amount) < abs(aml.balance) THEN abs(st_line.amount) / abs(aml.balance) * 100
|
||||
WHEN abs(st_line.amount) > abs(aml.balance) THEN abs(aml.balance) / abs(st_line.amount) * 100
|
||||
ELSE 100
|
||||
END >= {match_total_amount_param} AS payment_reference_flag
|
||||
""".format(
|
||||
match_total_amount_param=self.match_total_amount_param
|
||||
)
|
||||
|
||||
@@ -6,39 +6,62 @@ from odoo.addons.account.tests.test_reconciliation_matching_rules import (
|
||||
|
||||
|
||||
class TestAccountReconcileModelStrictMatchAmount(TestReconciliationMatchingRules):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.partner_3 = self.env["res.partner"].create({"name": "partner_3"})
|
||||
self.partner_4 = self.env["res.partner"].create({"name": "partner_4"})
|
||||
self.invoice_line_5 = self._create_invoice_line(
|
||||
150, self.partner_3, "out_invoice"
|
||||
)
|
||||
self.invoice_line_5.ref = "ABC001XYZ"
|
||||
self.invoice_line_6 = self._create_invoice_line(
|
||||
300, self.partner_4, "out_invoice"
|
||||
)
|
||||
self.invoice_line_6.name = "ABC002XYZ"
|
||||
|
||||
self.bank_st_2 = self.env["account.bank.statement"].create(
|
||||
{"name": "test bank journal 2", "journal_id": self.bank_journal.id,}
|
||||
)
|
||||
|
||||
self.bank_line_3 = self.env["account.bank.statement.line"].create(
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.partner_3 = cls.env["res.partner"].create({"name": "partner_3"})
|
||||
cls.partner_4 = cls.env["res.partner"].create({"name": "partner_4"})
|
||||
cls.partner_5 = cls.env["res.partner"].create({"name": "partner_5"})
|
||||
cls.partner_6 = cls.env["res.partner"].create({"name": "partner_6"})
|
||||
cls.invoice_line_5 = cls._create_invoice_line(150, cls.partner_3, "out_invoice")
|
||||
cls.invoice_line_5.ref = "ABC001XYZ"
|
||||
cls.invoice_line_6 = cls._create_invoice_line(300, cls.partner_4, "out_invoice")
|
||||
cls.invoice_line_6.name = "ABC002XYZ"
|
||||
cls.invoice_line_7 = cls._create_invoice_line(450, cls.partner_5, "out_invoice")
|
||||
cls.invoice_line_7.move_id.ref = "ABC003XYZ"
|
||||
cls.invoice_line_8 = cls._create_invoice_line(600, cls.partner_6, "out_invoice")
|
||||
cls.invoice_line_8.move_id.invoice_payment_ref = "ABC004XYZ"
|
||||
cls.bank_st_2 = cls.env["account.bank.statement"].create(
|
||||
{
|
||||
"statement_id": self.bank_st_2.id,
|
||||
"name": "test bank journal 2",
|
||||
"journal_id": cls.company_data["default_journal_bank"].id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.bank_line_3 = cls.env["account.bank.statement.line"].create(
|
||||
{
|
||||
"statement_id": cls.bank_st_2.id,
|
||||
"name": "ABC001XYZ",
|
||||
"partner_id": self.partner_3.id,
|
||||
"amount": 70,
|
||||
"partner_id": cls.partner_3.id,
|
||||
"amount": 135,
|
||||
"sequence": 1,
|
||||
}
|
||||
)
|
||||
self.bank_line_4 = self.env["account.bank.statement.line"].create(
|
||||
cls.bank_line_4 = cls.env["account.bank.statement.line"].create(
|
||||
{
|
||||
"statement_id": self.bank_st_2.id,
|
||||
"statement_id": cls.bank_st_2.id,
|
||||
"name": "ABC002XYZ",
|
||||
"partner_id": self.partner_4.id,
|
||||
"partner_id": cls.partner_4.id,
|
||||
"amount": 270,
|
||||
"sequence": 1,
|
||||
"sequence": 2,
|
||||
}
|
||||
)
|
||||
cls.bank_line_5 = cls.env["account.bank.statement.line"].create(
|
||||
{
|
||||
"statement_id": cls.bank_st_2.id,
|
||||
"name": "ABC003XYZ",
|
||||
"partner_id": cls.partner_5.id,
|
||||
"amount": 405,
|
||||
"sequence": 3,
|
||||
}
|
||||
)
|
||||
cls.bank_line_6 = cls.env["account.bank.statement.line"].create(
|
||||
{
|
||||
"statement_id": cls.bank_st_2.id,
|
||||
"name": "ABC004XYZ",
|
||||
"partner_id": cls.partner_6.id,
|
||||
"amount": 540,
|
||||
"sequence": 4,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -49,53 +72,59 @@ class TestAccountReconcileModelStrictMatchAmount(TestReconciliationMatchingRules
|
||||
"rule_type": "invoice_matching",
|
||||
"auto_reconcile": True,
|
||||
"match_nature": "both",
|
||||
"match_partner": True,
|
||||
"match_same_currency": True,
|
||||
"match_total_amount": True,
|
||||
"match_total_amount_param": 100.0,
|
||||
"strict_match_total_amount": True,
|
||||
# 'match_partner_ids': [
|
||||
# (6, 0, [self.partner_3.id, self.partner_4.id])
|
||||
# ],
|
||||
}
|
||||
)
|
||||
|
||||
self._check_statement_matching(
|
||||
my_rule,
|
||||
{
|
||||
self.bank_line_3.id: {"aml_ids": []},
|
||||
self.bank_line_4.id: {"aml_ids": []},
|
||||
self.bank_line_5.id: {"aml_ids": []},
|
||||
self.bank_line_6.id: {"aml_ids": []},
|
||||
},
|
||||
statements=self.bank_st_2,
|
||||
)
|
||||
|
||||
def test_auto_reconcile_strict_match_80(self):
|
||||
def test_auto_reconcile_strict_match_90(self):
|
||||
my_rule = self.env["account.reconcile.model"].create(
|
||||
{
|
||||
"name": "Strict Invoice matching amount 80%",
|
||||
"name": "Strict Invoice matching amount 90%",
|
||||
"rule_type": "invoice_matching",
|
||||
"auto_reconcile": True,
|
||||
"match_nature": "both",
|
||||
"match_partner": True,
|
||||
"match_same_currency": True,
|
||||
"match_total_amount": True,
|
||||
"match_total_amount_param": 80.0,
|
||||
"match_total_amount_param": 90.0,
|
||||
"strict_match_total_amount": True,
|
||||
# 'match_partner_ids': [
|
||||
# (6, 0, [self.partner_3.id, self.partner_4.id])
|
||||
# ],
|
||||
}
|
||||
)
|
||||
|
||||
self._check_statement_matching(
|
||||
my_rule,
|
||||
{
|
||||
self.bank_line_3.id: {"aml_ids": []},
|
||||
self.bank_line_3.id: {
|
||||
"aml_ids": [self.invoice_line_5.id],
|
||||
"model": my_rule,
|
||||
"status": "reconciled",
|
||||
},
|
||||
self.bank_line_4.id: {
|
||||
"aml_ids": [self.invoice_line_6.id],
|
||||
"model": my_rule,
|
||||
"status": "reconciled",
|
||||
},
|
||||
self.bank_line_5.id: {
|
||||
"aml_ids": [self.invoice_line_7.id],
|
||||
"model": my_rule,
|
||||
"status": "reconciled",
|
||||
},
|
||||
self.bank_line_6.id: {
|
||||
"aml_ids": [self.invoice_line_8.id],
|
||||
"model": my_rule,
|
||||
"status": "reconciled",
|
||||
},
|
||||
},
|
||||
statements=self.bank_st_2,
|
||||
)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/>
|
||||
</xpath>
|
||||
<xpath
|
||||
expr="//div[field[@name='match_total_amount']]/div[@class='text-muted']"
|
||||
expr="//div[field[@name='match_total_amount']]/div[hasclass('text-muted')]"
|
||||
position="attributes"
|
||||
>
|
||||
<attribute
|
||||
|
||||
Reference in New Issue
Block a user