Merge pull request #24 from acsone/7.0-improve-acc-number-completion

[IMP] account_statement_bankaccount_completion: Improve acc number completion
This commit is contained in:
Pedro M. Baeza
2014-08-07 19:02:13 +02:00
4 changed files with 146 additions and 68 deletions

View File

@@ -18,4 +18,5 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
import statement
from . import statement
from . import res_partner_bank

View File

@@ -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 <http://www.gnu.org/licenses/>.
#
#
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)

View File

@@ -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'],

View File

@@ -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)