mirror of
https://github.com/OCA/bank-payment.git
synced 2025-02-02 10:37:31 +02:00
[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:
@@ -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',
|
||||
|
||||
@@ -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!'),
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user