[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
This commit is contained in:
Pieter J. Kersten
2010-02-11 00:45:48 +01:00
parent 7fcaf8db56
commit 9ae1004aa5
4 changed files with 101 additions and 43 deletions

View File

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

View File

@@ -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!'),

View File

@@ -17,6 +17,21 @@
parent="account.menu_finance_configuration"
/>
<!-- Add a shortcut menu for bank accounts -->
<record model="ir.actions.act_window" id="action_account_banking_res_partner_banks">
<field name="name">Bank Accounts</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner.bank</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Bank Accounts"
id="menu_action_account_banking_bank_accounts"
parent="account_banking.menu_finance_banking_settings"
action="action_account_banking_res_partner_banks"
sequence="12"
/>
<!-- Create new view on default journals for bank accounts -->
<record model="ir.ui.view" id="view_banking_account_settings_form">
<field name="name">account.banking.account.settings.form</field>
@@ -82,7 +97,7 @@
<field name="statement_ids" colspan="4" nolabel="1"/>
</page>
<page string="Import Log">
<field name="log" colspan="4"/>
<field name="log" colspan="4" nolabel="1"/>
</page>
</notebook>
</form>
@@ -209,55 +224,55 @@
<!-- Set trigger on IBAN and acc_number fields in res_partner_bank form -->
<record id="view_partner_bank_account_banking_form_1" model="ir.ui.view">
<field name="name">res.partner.bank.form.account_banking.inherit</field>
<field name="name">res.partner.bank.form.banking-1</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base_iban.view_partner_bank_iban_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="iban" position="replace">
<field name="iban" on_change="onchange_iban(iban, acc_number)"/>
<field name="iban" on_change="onchange_iban(iban)" />
</field>
</field>
</record>
<record id="view_partner_bank_account_banking_form_2" model="ir.ui.view">
<field name="name">res.partner.bank.form.account_banking.inherit</field>
<field name="name">res.partner.bank.form.banking-2</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base_iban.view_partner_bank_iban_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="acc_number" position="replace">
<field name="acc_number" on_change="onchange_iban(iban, acc_number)"/>
<field name="acc_number" on_change="onchange_acc_number(acc_number)" />
</field>
</field>
</record>
<!-- Set trigger on IBAN and acc_number field in res_partner form -->
<record id="view_partner_account_banking_form_1" model="ir.ui.view">
<field name="name">res.partner.form.account_banking.inherit-1</field>
<field name="name">res.partner.form.banking-1</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base_iban.view_partner_iban_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="iban" position="replace">
<field name="iban" on_change="onchange_iban(iban, acc_number)"/>
<field name="iban" on_change="onchange_iban(iban)" />
</field>
</field>
</record>
<record id="view_partner_account_banking_form_2" model="ir.ui.view">
<field name="name">res.partner.form.account_banking.inherit-2</field>
<field name="name">res.partner.form.banking-2</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base_iban.view_partner_iban_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="acc_number" position="replace">
<field name="acc_number" on_change="onchange_iban(iban, acc_number)"/>
<field name="acc_number" on_change="onchange_acc_number(acc_number)" />
</field>
</field>
</record>
<!-- Set trigger on BIC in res_bank form -->
<record id="view_res_bank_account_banking_form_1" model="ir.ui.view">
<field name="name">res.bank.form.account_banking.inherit-1</field>
<field name="name">res.bank.form.banking-1</field>
<field name="model">res.bank</field>
<field name="inherit_id" ref="base.view_res_bank_form"/>
<field name="type">form</field>

View File

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