From 9ae1004aa5229772f05911ded5c6bcc94b642cc8 Mon Sep 17 00:00:00 2001
From: "Pieter J. Kersten"
Date: Thu, 11 Feb 2010 00:45:48 +0100
Subject: [PATCH] [FIX] account_banking: Changes on local account/IBAN could
get lost in write [FIX] account_banking: Direction of conversion BBAN and
IBAN now right [FIX] account_banking: BBAN-formatted Dutch bank accounts are
unrecognized by online BBAN/IBAN services, leading to
false misses. [IMP] account_banking: Added menu for bank accounts [IMP]
account_banking: Removed redundant field label
---
account_banking/__terp__.py | 1 +
account_banking/account_banking.py | 106 ++++++++++++++++-------
account_banking/account_banking_view.xml | 35 +++++---
account_banking/sepa/online.py | 2 +-
4 files changed, 101 insertions(+), 43 deletions(-)
diff --git a/account_banking/__terp__.py b/account_banking/__terp__.py
index e4f1dd6c0..56ef55d26 100644
--- a/account_banking/__terp__.py
+++ b/account_banking/__terp__.py
@@ -34,6 +34,7 @@
'init_xml': [],
'update_xml': [
#'security/ir.model.access.csv',
+ 'data/account_banking_data.xml',
'account_banking_import_wizard.xml',
'account_banking_view.xml',
'account_banking_workflow.xml',
diff --git a/account_banking/account_banking.py b/account_banking/account_banking.py
index cad70c5fa..574d12582 100644
--- a/account_banking/account_banking.py
+++ b/account_banking/account_banking.py
@@ -434,6 +434,7 @@ class account_bank_statement_line(osv.osv):
# '''
# if not ids:
# return {}
+
# res_currency_obj = self.pool.get('res.currency')
# res_users_obj = self.pool.get('res.users')
@@ -848,7 +849,7 @@ class res_partner_bank(osv.osv):
'''
_inherit = 'res.partner.bank'
_columns = {
- 'iban': fields.char('IBAN', size=34, readonly=True,
+ 'iban': fields.char('IBAN', size=34,
help="International Bank Account Number"
),
}
@@ -862,22 +863,23 @@ class res_partner_bank(osv.osv):
iban = sepa.IBAN(vals['iban'])
vals['iban'] = str(iban)
vals['acc_number'] = iban.localized_BBAN
- return self.__class__.__mro__[4].create(self, cursor, uid, vals,
- context
- )
+ return self.__class__.__mro__[4].create(self, cursor, uid, vals,
+ context
+ )
def write(self, cursor, uid, ids, vals, context={}):
'''
Create dual function IBAN account for SEPA countries
Note: No check on validity IBAN/Country
'''
+ import pdb; pdb.set_trace()
if 'iban' in vals and vals['iban']:
iban = sepa.IBAN(vals['iban'])
vals['iban'] = str(iban)
vals['acc_number'] = iban.localized_BBAN
- return self.__class__.__mro__[4].write(self, cursor, uid, ids,
- vals, context
- )
+ return self.__class__.__mro__[4].write(self, cursor, uid, ids,
+ vals, context
+ )
def read(self, *args, **kwargs):
records = self.__class__.__mro__[4].read(self, *args, **kwargs)
@@ -898,41 +900,82 @@ class res_partner_bank(osv.osv):
return False
return True
- def onchange_iban(self, cursor, uid, ids, iban, acc_number, context={}):
+ def get_bban_from_iban(self, cursor, uid, ids, context=None):
'''
- Trigger to auto complete other fields.
+ Return the local bank account number aka BBAN from the IBAN.
+ '''
+ for record in self.browse(cursor, uid, ids, context):
+ if not record.iban:
+ res[record.id] = False
+ else:
+ iban_acc = sepa.IBAN(record.iban)
+ try:
+ res[record.id] = iban_acc.localized_BBAN
+ except NotImplementedError:
+ res[record_id] = False
+ return res
+
+ def onchange_acc_number(self, cursor, uid, ids, acc_number,
+ context={}
+ ):
+ '''
+ Trigger to find IBAN. When found:
+ 1. Reformat BBAN
+ 2. Autocomplete bank
+ '''
+ if not acc_number:
+ return {}
+
+ values = {}
+ # Pre fill country based on company address
+ country_obj = self.pool.get('res.country')
+ partner_obj = self.pool.get('res.partner')
+ user_obj = self.pool.get('res.users')
+ user = user_obj.browse(cursor, uid, uid, context)
+ country = partner_obj.browse(cursor, uid,
+ user.company_id.partner_id.id
+ ).country
+ country_ids = [country.id]
+
+ # Complete data with online database when available
+ if country.code in sepa.IBAN.countries:
+ info = sepa.online.account_info(country.code, acc_number)
+ if info:
+ iban_acc = sepa.IBAN(info.iban)
+ if iban_acc.valid:
+ values['acc_number'] = iban_acc.localized_BBAN
+ values['iban'] = unicode(iban_acc)
+ bank_id, country_id = get_or_create_bank(
+ self.pool, cursor, uid,
+ info.bic or iban_acc.BIC_searchkey
+ )
+ values['country_id'] = country_id or \
+ country_ids and country_ids[0] or \
+ False
+ values['bank'] = bank_id or False
+ else:
+ info = None
+ if not info:
+ values['acc_number'] = acc_number
+ return {'value': values}
+
+ def onchange_iban(self, cursor, uid, ids, iban, context={}):
+ '''
+ Trigger to verify IBAN. When valid:
+ 1. Extract BBAN as local account
+ 2. Auto complete bank
'''
if not iban:
return {}
- acc_number = acc_number.strip()
country_obj = self.pool.get('res.country')
partner_obj = self.pool.get('res.partner')
- bic = None
country_ids = []
- if not iban:
- # Pre fill country based on company address
- user_obj = self.pool.get('res.users')
- user = user_obj.browse(cursor, uid, uid, context)
- country = partner_obj.browse(cursor, uid,
- user.company_id.partner_id.id
- ).country
- country_ids = [country.id]
-
- # Complete data with online database when available
- if country.code in sepa.IBAN.countries:
- info = sepa.online.account_info(country.code, acc_number)
- if info:
- bic = info.bic
- iban = info.iban
- else:
- return {}
-
iban_acc = sepa.IBAN(iban)
if iban_acc.valid:
bank_id, country_id = get_or_create_bank(
- self.pool, cursor, uid, bic or iban_acc.BIC_searchkey
+ self.pool, cursor, uid, iban_acc.BIC_searchkey
)
return {
'value': {
@@ -940,8 +983,7 @@ class res_partner_bank(osv.osv):
'iban': unicode(iban_acc),
'country':
country_id or country_ids and country_ids[0] or False,
- 'bank':
- bank_id or bank_ids and bank_id[0] or False,
+ 'bank': bank_id or False,
}
}
raise osv.except_osv(_('Invalid IBAN account number!'),
diff --git a/account_banking/account_banking_view.xml b/account_banking/account_banking_view.xml
index 9c5147f04..39a9a527b 100644
--- a/account_banking/account_banking_view.xml
+++ b/account_banking/account_banking_view.xml
@@ -17,6 +17,21 @@
parent="account.menu_finance_configuration"
/>
+
+
+ Bank Accounts
+ ir.actions.act_window
+ res.partner.bank
+ form
+ tree,form
+
+
+
account.banking.account.settings.form
@@ -82,7 +97,7 @@
-
+
@@ -209,55 +224,55 @@
- res.partner.bank.form.account_banking.inherit
+ res.partner.bank.form.banking-1
res.partner.bank
form
-
+
- res.partner.bank.form.account_banking.inherit
+ res.partner.bank.form.banking-2
res.partner.bank
form
-
+
- res.partner.form.account_banking.inherit-1
+ res.partner.form.banking-1
res.partner
form
-
+
- res.partner.form.account_banking.inherit-2
+ res.partner.form.banking-2
res.partner
form
-
+
- res.bank.form.account_banking.inherit-1
+ res.bank.form.banking-1
res.bank
form
diff --git a/account_banking/sepa/online.py b/account_banking/sepa/online.py
index 9d175ad33..e0da7665c 100644
--- a/account_banking/sepa/online.py
+++ b/account_banking/sepa/online.py
@@ -43,7 +43,7 @@ def get_iban_bic_NL(bank_acc):
banks operating in the Netherlands and will only convert Dutch local
account numbers.
'''
- data = urllib.urlencode(dict(number=bank_acc, method='POST'))
+ data = urllib.urlencode(dict(number=bank_acc.lstrip('0'), method='POST'))
request = urllib2.Request(IBANlink_NL, data)
response = urllib2.urlopen(request)
soup = BeautifulSoup(response)