[MERGE] l10n_ch: bugfixes from Camptocamp, courtesy of Yannick Vaucher
bzr revid: odo@openerp.com-20120620173200-3hxn1syumst7jdkz
This commit is contained in:
+21
-12
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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')]"/>
|
||||
|
||||
@@ -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('.', ',')
|
||||
|
||||
Reference in New Issue
Block a user