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)