diff --git a/addons/l10n_ch/__openerp__.py b/addons/l10n_ch/__openerp__.py
index 0785cc6245d..ab56327573c 100644
--- a/addons/l10n_ch/__openerp__.py
+++ b/addons/l10n_ch/__openerp__.py
@@ -19,9 +19,8 @@
#
##############################################################################
-{
- "name" : "Switzerland - Accounting",
- "description" : """
+{"name" : "Switzerland - Accounting",
+ "description" : """
Swiss localisation :
- DTA generation for a lot of payment types
- BVR management (number generation, report, etc..)
@@ -61,51 +60,47 @@ TODO :
""",
- "version" : "6.1",
- "author" : "Camptocamp",
- 'category': 'Localization/Account Charts',
- "website": "http://www.camptocamp.com",
+ "version": "6.1",
+ "author": "Camptocamp",
+ 'category': 'Localization/Account Charts',
+ "website": "http://www.camptocamp.com",
- "depends" : [
- "account_cancel",
- "base_iban",
- "account_payment",
- "account_voucher",
- "report_webkit",
- ],
- "init_xml" : [
- "dta_data.xml",
- "journal_data.xml",
- #FR sterchi chart data
- 'sterchi_chart/account.xml',
- 'sterchi_chart/vat.xml', #JUST REMOVE THIS FILE WHEN OBSOLETE. ALL REQUIERED DATA IN VAT2011.XML
- 'sterchi_chart/vat2011.xml',
- 'sterchi_chart/fiscal_position.xml',
- ],
- "demo_xml" : [
- "demo/demo.xml",
- "demo/dta_demo.xml",
- ],
- "update_xml" : [
- "wizard.xml",
- "wizard/bvr_import_view.xml",
- "wizard/create_dta_view.xml",
- "company_view.xml",
- "account_invoice.xml",
- "bank_view.xml",
- "security/ir.model.access.csv",
- "report/report_webkit_html_view.xml",
- ],
- 'test' : [
- 'test/l10n_ch_report.yml',
- 'test/l10n_ch_dta.yml',
- #TODO: uncomment the 2 following tests once they are fixed
- #'test/l10n_ch_v11.yml',
- #'test/l10n_ch_v11_part.yml',
- ],
- "auto_install": False,
- "installable": True,
- "certificate" : "001103836064567088989",
- 'images': ['images/config_chart_l10n_ch.jpeg','images/l10n_ch_chart.jpeg'],
-}
+ "depends" : [ "account_cancel",
+ "base_iban",
+ "account_payment",
+ "account_voucher",
+ "report_webkit",
+ "l10n_multilang"],
+
+ "init_xml": ["dta_data.xml",
+ "journal_data.xml",
+ #FR sterchi chart data
+ 'sterchi_chart/account.xml',
+ 'sterchi_chart/vat.xml',
+ 'sterchi_chart/vat2011.xml',
+ 'sterchi_chart/fiscal_position.xml'],
+
+ "demo_xml": ["demo/demo.xml",
+ "demo/dta_demo.xml"],
+
+ "update_xml": ["wizard.xml",
+ "wizard/bvr_import_view.xml",
+ "wizard/create_dta_view.xml",
+ "company_view.xml",
+ "account_invoice.xml",
+ "bank_view.xml",
+ "security/ir.model.access.csv",
+ "report/report_webkit_html_view.xml"],
+
+ "test": ['test/l10n_ch_report.yml',
+ 'test/l10n_ch_dta.yml',
+ #TODO: uncomment the 2 following tests once they are fixed
+ #'test/l10n_ch_v11.yml',
+ #'test/l10n_ch_v11_part.yml'
+ ],
+
+ "auto_install": False,
+ "installable": True,
+ "certificate": "001103836064567088989",
+ 'images': ['images/config_chart_l10n_ch.jpeg','images/l10n_ch_chart.jpeg']}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py
index fd69dec625f..3abc03759bb 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'),
@@ -68,11 +69,50 @@ 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 = u''
+ if bank.acc_number:
+ res = super(ResPartnerBank, self)._prepare_name(bank) 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/bank_view.xml b/addons/l10n_ch/bank_view.xml
index e23be1bb6ac..2ede389d7e1 100644
--- a/addons/l10n_ch/bank_view.xml
+++ b/addons/l10n_ch/bank_view.xml
@@ -130,12 +130,14 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
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/sterchi_chart/account.xml b/addons/l10n_ch/sterchi_chart/account.xml
index 8fdd29fe8a8..588fa5fed61 100644
--- a/addons/l10n_ch/sterchi_chart/account.xml
+++ b/addons/l10n_ch/sterchi_chart/account.xml
@@ -11802,7 +11802,12 @@
-
+
+
+
+
+
+
diff --git a/addons/l10n_ch/test/l10n_ch_dta.yml b/addons/l10n_ch/test/l10n_ch_dta.yml
index 5dc41adedd8..e82af1c7b72 100644
--- a/addons/l10n_ch/test/l10n_ch_dta.yml
+++ b/addons/l10n_ch/test/l10n_ch_dta.yml
@@ -16,7 +16,7 @@
address_contact_id: base.res_partner_address_8
address_invoice_id: base.res_partner_address_8
reference_type: bvr
- reference: 111111111111111111111111111111
+ reference: 11111111111111111111
date_invoice: !eval "'%s-01-01' %(datetime.now().year)"
period_id: account.period_1
#invoice_line:
@@ -65,7 +65,7 @@
amount_currency: 7000
bank_id: l10n_ch.agro_bank
#bank_statement_line_id
- communication: "111111111111111111111111111111"
+ communication: "11111111111111111111"
#communication2
company_currency: base.EUR
#create_date
@@ -76,7 +76,7 @@
#ml_date_created
#ml_inv_ref
#ml_maturity_date
- move_line_id: !ref {model: account.move.line, search: "[('ref','=','111111111111111111111111111111')]"}
+ move_line_id: !ref {model: account.move.line, search: "[('ref','=','11111111111111111111')]"}
#name (reference)
order_id: dta_payment_order
partner_id: base.res_partner_agrolait
@@ -152,7 +152,7 @@
# wiz = self.browse(cr, uid, wiz_id)
#
# line_obj = self.pool.get('payment.line')
-# pay_line_ids = line_obj.search(cr, uid, [('communication','=','111111111111111111111111111111'),('amount','=','7000')])
+# pay_line_ids = line_obj.search(cr, uid, [('communication','=','11111111111111111111'),('amount','=','7000')])
#
# data = { 'lines': [(6, 0, [pay_line_ids[0]])],}
# wiz.write(data)
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..a3ba33b7354 100644
--- a/addons/l10n_ch/wizard/create_dta_view.xml
+++ b/addons/l10n_ch/wizard/create_dta_view.xml
@@ -8,8 +8,7 @@
form