diff --git a/account_statement_bankaccount_completion/__init__.py b/account_statement_bankaccount_completion/__init__.py
index 133223b9..cac9a795 100644
--- a/account_statement_bankaccount_completion/__init__.py
+++ b/account_statement_bankaccount_completion/__init__.py
@@ -18,4 +18,5 @@
# along with this program. If not, see .
#
#
-import statement
+from . import statement
+from . import res_partner_bank
diff --git a/account_statement_bankaccount_completion/res_partner_bank.py b/account_statement_bankaccount_completion/res_partner_bank.py
new file mode 100644
index 00000000..ea826f96
--- /dev/null
+++ b/account_statement_bankaccount_completion/res_partner_bank.py
@@ -0,0 +1,52 @@
+#
+# Authors: Laurent Mignon
+# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
+# All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+#
+from openerp.osv.orm import Model
+
+
+class res_partner_bank(Model):
+ _inherit = 'res.partner.bank'
+
+ def search_by_acc_number(self, cr, uid, acc_number, context=None):
+ '''
+ Try to find the Account Number using a 'like' operator to avoid
+ problems with the input mask used to store the value.
+ '''
+ # first try with an exact match
+ ids = self.search(cr,
+ uid,
+ [('acc_number', '=', acc_number)],
+ context=context)
+ if ids:
+ return ids
+
+ cr.execute("""
+ SELECT
+ id
+ FROM
+ res_partner_bank
+ WHERE
+ regexp_replace(acc_number,'([^[:alnum:]])', '','g')
+ ilike
+ regexp_replace(%s,'([^[:alnum:]])', '','g')
+ """, (acc_number,))
+ # apply security constraints by using the orm
+ return self.search(cr, uid,
+ [('id', 'in', [r[0] for r in cr.fetchall()])],
+ context=context)
diff --git a/account_statement_bankaccount_completion/statement.py b/account_statement_bankaccount_completion/statement.py
index 4525f183..3c40204f 100644
--- a/account_statement_bankaccount_completion/statement.py
+++ b/account_statement_bankaccount_completion/statement.py
@@ -23,8 +23,8 @@
from openerp.tools.translate import _
from openerp.osv.orm import Model
from openerp.osv import fields
-from openerp.addons.account_statement_base_completion.statement import \
- ErrorTooManyPartner
+from openerp.addons.account_statement_base_completion.statement \
+ import ErrorTooManyPartner
class AccountStatementCompletionRule(Model):
@@ -54,21 +54,25 @@ class AccountStatementCompletionRule(Model):
partner_acc_number = st_line['partner_acc_number']
if not partner_acc_number:
return {}
- st_obj = self.pool.get('account.bank.statement.line')
+ st_obj = self.pool['account.bank.statement.line']
res = {}
- res_bank_obj = self.pool.get('res.partner.bank')
- ids = res_bank_obj.search(cr,
- uid,
- [('acc_number', '=', partner_acc_number)],
- context=context)
+ res_bank_obj = self.pool['res.partner.bank']
+ ids = res_bank_obj.search_by_acc_number(cr,
+ uid,
+ partner_acc_number,
+ context=context)
if len(ids) > 1:
- raise ErrorTooManyPartner(
- _('Line named "%s" (Ref:%s) was matched by more than one '
- 'partner for account number "%s".') %
- (st_line['name'], st_line['ref'], partner_acc_number))
+ raise ErrorTooManyPartner(_('Line named "%s" (Ref:%s) was matched '
+ 'by more than one partner for account '
+ 'number "%s".') %
+ (st_line['name'],
+ st_line['ref'],
+ partner_acc_number))
if len(ids) == 1:
- partner = res_bank_obj.browse(
- cr, uid, ids[0], context=context).partner_id
+ partner = res_bank_obj.browse(cr,
+ uid,
+ ids[0],
+ context=context).partner_id
res['partner_id'] = partner.id
st_vals = st_obj.get_values_for_line(
cr, uid, profile_id=st_line['profile_id'],
diff --git a/account_statement_bankaccount_completion/tests/test_bankaccount_completion.py b/account_statement_bankaccount_completion/tests/test_bankaccount_completion.py
index 123ef3e3..bef61969 100644
--- a/account_statement_bankaccount_completion/tests/test_bankaccount_completion.py
+++ b/account_statement_bankaccount_completion/tests/test_bankaccount_completion.py
@@ -22,81 +22,102 @@
from openerp.tests import common
import time
-ACC_NUMBER = "BE38733040385372"
+ACC_NUMBER = " BE38 7330 4038 5372 "
class bankaccount_completion(common.TransactionCase):
- def prepare(self):
+ def setUp(self):
+ super(bankaccount_completion, self).setUp()
self.company_a = self.browse_ref('base.main_company')
self.profile_obj = self.registry("account.statement.profile")
- self.st_obj = self.registry("account.bank.statement")
+ self.acc_bk_stmt = self.registry("account.bank.statement")
self.st_line_obj = self.registry("account.bank.statement.line")
- self.completion_rule_id = self.ref(
- 'account_statement_bankaccount_completion.'
- 'bank_statement_completion_rule_10')
- self.journal_id = self.registry("ir.model.data").get_object_reference(
- self.cr, self. uid, "account", "bank_journal")[1]
+ self.completion_rule_id = \
+ self.ref('account_statement_bankaccount_completion.'
+ 'bank_statement_completion_rule_10')
+ self.journal_id = self.ref("account.bank_journal")
self.partner_id = self.ref('base.main_partner')
+ self.account_id = self.ref("account.a_recv")
+
# Create the profile
- self.account_id = self.registry("ir.model.data").get_object_reference(
- self.cr, self.uid, "account", "a_recv")[1]
- self.journal_id = self.registry("ir.model.data").get_object_reference(
- self.cr, self. uid, "account", "bank_journal")[1]
self.profile_id = self.profile_obj.create(self.cr, self.uid, {
"name": "TEST",
"commission_account_id": self.account_id,
"journal_id": self.journal_id,
"rule_ids": [(6, 0, [self.completion_rule_id])]})
- # Create the completion rule
-
# Create a bank statement
- self.statement_id = self.st_obj.create(
- self.cr, self.uid, {
- "balance_end_real": 0.0,
+ vals = {"balance_end_real": 0.0,
"balance_start": 0.0,
"date": time.strftime('%Y-%m-%d'),
"journal_id": self.journal_id,
- "profile_id": self.profile_id
- })
-
- # Create bank a statement line
- self.statement_line_id = self.st_line_obj.create(self.cr, self.uid, {
- 'amount': 1000.0,
- 'name': 'EXT001',
- 'ref': 'My ref',
- 'statement_id': self.statement_id,
- 'partner_acc_number': ACC_NUMBER
- })
+ "profile_id": self.profile_id,
+ }
+ self.statement_id = self.acc_bk_stmt.create(self.cr,
+ self.uid,
+ vals)
# Add a bank account number to the partner
- res_bank_obj = self.registry('res.partner.bank')
- res_bank_obj.create(self.cr, self.uid, {
- "state": "bank",
- "company_id": self.company_a.id,
- "partner_id": self.partner_id,
- "acc_number": ACC_NUMBER,
- "footer": True,
- "bank_name": "Reserve"
- })
+ self.res_partner_bank_obj = self.registry('res.partner.bank')
+ vals = {"state": "bank",
+ "company_id": self.company_a.id,
+ "partner_id": self.partner_id,
+ "acc_number": ACC_NUMBER,
+ "footer": True,
+ "bank_name": "Reserve",
+ }
+ self.res_partner_bank_id = self.res_partner_bank_obj.create(self.cr,
+ self.uid,
+ vals)
def test_00(self):
"""Test complete partner_id from bank account number
-
Test the automatic completion of the partner_id based on the account
- number associated to the
- statement line
+ number associated to the statement line
"""
- self.prepare()
- statement_line = self.st_line_obj.browse(self.cr, self.uid,
- self.statement_line_id)
- # before import, the
- self.assertFalse(
- statement_line.partner_id,
- "Partner_id must be blank before completion")
- statement_obj = self.st_obj.browse(self.cr, self.uid, self.statement_id)
- statement_obj.button_auto_completion()
- statement_line = self.st_line_obj.browse(self.cr, self.uid,
- self.statement_line_id)
- self.assertEquals(self.partner_id, statement_line.partner_id[
- 'id'], "Missing expected partner id after completion")
+ for bank_acc_number in [ACC_NUMBER, ACC_NUMBER.replace(" ", ""),
+ ACC_NUMBER.replace(" ", "-")]:
+ # check the completion for well formatted and not well
+ # formatted account number
+ self.res_partner_bank_obj.write(self.cr,
+ self.uid,
+ self.res_partner_bank_id,
+ {"acc_number": bank_acc_number}
+ )
+ for acc_number in [ACC_NUMBER, ACC_NUMBER.replace(" ", ""),
+ ACC_NUMBER.replace(" ", "-"),
+ " BE38-7330 4038-5372 "]:
+ vals = {'amount': 1000.0,
+ 'name': 'EXT001',
+ 'ref': 'My ref',
+ 'statement_id': self.statement_id,
+ 'partner_acc_number': acc_number
+ }
+ line_id = self.st_line_obj.create(self.cr, self.uid, vals)
+ line = self.st_line_obj.browse(self.cr, self.uid, line_id)
+ self.assertFalse(line.partner_id,
+ 'Partner_id must be blank before completion')
+ statement_obj = self.acc_bk_stmt.browse(self.cr,
+ self.uid,
+ self.statement_id)
+ statement_obj.button_auto_completion()
+ line = self.st_line_obj.browse(self.cr, self.uid, line_id)
+ self.assertEquals(self.partner_id, line.partner_id['id'],
+ 'Missing expected partner id after '
+ 'completion')
+ vals = {'amount': 1000.0,
+ 'name': 'EXT001',
+ 'ref': 'My ref',
+ 'statement_id': self.statement_id,
+ 'partner_acc_number': 'BE38a7330.4038-5372.',
+ }
+ line_id = self.st_line_obj.create(self.cr, self.uid, vals)
+ line = self.st_line_obj.browse(self.cr, self.uid, line_id)
+ self.assertFalse(line.partner_id,
+ 'Partner_id must be blank before completion')
+ statement_obj = self.acc_bk_stmt.browse(self.cr,
+ self.uid,
+ self.statement_id)
+ statement_obj.button_auto_completion()
+ line = self.st_line_obj.browse(self.cr, self.uid, line_id)
+ self.assertFalse(line.partner_id.id)