From 61c3841ed72f765d0d723620fb9579af91484438 Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Tue, 17 Jan 2012 18:21:53 +0100 Subject: [PATCH 1/6] [MRG] from c2c swiss localization bzr revid: yannick.vaucher@camptocamp.com-20120117172153-elginy094q5rvt7s --- addons/l10n_ch/bank.py | 45 ++++++++++++- addons/l10n_ch/demo/demo.xml | 2 +- addons/l10n_ch/demo/dta_demo.xml | 2 +- addons/l10n_ch/report/report_webkit_html.py | 22 +++--- addons/l10n_ch/wizard/bvr_import.py | 5 +- addons/l10n_ch/wizard/create_dta.py | 74 +++++++++++++++++---- addons/l10n_ch/wizard/create_dta_view.xml | 4 +- 7 files changed, 120 insertions(+), 34 deletions(-) diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py index fd69dec625f..ac57eca8903 100644 --- a/addons/l10n_ch/bank.py +++ b/addons/l10n_ch/bank.py @@ -21,6 +21,7 @@ from tools.translate import _ from osv import fields, osv +import re class Bank(osv.osv): """Inherit res.bank class in order to add swiss specific field""" @@ -42,8 +43,8 @@ class ResPartnerBank(osv.osv): _columns = { 'name': fields.char('Description', size=128, required=True), - 'post_number': fields.char('Post number', size=64), - 'bvr_adherent_num': fields.char('BVR adherent number', size=11), + 'post_number': fields.char('Post number', size=64, help="Postal number 0x-xxxxxx-x or xxxxx"), + 'bvr_adherent_num': fields.char('Bank BVR adherent number', size=11, help="Your Bank adherent number to be printed in references of your BVR. This is not a postal account number."), 'dta_code': fields.char('DTA code', size=5), 'print_bank': fields.boolean('Print Bank on BVR'), 'print_account': fields.boolean('Print Account Number on BVR'), @@ -69,10 +70,48 @@ class ResPartnerBank(osv.osv): def _prepare_name(self, bank): "Hook to get bank number of bank account" res = super(ResPartnerBank, self)._prepare_name(bank) + res = res or u'' if bank.post_number: - res = u"%s - %s" % (res, bank.post_number) + if res: + res = u"%s - %s" % (res, bank.post_number) + else: + res = bank.post_number return res + def _check_9_pos_postal_num(self, number): + """ + check if a postal number in format xx-xxxxxx-x is correct, + return true if it matches the pattern + and if check sum mod10 is ok + """ + from tools import mod10r + pattern = r'^[0-9]{2}-[0-9]{1,6}-[0-9]$' + if not re.search(pattern, number): + return False + num, checksum = (number.replace('-','')[:-1], number[-1:]) + return mod10r(num)[-1:] == checksum + + + def _check_5_pos_postal_num(self, number): + """ + check if a postal number on 5 positions is correct + """ + pattern = r'^[0-9]{1,5}$' + if not re.search(pattern, number): + return False + return True + + def _check_postal_num(self, cursor, uid, ids): + banks = self.browse(cursor, uid, ids) + for b in banks: + return self._check_9_pos_postal_num(b.post_number) or \ + self._check_5_pos_postal_num(b.post_number) + + + _constraints = [(_check_postal_num, + 'Please enter a correct postal number. (01-23456-5 or 12345)', + ['post_number'])] + _sql_constraints = [('bvr_adherent_uniq', 'unique (bvr_adherent_num)', 'The BVR adherent number must be unique !')] diff --git a/addons/l10n_ch/demo/demo.xml b/addons/l10n_ch/demo/demo.xml index fbe09024966..f13546150b3 100644 --- a/addons/l10n_ch/demo/demo.xml +++ b/addons/l10n_ch/demo/demo.xml @@ -11,7 +11,7 @@ 11-1234-1 bvrbank - 11-1234-1 + 70-004152-8 0000000 diff --git a/addons/l10n_ch/demo/dta_demo.xml b/addons/l10n_ch/demo/dta_demo.xml index cdddb0d7a74..4f44ad21cc0 100644 --- a/addons/l10n_ch/demo/dta_demo.xml +++ b/addons/l10n_ch/demo/dta_demo.xml @@ -12,7 +12,7 @@ 123456 bvrbank - 234567 + 01-23456-5 diff --git a/addons/l10n_ch/report/report_webkit_html.py b/addons/l10n_ch/report/report_webkit_html.py index 8b179e7ae58..e6f7239c4e4 100644 --- a/addons/l10n_ch/report/report_webkit_html.py +++ b/addons/l10n_ch/report/report_webkit_html.py @@ -124,28 +124,24 @@ class l10n_ch_report_webkit_html(report_sxw.rml_parse): invoice_obj = pool.get('account.invoice') ids = invoice_ids for invoice in invoice_obj.browse(cursor, self.uid, ids): + invoice_name = "%s %s" %(invoice.name, invoice.number) if not invoice.partner_bank_id: raise except_osv(_('UserError'), - _('No bank specified on invoice:\n' + \ - invoice_obj.name_get(cursor, self.uid, [invoice.id], - context={})[0][1])) + _('No bank specified on invoice:\n%s' %(invoice_name))) if not self._compile_check_bvr.match( invoice.partner_bank_id.post_number or ''): raise except_osv(_('UserError'), - _('Your bank BVR number should be of the form 0X-XXX-X! ' + - 'Please check your company ' + - 'information for the invoice:\n' + - invoice_obj.name_get(cursor, self.uid, [invoice.id], - context={})[0][1])) + _(('Your bank BVR number should be of the form 0X-XXX-X! ' + 'Please check your company ' + 'information for the invoice:\n%s') + %(invoice_name))) if invoice.partner_bank_id.bvr_adherent_num \ and not self._compile_check_bvr_add_num.match( invoice.partner_bank_id.bvr_adherent_num): raise except_osv(_('UserError'), - _('Your bank BVR adherent number must contain exactly seven' + - 'digits!\nPlease check your company ' + - 'information for the invoice:\n' + - invoice_obj.name_get(cursor, self.uid, [invoice.id], - context={})[0][1])) + _(('Your bank BVR adherent number must contain only ' + 'digits!\nPlease check your company ' + 'information for the invoice:\n%s') %(invoice_name))) return '' class BVRWebKitParser(webkit_report.WebKitParser): diff --git a/addons/l10n_ch/wizard/bvr_import.py b/addons/l10n_ch/wizard/bvr_import.py index e98053513cd..e5c5b7e5053 100644 --- a/addons/l10n_ch/wizard/bvr_import.py +++ b/addons/l10n_ch/wizard/bvr_import.py @@ -71,6 +71,9 @@ def _import(self, cursor, user, data, context=None): statement_obj = self.pool.get('account.bank.statement') property_obj = self.pool.get('ir.property') file = data['form']['file'] + if not file: + raise osv.except_osv(_('UserError'), + _('Please select a file first!')) statement_id = data['id'] records = [] total_amount = 0 @@ -239,7 +242,7 @@ def _import(self, cursor, user, data, context=None): class bvr_import_wizard(osv.osv_memory): _name = 'bvr.import.wizard' _columns = { - 'file':fields.binary('BVR File', readonly=True) + 'file':fields.binary('BVR File') } def import_bvr(self, cr, uid, ids, context=None): diff --git a/addons/l10n_ch/wizard/create_dta.py b/addons/l10n_ch/wizard/create_dta.py index 7abb1d7ca7c..e9b0585d4c8 100644 --- a/addons/l10n_ch/wizard/create_dta.py +++ b/addons/l10n_ch/wizard/create_dta.py @@ -28,6 +28,8 @@ import pooler from tools.translate import _ import unicode2ascii +import re + TRANS=[ (u'é','e'), (u'è','e'), @@ -346,6 +348,14 @@ def c_ljust(s, size): s = s.decode('utf-8').encode('latin1','replace').ljust(size) return s +def _is_9_pos_bvr_adherent(adherent_num): + """ + from a bvr adherent number, + return true if + """ + pattern = r'[0-9]{2}-[0-9]{1,6}-[0-9]' + return re.search(pattern, adherent_num) + def _create_dta(obj, cr, uid, data, context=None): v = {} v['uid'] = str(uid) @@ -435,10 +445,24 @@ def _create_dta(obj, cr, uid, data, context=None): or False v['partner_bvr'] = pline.bank_id.post_number or '' if v['partner_bvr']: - v['partner_bvr'] = v['partner_bvr'].replace('-','') - if len(v['partner_bvr']) < 9: - v['partner_bvr'] = v['partner_bvr'][:2] + '0' * \ - (9 - len(v['partner_bvr'])) + v['partner_bvr'][2:] + is_9_pos_adherent = None + # if adherent bvr number is a 9 pos number + # add 0 to fill 2nd part plus remove '-' + # exemple: 12-567-C becomes 12000567C + if _is_9_pos_bvr_adherent(v['partner_bvr']): + parts = v['partner_bvr'].split('-') + parts[1] = parts[1].rjust(6, '0') + v['partner_bvr'] = ''.join(parts) + is_9_pos_adherent = True + # add 4*0 to bvr adherent number with 5 pos + # exemple: 12345 becomes 000012345 + elif len(v['partner_bvr']) == 5: + v['partner_bvr'] = v['partner_bvr'].rjust(9, '0') + is_9_pos_adherent = False + else: + raise osv.except_osv(_('Error'), + _('Wrong postal number format.\n' + 'It must be 12-123456-9 or 12345 format')) if pline.bank_id.bank: v['partner_bank_city'] = pline.bank_id.bank.city or False @@ -518,15 +542,39 @@ def _create_dta(obj, cr, uid, data, context=None): elif elec_pay == 'bvrbank' or elec_pay == 'bvrpost': from tools import mod10r - if v['reference']: - v['reference'] = v['reference'].replace(' ', - '').rjust(27).replace(' ', '0') - if not v['reference'] \ - or (mod10r(v['reference'][:-1]) != v['reference'] and \ - not len(v['reference']) == 15): - raise osv.except_osv(_('Error'), _('You must provide ' \ - 'a valid BVR reference number \n' \ - 'for the line: %s') % pline.name) + if not v['reference']: + raise osv.except_osv(_('Error'), + _('You must provide ' \ + 'a BVR reference number \n' \ + 'for the line: %s') % pline.name) + v['reference'] = v['reference'].replace(' ', '') + if is_9_pos_adherent: + if len(v['reference']) > 27: + raise osv.except_osv(_('Error'), + _('BVR reference number is not valid \n' + 'for the line: %s. \n' + 'Reference is too long.') % pline.name) + # do a mod10 check + if mod10r(v['reference'][:-1]) != v['reference']: + raise osv.except_osv(_('Error'), + _('BVR reference number is not valid \n' + 'for the line: %s. \n' + 'Mod10 check failed') % pline.name) + # fill reference with 0 + v['reference'] = v['reference'].rjust(27, '0') + else: + # reference of BVR adherent with 5 positions number + # have 15 positions references + if len(v['reference']) > 15: + raise osv.except_osv(_('Error'), + _('BVR reference number is not valid \n' + 'for the line: %s. \n' + 'Reference is too long ' + 'for this type of beneficiary.') % pline.name) + # complete 15 first digit with 0 on left and complete 27 digits with trailing spaces + # exemple: 123456 becomes 00000000012345____________ + v['reference'] = v['reference'].rjust(15, '0').ljust(27, ' ') + if not v['partner_bvr']: raise osv.except_osv(_('Error'), _('You must provide a BVR number\n' 'for the bank account: %s' \ diff --git a/addons/l10n_ch/wizard/create_dta_view.xml b/addons/l10n_ch/wizard/create_dta_view.xml index 11cd2095e28..df0544aa0b7 100644 --- a/addons/l10n_ch/wizard/create_dta_view.xml +++ b/addons/l10n_ch/wizard/create_dta_view.xml @@ -8,8 +8,7 @@ form
- - +