mirror of
https://github.com/OCA/account-reconcile.git
synced 2025-01-20 12:27:39 +02:00
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
108 lines
3.7 KiB
Python
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"
|