1 # -*- encoding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2011 Numérigraphe SARL.
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
23 from osv import fields, osv
24 from tools.translate import _
26 class res_partner_bank(osv.osv):
27 """Add fields and behavior for French RIB"""
28 _inherit = "res.partner.bank"
30 def _check_key(self, cr, uid, ids):
31 """Check the RIB key"""
32 for bank_acc in self.browse(cr, uid, ids):
33 # Ignore the accounts of type other than rib
34 if bank_acc.state !='rib':
36 # Fail if the needed values are empty of too short
37 if (not bank_acc.bank_code
38 or len(bank_acc.bank_code) != 5
39 or not bank_acc.office or len(bank_acc.office) != 5
40 or not bank_acc.acc_number or len(bank_acc.acc_number) != 11
41 or not bank_acc.key or len(bank_acc.key) != 2):
43 # Get the rib data (without the key)
44 rib = "%s%s%s" % (bank_acc.bank_code, bank_acc.office,
46 # Translate letters into numbers according to a specific table
48 table = dict((ord(a), b) for a, b in zip(
49 u'abcdefghijklmnopqrstuvwxyz', u'12345678912345678923456789'))
50 rib = rib.lower().translate(table)
52 key = 97 - (100 * int(rib)) % 97
53 if int(bank_acc.key) != key:
57 def onchange_bank_id(self, cr, uid, ids, bank_id, context=None):
58 """Change the bank code"""
59 result = super(res_partner_bank, self).onchange_bank_id(cr, uid, ids, bank_id,
62 value = result.setdefault('value', {})
63 bank = self.pool.get('res.bank').browse(cr, uid, bank_id,
65 value['bank_code'] = bank.rib_code
69 'bank_code': fields.char('Bank Code', size=64, readonly=True,),
70 'office': fields.char('Office Code', size=5, readonly=True,),
71 'key': fields.char('Key', size=2, readonly=True,
72 help="The key is a number allowing to check the "
73 "correctness of the other codes."),
76 def _construct_constraint_msg(self, cr, uid, ids, context=None):
77 """Quote the data in the warning message"""
78 # Only process the first id
79 if type(ids) not in (int, long):
81 rib = self.browse(cr, uid, id, context=context)
83 return (_("\nThe RIB key %s does not correspond to the other "
90 _constraints = [(_check_key,
91 _construct_constraint_msg,
96 class res_bank(osv.osv):
97 """Add the bank code to make it easier to enter RIB data"""
100 def name_search(self, cr, user, name, args=None, operator='ilike',
101 context=None, limit=80):
102 """Search by bank code in addition to the standard search"""
103 # Get the standard results
104 results = super(res_bank, self).name_search(cr, user,
105 name, args=args ,operator=operator, context=context, limit=limit)
106 # Get additional results using the RIB code
107 ids = self.search(cr, user, [('rib_code', operator, name)],
108 limit=limit, context=context)
110 results = list(set(results + self.name_get(cr, user, ids, context)))
114 'rib_code': fields.char('RIB Bank Code', size=64),
117 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: