[merge] merge stable/5.0 branch

bzr revid: hmo@tinyerp.com-20091104064625-8ufxibenj12wxj3o
This commit is contained in:
Harry (Open ERP)
2009-11-04 12:16:25 +05:30
123 changed files with 1930 additions and 1980 deletions
+15 -1
View File
@@ -77,7 +77,10 @@ class account_payment_term_line(osv.osv):
_columns = {
'name': fields.char('Line Name', size=32, required=True),
'sequence': fields.integer('Sequence', required=True, help="The sequence field is used to order the payment term lines from the lowest sequences to the higher ones"),
'value': fields.selection([('procent', 'Percent'), ('balance', 'Balance'), ('fixed', 'Fixed Amount')], 'Value',required=True),
'value': fields.selection([('procent', 'Percent'), ('balance', 'Balance'), ('fixed', 'Fixed Amount')], 'Value', required=True, help="""Example: 14 days 2%, 30 days net
1. Line 1: percent 0.02 14 days
2. Line 2: balance 30 days"""),
'value_amount': fields.float('Value Amount', help="For Value percent enter % ratio between 0-1."),
'days': fields.integer('Number of Days', required=True, help="Number of days to add before computation of the day of month." \
"If Date=15/01, Number of Days=22, Day of Month=-1, then the due date is 28/02."),
@@ -90,6 +93,17 @@ class account_payment_term_line(osv.osv):
'days2': lambda *a: 0,
}
_order = "sequence"
def _check_percent(self, cr, uid, ids, context={}):
obj = self.browse(cr, uid, ids[0])
if obj.value == 'procent' and ( obj.value_amount < 0.0 or obj.value_amount > 1.0):
return False
return True
_constraints = [
(_check_percent, _('Percentages for Payment Term Line must be between 0 and 1, Example: 0.02 for 2% '), ['value_amount']),
]
account_payment_term_line()
+1 -1
View File
@@ -209,7 +209,7 @@
<field name="date_invoice"/>
<field name="period_id"/>
<label align="0.0" colspan="2" string="(keep empty to use the current period)"/>
<separator colspan="4" string="Additionnal Information"/>
<separator colspan="4" string="Additional Information"/>
<field colspan="4" name="comment" nolabel="1"/>
</page>
<page string="Payments">
+24 -10
View File
@@ -102,15 +102,26 @@ class account_invoice(osv.osv):
def _amount_residual(self, cr, uid, ids, name, args, context=None):
res = {}
data_inv = self.browse(cr, uid, ids)
cur_obj = self.pool.get('res.currency')
for inv in data_inv:
paid_amt = 0.0
to_pay = inv.amount_total
debit = credit = 0.0
for lines in inv.move_lines:
if lines.amount_currency and lines.currency_id:
paid_amt += lines.amount_currency
if lines.account_id.company_currency_id.id <> inv.currency_id.id:
if lines.debit:
debit += cur_obj.compute(cr, uid, lines.account_id.company_currency_id.id, inv.currency_id.id, lines.debit)
if lines.credit:
credit += cur_obj.compute(cr, uid, lines.account_id.company_currency_id.id, inv.currency_id.id, lines.credit)
else:
paid_amt += lines.credit + lines.debit
res[inv.id] = round(to_pay - abs(paid_amt),int(config['price_accuracy']))
debit += lines.debit
credit += lines.credit
if not inv.amount_total:
result = 0.0
elif inv.type in ('out_invoice','in_refund'):
result = inv.amount_total * (1.0 - credit / (debit + inv.amount_total))
else:
result = inv.amount_total * (1.0 - debit / (credit + inv.amount_total))
res[inv.id] = round(result,int(config['price_accuracy']))
return res
def _get_lines(self, cr, uid, ids, name, arg, context=None):
@@ -1109,24 +1120,27 @@ class account_invoice_tax(osv.osv):
'tax_code_id': fields.many2one('account.tax.code', 'Tax Code', help="The tax basis of the tax declaration."),
'tax_amount': fields.float('Tax Code Amount', digits=(16,int(config['price_accuracy']))),
}
def base_change(self, cr, uid, ids, base,currency_id=False,company_id=False,date_invoice=False):
cur_obj = self.pool.get('res.currency')
company_obj = self.pool.get('res.company')
company_currency=False
if company_id:
company_currency=company_obj.browse(cr,uid,company_id).id
company_currency = company_obj.read(cr,uid,[company_id],['currency_id'])[0]['currency_id'][0]
if currency_id and company_currency:
base=cur_obj.compute(cr, uid, currency_id, company_currency, base, context={'date': date_invoice or time.strftime('%Y-%m-%d')}, round=False)
base = cur_obj.compute(cr, uid, currency_id, company_currency, base, context={'date': date_invoice or time.strftime('%Y-%m-%d')}, round=False)
return {'value': {'base_amount':base}}
def amount_change(self, cr, uid, ids, amount,currency_id=False,company_id=False,date_invoice=False):
cur_obj = self.pool.get('res.currency')
company_obj = self.pool.get('res.company')
company_currency=False
if company_id:
company_currency=company_obj.browse(cr,uid,company_id).id
company_currency = company_obj.read(cr,uid,[company_id],['currency_id'])[0]['currency_id'][0]
if currency_id and company_currency:
amount=cur_obj.compute(cr, uid, currency_id, company_currency, amount, context={'date': date_invoice or time.strftime('%Y-%m-%d')}, round=False)
amount = cur_obj.compute(cr, uid, currency_id, company_currency, amount, context={'date': date_invoice or time.strftime('%Y-%m-%d')}, round=False)
return {'value': {'tax_amount':amount}}
_order = 'sequence'
_defaults = {
'manual': lambda *a: 1,
+23 -4
View File
@@ -65,9 +65,16 @@ class account_analytic_account(osv.osv):
return r
def _balance_calc(self, cr, uid, ids, name, arg, context={}):
res = {}
ids2 = self.search(cr, uid, [('parent_id', 'child_of', ids)])
acc_set = ",".join(map(str, ids2))
for i in ids:
res.setdefault(i,0.0)
if not acc_set:
return res
where_date = ''
if context.get('from_date',False):
where_date += " AND l.date >= '" + context['from_date'] + "'"
@@ -75,7 +82,7 @@ class account_analytic_account(osv.osv):
where_date += " AND l.date <= '" + context['to_date'] + "'"
cr.execute("SELECT a.id, COALESCE(SUM(l.amount),0) FROM account_analytic_account a LEFT JOIN account_analytic_line l ON (a.id=l.account_id %s) WHERE a.id IN (%s) GROUP BY a.id" % (where_date,acc_set))
res = {}
for account_id, sum in cr.fetchall():
res[account_id] = sum
@@ -85,10 +92,12 @@ class account_analytic_account(osv.osv):
res_currency= self.pool.get('res.currency')
for id in ids:
if id not in ids2:
continue
for child in self.search(cr, uid, [('parent_id', 'child_of', [id])]):
if child <> id:
res.setdefault(id, 0.0)
if currency[child]<>currency[id] :
if currency[child]<>currency[id]:
res[id] += res_currency.compute(cr, uid, currency[child], currency[id], res.get(child, 0.0), context=context)
else:
res[id] += res.get(child, 0.0)
@@ -96,15 +105,23 @@ class account_analytic_account(osv.osv):
cur_obj = res_currency.browse(cr,uid,currency.values(),context)
cur_obj = dict([(o.id, o) for o in cur_obj])
for id in ids:
res[id] = res_currency.round(cr,uid,cur_obj[currency[id]],res.get(id,0.0))
if id in ids2:
res[id] = res_currency.round(cr,uid,cur_obj[currency[id]],res.get(id,0.0))
return dict([(i, res[i]) for i in ids ])
def _quantity_calc(self, cr, uid, ids, name, arg, context={}):
#XXX must convert into one uom
res = {}
ids2 = self.search(cr, uid, [('parent_id', 'child_of', ids)])
acc_set = ",".join(map(str, ids2))
for i in ids:
res.setdefault(i,0.0)
if not acc_set:
return res
where_date = ''
if context.get('from_date',False):
where_date += " AND l.date >= '" + context['from_date'] + "'"
@@ -115,11 +132,13 @@ class account_analytic_account(osv.osv):
FROM account_analytic_account a \
LEFT JOIN account_analytic_line l ON (a.id = l.account_id ' + where_date + ') \
WHERE a.id IN ('+acc_set+') GROUP BY a.id')
res = {}
for account_id, sum in cr.fetchall():
res[account_id] = sum
for id in ids:
if id not in ids2:
continue
for child in self.search(cr, uid, [('parent_id', 'child_of', [id])]):
if child <> id:
res.setdefault(id, 0.0)
+1 -1
View File
@@ -189,7 +189,7 @@
<record id="action_account_tree1" model="ir.actions.act_window">
<field name="name"></field>
<field name="name">Analytic Entries</field>
<field name="res_model">account.analytic.line</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
@@ -36,7 +36,7 @@ class journal_print(report_sxw.rml_parse):
self.cr.execute('select sum(amount) from account_analytic_line where journal_id=%s', (journal_id,))
return self.cr.fetchone()[0] or 0.0
def __init__(self, cr, uid, name, context):
super(journal_print, self).__init__(cr, uid, name, context)
super(journal_print, self).__init__(cr, uid, name, context=context)
self.localcontext = {
'time': time,
'lines': self.lines,
@@ -26,7 +26,7 @@ from report import report_sxw
class account_analytic_balance(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_balance, self).__init__(cr, uid, name, context)
super(account_analytic_balance, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'get_objects': self._get_objects,
@@ -25,7 +25,7 @@ from report import report_sxw
class account_analytic_analytic_check(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_analytic_check, self).__init__(cr, uid, name, context)
super(account_analytic_analytic_check, self).__init__(cr, uid, name, context=context)
self.sum_gen_deb = 0.0
self.sum_gen_cred = 0.0
self.sum_ana_deb = 0.0
@@ -28,7 +28,7 @@ from report import report_sxw
#
class account_analytic_journal(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_journal, self).__init__(cr, uid, name, context)
super(account_analytic_journal, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines': self._lines,
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class account_analytic_cost_ledger(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_cost_ledger, self).__init__(cr, uid, name, context)
super(account_analytic_cost_ledger, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines_g': self._lines_g,
@@ -25,7 +25,7 @@ from report import report_sxw
class account_inverted_analytic_balance(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_inverted_analytic_balance, self).__init__(cr, uid, name, context)
super(account_inverted_analytic_balance, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines_g': self._lines_g,
@@ -25,8 +25,7 @@ from report import report_sxw
class account_analytic_quantity_cost_ledger(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_quantity_cost_ledger, self).__init__(cr, uid,
name, context)
super(account_analytic_quantity_cost_ledger, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines_g': self._lines_g,
+1 -1
View File
@@ -29,7 +29,7 @@ from report import report_sxw
class account_balance(report_sxw.rml_parse):
_name = 'report.account.account.balance'
def __init__(self, cr, uid, name, context):
super(account_balance, self).__init__(cr, uid, name, context)
super(account_balance, self).__init__(cr, uid, name, context=context)
self.sum_debit = 0.00
self.sum_credit = 0.00
self.date_lst = []
+1 -1
View File
@@ -28,7 +28,7 @@ from report import report_sxw
#
class journal_print(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(journal_print, self).__init__(cr, uid, name, context)
super(journal_print, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines': self.lines,
+1 -1
View File
@@ -30,7 +30,7 @@ class account_tax_code_report(rml_parse.rml_parse):
#_name = 'report.account.tax.code.entries'
def __init__(self, cr, uid, name, context):
super(account_tax_code_report, self).__init__(cr, uid, name, context)
super(account_tax_code_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'get_line':self.get_line,
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class aged_trial_report(rml_parse.rml_parse):
def __init__(self, cr, uid, name, context):
super(aged_trial_report, self).__init__(cr, uid, name, context)
super(aged_trial_report, self).__init__(cr, uid, name, context=context)
self.line_query = ''
self.total_account = []
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
#
class journal_print(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(journal_print, self).__init__(cr, uid, name, context)
super(journal_print, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'lines': self.lines,
+1 -1
View File
@@ -28,7 +28,7 @@ from report import report_sxw
#
class journal_print(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(journal_print, self).__init__(cr, uid, name, context)
super(journal_print, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines': self.lines,
+1 -1
View File
@@ -51,7 +51,7 @@ class general_ledger(rml_parse.rml_parse):
super(general_ledger, self).set_context(objects, data, new_ids, report_type)
def __init__(self, cr, uid, name, context):
super(general_ledger, self).__init__(cr, uid, name, context)
super(general_ledger, self).__init__(cr, uid, name, context=context)
self.date_borne = {}
self.query = ""
self.child_ids = ""
@@ -52,7 +52,7 @@ class general_ledger_landscape(rml_parse.rml_parse):
super(general_ledger_landscape, self).set_context(objects, data, new_ids,report_type)
def __init__(self, cr, uid, name, context):
super(general_ledger_landscape, self).__init__(cr, uid, name, context)
super(general_ledger_landscape, self).__init__(cr, uid, name, context=context)
self.date_borne = {}
self.query = ""
self.child_ids = ""
+1 -1
View File
@@ -24,7 +24,7 @@ from report import report_sxw
class account_invoice(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_invoice, self).__init__(cr, uid, name, context)
super(account_invoice, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class partner_balance(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(partner_balance, self).__init__(cr, uid, name, context)
super(partner_balance, self).__init__(cr, uid, name, context=context)
self.date_lst = []
self.date_lst_string = ''
self.account_ids = ''
+1 -1
View File
@@ -32,7 +32,7 @@ import sys
class rml_parse(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(rml_parse, self).__init__(cr, uid, name, context=None)
super(rml_parse, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'comma_me': self.comma_me,
'format_date': self._get_and_change_date_format_for_swiss,
+1 -1
View File
@@ -30,7 +30,7 @@ import re
class tax_report(rml_parse.rml_parse):
_name = 'report.account.vat.declaration'
def __init__(self, cr, uid, name, context):
super(tax_report, self).__init__(cr, uid, name, context)
super(tax_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'get_period': self._get_period,
+1 -1
View File
@@ -30,7 +30,7 @@ class third_party_ledger(rml_parse.rml_parse):
def __init__(self, cr, uid, name, context):
self.date_lst = []
self.date_lst_string = ''
super(third_party_ledger, self).__init__(cr, uid, name, context)
super(third_party_ledger, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines': self.lines,
+176 -149
View File
@@ -2,176 +2,203 @@
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Test" author="Martin Simon" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="57.0" y1="57.0" width="481" height="728"/>
<header>
<pageGraphics>
<!--logo-->
<!--<fill color="darkblue"/>-->
<!--<stroke color="darkblue"/>-->
<!--TITLE COMPANY-->
<!-- <drawString x="4.6cm" y="28.7cm">[[ company.partner_id.name ]]</drawString> -->
<setFont name="Helvetica-Bold" size="9"/>
<!--COL 1-->
<drawString x="1.0cm" y="28.1cm">[[ company.name ]]</drawString>
<drawRightString x="20cm" y="28.1cm">Third Party Ledger [[ data['form']['result_selection'] == 'customer' and '/ Débiteur' ]] [[ data['form']['result_selection'] == 'supplier' and '/ Créancier' ]] [[ data['form']['result_selection'] == 'all' and '/ Créancier et Débiteur' ]]</drawRightString>
<!-- Header -->
<setFont name="Helvetica" size="9"/>
<drawString x="1.0cm" y="1cm"> [[ formatLang(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),date_time = True) ]]</drawString>
<drawString x="19.0cm" y="1cm">Page <pageNumber/></drawString>
<!--<drawRightString x="19.8cm" y="28cm">[[ company.rml_header1 ]]</drawRightString>-->
<lineMode width="0.7"/>
<lines>1cm 27.7cm 20cm 27.7cm</lines>
<setFont name="Helvetica" size="8"/>
</pageGraphics>
</header>
<frame id="first" x1="28.0" y1="28.0" width="539" height="786"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="Standard_Outline">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table_header">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table_header_1">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="5,-1" stop="5,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="6,-1" stop="6,-1"/>
</blockTableStyle>
<blockTableStyle id="Table1">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,0"/>
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,0"/>
<blockBackground colorName="#e6e6e6" start="2,0" stop="2,0"/>
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,1"/>
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,1"/>
<blockBackground colorName="#e6e6e6" start="2,1" stop="2,1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="3,-1" stop="3,-1"/>
</blockTableStyle>
<blockTableStyle id="tbl_heading">
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,0"/>
</blockTableStyle>
<blockTableStyle id="Table2">
<blockTableStyle id="Table2">
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,0" stop="-1,-1"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="1,-1"/>
</blockTableStyle>
<blockTableStyle id="Table3">
<blockLeftPadding length="0" start="1,0" stop="1,0"/>
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,-1"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="5,-1" stop="5,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="6,-1" stop="6,-1"/>
</blockTableStyle>
<blockTableStyle id="Table5">
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#777777" start="0,0" stop="0,-1"/>
</blockTableStyle>
<blockTableStyle id="Table4">
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,0" stop="-1,-1"/>
</blockTableStyle>
<initialize>
<paraStyle name="all" alignment="justify"/>
</initialize>
<paraStyle name="P1" fontName="Helvetica" fontSize="2.0" leading="1" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="P2" fontName="Helvetica-Bold" fontSize="14.5" leading="13" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P3" fontName="Helvetica" fontSize="7.5" leading="10" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P4" fontName="Helvetica" fontSize="7.5" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P5" fontName="Helvetica" fontSize="7.5" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P6" fontName="Helvetica" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P7" fontName="Helvetica" fontSize="8.0" leading="14" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P8" fontName="Helvetica-Bold" fontSize="8.5" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Balance" fontName="Helvetica-Bold" fontSize="8.5" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P9" fontName="Helvetica-Bold" alignment="CENTER" fontSize="14.5" leftIndent="-5.0"/>
<paraStyle name="P9a" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P9c" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P9b" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="total" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P10" fontName="Helvetica" alignment="CENTER"/>
<paraStyle name="P11" fontName="Helvetica" fontSize="8.0" leading="14"/>
<paraStyle name="P12" fontName="Helvetica" fontSize="8.0" leading="9" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="date" fontName="Helvetica" fontSize="8.0" leading="9" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P13" fontName="Helvetica" fontSize="8.0" leading="10" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P14" fontName="Helvetica-Bold" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P15" rightIndent="17.0" leftIndent="-0.0" fontName="Helvetica" fontSize="7.5" leading="10" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P16" fontName="Helvetica" fontSize="8.0" leading="12" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Standard" fontName="Helvetica"/>
<paraStyle name="Text body" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="List" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Contents" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Heading" fontName="Helvetica" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Caption" fontName="Helvetica" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="Index" fontName="Helvetica"/>
<paraStyle name="P1" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P2" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P3" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P4" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P5" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="Standard" fontName="Times-Roman"/>
<paraStyle name="Text body" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="List" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Contents" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Heading" fontName="Times-Roman" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Caption" fontName="Times-Roman" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="Index" fontName="Times-Roman"/>
<paraStyle name="Heading" fontName="Helvetica" fontSize="12.0" leading="15" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="Footer" fontName="Times-Roman"/>
<paraStyle name="Horizontal Line" fontName="Times-Roman" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/>
<paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_Right_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_address" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_2" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_Bold_Right_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_9_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
</stylesheet>
<images/>
<story>
<para style="P2"><font color="white"></font></para>
<para>[[ repeatIn(objects, 'p') ]] [[ setLang(p.partner_id.lang) ]]</para>
<blockTable colWidths="50.0,30.0,42.0,220.0,69.0,72.0,63.0" repeatRows="1" style="tbl_heading">
<tr>
<td><para style="date">Date</para></td>
<td><para style="P12">JNRL</para></td>
<td><para style="P12">Ref.</para></td>
<td><para style="P12">Entry label</para></td>
<td><para style="P16">Debit</para></td>
<td><para style="P16">Credit</para></td>
<td><para style="P16">Balance</para></td>
</tr>
<tr>
<td>
<blockTable colWidths="337.0,69.0,72.0,63.0" style="Table3">
<tr>
<td><para style="Balance">Balance brought forward</para></td>
<td><para style="P8"><u>[[ formatLang((sum_debit(data))) ]]</u></para></td>
<td><para style="P8"><u>[[ formatLang((sum_credit(data))) ]]</u></para></td>
<td><para style="P8"><u>[[ formatLang((sum_debit(data) - sum_credit(data))) ]]</u></para></td>
</tr>
</blockTable>
</td>
</tr>
<tr>
<td>
<blockTable colWidths="300.0,37.0,69.0,72.0,63.0" style="Table5">
<tr>
<td><para style="total">[[ p.ref ]] - [[ p.name ]]</para></td>
<td><para style="total"></para></td>
<td><para style="P9b"><u>[[ formatLang((sum_debit_partner(p,data))) ]]</u></para></td>
<td><para style="P9b"><u>[[ formatLang((sum_credit_partner(p,data))) ]]</u></para></td>
<td><para style="P9b"><u>[[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]]</u></para></td>
</tr>
</blockTable>
<blockTable colWidths="45.0,30.0,262.0,0.0,69.0,72.0,63.0" style="Table2">
<tr>
<td><para style="P15"><font face="Helvetica">[[ repeatIn(lines(p,data), 'line') ]]</font>[[ formatLang(line['date'],date=True) ]]</para></td>
<td><para style="P3">[[ line['code'] ]]</para></td>
<td><para style="P3">[[ line['ref'] ]] / [[ line['name'] ]]</para></td>
<td><para style="P4"></para></td>
<td><para style="P5">[[ formatLang((line['debit'])) ]]</para></td>
<td><para style="P5">[[ formatLang((line['credit'])) ]]</para></td>
<td><para style="P5">[[ formatLang((line['progress'])) ]]</para></td>
</tr>
</blockTable>
</td>
</tr>
<blockTable colWidths="539.0" style="Table_header">
<tr>
<td>
<para style="terp_header_Centre">Third Party Ledger</para>
</td>
</tr>
</blockTable>
<para style="P3">[[ repeatIn(objects, 'p') ]] [[ setLang(p.lang) ]]</para>
<blockTable colWidths="65.0,28.0,45.0,175.0,77.0,75.0,74.0" style="Table_header_1">
<tr>
<td>
<para style="terp_tblheader_Details">Date</para>
</td>
<td>
<para style="terp_tblheader_Details">JNRL</para>
</td>
<td>
<para style="terp_tblheader_Details">Ref.</para>
</td>
<td>
<para style="terp_tblheader_Details">Entry Label</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Debit</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Credit</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Balance</para>
</td>
</tr>
</blockTable>
<para style="P4">
<font color="white"> </font>
</para>
<blockTable colWidths="314.0,77.0,75.0,74.0" style="Table1">
<tr>
<td>
<para style="terp_default_Bold_9">Balance Brought Forward</para>
</td>
<td>
<para style="P5"><u>[[ formatLang((sum_debit(data))) ]]</u></para>
</td>
<td>
<para style="P5"><u>[[ formatLang((sum_credit(data))) ]]</u></para>
</td>
<td>
<para style="P5"><u>[[ formatLang((sum_debit(data) - sum_credit(data))) ]]</u></para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<blockTable colWidths="314.0,77.0,75.0,74.0" style="Table2">
<tr>
<td>
<para style="P2">[[ p.ref ]] - [[ p.name ]]</para>
</td>
<td>
<para style="P5">[[ formatLang((sum_debit_partner(p,data))) ]]</para>
</td>
<td>
<para style="P5">[[ formatLang((sum_credit_partner(p,data))) ]]</para>
</td>
<td>
<para style="P5">[[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<section>
<para style="P1">[[ repeatIn(lines(p,data), 'line') ]]</para>
<blockTable colWidths="65.0,28.0,45.0,175.0,77.0,75.0,74.0" style="Table3">
<tr>
<td>
<para style="P3">[[ formatLang(line['date'],date=True) ]]</para>
</td>
<td>
<para style="P3">[[ line['code'] ]]</para>
</td>
<td>
<para style="P3">[[ line['ref'] ]]</para>
</td>
<td>
<para style="P3">[[ line['name'] ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((line['debit'])) ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((line['credit'])) ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((line['progress'])) ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
</section>
<para style="terp_default_9">
<font color="white"> </font>
</para>
</story>
</document>
+182 -147
View File
@@ -2,176 +2,211 @@
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Test" author="Martin Simon" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="57.0" y1="57.0" width="481" height="728"/>
<header>
<pageGraphics>
<!--logo-->
<!--<fill color="darkblue"/>-->
<!--<stroke color="darkblue"/>-->
<!--TITLE COMPANY-->
<!-- <drawString x="4.6cm" y="28.7cm">[[ company.partner_id.name ]]</drawString> -->
<setFont name="Helvetica-Bold" size="9"/>
<!--COL 1-->
<drawString x="1.0cm" y="28.1cm">[[ company.name ]]</drawString>
<drawRightString x="20cm" y="28.1cm">Third Party Ledger [[ data['form']['result_selection'] == 'customer' and '/ Débiteur' ]] [[ data['form']['result_selection'] == 'supplier' and '/ Créancier' ]] [[ data['form']['result_selection'] == 'all' and '/ Créancier et Débiteur' ]]</drawRightString>
<!-- Header -->
<setFont name="Helvetica" size="9"/>
<drawString x="1.0cm" y="1cm"> [[ formatLang(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),date_time = True) ]]</drawString>
<drawString x="19.0cm" y="1cm">Page <pageNumber/></drawString>
<!--<drawRightString x="19.8cm" y="28cm">[[ company.rml_header1 ]]</drawRightString>-->
<lineMode width="0.7"/>
<lines>1cm 27.7cm 20cm 27.7cm</lines>
<setFont name="Helvetica" size="8"/>
</pageGraphics>
</header>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="Standard_Outline">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table_title">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table_header_1">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="5,-1" stop="5,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="6,-1" stop="6,-1"/>
</blockTableStyle>
<blockTableStyle id="Table1">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,0"/>
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,0"/>
<blockBackground colorName="#e6e6e6" start="2,0" stop="2,0"/>
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,1"/>
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,1"/>
<blockBackground colorName="#e6e6e6" start="2,1" stop="2,1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="3,-1" stop="3,-1"/>
</blockTableStyle>
<blockTableStyle id="tbl_heading">
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,0"/>
</blockTableStyle>
<blockTableStyle id="Table2">
<blockTableStyle id="Table2">
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,0" stop="-1,-1"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="1,-1"/>
</blockTableStyle>
<blockTableStyle id="Table3">
<blockLeftPadding length="0" start="1,0" stop="1,0"/>
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,-1"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="5,-1" stop="5,-1"/>
<lineStyle kind="LINEBELOW" colorName="#cccccc" start="6,-1" stop="6,-1"/>
</blockTableStyle>
<blockTableStyle id="Table5">
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#777777" start="0,0" stop="0,-1"/>
</blockTableStyle>
<blockTableStyle id="Table4">
<blockAlignment value="LEFT"/>
<blockValign value="LEFT"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,0" stop="-1,-1"/>
</blockTableStyle>
<initialize>
<paraStyle name="all" alignment="justify"/>
</initialize>
<paraStyle name="P1" fontName="Helvetica" fontSize="2.0" leading="1" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="P2" fontName="Helvetica-Bold" fontSize="14.5" leading="13" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P3" fontName="Helvetica" fontSize="7.5" leading="10" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P4" fontName="Helvetica" fontSize="7.5" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P5" fontName="Helvetica" fontSize="7.5" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P6" fontName="Helvetica" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P7" fontName="Helvetica" fontSize="8.0" leading="14" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P8" fontName="Helvetica-Bold" fontSize="8.5" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Balance" fontName="Helvetica-Bold" fontSize="8.5" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P9" fontName="Helvetica-Bold" alignment="CENTER" fontSize="14.5" leftIndent="-5.0"/>
<paraStyle name="P9a" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P9c" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P9b" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="total" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P10" fontName="Helvetica" alignment="CENTER"/>
<paraStyle name="P11" fontName="Helvetica" fontSize="8.0" leading="14"/>
<paraStyle name="P12" fontName="Helvetica" fontSize="8.0" leading="9" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="date" fontName="Helvetica" fontSize="8.0" leading="9" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P13" fontName="Helvetica" fontSize="8.0" leading="10" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P14" fontName="Helvetica-Bold" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P15" rightIndent="17.0" leftIndent="-0.0" fontName="Helvetica" fontSize="7.5" leading="10" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P16" fontName="Helvetica" fontSize="8.0" leading="12" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Standard" fontName="Helvetica"/>
<paraStyle name="Text body" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="P1" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P2" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P3" fontName="Times-Roman" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="P4" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="P5" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0" textColor="#000000"/>
<paraStyle name="Standard" fontName="Times-Roman"/>
<paraStyle name="Heading" fontName="Helvetica" fontSize="12.0" leading="15" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="Text body" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="List" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Contents" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Table Heading" fontName="Helvetica" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Caption" fontName="Helvetica" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="Index" fontName="Helvetica"/>
<paraStyle name="Caption" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="Index" fontName="Helvetica" fontSize="9.0" leading="11"/>
<paraStyle name="Footer" fontName="Times-Roman"/>
<paraStyle name="Table Contents" fontName="Times-Roman"/>
<paraStyle name="Table Heading" fontName="Times-Roman" alignment="CENTER"/>
<paraStyle name="Horizontal Line" fontName="Times-Roman" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/>
<paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_Right_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_address" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_9_italic" fontName="Helvetica-Oblique" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_9_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_2" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
</stylesheet>
<images/>
<story>
<para style="P2"><font color="white"></font></para>
<blockTable colWidths="50.0,30.0,42.0,220.0,69.0,72.0,63.0" repeatRows="1" style="tbl_heading">
<tr>
<td><para style="date">Date</para></td>
<td><para style="P12">JNRL</para></td>
<td><para style="P12">Ref.</para></td>
<td><para style="P12">Entry label</para></td>
<td><para style="P16">Debit</para></td>
<td><para style="P16">Credit</para></td>
<td><para style="P16">Balance</para></td>
</tr>
<tr>
<td>
<blockTable colWidths="337.0,69.0,72.0,63.0" style="Table3">
<tr>
<td><para style="Balance">Balance brought forward</para></td>
<td><para style="P8"><u>[[ formatLang((sum_debit(data))) ]]</u></para></td>
<td><para style="P8"><u>[[ formatLang((sum_credit(data))) ]]</u></para></td>
<td><para style="P8"><u>[[ formatLang((sum_debit(data) - sum_credit(data))) ]]</u></para></td>
</tr>
</blockTable>
</td>
</tr>
<tr>
<td>
<para style="P1">[[ repeatIn(objects, 'p') ]]</para>
<blockTable colWidths="300.0,37.0,69.0,72.0,63.0" style="Table5">
<tr>
<td><para style="total">[[ p.ref ]] - [[ p.name ]]</para></td>
<td><para style="total"></para></td>
<td><para style="P9b"><u>[[ formatLang((sum_debit_partner(p,data))) ]]</u></para></td>
<td><para style="P9b"><u>[[ formatLang((sum_credit_partner(p,data))) ]]</u></para></td>
<td><para style="P9b"><u>[[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]]</u></para></td>
</tr>
</blockTable>
<blockTable colWidths="45.0,30.0,262.0,0.0,69.0,72.0,63.0" style="Table2">
<tr>
<td><para style="P15"><font face="Helvetica">[[ repeatIn(lines(p,data), 'line') ]]</font>[[ formatLang(line['date'],date=True) ]]</para></td>
<td><para style="P3">[[ line['code'] ]]</para></td>
<td><para style="P3">[[ line['ref'] ]] / [[ line['name'] ]]</para></td>
<td><para style="P4"></para></td>
<td><para style="P5">[[ formatLang((line['debit'])) ]]</para></td>
<td><para style="P5">[[ formatLang((line['credit'])) ]]</para></td>
<td><para style="P5">[[ formatLang((line['progress'])) ]]</para></td>
</tr>
</blockTable>
</td>
</tr>
<blockTable colWidths="482.0" style="Table_title">
<tr>
<td>
<para style="terp_header_Centre">Third Party Ledger</para>
</td>
</tr>
</blockTable>
<para style="P3">
<font color="white"> </font>
</para>
<blockTable colWidths="58.0,26.0,40.0,156.0,68.0,67.0,66.0" style="Table_header_1">
<tr>
<td>
<para style="terp_tblheader_Details">Date</para>
</td>
<td>
<para style="terp_tblheader_Details">JNRL</para>
</td>
<td>
<para style="terp_tblheader_Details">Ref.</para>
</td>
<td>
<para style="terp_tblheader_Details">Entry Label</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Debit</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Credit</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Balance</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<blockTable colWidths="280.0,68.0,67.0,66.0" style="Table1">
<tr>
<td>
<para style="terp_default_Bold_9">Balance Brought Forward</para>
</td>
<td>
<para style="P5">[[ formatLang((sum_debit(data))) ]]</para>
</td>
<td>
<para style="P5">[[ formatLang((sum_credit(data))) ]]</para>
</td>
<td>
<para style="P5">[[ formatLang((sum_debit(data) - sum_credit(data))) ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<section>
<para style="P4">[[ repeatIn(objects, 'p') ]] [[ setLang(p.lang) ]]</para>
<blockTable colWidths="280.0,68.0,67.0,66.0" style="Table2">
<tr>
<td>
<para style="P2">[[ p.ref ]] - [[ p.name ]]</para>
</td>
<td>
<para style="P5"><u>[[ formatLang((sum_debit_partner(p,data))) ]]</u></para>
</td>
<td>
<para style="P5"><u>[[ formatLang((sum_credit_partner(p,data))) ]]</u></para>
</td>
<td>
<para style="P5"><u>[[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]]</u></para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<section>
<para style="P1">[[ repeatIn(lines(p,data), 'line') ]]</para>
<blockTable colWidths="58.0,26.0,40.0,156.0,68.0,67.0,66.0" style="Table3">
<tr>
<td>
<para style="P4">[[ formatLang(line['date'],date=True) ]]</para>
</td>
<td>
<para style="P4">[[ line['code'] ]]</para>
</td>
<td>
<para style="P4">[[ line['ref'] ]]</para>
</td>
<td>
<para style="P4">[[ line['name'] ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((line['debit'])) ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((line['credit'])) ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((line['progress'])) ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
</section>
<para style="terp_default_2">
<font color="white"> </font>
</para>
</section>
<para style="terp_default_9">
<font color="white"> </font>
</para>
</story>
</document>
+3 -1
View File
@@ -110,7 +110,9 @@ class wiz_refund(wizard.interface):
# we compute due date
#!!!due date = date inv date on formdate
pool.get('account.invoice').write(cr, uid, [refund.id],{'date_due':date,'check_total':inv.check_total})
# to make the taxes calculated
pool.get('account.invoice').button_compute(cr, uid, refund_id)
created_inv.append(refund_id[0])
#if inv is paid we unreconcile
if mode in ('cancel','modify'):
@@ -371,10 +371,13 @@ class account_analytic_account(osv.osv):
res = {}
for id in ids:
ids2 = self.search(cr, uid, [('parent_id', 'child_of', [id])])
cr.execute('SELECT DISTINCT(month_id) FROM account_analytic_analysis_summary_month ' \
'WHERE account_id in (' + ','.join([str(x) for x in ids2]) + ') ' \
'AND unit_amount <> 0.0')
res[id] = [int(id * 1000000 + int(x[0])) for x in cr.fetchall()]
if ids2:
cr.execute('SELECT DISTINCT(month_id) FROM account_analytic_analysis_summary_month ' \
'WHERE account_id in (' + ','.join([str(x) for x in ids2]) + ') ' \
'AND unit_amount <> 0.0')
res[id] = [int(id * 1000000 + int(x[0])) for x in cr.fetchall()]
else:
res[id] = []
return res
def _user(self, cr, uid, ids, name, arg, context=None):
@@ -383,10 +386,13 @@ class account_analytic_account(osv.osv):
max_user = cr.fetchone()[0]
for id in ids:
ids2 = self.search(cr, uid, [('parent_id', 'child_of', [id])])
cr.execute('SELECT DISTINCT("user") FROM account_analytic_analysis_summary_user ' \
'WHERE account_id in (' + ','.join([str(x) for x in ids2]) + ') ' \
'AND unit_amount <> 0.0')
res[id] = [int((id * max_user) + x[0]) for x in cr.fetchall()]
if ids2:
cr.execute('SELECT DISTINCT("user") FROM account_analytic_analysis_summary_user ' \
'WHERE account_id in (' + ','.join([str(x) for x in ids2]) + ') ' \
'AND unit_amount <> 0.0')
res[id] = [int((id * max_user) + x[0]) for x in cr.fetchall()]
else:
res[id] = []
return res
_columns ={
@@ -608,7 +614,7 @@ class account_analytic_account_summary_month(osv.osv):
for child_id in account_obj.search(cr, uid,
[('parent_id', 'child_of', [int(str(int(obj_id))[:-6])])]):
if child_id != int(str(int(obj_id))[:-6]):
res[obj_id] += res.get(int(child_id * 1000000 + int(obj_id)), 0.0)
res[obj_id] += res.get(int(child_id * 1000000 + int(str(int(obj_id))[-6:])), 0.0)
for id in ids:
res[id] = round(res.get(id, 0.0), 2)
return res
@@ -25,7 +25,7 @@ from report import report_sxw
class crossovered_analytic(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(crossovered_analytic, self).__init__(cr, uid, name, context)
super(crossovered_analytic, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'lines': self._lines,
@@ -34,7 +34,7 @@ parents = {
class account_balance(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_balance, self).__init__(cr, uid, name, context)
super(account_balance, self).__init__(cr, uid, name, context=context)
self.flag=1
self.dr_total= 0.00
self.cr_total= 0.00
@@ -35,7 +35,7 @@ parents = {
class account_balance_landscape(rml_parse.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_balance_landscape, self).__init__(cr, uid, name, context)
super(account_balance_landscape, self).__init__(cr, uid, name, context=context)
self.flag=1
self.dr_total= 0.00
self.cr_total= 0.00
+1 -1
View File
@@ -32,7 +32,7 @@ import sys
class rml_parse(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(rml_parse, self).__init__(cr, uid, name, context=None)
super(rml_parse, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'comma_me': self.comma_me,
'format_date': self._get_and_change_date_format_for_swiss,
@@ -26,7 +26,7 @@ import datetime
class analytic_account_budget_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(analytic_account_budget_report, self).__init__(cr, uid, name, context)
super(analytic_account_budget_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'funct': self.funct,
'funct_total': self.funct_total,
@@ -26,7 +26,7 @@ import operator
class budget_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(budget_report, self).__init__(cr, uid, name, context)
super(budget_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'lines': self.lines,
'budget_total': self.budget_total,
@@ -28,7 +28,7 @@ import osv
class budget_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(budget_report, self).__init__(cr, uid, name, context)
super(budget_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'funct': self.funct,
'funct_total': self.funct_total,
@@ -46,6 +46,8 @@ class account_move_line(osv.osv):
_name='account.move.line'
def check_date(self, cr, uid, vals, context=None, check=True):
if not context:
context = {}
if 'date' in vals.keys():
if 'journal_id' in vals and 'journal_id' not in context:
journal_id = vals['journal_id']
@@ -28,7 +28,7 @@ from report import report_sxw
class report_rappel(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(report_rappel, self).__init__(cr, uid, name, context)
super(report_rappel, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time' : time,
'ids_to_objects': self._ids_to_objects,
@@ -25,7 +25,7 @@ from report import report_sxw
class account_invoice_1(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_invoice_1, self).__init__(cr, uid, name, context)
super(account_invoice_1, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'invoice_lines': self.invoice_lines,
@@ -25,7 +25,7 @@ import pooler
class account_invoice_with_message(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_invoice_with_message, self).__init__(cr, uid, name, context)
super(account_invoice_with_message, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'spcl_msg': self.spcl_msg,
@@ -25,7 +25,7 @@ from report import report_sxw
class payment_order(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(payment_order, self).__init__(cr, uid, name, context)
super(payment_order, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
@@ -27,7 +27,7 @@ from report import report_sxw
class accounting_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(accounting_report, self).__init__(cr, uid, name, context)
super(accounting_report, self).__init__(cr, uid, name, context=context)
self.ret_list = []
self.localcontext.update({
'time': time,
@@ -45,7 +45,7 @@ import os
class accounting_report_indicator(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(accounting_report_indicator, self).__init__(cr, uid, name, context)
super(accounting_report_indicator, self).__init__(cr, uid, name, context=context)
self.ret_list = []
self.localcontext.update({
'time': time,
@@ -35,7 +35,7 @@ parents = {
class account_report_bs(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_report_bs, self).__init__(cr, uid, name, context)
super(account_report_bs, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'lines': self.lines,
@@ -104,7 +104,7 @@
<para style="P2">Cash Payment Voucher [[ (voucher.type == 'pay_voucher' or removeParentNode('para')) and '' ]]</para>
<para style="P24">Bank Receipt Voucher [[ (voucher.type == 'bank_rec_voucher' or removeParentNode('para')) and '' ]]</para>
<para style="P2">Bank Payment Voucher [[ (voucher.type == 'bank_pay_voucher' or removeParentNode('para')) and '' ]]</para>
<blockTable colWidths="49.0,143.0,116.0,69.0,106.0" style="Table1">
<tr>
<td>
@@ -171,13 +171,14 @@
<blockTable colWidths="482.0" style="voucher_lines">
<tr>
<td>
<para style="P20">[[ repeatIn(voucher.move_ids,'move_ids') ]] <font>[[ (not move_ids) and removeParentNode('blockTable') ]]</font></para>
<para style="P20">[[ repeatIn(voucher.move_ids,'move_ids') ]] </para>
<blockTable colWidths="251.0,110.0,115.0" style="Table2">
<tr>
<td>
<para style="P11">[[ (move_ids.partner_id and move_ids.partner_id.name) or 'Account']] :</para>
<para style="P28">[[ move_ids.account_id.name ]] </para>
<para style="P28"><i>[[ move_ids.name ]] - [[ get_ref(voucher.id,move_ids) ]]</i></para>
<!--para style="P31">[[ get_ref(voucher.id,move_ids) ]]</para-->
</td>
<td>
<para style="P21">[[ move_ids.debit ]]</para>
View File
+3 -4
View File
@@ -213,7 +213,7 @@ class account_voucher(osv.osv):
for il in iml:
if il['account_analytic_id']:
if inv.type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_voucher','journal_pur_voucher'):
if inv.type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_vou','journal_pur_voucher'):
ref = inv.reference
else:
ref = self._convert_ref(cr, uid, inv.number)
@@ -243,7 +243,7 @@ class account_voucher(osv.osv):
diff_currency_p = inv.currency_id.id <> company_currency
total = 0
if inv.type in ('pay_voucher', 'journal_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_voucher','journal_pur_voucher'):
if inv.type in ('pay_voucher', 'journal_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_vou','journal_pur_voucher'):
ref = inv.reference
else:
ref = self._convert_ref(cr, uid, inv.number)
@@ -508,12 +508,11 @@ class VoucherLine(osv.osv):
res.append(self.move_line_get_item(cr, uid, line, context))
return res
def onchange_partner(self, cr, uid, ids, partner_id, ttype,type1):
def onchange_partner(self, cr, uid, ids, partner_id, ttype ,type1):
if not partner_id:
return {'value' : {'account_id' : False, 'type' : False ,'amount':False}}
obj = self.pool.get('res.partner')
account_id = False
if type1 in ('rec_voucher','bank_rec_voucher', 'journal_voucher'):
account_id = obj.browse(cr, uid, partner_id).property_account_receivable
balance = obj.browse(cr,uid,partner_id).credit
+2 -2
View File
@@ -231,8 +231,8 @@
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_id" eval="view_voucher_form"/>
<field name="domain">[('type','=','journal_sale_voucher')]</field>
<field name="context">{'type':'journal_sale_voucher'}</field>
<field name="domain">[('type','=','journal_sale_vou')]</field>
<field name="context">{'type':'journal_sale_vou'}</field>
</record>
<menuitem name="Financial Management/Voucher Entries/Other Vouchers/Journal Sale Voucher" id="menu_action_view_jour_sale_voucher_form" action="action_view_jour_sale_voucher_form"/>
<record model="ir.actions.act_window" id="action_view_jour_pur_voucher_form">
@@ -36,7 +36,7 @@ _types = {
'rec_voucher':'Cash Receipt Voucher',
'bank_rec_voucher':'Bank Receipt Voucher',
'cont_voucher':'Contra Voucher',
'journal_sale_voucher':'Journal Sale Voucher',
'journal_sale_vou':'Journal Sale Voucher',
'journal_pur_voucher':'Journal Purchase Voucher'
}
_states = {
@@ -53,7 +53,7 @@ _voucher_fields = {
('rec_voucher','Cash Receipt Voucher'),
('bank_rec_voucher','Bank Receipt Voucher'),
('cont_voucher','Contra Voucher'),
('journal_sale_voucher','Journal Sale Voucher'),
('journal_sale_vou','Journal Sale Voucher'),
('journal_pur_voucher','Journal Purchase Voucher')], 'required':True},
'state': {'string':'State', 'type':'selection', 'selection':[
('draft','Draft'),
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class auction_artists(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_artists, self).__init__(cr, uid, name, context)
super(auction_artists, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class auction_bids(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_bids, self).__init__(cr, uid, name, context)
super(auction_bids, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
@@ -27,7 +27,7 @@ from report import report_sxw
class auction_buyer_result(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_buyer_result, self).__init__(cr, uid, name, context)
super(auction_buyer_result, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -26,7 +26,7 @@ from report import report_sxw
class auction_catelog(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_catelog, self).__init__(cr, uid, name, context)
super(auction_catelog, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class auction_objects(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_objects, self).__init__(cr, uid, name, context)
super(auction_objects, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
#'lines': self.lines
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class auction_result(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_result, self).__init__(cr, uid, name, context)
super(auction_result, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -28,7 +28,7 @@ from report import report_sxw
class auction_total_rml(report_sxw.rml_parse):
total_obj=[]
def __init__(self, cr, uid, name, context):
super(auction_total_rml, self).__init__(cr, uid, name, context)
super(auction_total_rml, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'sum_taxes':self.sum_taxes,
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class bids_lots(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(bids_lots, self).__init__(cr, uid, name, context)
super(bids_lots, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class bids_phones_details(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(bids_phones_details, self).__init__(cr, uid, name, context)
super(bids_phones_details, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
+1 -1
View File
@@ -29,7 +29,7 @@ class buyer_form_report(report_sxw.rml_parse):
count=0
c=0
def __init__(self, cr, uid, name, context):
super(buyer_form_report, self).__init__(cr, uid, name, context)
super(buyer_form_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'sum_taxes': self.sum_taxes,
+1 -1
View File
@@ -32,7 +32,7 @@ class buyer_list(report_sxw.rml_parse):
sum_buyer_price_val=0.0
sum_lot_val=0.0
def __init__(self, cr, uid, name, context):
super(buyer_list, self).__init__(cr, uid, name, context)
super(buyer_list, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'lines_lots_from_auction' : self.lines_lots_from_auction,
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class catelogwithpictures(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(catelogwithpictures, self).__init__(cr, uid, name, context)
super(catelogwithpictures, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -27,7 +27,7 @@ from report import report_sxw
class deposit_seller(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(deposit_seller, self).__init__(cr, uid, name, context)
super(deposit_seller, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class lots_list(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(lots_list, self).__init__(cr, uid, name, context)
super(lots_list, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'bid_line' : self.bid_line
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class lots_list_inventory(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(lots_list_inventory, self).__init__(cr, uid, name, context)
super(lots_list_inventory, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'bid_line' : self.bid_line
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class lots_list_llandscape(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(lots_list_landscape, self).__init__(cr, uid, name, context)
super(lots_list_landscape, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
+1 -1
View File
@@ -25,7 +25,7 @@ from report import report_sxw
class auction_code_produit(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(auction_code_produit, self).__init__(cr, uid, name, context)
super(auction_code_produit, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
+1 -1
View File
@@ -27,7 +27,7 @@ from osv import osv
class seller_form_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(seller_form_report, self).__init__(cr, uid, name, context)
super(seller_form_report, self).__init__(cr, uid, name, context=context)
lot=self.pool.get('auction.lots').browse(cr,uid,uid)
#address=lot.bord_vnd_id.address_get(self.cr,self.uid,[partner.id])
# partner=lot.bord_vnd_id.partner_id
@@ -258,8 +258,8 @@ class report_creator(osv.osv):
ret_str = ret_str[0:len(ret_str)-3]
if ret_str.endswith('or'):
ret_str = ret_str[0:len(ret_str)-2]
ret_str = ret_str.strip()
return ret_str
ret_str = ret_str.strip()
return ret_str % {'uid' : uid}
def _id_get(self, cr, uid, id, context):
# return 'min(sale_order_line.id)'
@@ -86,6 +86,8 @@
<field name="condition"/>
</form>
</field>
<separator string="Legend" colspan="4"/>
<label string="Use %%(uid)s to filter by the connected user" align="0.0"/>
</page><page string="Security">
<separator string="Authorized Groups (empty for all)" colspan="4"/>
<field name="group_ids" colspan="4" nolabel="1"/>
@@ -97,6 +99,7 @@
</field>
</record>
<record model="ir.actions.act_window" id="base_report_creator_action">
<field name="name">Custom Report</field>
<field name="res_model">base_report_creator.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
@@ -128,6 +128,10 @@ def _set_filter_value(self, cr, uid, data, context):
value_data = 'true'
else:
value_data = 'false'
if field_type in ['float','integer']:
value_data = value_data or 0
if field_type == 'many2many' and value_data and len(value_data):
fields_list = set_field_operator(self,table_name+"."+field_data['name'],field_data['ttype'],form_data['operator'],value_data[0][2])
else:
@@ -135,7 +139,7 @@ def _set_filter_value(self, cr, uid, data, context):
if fields_list:
create_dict = {
'name':model_name + "/" +field_data['field_description'] +" "+ mapping_fields[form_data['operator']] + " " + str(fields_list[2]) + " ",
'expression':' '.join(fields_list),
'expression':' '.join(map(str,fields_list)),
'report_id':data['id'],
'condition' : form_data['condition']
}
+9 -5
View File
@@ -530,17 +530,21 @@ class document_file(osv.osv):
result[id] = base64.encodestring(value)
except:
result[id]=''
if context.get('bin_size', False):
result[id] = tools.human_size(len(result[id]))
# if context.get('bin_size', False):
# result[id] = tools.human_size(result[id])
return result
#
# This code can be improved
#
def _data_set(self, cr, obj, id, name, value, uid=None, context={}):
def _data_set(self, cr, uid, id, name, value, args=None, context={}):
if not value:
filename = self.browse(cr, uid, id, context).store_fname
try:
os.unlink(os.path.join(self._get_filestore(cr), filename))
except:
pass
cr.execute('update ir_attachment set store_fname=NULL WHERE id=%s', (id,) )
return True
#if (not context) or context.get('store_method','fs')=='fs':
try:
+2 -1
View File
@@ -127,6 +127,7 @@ class document_directory_content(osv.osv):
event.add('last-modified').value = ics_datetime(perm[0]['write_date'][:19])
for field in node.content.ics_field_ids:
value = getattr(obj, field.field_id.name)
value = value and tools.ustr(value)
if (not value) and field.name=='uid':
value = 'OpenERP-%s_%s@%s' % (node.content.ics_object_id.model, str(obj.id), cr.dbname,)
obj_class.write(cr, uid, [obj.id], {field.field_id.name: value})
@@ -145,7 +146,7 @@ class document_directory_content(osv.osv):
else:
value = ics_datetime(value)
event.add(field.name).value = value
s= StringIO.StringIO(cal.serialize().encode('utf8'))
s= StringIO.StringIO(cal.serialize())
s.name = node
cr.commit()
return s
@@ -27,7 +27,7 @@ import datetime
class attendance_print(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(attendance_print, self).__init__(cr, uid, name, context)
super(attendance_print, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'lst': self._lst,
+1 -1
View File
@@ -138,7 +138,7 @@ class hr_expense_expense(osv.osv):
'account_analytic_id': l.analytic_account.id,
}))
if not exp.employee_id.address_id:
raise osv.except_osv(_('Error !'), _('The employee must have a contact address'))
raise osv.except_osv(_('Error !'), _('The employee must have a working address'))
acc = exp.employee_id.address_id.partner_id.property_account_payable.id
payment_term_id = exp.employee_id.address_id.partner_id.property_payment_term.id
inv = {
+1 -1
View File
@@ -25,7 +25,7 @@ import datetime
class expense(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(expense, self).__init__(cr, uid, name, context)
super(expense, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
})
@@ -24,7 +24,7 @@ import pooler
class account_analytic_profit(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_profit, self).__init__(cr, uid, name, context)
super(account_analytic_profit, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'lines': self._lines,
'user_ids': self._user_ids,
@@ -26,7 +26,7 @@ from report import report_sxw
class account_analytic_cost_ledger(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(account_analytic_cost_ledger, self).__init__(cr, uid, name, context)
super(account_analytic_cost_ledger, self).__init__(cr, uid, name, context=context)
self.sum_revenue={}
self.account_sum_revenue={}
self.localcontext.update( {
@@ -170,19 +170,26 @@ class invoice_create(wizard.interface):
pool.get('account.invoice').button_reset_taxes(cr, uid, [last_invoice], context)
mod_obj = pooler.get_pool(cr.dbname).get('ir.model.data')
act_obj = pooler.get_pool(cr.dbname).get('ir.actions.act_window')
act_obj = pooler.get_pool(cr.dbname).get('ir.actions.act_window')
mod_id = mod_obj.search(cr, uid, [('name', '=', 'action_invoice_tree1')])[0]
res_id = mod_obj.read(cr, uid, mod_id, ['res_id'])['res_id']
act_win = act_obj.read(cr, uid, res_id, [])
act_win['domain'] = [('id','in',invoices),('type','=','out_invoice')]
act_win['name'] = _('Invoices')
return act_win
return {
'domain': "[('id','in', ["+','.join(map(str,invoices))+"])]",
'name': _('Invoices'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'account.invoice',
'view_id': False,
'context': "{'type':'out_invoice'}",
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
# return {
# 'domain': "[('id','in', ["+','.join(map(str,invoices))+"])]",
# 'name': _('Invoices'),
# 'view_type': 'form',
# 'view_mode': 'tree,form',
# 'res_model': 'account.invoice',
# 'view_id': False,
# 'context': "{'type':'out_invoice'}",
# 'type': 'ir.actions.act_window',
# 'search_view_id': res['res_id']
# }
_create_form = """<?xml version="1.0"?>
<form string="Invoice on analytic entries">
+38 -44
View File
@@ -31,8 +31,8 @@
#
##############################################################################
{
"name" : "Switzerland localisation corrected by Camptocamp",
"description" : """
"name" : "Switzerland localisation corrected by Camptocamp",
"description" : """
Swiss localisation :
- DTA generation for a lot of paiment types
- BVR management (number generation, report, etc..)
@@ -43,9 +43,9 @@ You can also add with this module one of the following account plan:
- l10n_ch_c2c_pcg
------------------------------------------------------------------------
Module incluant la localisation Suisse de TinyERP revu et corrigé par Camptocamp. Cette nouvelle version
comprend la gestion et l'émissionde BVR, le paiement électronique via DTA (pour les banques, le système postal est en développement)
et l'import du relevé de compte depuis la banque de manière automatisée.
@@ -66,45 +66,39 @@ TODO :
""",
"version" : "5.0",
"author" : "Camptocamp SA",
"category" : "Localisation/Europe",
"website": "http://www.camptocamp.com",
"depends" : [
"base",
"account",
"base_vat",
"base_iban",
"account_payment",
"account_tax_include",
],
"init_xml" : [
"dta_data.xml",
"vaudtax_data.xml",
#these data will soon be part of an other modules but if you want
#them now uncomment the two lines
#"zip_code_default.xml",
#"bank_ch.xml",
],
"demo_xml" : [
"demo/vaudtax_data_demo.xml",
],
"update_xml" : [
"dta_view.xml",
"dta_wizard.xml",
#this file as been move to the account chart
# "account_vat.xml",
"bvr_report.xml",
"bvr_wizard.xml",
"bvr_view.xml",
"company_view.xml",
"account_invoice.xml",
"bank_view.xml",
"account_journal_view.xml",
"security/ir.model.access.csv",
],
"active": False,
"installable": True,
"version" : "5.0",
"author" : "Camptocamp SA",
"category" : "Localisation/Europe",
"website": "http://www.camptocamp.com",
"depends" : [
"base",
"account",
"base_vat",
"base_iban",
"account_payment",
"account_tax_include",
],
"init_xml" : [
"dta_data.xml",
"vaudtax_data.xml",
],
"demo_xml" : [
"demo/vaudtax_data_demo.xml",
],
"update_xml" : [
"dta_view.xml",
"dta_wizard.xml",
"bvr_report.xml",
"bvr_wizard.xml",
"bvr_view.xml",
"company_view.xml",
"account_invoice.xml",
"bank_view.xml",
"account_journal_view.xml",
"security/ir.model.access.csv",
],
"active": False,
"installable": True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+31 -31
View File
@@ -34,39 +34,39 @@
from osv import fields, osv
class AccountMoveLine(osv.osv):
""" Inherit account.move.line in order to add a custom link
between supplier invoice line and bank. The original link
was defined in account_payment between line """
""" Inherit account.move.line in order to add a custom link
between supplier invoice line and bank. The original link
was defined in account_payment between line """
_inherit = 'account.move.line'
_inherit = 'account.move.line'
## @param self The object pointer.
## @param cr a psycopg cursor
## @param uid res.user.id that is currently loged
## @param payment_type manual
## @parma context a standard dict
## @return a dict who has the account move line id as key and the bank id as value
def line2bank(self, cr, uid, ids, payment_type='manual', context=None):
"""add a link to account.move.line in order to link
supplier invoice line and bank. The original link
was defined in account_payment"""
payment_mode_obj = self.pool.get('payment.mode')
line2bank = {}
if not ids:
return {}
bank_type = payment_mode_obj.suitable_bank_types(cr, uid, payment_type,
context=context)
for line in self.browse(cr, uid, ids, context=context):
if line.invoice and line.invoice.partner_bank:
line2bank[line.id] = line.invoice.partner_bank.id
elif line.partner:
for bank in line.partner.bank_ids:
if bank.state in bank_type:
line2bank[line.id] = bank.id
break
if line.id not in line2bank and line.partner.bank_ids:
line2bank[line.id] = line.partner.bank_ids[0].id
return line2bank
## @param self The object pointer.
## @param cr a psycopg cursor
## @param uid res.user.id that is currently loged
## @param payment_type manual
## @parma context a standard dict
## @return a dict who has the account move line id as key and the bank id as value
def line2bank(self, cr, uid, ids, payment_type='manual', context=None):
"""add a link to account.move.line in order to link
supplier invoice line and bank. The original link
was defined in account_payment"""
payment_mode_obj = self.pool.get('payment.mode')
line2bank = {}
if not ids:
return {}
bank_type = payment_mode_obj.suitable_bank_types(cr, uid, payment_type,
context=context)
for line in self.browse(cr, uid, ids, context=context):
if line.invoice and line.invoice.partner_bank:
line2bank[line.id] = line.invoice.partner_bank.id
elif line.partner_id:
for bank in line.partner_id.bank_ids:
if bank.state in bank_type:
line2bank[line.id] = bank.id
break
if line.id not in line2bank and line.partner_id.bank_ids:
line2bank[line.id] = line.partner_id.bank_ids[0].id
return line2bank
AccountMoveLine()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+17 -8
View File
@@ -33,14 +33,23 @@ from osv import fields, osv
class Bank(osv.osv):
"""Inherit res.bank class in order to add swiss specific field"""
_inherit = 'res.bank'
_columns = {
###Swiss unik bank identifier also use in IBAN number
'clearing': fields.char('Clearing number', size=64),
### city of the bank
'city': fields.char('City', size=128, select=1),
}
"""Inherit res.bank class in order to add swiss specific field"""
_inherit = 'res.bank'
_columns = {
###Swiss unik bank identifier also use in IBAN number
'clearing': fields.char('Clearing number', size=64),
### city of the bank
'city': fields.char('City', size=128, select=1),
}
Bank()
class bvr_checkbox(osv.osv):
""" Add function to generate function """
_inherit = "res.partner.bank"
_columns = {
'printBank' : fields.boolean('Print Bank on BVR'),
'printAccount' : fields.boolean('Print Account Number on BVR'),
}
bvr_checkbox()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+26
View File
@@ -24,5 +24,31 @@
</field>
</field>
</record>
<record model="ir.ui.view" id="l10nch_view_res_partner_bank">
<field name="name">res.partner_bank.form</field>
<field name="model">res.partner.bank</field>
<field name="type">form</field>
<field name="inherit_id" ref="base.view_partner_bank_form"/>
<field name="arch" type="xml">
<field name="country_id" position="after">
<field name="printBank" select="2"/>
<field name="printAccount" select="2"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="l10nch_view_res_partner_bank">
<field name="name">res.partner_partner_bank.form</field>
<field name="model">res.partner</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_partner_property_form"/>
<field name="arch" type="xml">
<field name="bank" position="after">
<newline />
<field name="printBank" select="2"/>
<field name="printAccount" select="2"/>
</field>
</field>
</record>
</data>
</openerp>
+11 -11
View File
@@ -34,17 +34,17 @@
import netsvc
from osv import fields, osv
class res_company(osv.osv):
"""override company in order to add bvr vertical and
Horizontal print delta"""
_inherit = "res.company"
_columns = {
### horiz. delta in mm 1.2 will print the bvz 1.2mm lefter
'bvr_delta_horz': fields.float('BVR Horz. Delta (mm)',
help='horiz. delta in mm 1.2 will print the bvz 1.2mm lefter'),
### vert. delta in mm 1.2 will print the bvz 1.2mm lefter
'bvr_delta_vert': fields.float('BVR Vert. Delta (mm)',
help='vert. delta in mm 1.2 will print the bvz 1.2mm lefter'),
}
"""override company in order to add bvr vertical and
Horizontal print delta"""
_inherit = "res.company"
_columns = {
### horiz. delta in mm 1.2 will print the bvz 1.2mm lefter
'bvr_delta_horz': fields.float('BVR Horz. Delta (mm)',
help='horiz. delta in mm 1.2 will print the bvz 1.2mm lefter'),
### vert. delta in mm 1.2 will print the bvz 1.2mm lefter
'bvr_delta_vert': fields.float('BVR Vert. Delta (mm)',
help='vert. delta in mm 1.2 will print the bvz 1.2mm lefter'),
}
res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+53 -53
View File
@@ -34,62 +34,62 @@ import time
from osv import osv,fields
class account_dta(osv.osv):
"""class that implements bank DTA File format,
used to transfert bulk batch payment instruction to a bank"""
_name = "account.dta"
_description = "DTA History"
_columns = {
### name of the file
'name': fields.binary('DTA file', readonly=True),
### list of dta line linked to the dta order
'dta_line_ids': fields.one2many('account.dta.line','dta_id','DTA lines', readonly=True),
## textual notes
'note': fields.text('Creation log', readonly=True,
help="display the problem during dta generation"),
### bank how will execute DTA order
'bank': fields.many2one('res.partner.bank','Bank', readonly=True,select=True,
help="bank how will execute DTA order"),
### date of DTA order generation
'date': fields.date('Creation Date', readonly=True,select=True,
help="date of DTA order generation"),
### user how generate the DTA order
'user_id': fields.many2one('res.users','User', readonly=True, select=True),
}
"""class that implements bank DTA File format,
used to transfert bulk batch payment instruction to a bank"""
_name = "account.dta"
_description = "DTA History"
_columns = {
### name of the file
'name': fields.binary('DTA file', readonly=True),
### list of dta line linked to the dta order
'dta_line_ids': fields.one2many('account.dta.line','dta_id','DTA lines', readonly=True),
## textual notes
'note': fields.text('Creation log', readonly=True,
help="display the problem during dta generation"),
### bank how will execute DTA order
'bank': fields.many2one('res.partner.bank','Bank', readonly=True,select=True,
help="bank how will execute DTA order"),
### date of DTA order generation
'date': fields.date('Creation Date', readonly=True,select=True,
help="date of DTA order generation"),
### user how generate the DTA order
'user_id': fields.many2one('res.users','User', readonly=True, select=True),
}
account_dta()
class account_dta_line(osv.osv):
"""Class that represent a DTA order line,
each lin corressponds to a payment instruction"""
_name = "account.dta.line"
_description = "DTA line"
_columns = {
### name of the line
'name' : fields.many2one('account.invoice','Invoice', required=True, size=256),
### partner how will receive payments
'partner_id' : fields.many2one('res.partner','Partner',
help="Partenr to pay"),
### due date of the payment
'due_date' : fields.date('Due date'),
### date of the supplier invoice to pay
'invoice_date' : fields.date('Invoice date'),
### cash discount date
'cashdisc_date' : fields.date('Cash Discount date'),
### amount effectively paied on this line
'amount_to_pay' : fields.float('Amount to pay',
help="amount effectively paid"),
### amount that was on the supplier invoice
'amount_invoice': fields.float('Invoiced Amount',
help="amount to pay base on the supplier invoice"),
### Cash discount amount
'amount_cashdisc': fields.float('Cash Discount Amount'),
### Linke to the main dta order
'dta_id': fields.many2one('account.dta','Associated DTA', required=True, ondelete='cascade'),
### state of the invoice Drat, Cancel, Done
'state' : fields.selection([('draft','Draft'),('cancel','Error'),('done','Paid')],'State')
}
_defaults = {
'state' : lambda *a :'draft',
}
"""Class that represent a DTA order line,
each lin corressponds to a payment instruction"""
_name = "account.dta.line"
_description = "DTA line"
_columns = {
### name of the line
'name' : fields.many2one('account.invoice','Invoice', required=True, size=256),
### partner how will receive payments
'partner_id' : fields.many2one('res.partner','Partner',
help="Partenr to pay"),
### due date of the payment
'due_date' : fields.date('Due date'),
### date of the supplier invoice to pay
'invoice_date' : fields.date('Invoice date'),
### cash discount date
'cashdisc_date' : fields.date('Cash Discount date'),
### amount effectively paied on this line
'amount_to_pay' : fields.float('Amount to pay',
help="amount effectively paid"),
### amount that was on the supplier invoice
'amount_invoice': fields.float('Invoiced Amount',
help="amount to pay base on the supplier invoice"),
### Cash discount amount
'amount_cashdisc': fields.float('Cash Discount Amount'),
### Linke to the main dta order
'dta_id': fields.many2one('account.dta','Associated DTA', required=True, ondelete='cascade'),
### state of the invoice Drat, Cancel, Done
'state' : fields.selection([('draft','Draft'),('cancel','Error'),('done','Paid')],'State')
}
_defaults = {
'state' : lambda *a :'draft',
}
account_dta_line()
+162 -162
View File
@@ -37,176 +37,176 @@ from mx import DateTime
class account_invoice(osv.osv):
"""Inherit account.invoice in order to add bvr
printing functionnalites. BVR is a Swiss payment vector"""
_inherit = "account.invoice"
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma context a standard dict
## @return a list of tuple (name,value)
def _get_reference_type(self, cursor, user, context=None):
"""Function use by the function field reference_type in order to initalise available
BVR Reference Types"""
res = super(account_invoice, self)._get_reference_type(cursor, user,
context=context)
res.append(('bvr', 'BVR'))
return res
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma context a standard dict
## @param name of the files
## @param args a list of diverse argument
## @parma context a standard dict
## @return a dict (invoice id,amount to pay)
def _amount_to_pay(self, cursor, user, ids, name, args, context=None):
'''Return the amount still to pay regarding all the payment orders'''
if not ids:
return {}
res = {}
for invoice in self.browse(cursor, user, ids, context=context):
res[invoice.id] = 0.0
if invoice.move_id:
for line in invoice.move_id.line_id:
if not line.date_maturity or \
DateTime.strptime(line.date_maturity, '%Y-%m-%d') \
< DateTime.now():
res[invoice.id] += line.amount_to_pay
return res
"""Inherit account.invoice in order to add bvr
printing functionnalites. BVR is a Swiss payment vector"""
_inherit = "account.invoice"
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma context a standard dict
## @return a list of tuple (name,value)
def _get_reference_type(self, cursor, user, context=None):
"""Function use by the function field reference_type in order to initalise available
BVR Reference Types"""
res = super(account_invoice, self)._get_reference_type(cursor, user,
context=context)
res.append(('bvr', 'BVR'))
return res
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma context a standard dict
## @param name of the files
## @param args a list of diverse argument
## @parma context a standard dict
## @return a dict (invoice id,amount to pay)
def _amount_to_pay(self, cursor, user, ids, name, args, context=None):
'''Return the amount still to pay regarding all the payment orders'''
if not ids:
return {}
res = {}
for invoice in self.browse(cursor, user, ids, context=context):
res[invoice.id] = 0.0
if invoice.move_id:
for line in invoice.move_id.line_id:
if not line.date_maturity or \
DateTime.strptime(line.date_maturity, '%Y-%m-%d') \
< DateTime.now():
res[invoice.id] += line.amount_to_pay
return res
_columns = {
### BVR reference type BVR or FREE
'reference_type': fields.selection(_get_reference_type,
'Reference Type', required=True),
### Partner bank link between bank and partner id
'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',
help='The partner bank account to pay\nKeep empty to use the default'
),
### Amount to pay
'amount_to_pay': fields.function(_amount_to_pay, method=True,
type='float', string='Amount to be paid',
help='The amount which should be paid at the current date\n' \
'minus the amount which is already in payment order'),
}
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma ids invoices id
## @return a boolean True if valid False if invalid
def _check_bvr(self, cr, uid, ids):
"""
Function to validate a bvr reference like :
0100054150009>132000000000000000000000014+ 1300132412>
The validation is based on l10n_ch
"""
invoices = self.browse(cr,uid,ids)
for invoice in invoices:
if invoice.reference_type == 'bvr':
if not invoice.reference:
return False
## I need help for this bug because in this case
# <010001000060190> 052550152684006+ 43435>
# the reference 052550152684006 do not match modulo 10
#
if mod10r(invoice.reference[:-1]) != invoice.reference and \
len(invoice.reference) == 15:
return True
#
if mod10r(invoice.reference[:-1]) != invoice.reference:
return False
return True
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma ids invoices id
## @return a boolean True if valid False if invalid
def _check_reference_type(self, cursor, user, ids):
"""Check the customer invoice reference type depending
on the BVR reference type and the invoice partner bank type"""
for invoice in self.browse(cursor, user, ids):
if invoice.type in 'in_invoice':
if invoice.partner_bank and \
invoice.partner_bank.state in \
('bvrbank', 'bvrpost') and \
invoice.reference_type != 'bvr':
return False
return True
_columns = {
### BVR reference type BVR or FREE
'reference_type': fields.selection(_get_reference_type,
'Reference Type', required=True),
### Partner bank link between bank and partner id
'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',
help='The partner bank account to pay\nKeep empty to use the default'
),
### Amount to pay
'amount_to_pay': fields.function(_amount_to_pay, method=True,
type='float', string='Amount to be paid',
help='The amount which should be paid at the current date\n' \
'minus the amount which is already in payment order'),
}
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma ids invoices id
## @return a boolean True if valid False if invalid
def _check_bvr(self, cr, uid, ids):
"""
Function to validate a bvr reference like :
0100054150009>132000000000000000000000014+ 1300132412>
The validation is based on l10n_ch
"""
invoices = self.browse(cr,uid,ids)
for invoice in invoices:
if invoice.reference_type == 'bvr':
if not invoice.reference:
return False
## I need help for this bug because in this case
# <010001000060190> 052550152684006+ 43435>
# the reference 052550152684006 do not match modulo 10
#
if mod10r(invoice.reference[:-1]) != invoice.reference and \
len(invoice.reference) == 15:
return True
#
if mod10r(invoice.reference[:-1]) != invoice.reference:
return False
return True
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma ids invoices id
## @return a boolean True if valid False if invalid
def _check_reference_type(self, cursor, user, ids):
"""Check the customer invoice reference type depending
on the BVR reference type and the invoice partner bank type"""
for invoice in self.browse(cursor, user, ids):
if invoice.type in 'in_invoice':
if invoice.partner_bank and \
invoice.partner_bank.state in \
('bvrbank', 'bvrpost') and \
invoice.reference_type != 'bvr':
return False
return True
_constraints = [
(_check_bvr, 'Error: Invalid Bvr Number (wrong checksum).',
['reference']),
(_check_reference_type, 'Error: BVR reference is required.',
['reference_type']),
]
## @param self The object pointer.
## @param cr a psycopg cursor
## @param uid res.user.id that is currently loged
## @parma ids invoices id
## @parma type the invoice type
## @param partner_id the partner linked to the invoice
## @parma date_invoice date of the invoice
## @parma payment_term inoice payment term
## @param partner_bank_id the partner linked invoice bank
## @return the dict of values with the partner_bank value updated
def onchange_partner_id(self, cr, uid, ids, type, partner_id,
date_invoice=False, payment_term=False, partner_bank_id=False):
""" Function that is call when the partner of the invoice is changed
it will retriev and set the good bank partner bank"""
res = super(account_invoice, self).onchange_partner_id(
cr,
uid,
ids,
type,
partner_id,
date_invoice,
payment_term
)
bank_id = False
if partner_id:
p = self.pool.get('res.partner').browse(cr, uid, partner_id)
if p.bank_ids:
bank_id = p.bank_ids[0].id
_constraints = [
(_check_bvr, 'Error: Invalid Bvr Number (wrong checksum).',
['reference']),
(_check_reference_type, 'Error: BVR reference is required.',
['reference_type']),
]
## @param self The object pointer.
## @param cr a psycopg cursor
## @param uid res.user.id that is currently loged
## @parma ids invoices id
## @parma type the invoice type
## @param partner_id the partner linked to the invoice
## @parma date_invoice date of the invoice
## @parma payment_term inoice payment term
## @param partner_bank_id the partner linked invoice bank
## @return the dict of values with the partner_bank value updated
def onchange_partner_id(self, cr, uid, ids, type, partner_id,
date_invoice=False, payment_term=False, partner_bank_id=False):
""" Function that is call when the partner of the invoice is changed
it will retriev and set the good bank partner bank"""
res = super(account_invoice, self).onchange_partner_id(
cr,
uid,
ids,
type,
partner_id,
date_invoice,
payment_term
)
bank_id = False
if partner_id:
p = self.pool.get('res.partner').browse(cr, uid, partner_id)
if p.bank_ids:
bank_id = p.bank_ids[0].id
if type in ('in_invoice', 'in_refund'):
res['value']['partner_bank'] = bank_id
if type in ('in_invoice', 'in_refund'):
res['value']['partner_bank'] = bank_id
if partner_bank_id != bank_id:
to_update = self.onchange_partner_bank(cr, uid, ids, bank_id)
res['value'].update(to_update['value'])
return res
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma ids invoices id
## @param partner_bank_id the partner linked invoice bank
## @return the dict of values with the reference type value updated
def onchange_partner_bank(self, cursor, user, ids, partner_bank_id):
"""update the reference type depending of the partner bank"""
res = {'value': {}}
partner_bank_obj = self.pool.get('res.partner.bank')
if partner_bank_id:
partner_bank = partner_bank_obj.browse(cursor, user, partner_bank_id)
if partner_bank.state in ('bvrbank', 'bvrpost'):
res['value']['reference_type'] = 'bvr'
return res
if partner_bank_id != bank_id:
to_update = self.onchange_partner_bank(cr, uid, ids, bank_id)
res['value'].update(to_update['value'])
return res
## @param self The object pointer.
## @param cursor a psycopg cursor
## @param user res.user.id that is currently loged
## @parma ids invoices id
## @param partner_bank_id the partner linked invoice bank
## @return the dict of values with the reference type value updated
def onchange_partner_bank(self, cursor, user, ids, partner_bank_id):
"""update the reference type depending of the partner bank"""
res = {'value': {}}
partner_bank_obj = self.pool.get('res.partner.bank')
if partner_bank_id:
partner_bank = partner_bank_obj.browse(cursor, user, partner_bank_id)
if partner_bank.state in ('bvrbank', 'bvrpost'):
res['value']['reference_type'] = 'bvr'
return res
account_invoice()
class account_tax_code(osv.osv):
"""Inherit account tax code in order
to add a Case code"""
_name = 'account.tax.code'
_inherit = "account.tax.code"
_columns = {
### The case code of the taxt code
'code': fields.char('Case Code', size=512),
}
"""Inherit account tax code in order
to add a Case code"""
_name = 'account.tax.code'
_inherit = "account.tax.code"
_columns = {
### The case code of the taxt code
'code': fields.char('Case Code', size=512),
}
account_tax_code()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+50 -52
View File
@@ -34,13 +34,13 @@ import netsvc
from osv import fields, osv
class res_partner(osv.osv):
_inherit = 'res.partner'
_inherit = 'res.partner'
_columns = {
'ref_companies': fields.one2many('res.company', 'partner_id',
'Companies that refers to partner'),
}
_columns = {
'ref_companies': fields.one2many('res.company', 'partner_id',
'Companies that refers to partner'),
}
res_partner()
@@ -48,52 +48,50 @@ res_partner()
class res_partner_bank(osv.osv):
_inherit = "res.partner.bank"
_columns = {
'name': fields.char('Description', size=128, required=True),
'post_number': fields.char('Post number', size=64),
'bvr_number': fields.char('BVR account number', size=11),
'bvr_adherent_num': fields.char('BVR adherent number', size=11),
'dta_code': fields.char('DTA code', size=5),
}
def _default_value(self, cursor, user, field, context=None):
if field in ('country_id', 'state_id'):
value = False
else:
value = ''
if not context.get('address', False):
return value
for ham, spam, address in context['address']:
if 'type' in address.keys() :
if address['type'] == 'default':
return address.get(field,False)
elif not address['type']:
value = address.get(field,False)
else :
value = False
return value
def name_get(self, cr, uid, ids, context=None):
if not len(ids):
return []
bank_type_obj = self.pool.get('res.partner.bank.type')
_inherit = "res.partner.bank"
_columns = {
'name': fields.char('Description', size=128, required=True),
'post_number': fields.char('Post number', size=64),
'bvr_number': fields.char('BVR account number', size=11),
'bvr_adherent_num': fields.char('BVR adherent number', size=11),
'dta_code': fields.char('DTA code', size=5),
}
# def _default_value(self, cursor, user, field, context=None):
# if field in ('country_id', 'state_id'):
# value = False
# else:
# value = ''
# if not context.get('address', False):
# return value
# for ham, spam, address in context['address']:
# if 'type' in address.keys() :
# if address['type'] == 'default':
# return address[field]
# elif not address['type']:
# value = address[field]
# else :
# value = False
# return value
def name_get(self, cr, uid, ids, context=None):
if not len(ids):
return []
bank_type_obj = self.pool.get('res.partner.bank.type')
type_ids = bank_type_obj.search(cr, uid, [])
bank_type_names = {}
for bank_type in bank_type_obj.browse(cr, uid, type_ids,
context=context):
bank_type_names[bank_type.code] = bank_type.name
res = []
for r in self.read(cr, uid, ids, ['name','state'], context):
res.append((r['id'], r['name']+' : '+bank_type_names[r['state']]))
return res
_sql_constraints = [
('bvr_adherent_uniq', 'unique (bvr_adherent_num)', 'The BVR adherent number must be unique !')
]
type_ids = bank_type_obj.search(cr, uid, [])
bank_type_names = {}
for bank_type in bank_type_obj.browse(cr, uid, type_ids,
context=context):
bank_type_names[bank_type.code] = bank_type.name
res = []
for r in self.read(cr, uid, ids, ['name','state'], context):
res.append((r['id'], r['name']+' : '+bank_type_names[r['state']]))
return res
_sql_constraints = [
('bvr_adherent_uniq', 'unique (bvr_adherent_num)', 'The BVR adherent number must be unique !')
]
res_partner_bank()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+5 -5
View File
@@ -34,11 +34,11 @@ from osv import fields
from osv import osv
class payment_order(osv.osv):
_inherit = 'payment.order'
_inherit = 'payment.order'
def get_wizard(self,mode):
if mode == 'dta':
return 'l10n_ch','wizard_account_dta_create'
return super(payment_order,self).get_wizard(mode)
def get_wizard(self,mode):
if mode == 'dta':
return 'l10n_ch','wizard_account_dta_create'
return super(payment_order,self).get_wizard(mode)
payment_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+78 -56
View File
@@ -34,70 +34,92 @@ import time
from report import report_sxw
from tools import mod10r
import re
import os
import sys
import shutil
from mx.DateTime import *
class account_invoice_bvr(report_sxw.rml_parse):
"""Report class that Allows to print BVR payement vector"""
def __init__(self, cr, uid, name, context):
super(account_invoice_bvr, self).__init__(cr, uid, name, context)
self.localcontext.update({
'time': time,
'user':self.pool.get("res.users").browse(cr,uid,uid),
'mod10r': mod10r,
'_space': self._space,
'_get_ref': self._get_ref,
'comma_me': self.comma_me,
'format_date': self._get_and_change_date_format_for_swiss,
#'date_invoice':
})
def _get_and_change_date_format_for_swiss (self,date_to_format):
date_formatted=''
print date_to_format
if date_to_format:
date_formatted = strptime(date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y')
return date_formatted
def comma_me(self,amount):
if type(amount) is float :
amount = str('%.2f'%amount)
else :
amount = str(amount)
orig = amount
new = re.sub("^(-?\d+)(\d{3})", "\g<1>'\g<2>", amount)
if orig == new:
return new
else:
return self.comma_me(new)
"""Report class that Allows to print BVR payement vector"""
def __init__(self, cr, uid, name, context):
super(account_invoice_bvr, self).__init__(cr, uid, name, context)
self.copyocrbfile('addons/l10n_ch/report/ocrbb.ttf')
self.localcontext.update({
'time': time,
'user':self.pool.get("res.users").browse(cr,uid,uid),
'mod10r': mod10r,
'_space': self._space,
'_get_ref': self._get_ref,
'comma_me': self.comma_me,
'format_date': self._get_and_change_date_format_for_swiss,
'police_absolute_path' : self.police_absolute_path,
'copyocrbfile': self.copyocrbfile
})
def _get_and_change_date_format_for_swiss (self,date_to_format):
date_formatted=''
print date_to_format
if date_to_format:
date_formatted = strptime(date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y')
return date_formatted
def police_absolute_path(self, inner_path) :
path = os.path.join(os.path.dirname(sys.argv[0]), inner_path)
return path
def copyocrbfile(self,file):
src = self.police_absolute_path(file)
file = os.path.basename(src)
dest = os.path.join('/tmp/',file)
if not os.path.isfile(dest):
try:
shutil.copyfile(src,dest)
except:
"""print ocrbfile was not copy in /tmp/ please
copy it manually from l10_ch/report"""
def _space(self,nbr, nbrspc=5):
res = ''
for i in range(len(nbr)):
res = res + nbr[i]
if not (i-1) % nbrspc:
res = res + ' '
return res
def comma_me(self,amount):
if type(amount) is float :
amount = str('%.2f'%amount)
else :
amount = str(amount)
orig = amount
new = re.sub("^(-?\d+)(\d{3})", "\g<1>'\g<2>", amount)
if orig == new:
return new
else:
return self.comma_me(new)
def _get_ref(self, o):
res = ''
if o.partner_bank.bvr_adherent_num:
res = o.partner_bank.bvr_adherent_num
invoice_number = ''
if o.number:
invoice_number = re.sub('[^0-9]', '0', o.number)
return mod10r(res + invoice_number.rjust(26-len(res), '0'))
def _space(self,nbr, nbrspc=5):
res = ''
for i in range(len(nbr)):
res = res + nbr[i]
if not (i-1) % nbrspc:
res = res + ' '
return res
def _get_ref(self, o):
res = ''
if o.partner_bank.bvr_adherent_num:
res = o.partner_bank.bvr_adherent_num
invoice_number = ''
if o.number:
invoice_number = re.sub('[^0-9]', '0', o.number)
return mod10r(res + invoice_number.rjust(26-len(res), '0'))
report_sxw.report_sxw(
'report.l10n_ch.bvr',
'account.invoice',
'addons/l10n_ch/report/bvr.rml',
parser=account_invoice_bvr,
header=False)
'report.l10n_ch.bvr',
'account.invoice',
'addons/l10n_ch/report/bvr.rml',
parser=account_invoice_bvr,
header=False)
report_sxw.report_sxw(
'report.l10n_ch.invoice.bvr',
'account.invoice',
'addons/l10n_ch/report/invoice.rml',
parser=account_invoice_bvr,
header=False)
'report.l10n_ch.invoice.bvr',
'account.invoice',
'addons/l10n_ch/report/invoice.rml',
parser=account_invoice_bvr,
header=False)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+28 -25
View File
@@ -1,40 +1,36 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<docinit>
<registerFont fontName="ocrb" fontFile="addons/l10n_ch/report/ocrbb.ttf"/>
<registerFont fontFile="/tmp/ocrbb.ttf" expr="{'fontFile':str(police_absolute_path('addons/l10n_ch/report/ocrbb.ttf'))}" fontName="ocrb" />
</docinit>
<template pageSize="(210.0mm,297.0mm)" title="Test" author="Martin Simon" allowSplitting="20">
<pageTemplate id="first">
<pageGraphics>
<setFont name="Helvetica" size="30"/>
<fill color="darkblue"/>
<stroke color="darkblue"/>
<drawString x="1cm" y="27.8cm">[[ company.partner_id.name ]]</drawString>
<lines>1cm 27.7cm 20cm 27.7cm</lines>
<!-- You Logo - Change X,Y,Width and Height -->
<image x="1.3cm" y="27.6cm" height="40.0" >[[company.logo or removeParentNode('image')]]</image>
<setFont name="Helvetica" size="8"/>
<fill color="black"/>
<stroke color="black"/>
<lines>1.3cm 27.7cm 20cm 27.7cm</lines>
<setFont name="Helvetica" size="10"/>
<drawRightString x="20cm" y="27.8cm">[[ company.rml_header1 ]]</drawRightString>
<drawString x="1cm" y="27.1cm">[[ company.partner_id.address[0].street ]]</drawString>
<drawString x="1cm" y="26.7cm">[[ company.partner_id.address[0].zip ]] [[ company.partner_id.address[0].city ]]</drawString>
<drawString x="17cm" y="27.1cm">TVA:</drawString>
<drawString x="18cm" y="27.1cm">[[ company.partner_id.vat ]]</drawString>
<drawString x="1cm" y="26.2cm">Phone:</drawString>
<drawRightString x="7cm" y="26.2cm">[[ company.partner_id.address[0].phone ]]</drawRightString>
<drawString x="1cm" y="25.8cm">Mail:</drawString>
<drawRightString x="7cm" y="25.8cm">[[ company.partner_id.address[0].email ]]</drawRightString>
<lines>1cm 25.7cm 7cm 25.7cm</lines>
</pageGraphics>
<drawRightString x="20cm" y="27.8cm">[[ company.rml_header1 ]] </drawRightString>
<drawString x="1.3cm" y="27.2cm">[[ company.partner_id.name ]]</drawString>
<drawString x="1.3cm" y="26.8cm">[[ company.partner_id.address and company.partner_id.address[0].street or '' ]]</drawString>
<drawString x="1.3cm" y="26.4cm">[[ company.partner_id.address and company.partner_id.address[0].zip or '' ]] [[ company.partner_id.address and company.partner_id.address[0].city or '' ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name or '']]</drawString>
<drawString x="1.3cm" y="26.0cm">Phone:</drawString>
<drawRightString x="7cm" y="26.0cm">[[ company.partner_id.address and company.partner_id.address[0].phone or '' ]]</drawRightString>
<drawString x="1.3cm" y="25.6cm">Mail:</drawString>
<drawRightString x="7cm" y="25.6cm">[[ company.partner_id.address and company.partner_id.address[0].email or '' ]]</drawRightString>
<lines>1.3cm 25.5cm 7cm 25.5cm</lines>
</pageGraphics>
<frame id="first" x1="24.0" y1="111.5mm" width="190mm" height="142mm" last="1"/>
<frame id="Frame1"
expr="{'height':str(111+(company.bvr_delta_vert or 0.0))+'mm', 'x1': str((company.bvr_delta_horz or 0.0))+'mm'}"
x1="0mm"
y1="0mm"
y1="-5"
width="210mm"
height="106mm"/>
height="111mm"/>
</pageTemplate>
</template>
@@ -116,6 +112,12 @@
-->
<illustration width="210mm" height="106mm">
<setFont name="Helvetica" size="11"/>
<drawString x="2mm" y="93mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.name or '' ]]</drawString>
<drawString x="2mm" y="88mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.zip or '']] [[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.city or '']]</drawString>
<drawString x="62mm" y="93mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.name or '' ]]</drawString>
<drawString x="62mm" y="88mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.zip or '']] [[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.city or '']]</drawString>
<drawString x="2mm" y="78mm"> [[ user.company_id.partner_id.name ]]</drawString>
<drawString x="2mm" y="73mm"> [[ user.company_id.partner_id.address[0].street ]]</drawString>
<drawString x="2mm" y="68mm"> [[ (user.company_id.partner_id.address[0].street2 or '')]]</drawString>
@@ -145,10 +147,11 @@
<drawString x="124mm" y="67mm">[[ _space(_get_ref(o)) ]]</drawString>
<setFont name="ocrb" size="12"/>
<drawRightString x="52 mm" y="59.3mm">[[ o.partner_bank and o.partner_bank.printAccount and o.partner_bank.bvr_number or '' ]]</drawRightString>
<drawRightString x="112mm" y="59.3mm">[[ o.partner_bank and o.partner_bank.printAccount and o.partner_bank.bvr_number or '' ]]</drawRightString>
<drawRightString x="42mm" y="50mm">[[ _space(('%.2f' % o.amount_total)[:-3], 1) + ' ' ]]</drawRightString>
<drawRightString x="104mm" y="50mm">[[ _space(('%.2f' % o.amount_total)[:-3], 1) + ' ' ]]</drawRightString>
<drawRightString x="114 mm" y="59.3mm">[[ o.partner_bank and o.partner_bank.printAccount and o.partner_bank.bvr_number or '' ]]</drawRightString>
<drawRightString x="58mm" y="50mm">[[ _space(('%.2f' % o.amount_total)[-2:], 1) + ' ' ]]</drawRightString>
<drawRightString x="119mm" y="50mm">[[ _space(('%.2f' % o.amount_total)[-2:], 1) + ' ' ]]</drawRightString>
+34 -29
View File
@@ -1,41 +1,40 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<docinit>
<registerFont fontName="ocrb" fontFile="addons/l10n_ch/report/ocrbb.ttf"/>
<registerFont fontFile="/tmp/ocrbb.ttf" expr="{'fontFile':str(police_absolute_path('addons/l10n_ch/report/ocrbb.ttf'))}" fontName="ocrb" />
</docinit>
<template pageSize="(210.0mm,297.0mm)" title="Test" author="Martin Simon" allowSplitting="20">
<pageTemplate id="first">
<pageGraphics>
<!--logo-->
<setFont name="Helvetica" size="30"/>
<fill color="darkblue"/>
<stroke color="darkblue"/>
<drawString x="1cm" y="27.8cm">[[ company.partner_id.name ]]</drawString>
<lines>1cm 27.7cm 20cm 27.7cm</lines>
<!-- You Logo - Change X,Y,Width and Height -->
<image x="1.3cm" y="27.6cm" height="40.0" >[[company.logo or removeParentNode('image')]]</image>
<setFont name="Helvetica" size="8"/>
<fill color="black"/>
<stroke color="black"/>
<lines>1.3cm 27.7cm 20cm 27.7cm</lines>
<setFont name="Helvetica" size="10"/>
<drawRightString x="20cm" y="27.8cm">[[ company.rml_header1 ]]</drawRightString>
<drawRightString x="20cm" y="27.8cm">[[ company.rml_header1 ]]</drawRightString>
<drawString x="1cm" y="27.1cm">[[ company.partner_id.address and company.partner_id.address[0].street ]]</drawString>
<drawString x="1cm" y="26.7cm">[[ company.partner_id.address and company.partner_id.address[0].zip ]] [[ company.partner_id.address and company.partner_id.address[0].city ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name ]]</drawString>
<drawString x="17cm" y="27.1cm">TVA:</drawString>
<drawString x="18cm" y="27.1cm">[[ company.partner_id.vat ]]</drawString>
<drawString x="1cm" y="26.2cm">Phone:</drawString>
<drawRightString x="7cm" y="26.2cm">[[ company.partner_id.address and company.partner_id.address[0].phone ]]</drawRightString>
<drawString x="1cm" y="25.8cm">Mail:</drawString>
<drawRightString x="7cm" y="25.8cm">[[ company.partner_id.address and company.partner_id.address[0].email ]]</drawRightString>
<lines>1cm 25.7cm 7cm 25.7cm</lines>
</pageGraphics>
<!-- end of header -->
<drawString x="1.3cm" y="27.2cm">[[ company.partner_id.name ]]</drawString>
<drawString x="1.3cm" y="26.8cm">[[ company.partner_id.address and company.partner_id.address[0].street or '' ]]</drawString>
<drawString x="1.3cm" y="26.4cm">[[ company.partner_id.address and company.partner_id.address[0].zip or '' ]] [[ company.partner_id.address and company.partner_id.address[0].city or '' ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name or '']]</drawString>
<drawString x="1.3cm" y="26.0cm">Phone:</drawString>
<drawRightString x="7cm" y="26.0cm">[[ company.partner_id.address and company.partner_id.address[0].phone or '' ]]</drawRightString>
<drawString x="1.3cm" y="25.6cm">Mail:</drawString>
<drawRightString x="7cm" y="25.6cm">[[ company.partner_id.address and company.partner_id.address[0].email or '' ]]</drawRightString>
<lines>1.3cm 25.5cm 7cm 25.5cm</lines>
<drawCentredString x="10.5cm" y="0.8cm">Contact : [[ user.name ]] - Page: <pageNumber/></drawCentredString>
</pageGraphics> <!-- end of header -->
<frame id="first" x1="24.0" y1="111.5mm" width="190mm" height="142mm" last="1"/>
<frame id="Frame1"
expr="{'height':str(111+(company.bvr_delta_vert or 0.0))+'mm', 'x1': str((company.bvr_delta_horz or 0.0))+'mm'}"
x1="0mm"
y1="0mm"
y1="-5"
width="210mm"
height="106mm"/>
height="111mm"/>
</pageTemplate>
</template>
<!-- begin of core -->
@@ -189,7 +188,7 @@
</para>
<para style="P21">
<font face="Helvetica">Invoice Date: </font>
<font face="Helvetica">[[format_date(o.date_invoice)]]</font>
<font face="Helvetica">[[ o.date_invoice and format_date(o.date_invoice) or '']]</font>
</para>
<para style="P21">
<font face="Helvetica">Remarque:</font>
@@ -248,19 +247,18 @@
</td>
</tr>
</blockTable>
<blockTable colWidths="28.0,499.0" style="Table4">
<blockTable colWidths="28.0, 499.0" style="Table4">
<tr>
<td>
<para style="P16">[[ repeatIn((l.note and l.note.splitlines()) or [], 'note') ]]</para>
<para style="P9">[[ note or removeParentNode('blockTable') ]]</para>
</td>
<td>
<para style="P9">[[ note or removeParentNode('table') ]]</para>
<xpre style="P16">[[ l.note ]]</xpre>
</td>
</tr>
</blockTable>
</section>
<para style="P18">
<font color="white"> </font>
</para>
<blockTable colWidths="215.0,313.0" style="Table5">
<tr>
@@ -328,6 +326,11 @@
-->
<illustration width="210mm" height="106mm">
<setFont name="Helvetica" size="11"/>
<drawString x="2mm" y="93mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.name or '' ]]</drawString>
<drawString x="2mm" y="88mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.zip or '']] [[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.city or '']]</drawString>
<drawString x="62mm" y="93mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.name or '' ]]</drawString>
<drawString x="62mm" y="88mm">[[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.zip or '']] [[ o.partner_bank and o.partner_bank.printBank and o.partner_bank.bank and o.partner_bank.bank.city or '']]</drawString>
<drawString x="2mm" y="78mm"> [[user.company_id.name]]</drawString>
<drawString x="2mm" y="73mm"> [[ user.company_id.partner_id.address[0].street ]]</drawString>
<drawString x="2mm" y="68mm"> [[ (user.company_id.partner_id.address[0].street2 or '')]]</drawString>
@@ -354,10 +357,12 @@
<setFont name="ocrb" size="11"/>
<drawString x="124mm" y="67mm">[[ _space(_get_ref(o)) ]]</drawString>
<setFont name="ocrb" size="12"/>
<drawRightString x="52 mm" y="59.3mm">[[ o.partner_bank and o.partner_bank.printAccount and o.partner_bank.bvr_number or '' ]]</drawRightString>
<drawRightString x="112mm" y="59.3mm">[[ o.partner_bank and o.partner_bank.printAccount and o.partner_bank.bvr_number or '' ]]</drawRightString>
<drawRightString x="42mm" y="50mm">[[ _space(('%.2f' % o.amount_total)[:-3], 1) + ' ' ]]</drawRightString>
<drawRightString x="104mm" y="50mm">[[ _space(('%.2f' % o.amount_total)[:-3], 1) + ' ' ]]</drawRightString>
@@ -375,4 +380,4 @@
</illustration>
</story>
</document>
</document>
-339
View File
@@ -1,339 +0,0 @@
#coding: latin-1
##############################################################################
#
# Copyright (c):
#
# 2005 pyopenoffice.py Martin Simon (http://www.bezirksreiter.de)
# 2005 Fabien Pinckaers, TINY SPRL. (http://tiny.be)
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contact a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
#!/usr/bin/python
"""
Tiny SXW2RML - The Tiny ERP's report engine
Tiny SXW2RMLis part of the Tiny report project.
Tiny Report is a module that allows you to render high quality PDF document
from an OpenOffice template (.sxw) and any relationnal database.
The whole source code is distributed under the terms of the
GNU Public Licence.
(c) 2005 pyopenoffice.py Martin Simon (http://www.bezirksreiter.de)
(c) 2005-TODAY, Fabien Pinckaers - Tiny sprl
"""
__version__ = '0.9'
import re
import string
import os
import time
import zipfile
import xml.dom.minidom
from reportlab.lib.units import toLength
import optparse
parser = optparse.OptionParser(
version="Tiny Report v%s" % __version__,
usage = 'tiny_sxw2rml.py [options] file.sxw')
parser.add_option("-v", "--verbose", default=False, dest="verbose", help="enable basic debugging")
parser.add_option("-o", "--output", dest="output", default='.', help="directory of image output")
(opt, args) = parser.parse_args()
if len(args) != 1:
parser.error("incorrect number of arguments")
class DomApiGeneral:
"""General DOM API utilities."""
def __init__(self,content_string="",file=""):
self.content_string = content_string
self.re_digits = re.compile(r"(.*?\d)(pt|cm|mm|inch|in)")
def _unitTuple(self,string):
"""Split values and units to a tuple."""
temp = self.re_digits.findall(string)
if not temp:
return (string,"")
else:
return (temp[0])
def stringPercentToFloat(self,string):
temp = string.replace("""%""","")
return float(temp)/100
def findChildrenByName(self,parent,name,attr_dict={}):
"""Helper functions. Does not work recursively.
Optional: also test for certain attribute/value pairs."""
children = []
for c in parent.childNodes:
if c.nodeType == c.ELEMENT_NODE and c.nodeName == name:
children.append(c)
if attr_dict == {}:
return children
else:
return self._selectForAttributes(nodelist=children,attr_dict=attr_dict)
def _selectForAttributes(self,nodelist,attr_dict):
"Helper function."""
selected_nodes = []
for n in nodelist:
check = 1
for a in attr_dict.keys():
if n.getAttribute(a) != attr_dict[a]:
# at least one incorrect attribute value?
check = 0
if check:
selected_nodes.append(n)
return selected_nodes
def _stringToTuple(self,s):
"""Helper function."""
try:
temp = string.split(s,",")
return int(temp[0]),int(temp[1])
except:
return None
def _tupleToString(self,t):
try:
return self.openOfficeStringUtf8("%s,%s" % (t[0],t[1]))
except:
return None
def _lengthToFloat(self,value):
v = value
if not self.re_digits.search(v):
return v
try:
if v[-4:] == "inch":
# OO files use "inch" instead of "in" in Reportlab units
v = v[:-2]
except:
pass
try:
c = round(toLength(v))
return c
except:
return v
def openOfficeStringUtf8(self,string):
if type(string) == unicode:
return string.encode("utf-8")
tempstring = unicode(string,"cp1252").encode("utf-8")
return tempstring
class DomApi(DomApiGeneral):
"""This class provides a DOM-API for XML-Files from an SXW-Archive."""
def __init__(self,xml_content,xml_styles):
DomApiGeneral.__init__(self)
self.content_dom = xml.dom.minidom.parseString(xml_content)
self.styles_dom = xml.dom.minidom.parseString(xml_styles)
body = self.content_dom.getElementsByTagName("office:body")
self.body = body and body[0]
# TODO:
self.style_dict = {}
self.style_properties_dict = {}
# ******** always use the following order:
self.buildStyleDict()
self.buildStylePropertiesDict()
self.page_master = self.styles_dom.getElementsByTagName("style:page-master")[0]
self.document = self.content_dom.getElementsByTagName("office:document-content")[0]
def buildStylePropertiesDict(self):
for s in self.style_dict.keys():
self.style_properties_dict[s] = self.getStylePropertiesDict(s)
def updateWithPercents(self,dict,updatedict):
"""Sometimes you find values like "115%" in the style hierarchy."""
if not updatedict:
# no style hierarchies for this style? =>
return
new_updatedict = copy.copy(updatedict)
for u in new_updatedict.keys():
try:
if new_updatedict[u].find("""%""") != -1 and dict.has_key(u):
number = float(self.re_digits.search(dict[u]).group(1))
unit = self.re_digits.search(dict[u]).group(2)
new_number = self.stringPercentToFloat(new_updatedict[u]) * number
if unit == "pt":
new_number = int(new_number)
# no floats allowed for "pt"
# OOo just takes the int, does not round (try it out!)
new_updatedict[u] = "%s%s" % (new_number,unit)
else:
dict[u] = new_updatedict[u]
except:
dict[u] = new_updatedict[u]
dict.update(new_updatedict)
def normalizeStyleProperties(self):
"""Transfer all style:style-properties attributes from the
self.style_properties_hierarchical dict to the automatic-styles
from content.xml. Use this function to preprocess content.xml for
XSLT transformations etc.Do not try to implement this function
with XSlT - believe me, it's a terrible task..."""
styles_styles = self.styles_dom.getElementsByTagName("style:style")
automatic_styles = self.content_dom.getElementsByTagName("office:automatic-styles")[0]
for s in styles_styles:
automatic_styles.appendChild(s.cloneNode(deep=1))
content_styles = self.content_dom.getElementsByTagName("style:style")
# these are the content_styles with styles_styles added!!!
for s in content_styles:
c = self.findChildrenByName(s,"style:properties")
if c == []:
# some derived automatic styles do not have "style:properties":
temp = self.content_dom.createElement("style:properties")
s.appendChild(temp)
c = self.findChildrenByName(s,"style:properties")
c = c[0]
dict = self.style_properties_dict[(s.getAttribute("style:name")).encode("latin-1")] or {}
for attribute in dict.keys():
c.setAttribute(self.openOfficeStringUtf8(attribute),self.openOfficeStringUtf8(dict[attribute]))
def transferStylesXml(self):
"""Transfer certain sub-trees from styles.xml to the normalized content.xml
(see above). It is not necessary to do this - for example - with paragraph styles.
the "normalized" style properties contain all information needed for
further processing."""
# TODO: What about table styles etc.?
page_master = self.page_master
outline_styles = self.styles_dom.getElementsByTagName("text:outline-style")
t = self.content_dom.createElement("transferredfromstylesxml")
self.document.insertBefore(t,self.body)
t_new = self.body.previousSibling
try:
t_new.appendChild(page_master.cloneNode(deep=1))
t_new.appendChild(outline_styles[0].cloneNode(deep=1))
except:
pass
def normalizeLength(self):
"""Normalize all lengthes to floats (i.e: 1 inch = 72).
Always use this after "normalizeContent" and "transferStyles"!"""
# TODO: The complex attributes of table cell styles are not transferred yet.
#all_styles = self.content_dom.getElementsByTagName("style:properties")
#all_styles += self.content_dom.getElementsByTagName("draw:image")
all_styles = self.content_dom.getElementsByTagName("*")
for s in all_styles:
for x in s._attrs.keys():
v = s.getAttribute(x)
s.setAttribute(x,"%s" % self._lengthToFloat(v))
# convert float to string first!
def normalizeTableColumns(self):
"""Handle this strange table:number-columns-repeated attribute."""
columns = self.content_dom.getElementsByTagName("table:table-column")
for c in columns:
if c.hasAttribute("table:number-columns-repeated"):
number = int(c.getAttribute("table:number-columns-repeated"))
c.removeAttribute("table:number-columns-repeated")
for i in range(number-1):
(c.parentNode).insertBefore(c.cloneNode(deep=1),c)
def buildStyleDict(self):
"""Store all style:style-nodes from content.xml and styles.xml in self.style_dict.
Caution: in this dict the nodes from two dom apis are merged!"""
for st in (self.styles_dom,self.content_dom):
for s in st.getElementsByTagName("style:style"):
name = s.getAttribute("style:name").encode("latin-1")
self.style_dict[name] = s
return True
def toxml(self):
return self.content_dom.toxml(encoding="utf-8")
def getStylePropertiesDict(self,style_name):
res = {}
if self.style_dict[style_name].hasAttribute("style:parent-style-name"):
parent = self.style_dict[style_name].getAttribute("style:parent-style-name").encode("latin-1")
res = self.getStylePropertiesDict(parent)
childs = self.style_dict[style_name].childNodes
for c in childs:
if c.nodeType == c.ELEMENT_NODE and c.nodeName == "style:properties":
for attr in c._attrs.keys():
res[attr] = c.getAttribute(attr).encode("latin-1")
return res
class PyOpenOffice(object):
"""This is the main class which provides all functionality."""
def __init__(self, path='.'):
self.path = path
def oo_read(self,fname):
z = zipfile.ZipFile(fname,"r")
content = z.read('content.xml')
style = z.read('styles.xml')
all = z.namelist()
for a in all:
if a[:9]=='Pictures/' and len(a)>10:
pic_content = z.read(a)
f=open(os.path.join(self.path, os.path.basename(a)),"wb")
f.write(pic_content)
f.close()
z.close()
return content,style
def oo_replace(self,content):
regex = [
(r"<para[^>]*/>", ""),
#(r"<text:ordered-list.*?>(.*?)</text:ordered-list>", "$1"),
#(r"<text:unordered-list.*?>(.*?)</text:unordered-list>", "$1"),
(r"<para(.*)>(.*?)<text:line-break[^>]*/>", "<para$1>$2</para><para$1>"),
]
for key,val in regex:
content = re.sub(key, val, content)
return content
def unpackNormalize(self,sourcefile):
c,s = self.oo_read(sourcefile)
c = self.oo_replace(c)
dom = DomApi(c,s)
dom.normalizeStyleProperties()
dom.transferStylesXml()
dom.normalizeLength()
dom.normalizeTableColumns()
new_c = dom.toxml()
return new_c
if __name__ == "__main__":
import sys
import libxslt
import libxml2
f = sys.argv[1]
tool = PyOpenOffice(opt.output)
res = tool.unpackNormalize(f)
styledoc = libxml2.parseFile('normalized_oo2rml.xsl')
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseMemory(res,len(res))
result = style.applyStylesheet(doc, None)
xml = style.saveResultToString(result)
print xml
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+187 -187
View File
@@ -39,215 +39,215 @@ from tools.translate import _
ASK_FORM = """<?xml version="1.0"?>
<form string="BVR Import">
<field name="file"/>
<field name="file"/>
</form>"""
ASK_FIELDS = {
'file': {
'string': 'BVR file',
'type': 'binary',
'required': True,
},
'file': {
'string': 'BVR file',
'type': 'binary',
'required': True,
},
}
def _reconstruct_invoice_ref(cursor, user, reference, context):
###
id_invoice = False
# On fait d'abord une recherche sur toutes les factures
# we now searhc for company
user_obj=pooler.get_pool(cursor.dbname).get('res.users')
user_current=user_obj.browse(cursor, user, user)
##
cursor.execute("SELECT inv.id,inv.number from account_invoice AS inv where inv.company_id = " + str(user_current.company_id.id))
result_invoice = cursor.fetchall()
for inv_id,inv_name in result_invoice:
inv_name = re.sub('[^0-9]', '0', str(inv_name))
if inv_name == reference:
id_invoice = inv_id
break
if id_invoice:
cursor.execute('SELECT l.id ' \
'FROM account_move_line l, account_invoice i ' \
'WHERE l.move_id = i.move_id AND l.reconcile_id is NULL ' \
'AND i.id in (' + ','.join([str(x) for x in [id_invoice]]) + ')')
inv_line = []
for id_line in cursor.fetchall():
inv_line.append(id_line[0])
return inv_line
else:
return []
return True
###
id_invoice = False
# On fait d'abord une recherche sur toutes les factures
# we now searhc for company
user_obj=pooler.get_pool(cursor.dbname).get('res.users')
user_current=user_obj.browse(cursor, user, user)
##
cursor.execute("SELECT inv.id,inv.number from account_invoice AS inv where inv.company_id = " + str(user_current.company_id.id))
result_invoice = cursor.fetchall()
for inv_id,inv_name in result_invoice:
inv_name = re.sub('[^0-9]', '0', str(inv_name))
if inv_name == reference:
id_invoice = inv_id
break
if id_invoice:
cursor.execute('SELECT l.id ' \
'FROM account_move_line l, account_invoice i ' \
'WHERE l.move_id = i.move_id AND l.reconcile_id is NULL ' \
'AND i.id in (' + ','.join([str(x) for x in [id_invoice]]) + ')')
inv_line = []
for id_line in cursor.fetchall():
inv_line.append(id_line[0])
return inv_line
else:
return []
return True
def _import(obj, cursor, user, data, context):
pool = pooler.get_pool(cursor.dbname)
statement_line_obj = pool.get('account.bank.statement.line')
statement_reconcile_obj = pool.get('account.bank.statement.reconcile')
move_line_obj = pool.get('account.move.line')
property_obj = pool.get('ir.property')
model_fields_obj = pool.get('ir.model.fields')
attachment_obj = pool.get('ir.attachment')
file = data['form']['file']
statement_id = data['id']
pool = pooler.get_pool(cursor.dbname)
statement_line_obj = pool.get('account.bank.statement.line')
statement_reconcile_obj = pool.get('account.bank.statement.reconcile')
move_line_obj = pool.get('account.move.line')
property_obj = pool.get('ir.property')
model_fields_obj = pool.get('ir.model.fields')
attachment_obj = pool.get('ir.attachment')
file = data['form']['file']
statement_id = data['id']
records = []
total_amount = 0
total_cost = 0
find_total = False
records = []
total_amount = 0
total_cost = 0
find_total = False
for lines in base64.decodestring(file).split("\n"):
# Manage files without carriage return
while lines:
(line, lines) = (lines[:128], lines[128:])
record = {}
for lines in base64.decodestring(file).split("\n"):
# Manage files without carriage return
while lines:
(line, lines) = (lines[:128], lines[128:])
record = {}
if line[0:3] in ('999', '995'):
if find_total:
raise wizard.except_wizard(_('Error'),
_('Too much total record found!'))
find_total = True
if lines:
raise wizard.except_wizard(_('Error'),
_('Record found after total record!'))
amount = float(line[39:49]) + (float(line[49:51]) / 100)
cost = float(line[69:76]) + (float(line[76:78]) / 100)
if line[2] == '5':
amount *= -1
cost *= -1
if line[0:3] in ('999', '995'):
if find_total:
raise wizard.except_wizard(_('Error'),
_('Too much total record found!'))
find_total = True
if lines:
raise wizard.except_wizard(_('Error'),
_('Record found after total record!'))
amount = float(line[39:49]) + (float(line[49:51]) / 100)
cost = float(line[69:76]) + (float(line[76:78]) / 100)
if line[2] == '5':
amount *= -1
cost *= -1
if round(amount - total_amount, 2) >= 0.01 \
or round(cost - total_cost, 2) >= 0.01:
raise wizard.except_wizard(_('Error'),
_('Total record different from the computed!'))
if int(line[51:63]) != len(records):
raise wizard.except_wizard(_('Error'),
_('Number record different from the computed!'))
else:
record = {
'reference': line[12:39],
'amount': float(line[39:47]) + (float(line[47:49]) / 100),
'date': time.strftime('%Y-%m-%d',
time.strptime(line[65:71], '%y%m%d')),
'cost': float(line[96:98]) + (float(line[98:100]) / 100),
}
if round(amount - total_amount, 2) >= 0.01 \
or round(cost - total_cost, 2) >= 0.01:
raise wizard.except_wizard(_('Error'),
_('Total record different from the computed!'))
if int(line[51:63]) != len(records):
raise wizard.except_wizard(_('Error'),
_('Number record different from the computed!'))
else:
record = {
'reference': line[12:39],
'amount': float(line[39:47]) + (float(line[47:49]) / 100),
'date': time.strftime('%Y-%m-%d',
time.strptime(line[65:71], '%y%m%d')),
'cost': float(line[96:98]) + (float(line[98:100]) / 100),
}
if record['reference'] != mod10r(record['reference'][:-1]):
raise wizard.except_wizard(_('Error'),
_('Recursive mod10 is invalid for reference: %s') % \
record['reference'])
if record['reference'] != mod10r(record['reference'][:-1]):
raise wizard.except_wizard(_('Error'),
_('Recursive mod10 is invalid for reference: %s') % \
record['reference'])
if line[2] == '5':
record['amount'] *= -1
record['cost'] *= -1
total_amount += record['amount']
total_cost += record['cost']
records.append(record)
if line[2] == '5':
record['amount'] *= -1
record['cost'] *= -1
total_amount += record['amount']
total_cost += record['cost']
records.append(record)
model_fields_ids = model_fields_obj.search(cursor, user, [
('name', 'in', ['property_account_receivable', 'property_account_payable']),
('model', '=', 'res.partner'),
], context=context)
property_ids = property_obj.search(cursor, user, [
('fields_id', 'in', model_fields_ids),
('res_id', '=', False),
], context=context)
model_fields_ids = model_fields_obj.search(cursor, user, [
('name', 'in', ['property_account_receivable', 'property_account_payable']),
('model', '=', 'res.partner'),
], context=context)
property_ids = property_obj.search(cursor, user, [
('fields_id', 'in', model_fields_ids),
('res_id', '=', False),
], context=context)
account_receivable = False
account_payable = False
for property in property_obj.browse(cursor, user, property_ids, context=context):
if property.fields_id.name == 'property_account_receivable':
account_receivable = int(property.value.split(',')[1])
elif property.fields_id.name == 'property_account_payable':
account_payable = int(property.value.split(',')[1])
account_receivable = False
account_payable = False
for property in property_obj.browse(cursor, user, property_ids, context=context):
if property.fields_id.name == 'property_account_receivable':
account_receivable = int(property.value.split(',')[1])
elif property.fields_id.name == 'property_account_payable':
account_payable = int(property.value.split(',')[1])
for record in records:
# Remove the 11 first char because it can be adherent number
# TODO check if 11 is the right number
reference = record['reference'][11:-1].lstrip('0')
values = {
'name': 'IN '+ reference,
'date': record['date'],
'amount': record['amount'],
'ref': reference,
'type': (record['amount'] >= 0 and 'customer') or 'supplier',
'statement_id': statement_id,
}
line_ids = move_line_obj.search(cursor, user, [
('ref', 'like', reference),
('reconcile_id', '=', False),
('account_id.type', 'in', ['receivable', 'payable']),
], order='date desc', context=context)
if not line_ids:
line_ids = _reconstruct_invoice_ref(cursor,user,reference,None)
line2reconcile = False
partner_id = False
account_id = False
for line in move_line_obj.browse(cursor, user, line_ids, context=context):
if line.partner_id.id:
partner_id = line.partner_id.id
if record['amount'] >= 0:
if round(record['amount'] - line.debit, 2) < 0.01:
line2reconcile = line.id
account_id = line.account_id.id
break
else:
if round(line.credit + record['amount'], 2) < 0.01:
line2reconcile = line.id
account_id = line.account_id.id
break
if not account_id:
if record['amount'] >= 0:
account_id = account_receivable
else:
account_id = account_payable
if not account_id :
raise wizard.except_wizard(_('Error'),
_('The properties account payable account receivable'))
values['account_id'] = account_id
values['partner_id'] = partner_id
for record in records:
# Remove the 11 first char because it can be adherent number
# TODO check if 11 is the right number
reference = record['reference'][11:-1].lstrip('0')
values = {
'name': 'IN '+ reference,
'date': record['date'],
'amount': record['amount'],
'ref': reference,
'type': (record['amount'] >= 0 and 'customer') or 'supplier',
'statement_id': statement_id,
}
line_ids = move_line_obj.search(cursor, user, [
('ref', 'like', reference),
('reconcile_id', '=', False),
('account_id.type', 'in', ['receivable', 'payable']),
], order='date desc', context=context)
if not line_ids:
line_ids = _reconstruct_invoice_ref(cursor,user,reference,None)
line2reconcile = False
partner_id = False
account_id = False
for line in move_line_obj.browse(cursor, user, line_ids, context=context):
if line.partner_id.id:
partner_id = line.partner_id.id
if record['amount'] >= 0:
if round(record['amount'] - line.debit, 2) < 0.01:
line2reconcile = line.id
account_id = line.account_id.id
break
else:
if round(line.credit + record['amount'], 2) < 0.01:
line2reconcile = line.id
account_id = line.account_id.id
break
if not account_id:
if record['amount'] >= 0:
account_id = account_receivable
else:
account_id = account_payable
if not account_id :
raise wizard.except_wizard(_('Error'),
_('The properties account payable account receivable'))
values['account_id'] = account_id
values['partner_id'] = partner_id
if line2reconcile:
values['reconcile_id'] = statement_reconcile_obj.create(cursor, user, {
'line_ids': [(6, 0, [line2reconcile])],
}, context=context)
if line2reconcile:
values['reconcile_id'] = statement_reconcile_obj.create(cursor, user, {
'line_ids': [(6, 0, [line2reconcile])],
}, context=context)
statement_line_obj.create(cursor, user, values, context=context)
attachment_obj.create(cursor, user, {
'name': 'BVR',
'datas': file,
'datas_fname': 'BVR.txt',
'res_model': 'account.bank.statement',
'res_id': statement_id,
}, context=context)
return {}
statement_line_obj.create(cursor, user, values, context=context)
attachment_obj.create(cursor, user, {
'name': 'BVR',
'datas': file,
'datas_fname': 'BVR.txt',
'res_model': 'account.bank.statement',
'res_id': statement_id,
}, context=context)
return {}
class BVRImport(wizard.interface):
states = {
'init': {
'actions': [],
'result': {
'type': 'form',
'arch': ASK_FORM,
'fields': ASK_FIELDS,
'state': [
('end', 'Cancel', 'gtk-cancel'),
('import', 'Import', 'gtk-ok', True),
],
},
},
'import': {
'actions': [],
'result': {
'type': 'action',
'action': _import,
'state': 'end',
},
},
}
states = {
'init': {
'actions': [],
'result': {
'type': 'form',
'arch': ASK_FORM,
'fields': ASK_FIELDS,
'state': [
('end', 'Cancel', 'gtk-cancel'),
('import', 'Import', 'gtk-ok', True),
],
},
},
'import': {
'actions': [],
'result': {
'type': 'action',
'action': _import,
'state': 'end',
},
},
}
BVRImport('l10n_ch.bvr_import')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -31,7 +31,7 @@ from report import report_sxw
class base_report(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(base_report, self).__init__(cr, uid, name, context)
super(base_report, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
'_load': self._load,
+4
View File
@@ -363,6 +363,8 @@ class mrp_production(osv.osv):
parent_move_line=get_parent_move(production['move_prod_id'][0])
if parent_move_line:
move = move_obj.browse(cr,uid,parent_move_line)
#TODO: fix me sale module can not be used here,
#as may be mrp can be installed without sale module
if field_name=='name':
res[production['id']]=move.sale_line_id and move.sale_line_id.order_id.name or False
if field_name=='client_order_ref':
@@ -978,6 +980,8 @@ class mrp_procurement(osv.osv):
def action_confirm(self, cr, uid, ids, context={}):
for procurement in self.browse(cr, uid, ids):
if procurement.product_qty <= 0.00:
raise osv.except_osv(_('Data Insufficient !'), _('Please check the Quantity of Procurement Order(s), it should not be less than 1!'))
if procurement.product_id.type in ('product', 'consu'):
if not procurement.move_id:
source = procurement.location_id.id
+1 -1
View File
@@ -26,7 +26,7 @@ import pooler
class order(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(order, self).__init__(cr, uid, name, context)
super(order, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
@@ -25,7 +25,7 @@ from report import report_sxw
class code_barcode(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(code_barcode, self).__init__(cr, uid, name, context)
super(code_barcode, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
@@ -25,7 +25,7 @@ from report import report_sxw
class workcenter_code(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(workcenter_code, self).__init__(cr, uid, name, context)
super(workcenter_code, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
})
+1 -1
View File
@@ -26,7 +26,7 @@ import pooler
class order(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(order, self).__init__(cr, uid, name, context)
super(order, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'total': self.total,
+1 -1
View File
@@ -111,7 +111,7 @@ class pos_details(report_sxw.rml_parse):
return '%s - %s' % (min_date, max_date)
def __init__(self, cr, uid, name, context):
super(pos_details, self).__init__(cr, uid, name, context)
super(pos_details, self).__init__(cr, uid, name, context=context)
self.total = 0.0
self.localcontext.update({
'time': time,

Some files were not shown because too many files have changed in this diff Show More