From 6c8c37d8fc4dc2c6db6f765560a36d1c835da707 Mon Sep 17 00:00:00 2001 From: Timon Tschanz Date: Mon, 8 Jul 2019 17:40:27 +0200 Subject: [PATCH 1/5] [10.0][ADD] auto_reconcile_structured_ref --- auto_reconcile_structured_ref/__init__.py | 2 + auto_reconcile_structured_ref/__manifest__.py | 23 ++++ auto_reconcile_structured_ref/i18n/de.po | 43 +++++++ auto_reconcile_structured_ref/i18n/fr.po | 43 +++++++ auto_reconcile_structured_ref/i18n/it.po | 43 +++++++ .../i18n/l10n_ch_account_reconcile_esr.pot | 43 +++++++ .../models/__init__.py | 2 + .../models/account_bank_statement_line.py | 117 ++++++++++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 3 + .../static/src/js/account_reconciliation.js | 32 +++++ .../static/src/xml/account_reconciliation.xml | 15 +++ .../views/assets.xml | 8 ++ 14 files changed, 377 insertions(+) create mode 100644 auto_reconcile_structured_ref/__init__.py create mode 100644 auto_reconcile_structured_ref/__manifest__.py create mode 100644 auto_reconcile_structured_ref/i18n/de.po create mode 100644 auto_reconcile_structured_ref/i18n/fr.po create mode 100644 auto_reconcile_structured_ref/i18n/it.po create mode 100644 auto_reconcile_structured_ref/i18n/l10n_ch_account_reconcile_esr.pot create mode 100644 auto_reconcile_structured_ref/models/__init__.py create mode 100644 auto_reconcile_structured_ref/models/account_bank_statement_line.py create mode 100644 auto_reconcile_structured_ref/readme/CONTRIBUTORS.rst create mode 100644 auto_reconcile_structured_ref/readme/DESCRIPTION.rst create mode 100644 auto_reconcile_structured_ref/readme/USAGE.rst create mode 100644 auto_reconcile_structured_ref/static/src/js/account_reconciliation.js create mode 100644 auto_reconcile_structured_ref/static/src/xml/account_reconciliation.xml create mode 100644 auto_reconcile_structured_ref/views/assets.xml diff --git a/auto_reconcile_structured_ref/__init__.py b/auto_reconcile_structured_ref/__init__.py new file mode 100644 index 0000000000..a0fdc10fe1 --- /dev/null +++ b/auto_reconcile_structured_ref/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/auto_reconcile_structured_ref/__manifest__.py b/auto_reconcile_structured_ref/__manifest__.py new file mode 100644 index 0000000000..b072894636 --- /dev/null +++ b/auto_reconcile_structured_ref/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': 'Structured ref auto reconcile', + 'version': '10.0.1.0.0', + 'author': "Camptocamp,Odoo Community Association (OCA)", + 'website': 'https://github.com/OCA/account-reconcile', + 'license': 'AGPL-3', + 'summary': 'Adds a second automatic reconciliation button,' + ' which is based on a structured ref', + 'depends': [ + 'account', + ], + 'data': [ + 'views/assets.xml', + ], + 'qweb': [ + 'static/src/xml/account_reconciliation.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/auto_reconcile_structured_ref/i18n/de.po b/auto_reconcile_structured_ref/i18n/de.po new file mode 100644 index 0000000000..1148aef4ee --- /dev/null +++ b/auto_reconcile_structured_ref/i18n/de.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_reconcile_strucured_ref +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-13 14:39+0000\n" +"PO-Revision-Date: 2019-05-13 16:41+0200\n" +"Last-Translator: Timon Tschanz \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" + +#. module: auto_reconcile_strucured_ref +#: model:ir.model,name:auto_reconcile_strucured_ref.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Kontoauszugzeile" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "ESR reconciliation" +msgstr "ESR Ausgleich" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "Let odoo try to reconcile entries for the user using esr refs" +msgstr "Versucht zeilen basierent auf der ESR nummer auszugleichen" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:12 +#, python-format +msgid "display: none;" +msgstr "" diff --git a/auto_reconcile_structured_ref/i18n/fr.po b/auto_reconcile_structured_ref/i18n/fr.po new file mode 100644 index 0000000000..8a5da7f250 --- /dev/null +++ b/auto_reconcile_structured_ref/i18n/fr.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_reconcile_strucured_ref +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-13 14:39+0000\n" +"PO-Revision-Date: 2019-05-13 16:41+0200\n" +"Last-Translator: Timon Tschanz \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#. module: auto_reconcile_strucured_ref +#: model:ir.model,name:auto_reconcile_strucured_ref.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Ligne de relevé bancaire" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "ESR reconciliation" +msgstr "Lettrage BVR" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "Let odoo try to reconcile entries for the user using esr refs" +msgstr "Laisser Odoo essayer de lettrer les entrées pour l'utilisateur avec les références BVR" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:12 +#, python-format +msgid "display: none;" +msgstr "display: none;" diff --git a/auto_reconcile_structured_ref/i18n/it.po b/auto_reconcile_structured_ref/i18n/it.po new file mode 100644 index 0000000000..90a72d9fe1 --- /dev/null +++ b/auto_reconcile_structured_ref/i18n/it.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_reconcile_strucured_ref +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-13 14:39+0000\n" +"PO-Revision-Date: 2019-05-13 16:41+0200\n" +"Last-Translator: Timon Tschanz \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: it\n" + +#. module: auto_reconcile_strucured_ref +#: model:ir.model,name:auto_reconcile_strucured_ref.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Linea estratto conto" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "ESR reconciliation" +msgstr "Riconciliazione PVR" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "Let odoo try to reconcile entries for the user using esr refs" +msgstr "" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:12 +#, python-format +msgid "display: none;" +msgstr "display: none;" diff --git a/auto_reconcile_structured_ref/i18n/l10n_ch_account_reconcile_esr.pot b/auto_reconcile_structured_ref/i18n/l10n_ch_account_reconcile_esr.pot new file mode 100644 index 0000000000..befa190c3a --- /dev/null +++ b/auto_reconcile_structured_ref/i18n/l10n_ch_account_reconcile_esr.pot @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auto_reconcile_strucured_ref +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-13 14:39+0000\n" +"PO-Revision-Date: 2019-05-13 14:39+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: auto_reconcile_strucured_ref +#: model:ir.model,name:auto_reconcile_strucured_ref.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "ESR reconciliation" +msgstr "" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:9 +#, python-format +msgid "Let odoo try to reconcile entries for the user using esr refs" +msgstr "" + +#. module: auto_reconcile_strucured_ref +#. openerp-web +#: code:addons/auto_reconcile_strucured_ref/static/src/xml/account_reconciliation.xml:12 +#, python-format +msgid "display: none;" +msgstr "" + diff --git a/auto_reconcile_structured_ref/models/__init__.py b/auto_reconcile_structured_ref/models/__init__.py new file mode 100644 index 0000000000..d5fc9a8a94 --- /dev/null +++ b/auto_reconcile_structured_ref/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import account_bank_statement_line diff --git a/auto_reconcile_structured_ref/models/account_bank_statement_line.py b/auto_reconcile_structured_ref/models/account_bank_statement_line.py new file mode 100644 index 0000000000..dfc73f3259 --- /dev/null +++ b/auto_reconcile_structured_ref/models/account_bank_statement_line.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, api +from odoo.exceptions import UserError + + +class AccountBankStatementLine(models.Model): + _inherit = "account.bank.statement.line" + + @api.multi + def auto_reconcile(self): + # If we don't have esr_reconcile we want the default odoo way + if not self.env.context.get('struct_reconcile'): + return super(AccountBankStatementLine, self).auto_reconcile() + # otherwise use struct reconcile + else: + return self.auto_reconcile_struct() + + @api.multi + def auto_reconcile_struct(self): + """ Reconcile the Bank statement line and acount move line + based on only the strctured reference + + """ + self.ensure_one() + match_recs = self.env['account.move.line'] + company_currency = self.journal_id.company_id.currency_id + # customized: dropped unneeded params + precision = company_currency.decimal_places + params = { + 'company_id': self.env.user.company_id.id, + 'account_payable_receivable': ( + self.journal_id.default_credit_account_id.id, + self.journal_id.default_debit_account_id.id + ), + 'partner_id': self.partner_id.id, + 'ref': self.name.strip(), + 'amount': self.amount, + 'precision': precision + } + # Try to get Structured Ref match + if self.name: + sql_query = self._get_common_sql_query_ignore_partner() + \ + " AND POSITION(aml.ref in %(ref)s) > 0" \ + " AND aml.ref is not null" \ + " AND round(aml.amount_residual,%(precision)s)" \ + " = round(%(amount)s,%(precision)s) " \ + " ORDER BY" \ + " date_maturity asc, aml.id asc" + self.env.cr.execute(sql_query, params) + match_recs = self.env.cr.dictfetchall() + if len(match_recs) > 1: + return False + # Customizations done. odoo code from here on. + if not match_recs: + return False + + match_recs = self.env['account.move.line'].browse( + [aml.get('id') for aml in match_recs] + ) + # Now reconcile + counterpart_aml_dicts = [] + payment_aml_rec = self.env['account.move.line'] + for aml in match_recs: + if aml.account_id.internal_type == 'liquidity': + payment_aml_rec = (payment_aml_rec | aml) + else: + amount = self.amount + counterpart_aml_dicts.append({ + 'name': aml.name if aml.name != '/' else aml.move_id.name, + 'debit': amount < 0 and -amount or 0, + 'credit': amount > 0 and amount or 0, + 'move_line': aml + }) + + try: + with self._cr.savepoint(): + counterpart = self.process_reconciliation( + counterpart_aml_dicts=counterpart_aml_dicts, + payment_aml_rec=payment_aml_rec + ) + return counterpart + except UserError: + # A configuration / business logic error that makes it impossible + # to auto-reconcile should not be raised + # since automatic reconciliation is just an amenity and the user + # will get the same exception when manually + # reconciling. Other types of exception are (hopefully) + # programmation errors and should cause a stacktrace. + self.invalidate_cache() + self.env['account.move'].invalidate_cache() + self.env['account.move.line'].invalidate_cache() + return False + + def _get_common_sql_query_ignore_partner(self): + """ Selects the account move lines based on account type and company. + + Basequery, returns all lines matching filter clause needs to be added. + """ + acc_type = "acc.internal_type IN ('payable', 'receivable')" if ( + self.partner_id or False + ) else "acc.reconcile = true" + account_clause = '' + if self.journal_id.default_credit_account_id and \ + self.journal_id.default_debit_account_id: + account_clause = "(aml.statement_id IS NULL AND aml.account_id IN \ + %(account_payable_receivable)s AND aml.payment_id IS NOT NULL) OR" + query = """ + SELECT aml.id + FROM account_move_line aml + JOIN account_account acc ON acc.id = aml.account_id + WHERE aml.company_id = %(company_id)s + AND ({0} ( {1} AND aml.reconciled = false)) + """ + return query.format(account_clause, acc_type) diff --git a/auto_reconcile_structured_ref/readme/CONTRIBUTORS.rst b/auto_reconcile_structured_ref/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..5a2b302925 --- /dev/null +++ b/auto_reconcile_structured_ref/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +Timon Tschanz diff --git a/auto_reconcile_structured_ref/readme/DESCRIPTION.rst b/auto_reconcile_structured_ref/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..1bf0740712 --- /dev/null +++ b/auto_reconcile_structured_ref/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This addon adds a new auto reconciliation button, which reconciles statement lines +only based on the ESR and hides the original one. This should allow for more acurate matching, though we probably match a bit less. diff --git a/auto_reconcile_structured_ref/readme/USAGE.rst b/auto_reconcile_structured_ref/readme/USAGE.rst new file mode 100644 index 0000000000..a2f8e435cd --- /dev/null +++ b/auto_reconcile_structured_ref/readme/USAGE.rst @@ -0,0 +1,3 @@ +To use this module following steps are required: +1. Go to the Bank Statement reconciliation view +2. Press the "Automatic ESR reconciliation" button diff --git a/auto_reconcile_structured_ref/static/src/js/account_reconciliation.js b/auto_reconcile_structured_ref/static/src/js/account_reconciliation.js new file mode 100644 index 0000000000..2e3f65fe8e --- /dev/null +++ b/auto_reconcile_structured_ref/static/src/js/account_reconciliation.js @@ -0,0 +1,32 @@ +odoo.define('auto_reconcile_structured_ref.structured_ref_reconciliation', function (require) { +"use strict"; + +var AccountReconciliation = require('account.reconciliation'); +var core = require('web.core'); + + +// Add a second button to reconcilation widget which only reconciles based on esr. +AccountReconciliation.bankStatementReconciliation.include({ + start: function() { + var self = this; + return $.when(this._super()).then(function(){ + self.$el.find('.js_struct_reconciliation').click(function() { + self.model_bank_statement_line + .call("reconciliation_widget_auto_reconcile", + [self.lines || undefined, self.num_already_reconciled_lines], + {'context': {'struct_reconcile': true}} + ) + .then(function(data){ + self.serverPreprocessResultHandler(data); + }) + .then(function(){ + self.$('.js_struct_reconciliation').hide(); + return self.display_reconciliation_propositions(); + }); + + }); + + }); + }, +}); +}); diff --git a/auto_reconcile_structured_ref/static/src/xml/account_reconciliation.xml b/auto_reconcile_structured_ref/static/src/xml/account_reconciliation.xml new file mode 100644 index 0000000000..93537f06da --- /dev/null +++ b/auto_reconcile_structured_ref/static/src/xml/account_reconciliation.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + display: none; + + + diff --git a/auto_reconcile_structured_ref/views/assets.xml b/auto_reconcile_structured_ref/views/assets.xml new file mode 100644 index 0000000000..f268aaab71 --- /dev/null +++ b/auto_reconcile_structured_ref/views/assets.xml @@ -0,0 +1,8 @@ + + + + From 59c9d99da0b1019986a5832e0055ac9630a0783e Mon Sep 17 00:00:00 2001 From: Timon Tschanz Date: Wed, 10 Jul 2019 13:40:48 +0200 Subject: [PATCH 2/5] fix changed line --- .../models/account_bank_statement_line.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auto_reconcile_structured_ref/models/account_bank_statement_line.py b/auto_reconcile_structured_ref/models/account_bank_statement_line.py index dfc73f3259..6ce0b2cb36 100644 --- a/auto_reconcile_structured_ref/models/account_bank_statement_line.py +++ b/auto_reconcile_structured_ref/models/account_bank_statement_line.py @@ -67,7 +67,8 @@ def auto_reconcile_struct(self): if aml.account_id.internal_type == 'liquidity': payment_aml_rec = (payment_aml_rec | aml) else: - amount = self.amount + amount = aml.currency_id and aml.amount_residual_currency \ + or aml.amount_residual counterpart_aml_dicts.append({ 'name': aml.name if aml.name != '/' else aml.move_id.name, 'debit': amount < 0 and -amount or 0, From 45ffc08e6dead96497f22f24406a1147f9c173a4 Mon Sep 17 00:00:00 2001 From: Timon Tschanz Date: Wed, 10 Jul 2019 14:07:41 +0200 Subject: [PATCH 3/5] Update auto_reconcile_structured_ref/views/assets.xml Co-Authored-By: jcoux --- auto_reconcile_structured_ref/views/assets.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto_reconcile_structured_ref/views/assets.xml b/auto_reconcile_structured_ref/views/assets.xml index f268aaab71..ef11180805 100644 --- a/auto_reconcile_structured_ref/views/assets.xml +++ b/auto_reconcile_structured_ref/views/assets.xml @@ -2,7 +2,7 @@