Skip to content
Snippets Groups Projects
Commit cc5a2e44 authored by Laurent Mignon's avatar Laurent Mignon Committed by Arthur Maniet
Browse files

[FIX] Use unique accounts and improved bank search in base.

Courtesy of lmignon (acsone)
parent 9919707e
No related branches found
No related tags found
No related merge requests found
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
# #
############################################################################## ##############################################################################
import re
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp.exceptions import UserError from openerp.exceptions import UserError
...@@ -113,8 +115,51 @@ class res_partner_bank(osv.osv): ...@@ -113,8 +115,51 @@ class res_partner_bank(osv.osv):
value = address.get(field, value) value = address.get(field, value)
return value return value
# Courtesy of lmignon (acsone)
def _sanitize_account_number(self, acc_number):
if acc_number:
return re.sub(r'\W+', '', acc_number).upper()
return False
def _get_sanitized_account_number(
self, cr, uid, ids, field_name, arg, context):
"""Compute sanitized version off account number.
This is needed for reliable search and uniqueness test."""
res = {}
for this_obj in self.browse(cr, uid, ids, context = context):
res[this_obj.id] = (
self._sanitize_account_number(this_obj.acc_number))
return res
def search(self, cr, user, args, offset=0, limit=None, order=None,
context=None, count=False):
pos = 0
while pos < len(args):
if args[pos][0] == 'acc_number':
op = args[pos][1]
value = args[pos][2]
if hasattr(value, '__iter__'):
value = [self._sanitize_account_number(i) for i in value]
else:
value = self._sanitize_account_number(value)
if 'like' in op:
value = '%' + value + '%'
args[pos] = ('sanitized_acc_number', op, value)
pos += 1
return super(res_partner_bank, self).search(
cr, user, args, offset=0, limit=None, order=None, context=None,
count=False)
_columns = { _columns = {
'acc_number': fields.char('Account Number', required=True), 'acc_number': fields.char('Account Number', required=True),
'sanitized_acc_number': fields.function(
_get_sanitized_account_number,
string='Sanitized Account Number',
type='char', size=64, readonly=True,
store=True,
),
'bank': fields.many2one('res.bank', 'Bank'), 'bank': fields.many2one('res.bank', 'Bank'),
'bank_bic': fields.char('Bank Identifier Code'), 'bank_bic': fields.char('Bank Identifier Code'),
'bank_name': fields.char('Bank Name'), 'bank_name': fields.char('Bank Name'),
...@@ -135,6 +180,10 @@ class res_partner_bank(osv.osv): ...@@ -135,6 +180,10 @@ class res_partner_bank(osv.osv):
'footer': fields.boolean("Display on Reports", help="Display this bank account on the footer of printed documents like invoices and sales orders."), 'footer': fields.boolean("Display on Reports", help="Display this bank account on the footer of printed documents like invoices and sales orders."),
'currency_id': fields.many2one('res.currency', string='Currency', help="Currency of the bank account and its related journal."), 'currency_id': fields.many2one('res.currency', string='Currency', help="Currency of the bank account and its related journal."),
} }
_sql_constraints = [
('unique_number', 'unique(sanitized_acc_number)',
'Account Number must be unique'),
]
_defaults = { _defaults = {
'owner_name': lambda obj, cursor, user, context: obj._default_value( 'owner_name': lambda obj, cursor, user, context: obj._default_value(
......
...@@ -25,3 +25,4 @@ import test_translate ...@@ -25,3 +25,4 @@ import test_translate
import test_view_validation import test_view_validation
import test_views import test_views
import test_xmlrpc import test_xmlrpc
import test_res_partner_bank
# -*- coding: utf-8 -*-
##############################################################################
#
# This file is part of account_bank_statement_import,
# an Odoo module.
#
# Copyright (c) 2015 ACSONE SA/NV (<http://acsone.eu>)
#
# account_bank_statement_import 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.
#
# account_bank_statement_import 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 account_bank_statement_import_coda.
# If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.tests.common import TransactionCase
class TestResPartnerBank(TransactionCase):
"""Tests acc_number
"""
def test_sanitized_acc_number(self):
partner_bank_model = self.env['res.partner.bank']
acc_number = " BE-001 2518823 03 "
vals = partner_bank_model.search([('acc_number', '=', acc_number)])
self.assertEquals(0, len(vals))
partner_bank = partner_bank_model.create({
'acc_number': acc_number,
'partner_id': self.ref('base.res_partner_2'),
'state': 'bank',
})
vals = partner_bank_model.search([('acc_number', '=', acc_number)])
self.assertEquals(1, len(vals))
self.assertEquals(partner_bank, vals[0])
vals = partner_bank_model.search([('acc_number', 'in', [acc_number])])
self.assertEquals(1, len(vals))
self.assertEquals(partner_bank, vals[0])
self.assertEqual(partner_bank.acc_number, acc_number)
# sanitaze the acc_number
sanitized_acc_number = 'BE001251882303'
vals = partner_bank_model.search(
[('acc_number', '=', sanitized_acc_number)])
self.assertEquals(1, len(vals))
self.assertEquals(partner_bank, vals[0])
vals = partner_bank_model.search(
[('acc_number', 'in', [sanitized_acc_number])])
self.assertEquals(1, len(vals))
self.assertEquals(partner_bank, vals[0])
self.assertEqual(partner_bank.sanitized_acc_number,
sanitized_acc_number)
# search is case insensitive
vals = partner_bank_model.search(
[('acc_number', '=', sanitized_acc_number.lower())])
self.assertEquals(1, len(vals))
vals = partner_bank_model.search(
[('acc_number', '=', acc_number.lower())])
self.assertEquals(1, len(vals))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment