[MERGE] l10n_ch: bugfixes from Camptocamp, courtesy of Yannick Vaucher

bzr revid: odo@openerp.com-20120620173200-3hxn1syumst7jdkz
This commit is contained in:
Olivier Dony
2012-06-20 19:32:00 +02:00
7 changed files with 98 additions and 154 deletions
+21 -12
View File
@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Nicolas Bessi. Copyright Camptocamp SA
@@ -19,8 +19,8 @@
#
##############################################################################
from tools.translate import _
from osv import fields, osv
from tools import mod10r
import re
class Bank(osv.osv):
@@ -35,10 +35,15 @@ class Bank(osv.osv):
'city': fields.char('City', size=128, select=1),
}
Bank()
class ResPartnerBank(osv.osv):
"""
Inherit res.partner.bank class in order to add swiss specific fields
such as:
- A postnumber
- BVR data
- BVR print options for company accounts
"""
_inherit = "res.partner.bank"
_columns = {
@@ -85,12 +90,15 @@ class ResPartnerBank(osv.osv):
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
nums = number.split('-')
prefix = nums[0]
num = nums[1].rjust(6,'0')
checksum = nums[2]
expected_checksum = mod10r(prefix + num)[-1]
return expected_checksum == checksum
def _check_5_pos_postal_num(self, number):
@@ -103,6 +111,9 @@ class ResPartnerBank(osv.osv):
return True
def _check_postal_num(self, cursor, uid, ids):
"""
validate postal number format
"""
banks = self.browse(cursor, uid, ids)
for b in banks:
if not b.post_number:
@@ -110,14 +121,12 @@ class ResPartnerBank(osv.osv):
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'])]
'Please enter a correct postal number. (01-23456-1 or 12345)',
['post_number'])]
_sql_constraints = [('bvr_adherent_uniq', 'unique (bvr_adherent_num)',
'The BVR adherent number must be unique !')]
ResPartnerBank()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1 -1
View File
@@ -12,7 +12,7 @@
<field name="acc_number">123456</field>
<field name="partner_id" ref="base.res_partner_agrolait"/>
<field name="state">bvrbank</field>
<field name="post_number">01-23456-5</field>
<field name="post_number">01-23456-1</field>
<field name="bank" ref="partner_bank"/>
<!-- <field name="iban">CH9100767000S00023455</field> -->
</record>
-9
View File
@@ -42,15 +42,6 @@
<field name="entry_posted" eval="True" />
</record>
<record id="misc_transaction_journal" model="account.journal">
<field name="name">Opérations Diverses</field>
<field name="code">OD</field>
<field name="type">general</field>
<field name="view_id" ref="account.account_journal_bank_view"/>
<field name="user_id" ref="base.user_root"/>
<field name="update_posted" eval="True" />
<field name="entry_posted" eval="True" />
</record>
<record model="account.journal" id="bilan_journal">
<field name="name">Journal d'ouverture</field>
+67 -117
View File
@@ -20,22 +20,31 @@
##############################################################################
import time
from report import report_sxw
from report_webkit import webkit_report
from report_webkit import report_helper
from osv import osv
from tools import mod10r
import sys
import os
import re
from mako.template import Template
from mako.lookup import TemplateLookup
from mako import exceptions
from report import report_sxw
from report_webkit import webkit_report
from report_webkit import report_helper
from osv import osv
from osv.osv import except_osv
from tools import mod10r
from tools.translate import _
from tools.config import config
import wizard
import addons
import pooler
from tools.config import config
from mako.template import Template
from mako import exceptions
from tools.translate import _
from osv.osv import except_osv
class l10n_ch_report_webkit_html(report_sxw.rml_parse):
@@ -59,24 +68,24 @@ class l10n_ch_report_webkit_html(report_sxw.rml_parse):
_compile_comma_me = re.compile("^(-?\d+)(\d{3})")
_compile_check_bvr = re.compile('[0-9][0-9]-[0-9]{3,6}-[0-9]')
_compile_check_bvr_add_num = re.compile('[0-9]*$')
def set_context(self, objects, data, ids, report_type=None):
user = self.pool.get('res.users').browse(self.cr, self.uid, self.uid)
company = user.company_id
if not company.invoice_only:
self._check(ids)
return super(l10n_ch_report_webkit_html, self).set_context(objects, data, ids, report_type=report_type)
def police_absolute_path(self, inner_path) :
"""Will get the ocrb police absolute path"""
path = addons.get_module_resource(os.path.join('l10n_ch', 'report', inner_path))
return path
def bvr_absolute_path(self) :
"""Will get the ocrb police absolute path"""
path = addons.get_module_resource(os.path.join('l10n_ch', 'report', 'bvr1.jpg'))
return path
def headheight(self):
report_id = self.pool.get('ir.actions.report.xml').search(self.cr, self.uid, [('name','=', 'BVR invoice')])[0]
report = self.pool.get('ir.actions.report.xml').browse(self.cr, self.uid, report_id)
@@ -103,8 +112,8 @@ class l10n_ch_report_webkit_html(report_sxw.rml_parse):
'12 34567 89012 345'
"""
return ''.join([' '[(i - 2) % nbrspc:] + c for i, c in enumerate(nbr)])
def _get_ref(self, inv):
"""Retrieve ESR/BVR reference form invoice in order to print it"""
res = ''
@@ -114,7 +123,7 @@ class l10n_ch_report_webkit_html(report_sxw.rml_parse):
if inv.number:
invoice_number = self._compile_get_ref.sub('', inv.number)
return mod10r(res + invoice_number.rjust(26-len(res), '0'))
def _check(self, invoice_ids):
"""Check if the invoice is ready to be printed"""
if not invoice_ids:
@@ -144,52 +153,27 @@ class l10n_ch_report_webkit_html(report_sxw.rml_parse):
'information for the invoice:\n%s') %(invoice_name)))
return ''
def mako_template(text):
"""Build a Mako template.
This template uses UTF-8 encoding
"""
tmp_lookup = TemplateLookup() #we need it in order to allow inclusion and inheritance
return Template(text, input_encoding='utf-8', output_encoding='utf-8', lookup=tmp_lookup)
class BVRWebKitParser(webkit_report.WebKitParser):
def setLang(self, lang):
if not lang:
lang = 'en_US'
self.localcontext['lang'] = lang
def formatLang(self, value, digits=None, date=False, date_time=False, grouping=True, monetary=False):
"""format using the know cursor, language from localcontext"""
if digits is None:
digits = self.parser_instance.get_digits(value)
if isinstance(value, (str, unicode)) and not value:
return ''
pool_lang = self.pool.get('res.lang')
lang = self.localcontext['lang']
lang_ids = pool_lang.search(self.parser_instance.cr, self.parser_instance.uid, [('code','=',lang)])[0]
lang_obj = pool_lang.browse(self.parser_instance.cr, self.parser_instance.uid, lang_ids)
bvr_file_path = os.path.join('l10n_ch','report','bvr.mako')
if date or date_time:
if not str(value):
return ''
date_format = lang_obj.date_format
parse_format = '%Y-%m-%d'
if date_time:
value=value.split('.')[0]
date_format = date_format + " " + lang_obj.time_format
parse_format = '%Y-%m-%d %H:%M:%S'
if not isinstance(value, time.struct_time):
return time.strftime(date_format, time.strptime(value, parse_format))
else:
date = datetime(*value.timetuple()[:6])
return date.strftime(date_format)
return lang_obj.format('%.' + str(digits) + 'f', value, grouping=grouping, monetary=monetary)
def create_single_pdf(self, cursor, uid, ids, data, report_xml, context=None):
"""generate the PDF"""
self.parser_instance = self.parser(
cursor,
uid,
self.name2,
context=context
)
context = context or {}
if report_xml.report_type != 'webkit':
return super(WebKitParser,self).create_single_pdf(cursor, uid, ids, data, report_xml, context=context)
self.parser_instance = self.parser(cursor,
uid,
self.name2,
context=context)
self.pool = pooler.get_pool(cursor.dbname)
objs = self.getObjects(cursor, uid, ids, context)
self.parser_instance.set_context(objs, data, ids, report_xml.report_type)
@@ -201,7 +185,7 @@ class BVRWebKitParser(webkit_report.WebKitParser):
if not template and report_xml.report_webkit_data :
template = report_xml.report_webkit_data
if not template :
raise except_osv(_('Webkit Report template not found !'), _(''))
raise except_osv(_('Error'),_('Webkit Report template not found !'))
header = report_xml.webkit_header.html
footer = report_xml.webkit_header.footer_html
if not header and report_xml.header:
@@ -210,43 +194,19 @@ class BVRWebKitParser(webkit_report.WebKitParser):
_('Please set a header in company settings')
)
if not report_xml.header :
#I know it could be cleaner ...
header = u"""
<html>
<head>
<style type="text/css">
${css}
</style>
<script>
function subst() {
var vars={};
var x=document.location.search.substring(1).split('&');
for(var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);}
var x=['frompage','topage','page','webpage','section','subsection','subsubsection'];
for(var i in x) {
var y = document.getElementsByClassName(x[i]);
for(var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]];
}
}
</script>
</head>
<body style="border:0; margin: 0;" onload="subst()">
</body>
</html>"""
self.parser_instance.localcontext.update({'setLang':self.setLang})
self.parser_instance.localcontext.update({'formatLang':self.formatLang})
header = ''
default_head = addons.get_module_resource('report_webkit', 'default_header.html')
with open(default_head,'r') as f:
header = f.read()
css = report_xml.webkit_header.css
if not css :
css = ''
user = self.pool.get('res.users').browse(cursor, uid, uid)
company = user.company_id
parse_template = template
#default_filters=['unicode', 'entity'] can be used to set global filter
body_mako_tpl = Template(parse_template ,input_encoding='utf-8', output_encoding='utf-8')
body_mako_tpl = mako_template(template)
#BVR specific
bvr_path = addons.get_module_resource(os.path.join('l10n_ch','report','bvr.mako'))
body_bvr_tpl = Template(file(bvr_path).read(), input_encoding='utf-8', output_encoding='utf-8')
bvr_path = addons.get_module_resource(self.bvr_file_path)
body_bvr_tpl = mako_template(file(bvr_path).read())
helper = report_helper.WebKitHelper(cursor, uid, report_xml.id, context)
##BVR Specific
htmls = []
@@ -254,68 +214,58 @@ class BVRWebKitParser(webkit_report.WebKitParser):
self.parser_instance.localcontext['objects'] = [obj]
if not company.bvr_only:
try:
html = body_mako_tpl.render(
helper=helper,
html = body_mako_tpl.render(helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext
)
**self.parser_instance.localcontext)
except Exception, e:
raise Exception(exceptions.text_error_template().render())
htmls.append(html)
if not company.invoice_only:
try:
bvr = body_bvr_tpl.render(
helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext
)
bvr = body_bvr_tpl.render(helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext)
except Exception, e:
raise Exception(exceptions.text_error_template().render())
htmls.append(bvr)
htmls.append(bvr)
head_mako_tpl = Template(header, input_encoding='utf-8', output_encoding='utf-8')
try:
head = head_mako_tpl.render(
helper=helper,
head = head_mako_tpl.render(helper=helper,
css=css,
_debug=False,
_=self.translate_call,
**self.parser_instance.localcontext
)
**self.parser_instance.localcontext)
except Exception, e:
raise Exception(exceptions.text_error_template().render())
foot = False
if footer and company.invoice_only :
foot_mako_tpl = Template(footer, input_encoding='utf-8', output_encoding='utf-8')
try:
foot = foot_mako_tpl.render(
helper=helper,
css=css,
foot = foot_mako_tpl.render(helper=helper,
css=css,
_=self.translate_call,
**self.parser_instance.localcontext
)
**self.parser_instance.localcontext)
except Exception, e:
raise Exception(exceptions.text_error_template().render())
if report_xml.webkit_debug :
try:
deb = head_mako_tpl.render(
helper=helper,
css=css,
deb = head_mako_tpl.render(helper=helper,
css=css,
_debug=html,
_=self.translate_call,
**self.parser_instance.localcontext
)
**self.parser_instance.localcontext)
except Exception, e:
raise Exception(exceptions.text_error_template().render())
return (deb, 'html')
bin = self.get_lib(cursor, uid)
pdf = self.generate_pdf(bin, report_xml, head, foot, htmls)
return (pdf, 'pdf')
BVRWebKitParser('report.invoice_web_bvr',
'account.invoice',
'account.invoice',
'addons/l10n_ch/report/report_webkit_html.mako',
parser=l10n_ch_report_webkit_html)
+8 -10
View File
@@ -177,12 +177,14 @@
<record model="account.account.type" id="account_type_receivable">
<field name="name">Bilan : Debiteurs</field>
<field name="code">receivable</field>
<field name="partner_account" eval="True"/>
<field name="close_method">unreconciled</field>
<field name="report_type">none</field>
</record>
<record model="account.account.type" id="account_type_payable">
<field name="name">Bilan : Fournisseurs</field>
<field name="code">payable</field>
<field name="partner_account" eval="True"/>
<field name="close_method">unreconciled</field>
<field name="report_type">none</field>
</record>
@@ -582,7 +584,7 @@
</record>
<record id="ch_1100" model="account.account.template">
<field name="type">receivable</field>
<field name="reconcile">True</field>
<field name="reconcile" eval="True"/>
<field name="name">Créances envers des tiers suisses</field>
<field name="code">1100</field>
<field name="user_type" ref="account_type_receivable"/>
@@ -591,7 +593,7 @@
</record>
<record id="ch_1101" model="account.account.template">
<field name="type">receivable</field>
<field name="reconcile">True</field>
<field name="reconcile" eval="True"/>
<field name="name">Créances envers des tiers étrangers</field>
<field name="code">1101</field>
<field name="user_type" ref="account_type_receivable"/>
@@ -616,7 +618,7 @@
</record>
<record id="ch_1110" model="account.account.template">
<field name="type">receivable</field>
<field name="reconcile">True</field>
<field name="reconcile" eval="True"/>
<field name="name">Créances envers la filiale A</field>
<field name="code">1110</field>
<field name="user_type" ref="account_type_receivable"/>
@@ -625,7 +627,7 @@
</record>
<record id="ch_1111" model="account.account.template">
<field name="type">receivable</field>
<field name="reconcile">True</field>
<field name="reconcile" eval="True"/>
<field name="name">Créances envers la filiale B</field>
<field name="code">1111</field>
<field name="user_type" ref="account_type_receivable"/>
@@ -650,7 +652,7 @@
</record>
<record id="ch_1120" model="account.account.template">
<field name="type">receivable</field>
<field name="reconcile">True</field>
<field name="reconcile" eval="True"/>
<field name="name">Créances envers l'actionnaire X</field>
<field name="code">1120</field>
<field name="user_type" ref="account_type_receivable"/>
@@ -659,7 +661,7 @@
</record>
<record id="ch_1121" model="account.account.template">
<field name="type">receivable</field>
<field name="reconcile">True</field>
<field name="reconcile" eval="True"/>
<field name="name">Créances envers l'actionnaire Y</field>
<field name="code">1121</field>
<field name="user_type" ref="account_type_receivable"/>
@@ -11832,10 +11834,6 @@
<field name="default_debit_account_id" eval="False"/>
</record>
<record id="misc_transaction_journal" model="account.journal">
<field name="default_debit_account_id" eval="False"/>
<field name="default_debit_account_id" eval="False"/>
</record>
<record model="account.journal" id="bilan_journal">
<field name="default_debit_account_id" eval="False"/>
@@ -23,10 +23,6 @@
<field name="default_credit_account_id" model="account.account" search="[('code','=', '1000')]"/>
</record>
<record id="misc_transaction_journal" model="account.journal">
<field name="default_debit_account_id" eval="False"/>
<field name="default_credit_account_id" eval="False"/>
</record>
<record model="account.journal" id="bilan_journal">
<field name="default_debit_account_id" model="account.account" search="[('code','=', '2991')]"/>
+1 -1
View File
@@ -421,7 +421,7 @@ def _create_dta(obj, cr, uid, data, context=None):
raise osv.except_osv(_('Error'), _('No bank defined\n' \
'for the bank account: %s\n' \
'on the partner: %s\n' \
'on line: %s') + (pline.bank_id.state, pline.partner_id.name, pline.name))
'on line: %s') % (pline.bank_id.state, pline.partner_id.name, pline.name))
v['sequence'] = str(seq).rjust(5).replace(' ', '0')
v['amount_to_pay']= str(pline.amount_currency).replace('.', ',')