diff --git a/addons/edi/models/res_company.py b/addons/edi/models/res_company.py index 0fcc0cd1033..2cf863e6d3d 100644 --- a/addons/edi/models/res_company.py +++ b/addons/edi/models/res_company.py @@ -48,7 +48,11 @@ class res_company(osv.osv): result['logo'] = company.logo # already base64-encoded if company.paypal_account: result['paypal_account'] = company.paypal_account - # bank info - if company.bank_ids: - result['bank_ids'] = res_partner_address.edi_m2m(cr, uid, company.bank_ids, context=context) + # bank info: include only bank account supposed to be displayed in document footers + res_partner_bank = self.pool.get('res.partner.bank') + bank_ids = res_partner_bank.search(cr, uid, [('company_id','=',company.id),('footer','=',True)], context=context) + if bank_ids: + result['bank_ids'] = res_partner_address.edi_m2m(cr, uid, + res_partner_bank.browse(cr, uid, bank_ids, context=context), + context=context) return result diff --git a/addons/edi/models/res_partner.py b/addons/edi/models/res_partner.py index f8ddc4063e8..4e383b7cd7e 100644 --- a/addons/edi/models/res_partner.py +++ b/addons/edi/models/res_partner.py @@ -18,8 +18,12 @@ # along with this program. If not, see . # ############################################################################## +import logging + from osv import fields,osv from edi import EDIMixin +from openerp import SUPERUSER_ID +from tools.translate import _ RES_PARTNER_ADDRESS_EDI_STRUCT = { 'name': True, @@ -54,6 +58,26 @@ class res_partner(osv.osv, EDIMixin): class res_partner_address(osv.osv, EDIMixin): _inherit = "res.partner.address" + def _get_bank_type(self, cr, uid, context=None): + # first option: the "normal" bank type, installed by default + res_partner_bank_type = self.pool.get('res.partner.bank.type') + try: + return self.pool.get('ir.model.data').get_object(cr, uid, 'base', 'bank_normal', context=context).code + except ValueError: + pass + + # second option: create a new custom type for EDI or use it if already created, as IBAN type is + # not always appropriate: we need a free-form bank type for max flexibility (users can correct + # data manually after import) + code, label = 'edi_generic', 'Generic Bank Type (auto-created for EDI)' + bank_code_ids = res_partner_bank_type.search(cr, uid, [('code','=',code)], context=context) + if not bank_code_ids: + logging.getLogger('edi.res_partner').info('Normal bank account type is missing, creating ' + 'a generic bank account type for EDI.') + self.res_partner_bank_type.create(cr, SUPERUSER_ID, {'name': label, + 'code': label}) + return code + def edi_export(self, cr, uid, records, edi_struct=None, context=None): return super(res_partner_address,self).edi_export(cr, uid, records, edi_struct or dict(RES_PARTNER_ADDRESS_EDI_STRUCT), @@ -67,15 +91,16 @@ class res_partner_address(osv.osv, EDIMixin): partner = self._edi_get_object_by_external_id(cr, uid, edi_document['partner_id'][0], 'res.partner', context=context) assert partner is not None - import_ctx = dict(context, default_partner_id=partner.id) - - # get the first bank type - res_partner_bank_type = self.pool.get('res.partner.bank.type') - bank_code_ids = res_partner_bank_type.search(cr, uid, [], context=context) - assert bank_code_ids, 'Please define at least one "bank type" before importing bank accounts' - import_ctx['default_state'] = res_partner_bank_type.browse(cr, uid, bank_code_ids[0]).code - bank_ids = [] + import_ctx = dict(context, + default_partner_id=partner.id, + default_state=self._get_bank_type(cr, uid, context)) for ext_bank_id, bank_name in edi_bank_ids: - bank_ids.append(self.edi_import_relation(cr, uid, 'res.partner.bank', - bank_name, ext_bank_id, context=import_ctx)) + try: + self.edi_import_relation(cr, uid, 'res.partner.bank', + bank_name, ext_bank_id, context=import_ctx) + except osv.except_osv: + # failed to import it, try again with unrestricted default type + logging.getLogger('edi.res_partner').warning('Failed to import bank account using' + 'bank type: %s, ignoring', import_ctx['default_state'], + exc_info=True) return result \ No newline at end of file diff --git a/addons/purchase/test/edi_purchase_order.yml b/addons/purchase/test/edi_purchase_order.yml index d0dd955fcc8..ff49b41157b 100644 --- a/addons/purchase/test/edi_purchase_order.yml +++ b/addons/purchase/test/edi_purchase_order.yml @@ -78,7 +78,7 @@ "street": "Chaussee de Namur 40", "street2": "mailbox 34", "bank_ids": [ - ["base:724f93ec-ddd0-11e0-88ec-701a04e25543.res_partner_bank-ZrTWzeDJzGbp","Sample bank: 123465789-156113"] + ["base:724f93ec-ddd0-11e0-88ec-701a04e25543.res_partner_bank-XiwqnxKWzGbp","Guys bank: 123477777-156113"] ], }, "order_line": [{ @@ -117,7 +117,7 @@ # check bank info on partner assert len(order_new.partner_id.bank_ids) == 1, "Expected 1 bank entry related to partner" bank_info = order_new.partner_id.bank_ids[0] - assert bank_info.acc_number == "Sample bank: 123465789-156113", 'Expected "Sample bank: 123465789-156113", got %s' % bank_info.acc_number + assert bank_info.acc_number == "Guys bank: 123477777-156113", 'Expected "Guys bank: 123477777-156113", got %s' % bank_info.acc_number assert order_new.pricelist_id.name == 'Default Purchase Pricelist' , "Default Purchase Pricelist was not automatically assigned" assert order_new.amount_total == 350, "Amount total is not same" diff --git a/addons/sale/test/edi_sale_order.yml b/addons/sale/test/edi_sale_order.yml index 4aefeeecac7..9a207d9f44e 100644 --- a/addons/sale/test/edi_sale_order.yml +++ b/addons/sale/test/edi_sale_order.yml @@ -63,7 +63,7 @@ "zip": "1367", "country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"], "bank_ids": [ - ["base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_bank-ZrTWzesfsdDJzGbp","Sample bank: 123465789-156113"] + ["base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_bank-adaWadsadasdDJzGbp","Ladies bank: 032465789-156113"] ], }, "partner_id": ["purchase:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_test20", "jones white"], @@ -111,7 +111,7 @@ # check bank info on partner assert len(order_new.partner_id.bank_ids) == 1, "Expected 1 bank entry related to partner" bank_info = order_new.partner_id.bank_ids[0] - assert bank_info.acc_number == "Sample bank: 123465789-156113", 'Expected "Sample bank: 123465789-156113", got %s' % bank_info.acc_number + assert bank_info.acc_number == "Ladies bank: 032465789-156113", 'Expected "Ladies bank: 032465789-156113", got %s' % bank_info.acc_number assert order_new.pricelist_id.name == 'Public Pricelist' , "Public Price list was not automatically assigned" assert order_new.amount_total == 350, "Amount total is wrong"