Files
account-reconcile/account_mass_reconcile/models/simple_reconciliation.py
Florian da Costa e724515450 Manage write off, some refactore to manage better currency, partial reconciliation, and add some tests
Also add an advanced reconciliation method based on name. Could be very useful to actually match account move line based
on payment_reference field on invoices, as it is passed to account move line on name field
2021-05-10 12:27:44 +02:00

108 lines
3.7 KiB
Python

# Copyright 2012-2016 Camptocamp SA
# Copyright 2010 Sébastien Beau
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import models
_logger = logging.getLogger(__name__)
class MassReconcileSimple(models.AbstractModel):
_name = "mass.reconcile.simple"
_inherit = "mass.reconcile.base"
_description = "Mass Reconcile Simple"
# has to be subclassed
# field name used as key for matching the move lines
_key_field = None
def rec_auto_lines_simple(self, lines):
if self._key_field is None:
raise ValueError("_key_field has to be defined")
count = 0
res = []
while count < len(lines):
for i in range(count + 1, len(lines)):
if lines[count][self._key_field] != lines[i][self._key_field]:
break
check = False
if lines[count]["credit"] > 0 and lines[i]["debit"] > 0:
credit_line = lines[count]
debit_line = lines[i]
check = True
elif lines[i]["credit"] > 0 and lines[count]["debit"] > 0:
credit_line = lines[i]
debit_line = lines[count]
check = True
if not check:
continue
reconciled, dummy = self._reconcile_lines(
[credit_line, debit_line], allow_partial=False
)
if reconciled:
res += [credit_line["id"], debit_line["id"]]
del lines[i]
if (
self.env.context.get("commit_every", 0)
and len(res) % self.env.context["commit_every"] == 0
):
# new cursor is already open in cron
self.env.cr.commit() # pylint: disable=invalid-commit
_logger.info(
"Commit the reconciliations after %d groups", len(res)
)
break
count += 1
return res
def _simple_order(self, *args, **kwargs):
return "ORDER BY account_move_line.%s" % self._key_field
def _action_rec(self):
"""Match only 2 move lines, do not allow partial reconcile"""
select = self._select_query()
select += ", account_move_line.%s " % self._key_field
where, params = self._where_query()
where += " AND account_move_line.%s IS NOT NULL " % self._key_field
where2, params2 = self._get_filter()
query = " ".join(
(select, self._from_query(), where, where2, self._simple_order())
)
self.flush()
self.env.cr.execute(query, params + params2)
lines = self.env.cr.dictfetchall()
return self.rec_auto_lines_simple(lines)
class MassReconcileSimpleName(models.TransientModel):
_name = "mass.reconcile.simple.name"
_inherit = "mass.reconcile.simple"
_description = "Mass Reconcile Simple Name"
# has to be subclassed
# field name used as key for matching the move lines
_key_field = "name"
class MassReconcileSimplePartner(models.TransientModel):
_name = "mass.reconcile.simple.partner"
_inherit = "mass.reconcile.simple"
_description = "Mass Reconcile Simple Partner"
# has to be subclassed
# field name used as key for matching the move lines
_key_field = "partner_id"
class MassReconcileSimpleReference(models.TransientModel):
_name = "mass.reconcile.simple.reference"
_inherit = "mass.reconcile.simple"
_description = "Mass Reconcile Simple Reference"
# has to be subclassed
# field name used as key for matching the move lines
_key_field = "ref"