diff options
| author | Mustufa Rangwala <mra@mra-laptop> | 2010-07-15 09:02:43 +0530 |
|---|---|---|
| committer | Mustufa Rangwala <mra@mra-laptop> | 2010-07-15 09:02:43 +0530 |
| commit | e882dd1177aae0ce5bcffaaa4ba59436d417cbe0 (patch) | |
| tree | 8b574ad238f592433e74e8ec76ea93aabe813d00 | |
| parent | ba0d8c7e7eafd2b20b8812afbe3602b356e9b581 (diff) | |
| parent | 70860df207440f3d638ba43bfb28f643c33ca933 (diff) | |
[MERGE] Merge with main branch
bzr revid: mra@mra-laptop-20100714072332-7ycx327rn1jogv68
bzr revid: mra@mra-laptop-20100714092142-9kdl5qtzs3cuc2o1
bzr revid: mra@mra-laptop-20100714110809-p0yvxwry1ra1v6ek
bzr revid: mra@mra-laptop-20100714130841-hoaenqsigi2bx9ce
bzr revid: mra@mra-laptop-20100715033243-5swxnpy11l3m02b2
67 files changed, 2755 insertions, 431 deletions
diff --git a/addons/account/account.py b/addons/account/account.py index 73e1fdd0b7e..6aa47551a98 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1746,7 +1746,12 @@ class account_tax(osv.osv): tin = self.compute_inv(cr, uid, tin, price_unit, quantity, address_id=address_id, product=product, partner=partner) for r in tin: totalex -= r['amount'] - tex = self._compute(cr, uid, tex, totalex/quantity, quantity, address_id=address_id, product=product, partner=partner) + totlex_qty=0.0 + try: + totlex_qty=totalex/quantity + except: + pass + tex = self._compute(cr, uid, tex, totlex_qty, quantity, address_id=address_id, product=product, partner=partner) for r in tex: totalin += r['amount'] return { diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 99d1181fb7b..6fe0182b584 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -147,7 +147,7 @@ <field name="number" readonly="1"/> <field name="type" invisible="1"/> <field name="currency_id" domain="[('company_id','=', company_id)]" on_change="onchange_currency_id(currency_id, company_id)" width="50"/> - <button name="%(action_account_change_currency)d" type="action" icon="gtk-apply" string="Change"/> + <button name="%(action_account_change_currency)d" type="action" icon="terp-stock_effects-object-colorize" string="Change"/> <newline/> <field name="partner_id" domain="[('supplier','=', 1)]" on_change="onchange_partner_id(type,partner_id,date_invoice,payment_term, partner_bank,company_id)" context="{'default_customer': 0}"/> <field domain="[('partner_id','=',partner_id)]" name="address_invoice_id"/> @@ -202,7 +202,7 @@ <field name="state"/> <field name="residual"/> <group col="3" colspan="4"> - <button name="invoice_open" states="draft,proforma2" string="Validate" icon="terp-camera_test"/> + <button name="invoice_open" states="draft,proforma2" string="Approve" icon="terp-camera_test"/> <button name="%(action_account_invoice_pay)d" type='action' string='Pay Invoice' states='open' icon="gtk-ok"/> <button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" icon="terp-gtk-stop"/> <button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object" icon="terp-stock_effects-object-colorize"/> diff --git a/addons/account/account_invoice_workflow.xml b/addons/account/account_invoice_workflow.xml index 4c919765596..917f004e7f0 100644 --- a/addons/account/account_invoice_workflow.xml +++ b/addons/account/account_invoice_workflow.xml @@ -42,7 +42,7 @@ write({'state':'open'})</field> </record> <record model="workflow.activity" id="act_open_test"> <field name="wkf_id" ref="wkf"/> - <field name="name">open</field> + <field name="name">re-open</field> <field name="action">write({'state':'open'})</field> <field name="kind">function</field> </record> @@ -124,7 +124,15 @@ write({'state':'cancel'})</field> <field name="act_to" ref="act_cancel"/> <field name="signal">invoice_cancel</field> </record> - + + <record id="open_test_to_paid" model="workflow.transition"> + <field name="act_from" ref="act_open_test"/> + <field name="act_to" ref="act_paid"/> + <field name="trigger_model">account.move.line</field> + <field name="trigger_expr_id">move_line_id_payment_get()</field> + <field name="condition">test_paid()</field> + </record> + <record id="draft_to_pro2" model="workflow.transition"> <field name="act_from" ref="account.act_draft"/> <field name="act_to" ref="act_proforma2"/> diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 21b13a244d8..1eb238fa04f 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -1059,7 +1059,7 @@ <field name="to_check" groups="base.group_extended"/> <field name="amount"/> <field name="state"/> - <button name="button_validate" states="draft" string="Validate" type="object" icon="terp-camera_test"/> + <button name="button_validate" states="draft" string="Approve" type="object" icon="terp-camera_test"/> </tree> </field> </record> @@ -1127,7 +1127,7 @@ <field name="narration" colspan="4" nolabel="1"/> <field name="state" select="1"/> <group col="2" colspan="2"> - <button name="button_validate" states="draft" string="Validate" type="object" icon="terp-camera_test"/> + <button name="button_validate" states="draft" string="Approve" type="object" icon="terp-camera_test"/> <button name="button_cancel" states="posted" string="Cancel" type="object" icon="terp-gtk-stop"/> </group> </page> diff --git a/addons/account/demo/account_minimal.xml b/addons/account/demo/account_minimal.xml index abae5562b2c..e18dab2d332 100644 --- a/addons/account/demo/account_minimal.xml +++ b/addons/account/demo/account_minimal.xml @@ -82,21 +82,21 @@ </record> <record model="account.account" id="assets_view"> - <field name="name">Assets - (test)</field> - <field name="code">X10</field> - <field name="type">view</field> - <field name="user_type" ref="account_type_asset"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="bal"/> + <field name="name">Assets - (test)</field> + <field name="code">X10</field> + <field name="type">view</field> + <field name="user_type" ref="account_type_asset"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="bal"/> </record> <record model="account.account" id="liabilities_view"> - <field name="name">Liabilities - (test)</field> - <field name="code">X11</field> - <field name="type">view</field> - <field name="user_type" ref="account_type_liability"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="bal"/> + <field name="name">Liabilities - (test)</field> + <field name="code">X11</field> + <field name="type">view</field> + <field name="user_type" ref="account_type_liability"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="bal"/> </record> <record id="fas" model="account.account"> @@ -208,23 +208,32 @@ </record> <record model="account.account" id="income_view"> - <field name="name">Income - (test)</field> - <field name="code">X20</field> - <field name="type">view</field> - <field name="user_type" ref="account_type_income"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="gpf"/> + <field name="name">Income - (test)</field> + <field name="code">X20</field> + <field name="type">view</field> + <field name="user_type" ref="account_type_income"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="gpf"/> + </record> + + <record model="account.account" id="income_fx_income"> + <field name="name">Foreign Exchange Gain - (test)</field> + <field name="code">X201</field> + <field name="type">other</field> + <field name="user_type" ref="account_type_income"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="income_view"/> </record> <record model="account.account" id="expense_view"> - <field name="name">Expense - (test)</field> - <field name="code">X21</field> - <field name="type">view</field> - <field name="user_type" ref="account_type_expense"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="gpf"/> + <field name="name">Expense - (test)</field> + <field name="code">X21</field> + <field name="type">view</field> + <field name="user_type" ref="account_type_expense"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="gpf"/> </record> - + <record id="rev" model="account.account"> <field name="code">X200</field> <field name="name">Revenue - (test)</field> @@ -273,6 +282,14 @@ <field name="user_type" ref="account_type_expense"/> </record> + <record model="account.account" id="income_fx_expense"> + <field name="name">Foreign Exchange Loss - (test)</field> + <field name="code">X2111</field> + <field name="type">other</field> + <field name="user_type" ref="account_type_expense"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="ovr"/> + </record> <!-- Properties --> <record forcecreate="True" id="property_account_receivable" model="ir.property"> diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 423c39deea1..e2700a4e4b1 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -892,6 +892,7 @@ class account_invoice(osv.osv): self.write(cr, uid, [inv.id], {'move_id': move_id,'period_id':period_id, 'move_name':new_move_name}) self.pool.get('account.move').post(cr, uid, [move_id]) self._log_event(cr, uid, ids) + return True def line_get_convert(self, cr, uid, x, part, date, context=None): @@ -916,12 +917,12 @@ class account_invoice(osv.osv): } def action_number(self, cr, uid, ids, *args): - cr.execute('SELECT id, type, number, move_id, reference ' \ - 'FROM account_invoice ' \ - 'WHERE id IN %s', - (tuple(ids),)) - obj_inv = self.browse(cr, uid, ids)[0] - for (id, invtype, number, move_id, reference) in cr.fetchall(): + for obj_inv in self.browse(cr, uid, ids): + id = obj_inv.id + invtype = obj_inv.type + number = obj_inv.number + move_id = obj_inv.move_id and obj_inv.move_id.id or False + reference = obj_inv.reference if not number: if obj_inv.journal_id.invoice_sequence_id: sid = obj_inv.journal_id.invoice_sequence_id.id @@ -946,6 +947,8 @@ class account_invoice(osv.osv): 'WHERE account_move_line.move_id = %s ' \ 'AND account_analytic_line.move_id = account_move_line.id', (ref, move_id)) + message = _('Invoice ') + " '" + number + "' "+ _("is confirm") + self.log(cr, uid, id, message) return True def action_cancel(self, cr, uid, ids, *args): diff --git a/addons/account/wizard/account_validate_move_view.xml b/addons/account/wizard/account_validate_move_view.xml index 232a924dbd9..8c8284e3b11 100644 --- a/addons/account/wizard/account_validate_move_view.xml +++ b/addons/account/wizard/account_validate_move_view.xml @@ -16,7 +16,7 @@ <field name="period_id"/> <group colspan="4" col="6"> <button icon="gtk-cancel" special="cancel" string="Cancel"/> - <button icon="terp-camera_test" string="Validate" name="validate_move" type="object"/> + <button icon="terp-camera_test" string="Approve" name="validate_move" type="object"/> </group> </form> </field> @@ -47,7 +47,7 @@ <form string="Validate Moves"> <separator string="Validate Ledger Postings" colspan="4"/> <button special="cancel" string="Cancel" icon="gtk-cancel"/> - <button name="validate_move_lines" string="Validate" type="object" icon="gtk-go-forward" default_focus="1"/> + <button name="validate_move_lines" string="Approve" type="object" icon="gtk-go-forward" default_focus="1"/> </form> </field> </record> diff --git a/addons/account_budget/crossovered_budget_view.xml b/addons/account_budget/crossovered_budget_view.xml index 81c5e67f961..c022eca0c68 100644 --- a/addons/account_budget/crossovered_budget_view.xml +++ b/addons/account_budget/crossovered_budget_view.xml @@ -148,7 +148,7 @@ <field name="state" select="1"/> <group col="4" colspan="2"> <button string="Confirm" name="confirm" states="draft" type="workflow" icon="gtk-apply" /> - <button string="Validate" name="validate" states="confirm" type="workflow" icon="gtk-ok"/> + <button string="Approve" name="validate" states="confirm" type="workflow" icon="gtk-ok"/> <button string="Done" name="done" states="validate" type="workflow" icon="gtk-jump-to" /> <button string="Cancel" name="cancel" states="confirm,validate" type="workflow" icon="gtk-cancel"/> <!--<button string="Set to Draft" name="action_set_to_draft" states="cancel" type="object"/>--> @@ -181,7 +181,7 @@ <search string="Budget"> <group col="20" colspan="4"> <filter string="Draft" icon="terp-document-new" domain="[('state','=','draft')]" help="Draft Budgets" default="1"/> - <filter string="To Validate" icon="terp-gtk-go-back-rtl" domain="[('state','=','validate')]" help="To Validate Budgets" /> + <filter string="To Approve" icon="terp-gtk-go-back-rtl" domain="[('state','=','validate')]" help="To Approve Budgets" /> <separator orientation="vertical"/> <field name="name" select="1"/> <field name="code" select="1" /> diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml index 29798d34b91..5ba248635ed 100644 --- a/addons/account_payment/account_payment_view.xml +++ b/addons/account_payment/account_payment_view.xml @@ -207,7 +207,7 @@ </record> <record id="action_payment_order_open" model="ir.actions.act_window"> - <field name="name">Payment Orders to Validate</field> + <field name="name">Payment Orders to Approve</field> <field name="res_model">payment.order</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py index 47ff58a3226..7f74553f6bf 100644 --- a/addons/account_voucher/voucher.py +++ b/addons/account_voucher/voucher.py @@ -116,10 +116,10 @@ class account_voucher(osv.osv): ('journal_pur_voucher','Journal Purchase'), ('journal_voucher','Journal Voucher'), ],'Entry Type', select=True , size=128, readonly=True, states={'draft':[('readonly',False)]}), - 'date':fields.date('Date', readonly=True, states={'draft':[('readonly',False)]}), + 'date':fields.date('Date', readonly=True, states={'draft':[('readonly',False)]}, help="Effective date for accounting entries"), 'journal_id':fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'account_id':fields.many2one('account.account', 'Account', required=True, readonly=True, states={'draft':[('readonly',False)]}, domain=[('type','<>','view')]), - 'payment_ids':fields.one2many('account.voucher.line','voucher_id','Voucher Lines', readonly=False, states={'proforma':[('readonly',True)]}), + 'payment_ids':fields.one2many('account.voucher.line','voucher_id','Voucher Lines', readonly=False, states={'draft':[('readonly',True)]}), 'period_id': fields.many2one('account.period', 'Period', required=True, readonly=True, states={'posted':[('readonly',True)]}), 'narration':fields.text('Narration', readonly=True, states={'draft':[('readonly',False)]}, required=False), 'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), @@ -137,9 +137,8 @@ class account_voucher(osv.osv): \n* The \'Posted\' state is used when user create voucher,a voucher number is generated and voucher entries are created in account \ \n* The \'Cancelled\' state is used when user cancel voucher.'), 'amount':fields.float('Amount', readonly=True), - 'reference': fields.char('Voucher Reference', size=64), - 'reference_type': fields.selection(_get_reference_type, 'Reference Type', - required=True), + 'reference': fields.char('Reference', size=64, readonly=True, states={'draft':[('readonly',False)]}, help="Bank cheque number or payorder number"), + 'reference_type': fields.selection(_get_reference_type, 'Reference Type', required=True), 'number': fields.related('move_id', 'name', type="char", readonly=True, string='Number'), 'move_id':fields.many2one('account.move', 'Account Entry'), 'move_ids':fields.many2many('account.move.line', 'voucher_id', 'account_id', 'rel_account_move', 'Real Entry'), @@ -280,7 +279,8 @@ class account_voucher(osv.osv): 'journal_id': journal.id, 'type' : inv.type, 'narration' : inv.narration and inv.narration or inv.name, - 'date':inv.date + 'date':inv.date, + 'ref':inv.reference } if inv.period_id: @@ -366,6 +366,10 @@ class account_voucher(osv.osv): 'move_id': move_id, 'move_ids':[(6, 0,line_ids)] } + + message = _('Voucher ') + " '" + inv.name + "' "+ _("is confirm") + self.log(cr, uid, inv.id, message) + self.write(cr, uid, [inv.id], rec) return True diff --git a/addons/account_voucher/voucher_view.xml b/addons/account_voucher/voucher_view.xml index 1a781c4cc34..09425fe4451 100644 --- a/addons/account_voucher/voucher_view.xml +++ b/addons/account_voucher/voucher_view.xml @@ -35,7 +35,7 @@ </group> <notebook colspan="4"> <page string="Journal Entries"> - <field name="payment_ids" colspan="4" nolabel="1" height="250"> + <field name="payment_ids" colspan="4" nolabel="1" height="200"> <tree string="Voucher Lines" editable="top"> <field name="partner_id" on_change="onchange_partner(partner_id,type,parent.type, parent.currency_id)"/> <field name="account_id"/> @@ -46,14 +46,21 @@ <field name="ref"/> </tree> </field> - <separator string="Narration" colspan="4"/> - <field name="narration" colspan="4" nolabel="1" height="50"/> + <group col="2" colspan="3"> + <separator string="Narration" colspan="2"/> + <field name="narration" colspan="2" nolabel="1"/> + </group> + <group col="2" colspan="1"> + <separator string="Other Informtion" colspan="2"/> + <field name="reference" select="1"/> + <field name="date" select="1"/> + <field name="currency_id" select="1"/> + + </group> </page> - <page string="Other Info"> + <page string="Accounting Entries"> <field name="company_id" select="1" widget="selection" groups="base.group_multi_company"/> - <field name="currency_id" select="1" /> <field name="period_id"/> - <field name="date" select="1"/> <separator string="General Entries" colspan="4"/> <field name="move_ids" colspan="4" nolabel="1" readonly="1"/> </page> @@ -62,7 +69,7 @@ <field name="state"/> <button name="open_voucher" string="Pro-forma" states="draft" icon="terp-check"/> <button name="proforma_voucher" string="Create" states="proforma" icon="terp-document-new"/> - <button name="recheck_voucher" string="Validate" states="recheck" icon="terp-check"/> + <button name="recheck_voucher" string="Approve" states="recheck" icon="terp-check"/> <button name="audit_complete" string="Audit Pass" states="posted" icon="terp-check"/> <button name="cancel_voucher" string="Cancel" states="proforma,recheck,posted" icon="gtk-cancel"/> <button name="cancel_to_draft" states="cancel" string="Set to Draft" icon="terp-stock_effects-object-colorize"/> diff --git a/addons/account_voucher_payment/account_voucher_payment.py b/addons/account_voucher_payment/account_voucher_payment.py index f2c6507181c..38c8bf93f4a 100755 --- a/addons/account_voucher_payment/account_voucher_payment.py +++ b/addons/account_voucher_payment/account_voucher_payment.py @@ -63,7 +63,8 @@ class account_voucher(osv.osv): 'journal_id': journal.id, 'type' : inv.type, 'narration' : inv.narration and inv.narration or inv.name, - 'date':inv.date + 'date':inv.date, + 'ref':inv.reference } if inv.period_id: @@ -101,6 +102,7 @@ class account_voucher(osv.osv): line_ids = [] line_ids += [move_line_pool.create(cr, uid, move_line)] + rec_ids = [] for line in inv.payment_ids: amount=0.0 move_line = { @@ -146,16 +148,23 @@ class account_voucher(osv.osv): line_ids += [move_line_id] if line.invoice_id: - rec_ids = [move_line_id] + rec_ids += [move_line_id] for move_line in line.invoice_id.move_id.line_id: if line.account_id.id == move_line.account_id.id: rec_ids += [move_line.id] - move_line_pool.reconcile_partial(cr, uid, rec_ids) + #move_line_pool.reconcile_partial(cr, uid, rec_ids) + + if rec_ids: + move_line_pool.reconcile_partial(cr, uid, rec_ids) rec = { 'move_id': move_id, 'move_ids':[(6, 0,line_ids)] } + + message = _('Voucher ') + " '" + inv.name + "' "+ _("is confirm") + self.log(cr, uid, inv.id, message) + self.write(cr, uid, [inv.id], rec) return True diff --git a/addons/association/profile_association.py b/addons/association/profile_association.py index ab437baf2c8..f102d710fd8 100644 --- a/addons/association/profile_association.py +++ b/addons/association/profile_association.py @@ -29,7 +29,7 @@ class profile_association_config_install_modules_wizard(osv.osv_memory): _columns = { 'hr_expense':fields.boolean('Expenses Tracking', help="Tracks the personal expenses process, from the employee expense encoding, to the reimbursement of the employee up to the reinvoicing to the final customer."), 'project':fields.boolean('Project Management'), - 'event_project':fields.boolean('Organization and management of events', help="This module allows you to create retro planning for managing your events."), + 'event_project':fields.boolean('Organization and management of Events', help="This module allows you to create retro planning for managing your events."), 'project_gtd':fields.boolean('Getting Things Done', help="GTD is a methodology to efficiently organise yourself and your tasks. This module fully integrates GTD principle with OpenERP's project management."), 'wiki': fields.boolean('Wiki', diff --git a/addons/association/profile_association.xml b/addons/association/profile_association.xml index c1ee9e163fe..4c02a24dac2 100644 --- a/addons/association/profile_association.xml +++ b/addons/association/profile_association.xml @@ -18,6 +18,9 @@ position="attributes"> <attribute name="string">Install more modules. A few modules are proposed according to the Association Profile you selected. You will be able to install them based on our requirements.</attribute> </xpath> + <xpath expr="//button[@string='Install Modules']" position="attributes"> + <attribute name="string">Configure</attribute> + </xpath> <separator string="title" position="replace"/> <group colspan="8"> <separator string="Project Management" colspan="4"/> diff --git a/addons/base_contact/__openerp__.py b/addons/base_contact/__openerp__.py index 8c58d44ff4c..b5de9b321a3 100644 --- a/addons/base_contact/__openerp__.py +++ b/addons/base_contact/__openerp__.py @@ -45,7 +45,7 @@ 'update_xml': [ 'security/ir.model.access.csv', 'base_contact_view.xml', - 'base_contact_installer_view.xml', +# 'base_contact_installer_view.xml', 'process/base_contact_process.xml' ], 'demo_xml': ['base_contact_demo.xml'], diff --git a/addons/base_contact/base_contact_view.xml b/addons/base_contact/base_contact_view.xml index 0e04fd76110..a251ca6eb90 100644 --- a/addons/base_contact/base_contact_view.xml +++ b/addons/base_contact/base_contact_view.xml @@ -72,8 +72,8 @@ <tree string="Functions and Addresses"> <field name="sequence_contact" string="Seq."/> <field name="function"/> - <field name="name"/> - <field name="address_id"/> + <field name="name" on_change="onchange_partner(name)"/> + <field name="address_id" attrs="{'required': [('name', '!=', False)]}" on_change="onchange_address(address_id)"/> <field name="phone"/> <field name="fax"/> <field name="extension"/> diff --git a/addons/base_report_designer/__openerp__.py b/addons/base_report_designer/__openerp__.py index f19d179a1ed..efdf6cd5a00 100644 --- a/addons/base_report_designer/__openerp__.py +++ b/addons/base_report_designer/__openerp__.py @@ -25,11 +25,11 @@ 'version': '0.1', 'category': 'Generic Modules/Base', 'description': """ -This module is used along with openerp OpenOffice plugin. +This module is used along with OpenERP OpenOffice plugin. You have to first install the plugin which is available at http://www.openerp.com -This module adds wizards to import/export .SXW report that +This module adds wizards to Import/Export .sxw report that you can modify in OpenOffice.Once you have modified it you can upload the report using the same wizard. """, diff --git a/addons/base_report_designer/base_report_data.xml b/addons/base_report_designer/base_report_data.xml index 7e5ec4335ee..bd3854ebdba 100644 --- a/addons/base_report_designer/base_report_data.xml +++ b/addons/base_report_designer/base_report_data.xml @@ -7,6 +7,7 @@ <field eval="[(6,0,[ref('base.user_root')])]" name="users"/> <field eval=""""OpenOfficeReportDesigner"""" name="name"/> </record> + <record id="ir_model_access_openofficereportdesigner0" model="ir.model.access"> <field name="model_id" ref="base.model_ir_actions_report_xml"/> <field eval="1" name="perm_read"/> diff --git a/addons/base_report_designer/base_report_designer.py b/addons/base_report_designer/base_report_designer.py index 311449fd46c..a4a135c4299 100644 --- a/addons/base_report_designer/base_report_designer.py +++ b/addons/base_report_designer/base_report_designer.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). # @@ -15,11 +15,11 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. +# along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -from osv import fields,osv +from osv import osv from wizard.tiny_sxw2rml import sxw2rml from StringIO import StringIO from report import interface @@ -27,49 +27,53 @@ import base64 import pooler import tools + class report_xml(osv.osv): _inherit = 'ir.actions.report.xml' - def sxwtorml(self,cr, uid, file_sxw,file_type): + def sxwtorml(self, cr, uid, file_sxw, file_type): ''' The use of this function is to get rml file from sxw file. ''' sxwval = StringIO(base64.decodestring(file_sxw)) if file_type=='sxw': - fp = tools.file_open('normalized_oo2rml.xsl', + fp = tools.file_open('normalized_oo2rml.xsl', subdir='addons/base_report_designer/wizard/tiny_sxw2rml') if file_type=='odt': - fp = tools.file_open('normalized_odt2rml.xsl', + fp = tools.file_open('normalized_odt2rml.xsl', subdir='addons/base_report_designer/wizard/tiny_sxw2rml') - + return {'report_rml_content': str(sxw2rml(sxwval, xsl=fp.read()))} - def upload_report(self, cr, uid, report_id, file_sxw,file_type, context): + def upload_report(self, cr, uid, report_id, file_sxw, file_type, context): ''' Untested function ''' pool = pooler.get_pool(cr.dbname) sxwval = StringIO(base64.decodestring(file_sxw)) if file_type=='sxw': - fp = tools.file_open('normalized_oo2rml.xsl', + fp = tools.file_open('normalized_oo2rml.xsl', subdir='addons/base_report_designer/wizard/tiny_sxw2rml') if file_type=='odt': - fp = tools.file_open('normalized_odt2rml.xsl', + fp = tools.file_open('normalized_odt2rml.xsl', subdir='addons/base_report_designer/wizard/tiny_sxw2rml') report = pool.get('ir.actions.report.xml').write(cr, uid, [report_id], { - 'report_sxw_content': base64.decodestring(file_sxw), - 'report_rml_content': str(sxw2rml(sxwval, xsl=fp.read())), + 'report_sxw_content': base64.decodestring(file_sxw), + 'report_rml_content': str(sxw2rml(sxwval, xsl=fp.read())), }) db = pooler.get_db_only(cr.dbname) interface.register_all(db) return True + def report_get(self, cr, uid, report_id, context={}): report = self.browse(cr, uid, report_id, context) return { - 'file_type' : report.report_type, - 'report_sxw_content': report.report_sxw_content and base64.encodestring(report.report_sxw_content) or False, + 'file_type' : report.report_type, + 'report_sxw_content': report.report_sxw_content and base64.encodestring(report.report_sxw_content) or False, 'report_rml_content': report.report_rml_content and base64.encodestring(report.report_rml_content) or False } + report_xml() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_report_designer/base_report_designer_wizard.xml b/addons/base_report_designer/base_report_designer_wizard.xml index 713dab37d48..c1bb7c35270 100644 --- a/addons/base_report_designer/base_report_designer_wizard.xml +++ b/addons/base_report_designer/base_report_designer_wizard.xml @@ -1,31 +1,22 @@ <?xml version="1.0"?> <openerp> - <data> + <data> - <wizard - string="Modify an existing report" - model="ir.actions.report.xml" - name="base_report_designer.modify" - id="wizard_report_designer_modify"/> + <wizard string="Modify an existing report" + model="ir.actions.report.xml" name="base_report_designer.modify" + id="wizard_report_designer_modify" /> - <menuitem icon="terp-graph" id="base.reporting_menu" name="Reporting" sequence="30"/> - <menuitem - id="base.next_id_50" - name="Configuration" - parent="base.reporting_menu" - groups="base.group_system" - sequence="3"/> - <menuitem - parent="base.next_id_50" - name="Report Designer" - action="wizard_report_designer_modify" - type="wizard" - id="menu_wizard_report_designer_modify" - sequence="70"/> + <menuitem icon="terp-graph" id="base.reporting_menu" + name="Reporting" sequence="30" /> + <menuitem id="base.next_id_50" name="Configuration" + parent="base.reporting_menu" groups="base.group_system" sequence="3" /> + <menuitem parent="base.next_id_50" name="Report Designer" + action="wizard_report_designer_modify" type="wizard" + id="menu_wizard_report_designer_modify" sequence="70" /> - </data> + </data> </openerp> diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 0e078820062..5c7fdb08522 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -152,8 +152,10 @@ and users"), \nIf the case is in progress the state is set to \'Open\'.\ \nWhen the case is over, the state is set to \'Done\'.\ \nIf the case needs to be reviewed then the state is set to \'Pending\'.'), - 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True),('model','=',_name)]), - 'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)]), + 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True),('model','=',_name)], readonly=True), + 'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)], readonly=True), + 'partner_assigned_id': fields.many2one('res.partner', 'Assigned Partner', help="Partner this case has been forwarded/assigned to.", select=True), + 'date_assign': fields.date('Assignation Date', help="Last date this case was forwarded/assigned to a partner"), } _defaults = { @@ -167,6 +169,20 @@ and users"), 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0], } + def onchange_partner_address_id(self, cr, uid, ids, add, email=False): + """This function returns value of partner email based on Partner Address + @param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of case IDs + @param add: Id of Partner's address + @email: Partner's email ID + """ + if not add: + return {'value': {'email_from': False, 'country_id': False}} + address = self.pool.get('res.partner.address').browse(cr, uid, add) + return {'value': {'email_from': address.email, 'phone': address.phone, 'country_id': address.country_id.id}} + def case_open(self, cr, uid, ids, *args): """Overrides cancel for crm_case for setting Open Date @param self: The object pointer diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index 39c65cb6faf..bcc72d74042 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -91,7 +91,7 @@ <field name="mobile"/> <newline/> <separator string="Links" colspan="4" col="3"/> - <field name="partner_id"/> + <field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)"/> <button name="%(action_crm_lead2partner)d" icon="gtk-index" type="action" @@ -193,11 +193,10 @@ name="%(crm.action_crm_send_mail)d" context="{'mail':'new', 'model': 'crm.lead'}" icon="gtk-go-forward" type="action" /> - <button colspan="2" string="Forward to Partner" + <button colspan="2" string="Forward" name="%(crm_lead_forward_to_partner_act)d" icon="gtk-go-forward" type="action" /> </page> - </notebook> </form> </field> diff --git a/addons/crm/crm_opportunity.py b/addons/crm/crm_opportunity.py index 0b672721ba3..5869f94e72e 100644 --- a/addons/crm/crm_opportunity.py +++ b/addons/crm/crm_opportunity.py @@ -46,7 +46,7 @@ class crm_opportunity(osv.osv): domain="[('partner_id','=',partner_id)]"), # Opportunity fields - 'probability': fields.float('Probability (%)'), + 'probability': fields.float('Probability (%)',group_operator="avg"), 'planned_revenue': fields.float('Expected Revenue'), 'ref': fields.reference('Reference', selection=crm._links_get, size=128), 'ref2': fields.reference('Reference 2', selection=crm._links_get, size=128), diff --git a/addons/crm/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml index 5bbe4feed35..700eb4cba5c 100644 --- a/addons/crm/crm_opportunity_view.xml +++ b/addons/crm/crm_opportunity_view.xml @@ -190,6 +190,21 @@ </form> </field> </page> + <page string="Assignation" groups="base.group_extended"> + <group name="partner_assign_group" col="5" colspan="4"> + <separator string="Partner Assignation" colspan="5"/> + <field name="partner_assigned_id"/> + <field name="date_assign"/> + <group colspan="1" col="1"> + <button string="Forward" + attrs="{'invisible':[('partner_assigned_id','=',False)]}" + name="%(crm_lead_forward_to_partner_act)d" + icon="gtk-go-forward" type="action" + context="{'default_name': 'partner', 'default_partner_id': partner_assigned_id}" + /> + </group> + </group> + </page> </notebook> </form> </field> diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py index 208054b3f4d..98515b6ab43 100644 --- a/addons/crm/report/crm_lead_report.py +++ b/addons/crm/report/crm_lead_report.py @@ -76,6 +76,7 @@ class crm_lead_report(osv.osv): _columns = { 'name': fields.char('Year', size=64, required=False, readonly=True), 'user_id':fields.many2one('res.users', 'User', readonly=True), + 'country_id':fields.many2one('res.country', 'Country', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), 'avg_answers': fields.function(_get_data, string='Avg. Answers', method=True, type="integer"), @@ -141,6 +142,7 @@ class crm_lead_report(osv.osv): c.section_id, c.categ_id, c.partner_id, + c.country_id, c.planned_revenue, 1 as nbr, 0 as avg_answers, diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml index bf679c4cdaa..150ae5d3849 100644 --- a/addons/crm/report/crm_lead_report_view.xml +++ b/addons/crm/report/crm_lead_report_view.xml @@ -104,6 +104,7 @@ <filter string="User" name="user" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}" /> <filter string="Partner" icon="terp-personal" context="{'group_by':'partner_id'}" /> + <filter string="Country" icon="terp-go-home" context="{'group_by':'country_id'}" /> <separator orientation="vertical" /> <filter string="Section" icon="terp-personal+" domain="[]" @@ -133,7 +134,7 @@ <group expand="0" string="Extended options..." groups="base.group_extended"> <field name="partner_id"/> <separator orientation="vertical"/> - <field name="stage_id" widget="selection" domain="[('section_id','=',section_id), ('object_id.model', '=', 'crm.lead')]" /> + <field name="stage_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]" /> <field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]"/> <separator orientation="vertical"/> <field name="company_id" widget="selection" groups="base.group_multi_company"/> @@ -159,6 +160,7 @@ <field name="section_id" invisible="1" groups="base.group_extended"/> <field name="user_id" invisible="1"/> <field name="partner_id" invisible="1"/> + <field name="country_id" invisible="1"/> <field name="day" invisible="1"/> <field name="state" invisible="1"/> <field name="stage_id" invisible="1"/> diff --git a/addons/crm/res_partner.py b/addons/crm/res_partner.py index 2dbae32ad98..db7069af4db 100644 --- a/addons/crm/res_partner.py +++ b/addons/crm/res_partner.py @@ -26,11 +26,13 @@ class res_partner(osv.osv): _inherit = 'res.partner' _columns = { 'opportunity_ids': fields.one2many('crm.lead', 'partner_id',\ - 'Leads and Opportunities'), + 'Leads and Opportunities'), 'meeting_ids': fields.one2many('crm.meeting', 'partner_id',\ - 'Meetings'), + 'Meetings'), 'phonecall_ids': fields.one2many('crm.phonecall', 'partner_id',\ - 'Phonecalls'), + 'Phonecalls'), + 'opportunity_assigned_ids': fields.one2many('crm.lead', 'partner_assigned_id',\ + 'Assigned Opportunities'), } res_partner() diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml index 3ae772b2b85..3b23c53efad 100644 --- a/addons/crm/res_partner_view.xml +++ b/addons/crm/res_partner_view.xml @@ -44,6 +44,39 @@ icon="gtk-cancel" /> </tree> </field> + <field name="opportunity_assigned_ids" colspan="4" nolabel="1"> + <tree string="Assigned Opportunities" colors="blue:state=='pending';grey:state=='cancel')"> + <field name="create_date"/> + <field name="name"/> + <field name="type"/> + <field name="stage_id"/> + <button name="stage_previous" string="Previous" + states="open,pending" type="object" icon="gtk-go-back" /> + <button name="stage_next" string="Next" + states="open,pending" type="object" + icon="gtk-go-forward" /> + <field name="section_id" + invisible="context.get('invisible_section', True)" /> + <field name="user_id" /> + <field name="state" /> + <button name="case_open" string="Open" + states="draft,pending" type="object" + icon="gtk-go-forward" /> + <button name="case_close" string="Close" + states="open,draft,pending" type="object" + icon="gtk-close" /> + <button string="Convert to Opportunity" + name="convert_opportunity" + states="draft,open,pending" icon="gtk-index" + type="object" /> + <button name="case_escalate" string="Escalate" + states="open,draft,pending" type="object" + icon="gtk-go-up" /> + <button name="case_cancel" string="Cancel" + states="draft,open,pending" type="object" + icon="gtk-cancel" /> + </tree> + </field> <field name="meeting_ids" colspan="4" nolabel="1" > <tree string="Meetings" colors="gray:state in ('draft', 'cancel','done','pending')"> <field name="user_id" string="Responsible"/> diff --git a/addons/crm/wizard/crm_forward_to_partner.py b/addons/crm/wizard/crm_forward_to_partner.py index 1e323eddedb..1a6e1fb505b 100644 --- a/addons/crm/wizard/crm_forward_to_partner.py +++ b/addons/crm/wizard/crm_forward_to_partner.py @@ -22,6 +22,7 @@ import base64 import itertools +import time from osv import osv, fields import tools @@ -218,6 +219,10 @@ class crm_lead_forward_to_partner(osv.osv_memory): if result: case_pool.history(cr, uid, [case], _('Forward'), history=True, email=this.email_to, subject=this.subject, details=body, email_from=email_from, attach=attach) + to_write = {'date_assign': time.strftime('%Y-%m-%d')} + if (this.name == 'partner' and this.partner_id): + to_write['partner_assigned_id'] = this.partner_id.id + case_pool.write(cr, uid, case.id, to_write) else: raise osv.except_osv(_('Error!'), _('Unable to send mail. Please check SMTP is configured properly.')) diff --git a/addons/crm/wizard/crm_phonecall_to_partner_view.xml b/addons/crm/wizard/crm_phonecall_to_partner_view.xml index c7da406f687..6da8a168b21 100644 --- a/addons/crm/wizard/crm_phonecall_to_partner_view.xml +++ b/addons/crm/wizard/crm_phonecall_to_partner_view.xml @@ -30,7 +30,7 @@ <form string="Create a Partner"> <field name="action"/> <group attrs="{'invisible':[('action','!=','exist')]}"> - <field name="partner_id"/> + <field name="partner_id" attrs="{'required':[('action','=','exist')]}" /> </group> <separator string="" colspan="4" /> <group col="4" colspan="4"> diff --git a/addons/crm/wizard/crm_send_email.py b/addons/crm/wizard/crm_send_email.py index 83b1959b196..bc2b5357c15 100644 --- a/addons/crm/wizard/crm_send_email.py +++ b/addons/crm/wizard/crm_send_email.py @@ -26,25 +26,18 @@ import base64 import tools from crm import crm -class crm_send_new_email(osv.osv_memory): - """ Sends new email for the case""" - _name = "crm.send.mail" - -crm_send_new_email() - class crm_send_new_email_attachment(osv.osv_memory): _name = 'crm.send.mail.attachment' _columns = { 'binary' : fields.binary('Attachment', required=True), 'name' : fields.char('Name', size=128, required=True), - 'wizard_id' : fields.many2one('crm.send.mail', 'Wizard', required=True), } crm_send_new_email_attachment() -class crm_send_new_email2(osv.osv_memory): +class crm_send_new_email(osv.osv_memory): """ Sends new email for the case""" _name = "crm.send.mail" _description = "Send new email" @@ -52,12 +45,12 @@ class crm_send_new_email2(osv.osv_memory): _columns = { 'email_to' : fields.char('To', size=512, required=True), 'email_from' : fields.char('From', size=128, required=True), + 'reply_to' : fields.char('Reply To', size=128, required=True, help="Reply-to of the Sales team defined on this case"), 'email_cc' : fields.char('CC', size=512, help="Carbon Copy: list of recipients that will receive"\ " a copy of this mail, and future communication related to this case"), 'subject': fields.char('Subject', size=512, required=True), 'text': fields.text('Message', required=True), 'state': fields.selection(crm.AVAILABLE_STATES, string='Set New State To', required=True), - 'attachment_ids' : fields.one2many('crm.send.mail.attachment', 'wizard_id'), } @@ -120,29 +113,28 @@ class crm_send_new_email2(osv.osv_memory): body, email_cc=email_cc, attach=attach, - reply_to=case.section_id and case.section_id.reply_to, + reply_to=obj.reply_to, openobject_id=str(case.id), x_headers=x_headers ) if not flag: raise osv.except_osv(_('Error!'), _('Unable to send mail. Please check SMTP is configured properly.')) - if flag: - case_pool.history(cr, uid, [case], _('Send'), history=True, \ - email=obj.email_to, details=body, \ - subject=obj.subject, email_from=email_from, \ - email_cc=email_cc, message_id=message_id, \ - references=ref_id or message_id, attach=attach) - if obj.state == 'unchanged': - pass - elif obj.state == 'done': - case_pool.case_close(cr, uid, [case.id]) - elif obj.state == 'draft': - case_pool.case_reset(cr, uid, [case.id]) - elif obj.state in ['cancel', 'open', 'pending']: - act = 'case_' + obj.state - getattr(case_pool, act)(cr, uid, [case.id]) - cr.commit() + + case_pool.history(cr, uid, [case], _('Send'), history=True, \ + email=obj.email_to, details=body, \ + subject=obj.subject, email_from=email_from, \ + email_cc=email_cc, message_id=message_id, \ + references=ref_id or message_id, attach=attach) + if obj.state == 'unchanged': + pass + elif obj.state == 'done': + case_pool.case_close(cr, uid, [case.id]) + elif obj.state == 'draft': + case_pool.case_reset(cr, uid, [case.id]) + elif obj.state in ['cancel', 'open', 'pending']: + act = 'case_' + obj.state + getattr(case_pool, act)(cr, uid, [case.id]) return {} @@ -156,7 +148,7 @@ class crm_send_new_email2(osv.osv_memory): if not context.get('model'): raise osv.except_osv(_('Error'), _('Can not send mail!')) - res = super(crm_send_new_email2, self).default_get(cr, uid, fields, context=context) + res = super(crm_send_new_email, self).default_get(cr, uid, fields, context=context) if context.get('mail') == 'reply': res.update(self.get_reply_defaults(cr, uid, fields, context=context)) @@ -171,9 +163,11 @@ class crm_send_new_email2(osv.osv_memory): for case in mod_obj.browse(cr, uid, res_id): if 'email_to' in fields: - res.update({'email_to': tools.ustr(case.email_from)}) + res.update({'email_to': case.email_from and tools.ustr(case.email_from) or ''}) if 'email_from' in fields: - res.update({'email_from': tools.ustr(user_mail_from)}) + res.update({'email_from': user_mail_from and tools.ustr(user_mail_from) or ''}) + if 'reply_to' in fields: + res.update({'reply_to': case.section_id.reply_to}) if 'subject' in fields: res.update({'subject': tools.ustr(context.get('subject', case.name) or '')}) if 'email_cc' in fields: @@ -249,5 +243,5 @@ class crm_send_new_email2(osv.osv_memory): raise osv.except_osv(_('Error'), _('Can not send mail!')) return True -crm_send_new_email2() +crm_send_new_email() diff --git a/addons/crm/wizard/crm_send_email_view.xml b/addons/crm/wizard/crm_send_email_view.xml index 3dfde724bdf..df7218cbc02 100644 --- a/addons/crm/wizard/crm_send_email_view.xml +++ b/addons/crm/wizard/crm_send_email_view.xml @@ -12,6 +12,7 @@ <form string="Send New Mail" col="4"> <group colspan="4" col="2"> <field name="email_from"/> + <field name="reply_to"/> <field name="email_to" /> <field name="email_cc"/> <field name="subject"/> diff --git a/addons/crm_claim/report/crm_claim_report_view.xml b/addons/crm_claim/report/crm_claim_report_view.xml index f10f403c034..45aec4ead2b 100644 --- a/addons/crm_claim/report/crm_claim_report_view.xml +++ b/addons/crm_claim/report/crm_claim_report_view.xml @@ -211,7 +211,7 @@ <field name="act_window_id" ref="action_report_crm_claim"/> </record> - <menuitem name="Claims" id="menu_report_crm_claim_tree" + <menuitem name="Claims Analysis" id="menu_report_crm_claim_tree" groups="base.group_extended" action="action_report_crm_claim" parent="base.next_id_64" sequence="6"/> diff --git a/addons/crm_fundraising/report/crm_fundraising_report_view.xml b/addons/crm_fundraising/report/crm_fundraising_report_view.xml index 4a5e05b28e1..8bf5a993925 100644 --- a/addons/crm_fundraising/report/crm_fundraising_report_view.xml +++ b/addons/crm_fundraising/report/crm_fundraising_report_view.xml @@ -198,7 +198,7 @@ <field name="act_window_id" ref="action_report_crm_fundraising"/> </record> - <menuitem name="Fundraising" + <menuitem name="Fundraising Analysis" action="action_report_crm_fundraising" groups="base.group_extended" id="menu_report_crm_fundraising_tree" parent="base.next_id_64" sequence="20"/> diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml index 1ebdb041a9a..0ee5d565a08 100644 --- a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml +++ b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml @@ -179,7 +179,7 @@ <field name="act_window_id" ref="action_report_crm_helpdesk"/> </record> - <menuitem name="Helpdesk" action="action_report_crm_helpdesk" + <menuitem name="Helpdesk Analysis" action="action_report_crm_helpdesk" groups="base.group_extended" id="menu_report_crm_helpdesks_tree" parent="base.next_id_64" sequence="7"/> diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py index 730502bc549..07dce405c07 100644 --- a/addons/email_template/email_template.py +++ b/addons/email_template/email_template.py @@ -62,6 +62,7 @@ import email_template_engines import tools import report import pooler +import logging def get_value(cursor, user, recid, message=None, template=None, context=None): """ @@ -99,6 +100,7 @@ def get_value(cursor, user, recid, message=None, template=None, context=None): reply = templ.render(Context(env)) return reply or False except Exception: + logging.exception("can't render %r", message) return u"" else: return message @@ -543,7 +545,7 @@ class email_template(osv.osv): if lang: ctx = context.copy() ctx.update({'lang':lang}) - template = self.browse(cursor, user, template_id, context=ctx) + template = self.browse(cursor, user, template.id, context=ctx) mailbox_values = { 'email_from': tools.ustr(from_account['name']) + \ "<" + tools.ustr(from_account['email_id']) + ">", @@ -641,7 +643,7 @@ class email_template(osv.osv): context=context ) if template.report_template: - self._generate_attach_reports( + self.generate_attach_reports( cursor, user, template, diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 6b92e792ad5..7e7f17187f6 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -128,7 +128,7 @@ <group> <filter icon="terp-document-new" domain="[('state','=','draft')]" string="Draft" help="Draft Expense"/> <separator orientation="vertical"/> - <filter icon="terp-gtk-go-back-rtl" domain="[('state','=','confirm')]" string="To Validate" + <filter icon="terp-gtk-go-back-rtl" domain="[('state','=','confirm')]" string="To Approve" help="Confirmed Expense"/> <filter icon="terp-gtk-go-back-rtl" domain="[('state','=','accepted')]" string="To Pay" help="Expenses to Invoice"/> diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index bd96de3dd82..a6b87304ae5 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -10,7 +10,7 @@ <search string="Search Leave"> <group col='8' colspan='4'> <filter icon="terp-gtk-go-back-rtl" domain="[('state','=','draft')]" string="To Confirm"/> - <filter icon="terp-gtk-go-back-rtl" domain="[('state','=','confirm')]" string="To Validate"/> + <filter icon="terp-gtk-go-back-rtl" domain="[('state','=','confirm')]" string="To Approve"/> <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" default="context.get('report', False)"/> <separator orientation="vertical"/> @@ -69,8 +69,8 @@ <field name="state" colspan="2"/> <group colspan="2"> <button string="Confirm" name="confirm" states="draft" type="workflow" icon="gtk-yes"/> - <button string="Validate" name="validate" states="confirm" type="workflow" icon="gtk-apply"/> - <button string="Approve" name="second_validate" states="validate1" type="workflow" icon="gtk-apply"/> + <button string="To Approve" name="validate" states="confirm" type="workflow" icon="gtk-apply"/> + <button string="Approved" name="second_validate" states="validate1" type="workflow" icon="gtk-apply"/> <button string="Refuse" name="refuse" states="confirm,validate1" type="workflow" icon="gtk-no"/> <button string="Cancel" name="cancel" states="validate,refuse" type="workflow" icon="gtk-cancel"/> <button string="Set to Draft" name="set_to_draft" states="cancel" type="object" icon="gtk-convert"/> @@ -113,8 +113,8 @@ <field name="state" colspan="2"/> <group colspan="2"> <button string="Confirm" name="confirm" states="draft" type="workflow" icon="gtk-yes"/> - <button string="Validate" name="validate" states="confirm" type="workflow" icon="gtk-apply"/> - <button string="Approve" name="second_validate" states="validate1" type="workflow" icon="gtk-apply"/> + <button string="To Approve" name="validate" states="confirm" type="workflow" icon="gtk-apply"/> + <button string="Approved" name="second_validate" states="validate1" type="workflow" icon="gtk-apply"/> <button string="Refuse" name="refuse" states="confirm,validate1" type="workflow" icon="gtk-no"/> <button string="Cancel" name="cancel" states="validate,refuse" type="workflow" icon="gtk-cancel"/> <button string="Set to Draft" name="set_to_draft" states="cancel" type="object" icon="gtk-convert"/> @@ -168,7 +168,7 @@ <field name="state" colspan="2"/> <group colspan="2"> <button string="Confirm" name="confirm" states="draft" type="workflow" icon="gtk-yes"/> - <button string="Validate" name="validate" states="confirm" type="workflow" icon="gtk-apply"/> + <button string="Approve" name="validate" states="confirm" type="workflow" icon="gtk-apply"/> <button string="Refuse" name="refuse" states="confirm" type="workflow" icon="gtk-no"/> <button string="Cancel" name="cancel" states="validate,refuse,validate1" type="workflow" icon="gtk-cancel"/> <button string="Set to Draft" name="set_to_draft" states="cancel" type="object" icon="gtk-convert"/> diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml index a85fcc2462c..962fa844808 100644 --- a/addons/hr_payroll/hr_payroll_view.xml +++ b/addons/hr_payroll/hr_payroll_view.xml @@ -505,7 +505,7 @@ <button string="Compute Sheet" icon="terp-stock_format-scientific" name="compute_sheet" states="new"/> <button string="Recompute Sheet" icon="terp-stock_format-scientific" name="compute_sheet" type="object" states="draft"/> <button string="Verify Sheet" icon="terp-camera_test" name="verify_sheet" states="draft"/> - <button string="Validate Sheet" icon="terp-camera_test" name="final_verify_sheet" states="hr_check"/> + <button string="Approve Sheet" icon="terp-camera_test" name="final_verify_sheet" states="hr_check"/> <button string="Pay Salary" icon="terp-dolar_ok!" name="process_sheet" states="confirm"/> <button string="Cancel" icon="terp-dialog-close" name="cancel_sheet" states="draft,hr_check,confirm"/> <button string="Set to Draft" icon="terp-stock_effects-object-colorize" name="set_to_draft" states="cancel"/> diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 050b798f16d..ec667e74f75 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -195,7 +195,7 @@ <search string="Search Timesheet"> <group col="10" colspan="4"> <filter icon="terp-document-new" string="In Draft" domain="[('state','in',('draft', 'new'))]" help="Unvalidated Timesheets"/> - <filter icon="terp-gtk-go-back-rtl" string="To Validate" domain="[('state','=','confirm')]" help="Confirmed Timesheets"/> + <filter icon="terp-gtk-go-back-rtl" string="To Approve" domain="[('state','=','confirm')]" help="Confirmed Timesheets"/> <separator orientation="vertical"/> <field name="user_id" select="1"/> <field name="date_from"/> diff --git a/addons/l10n_chart_uk_minimal/account_chart.xml b/addons/l10n_chart_uk_minimal/account_chart.xml index 804568afecc..17eae399ef8 100644 --- a/addons/l10n_chart_uk_minimal/account_chart.xml +++ b/addons/l10n_chart_uk_minimal/account_chart.xml @@ -22,21 +22,21 @@ </record> <record model="account.account.template" id="assets_view"> - <field name="name">Assets</field> - <field name="code">10</field> - <field name="type">view</field> - <field name="user_type" ref="acct_type_asset_view"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="bal"/> + <field name="name">Assets</field> + <field name="code">10</field> + <field name="type">view</field> + <field name="user_type" ref="acct_type_asset_view"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="bal"/> </record> <record model="account.account.template" id="liabilities_view"> - <field name="name">Liabilities</field> - <field name="code">11</field> - <field name="type">view</field> - <field name="user_type" ref="acct_type_liability_view"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="bal"/> + <field name="name">Liabilities</field> + <field name="code">11</field> + <field name="type">view</field> + <field name="user_type" ref="acct_type_liability_view"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="bal"/> </record> <record id="fas" model="account.account.template"> @@ -156,21 +156,30 @@ </record> <record model="account.account.template" id="income_view"> - <field name="name">Income</field> - <field name="code">20</field> - <field name="type">view</field> - <field name="user_type" ref="acct_type_income_view"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="gpf"/> + <field name="name">Income</field> + <field name="code">20</field> + <field name="type">view</field> + <field name="user_type" ref="acct_type_income_view"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="gpf"/> + </record> + + <record model="account.account.template" id="income_fx_income"> + <field name="name">Foreign Exchange Gain</field> + <field name="code">X201</field> + <field name="type">other</field> + <field name="user_type" ref="acct_type_income_view"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="income_view"/> </record> <record model="account.account.template" id="expense_view"> - <field name="name">Expense</field> - <field name="code">21</field> - <field name="type">view</field> - <field name="user_type" ref="acct_type_expense_view"/> - <field name="reconcile" eval="False"/> - <field name="parent_id" ref="gpf"/> + <field name="name">Expense</field> + <field name="code">21</field> + <field name="type">view</field> + <field name="user_type" ref="acct_type_expense_view"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="gpf"/> </record> <record id="rev" model="account.account.template"> @@ -225,10 +234,18 @@ <field name="user_type" ref="account_type_expense"/> </record> + <record model="account.account.template" id="income_fx_expense"> + <field name="name">Foreign Exchange Loss - (test)</field> + <field name="code">X2111</field> + <field name="type">other</field> + <field name="user_type" ref="account_type_expense"/> + <field name="reconcile" eval="False"/> + <field name="parent_id" ref="ovr"/> + </record> + <!-- <record id="account.property_account_expense_categ" model="ir.property"> <field eval="'account.account,'+str(a_expense)" name="value"/> </record> --> - </data> </openerp> diff --git a/addons/mail_gateway/mail_gateway.py b/addons/mail_gateway/mail_gateway.py index 7187de5d1a5..1abda444116 100644 --- a/addons/mail_gateway/mail_gateway.py +++ b/addons/mail_gateway/mail_gateway.py @@ -41,8 +41,8 @@ class mailgate_thread(osv.osv): _description = 'Mailgateway Thread' _columns = { - 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True)]), - 'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False)]), + 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True)], readonly=True), + 'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False)], readonly=True), } def message_new(self, cr, uid, msg, context): @@ -149,23 +149,23 @@ class mailgate_message(osv.osv): _description = 'Mailgateway Message' _order = 'id desc' _columns = { - 'name':fields.text('Subject'), - 'model': fields.char('Object Name', size=128, select=1), - 'res_id': fields.integer('Resource ID', select=1), + 'name':fields.text('Subject', readonly=True), + 'model': fields.char('Object Name', size=128, select=1, readonly=True), + 'res_id': fields.integer('Resource ID', select=1, readonly=True), 'ref_id': fields.char('Reference Id', size=256, readonly=True, help="Message Id in Email Server.", select=True), - 'date': fields.datetime('Date'), - 'history': fields.boolean('Is History?'), + 'date': fields.datetime('Date', readonly=True), + 'history': fields.boolean('Is History?', readonly=True), 'user_id': fields.many2one('res.users', 'User Responsible', readonly=True), - 'message': fields.text('Description'), - 'email_from': fields.char('From', size=128, help="Email From"), - 'email_to': fields.char('To', help="Email Recipients", size=256), - 'email_cc': fields.char('Cc', help="Carbon Copy Email Recipients", size=256), - 'email_bcc': fields.char('Bcc', help='Blind Carbon Copy Email Recipients', size=256), + 'message': fields.text('Description', readonly=True), + 'email_from': fields.char('From', size=128, help="Email From", readonly=True), + 'email_to': fields.char('To', help="Email Recipients", size=256, readonly=True), + 'email_cc': fields.char('Cc', help="Carbon Copy Email Recipients", size=256, readonly=True), + 'email_bcc': fields.char('Bcc', help='Blind Carbon Copy Email Recipients', size=256, readonly=True), 'message_id': fields.char('Message Id', size=1024, readonly=True, help="Message Id on Email.", select=True), 'references': fields.text('References', readonly=True, help="References emails."), - 'description': fields.text('Description'), + 'description': fields.text('Description', readonly=True), 'partner_id': fields.many2one('res.partner', 'Partner', required=False), - 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', 'message_id', 'attachment_id', 'Attachments'), + 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', 'message_id', 'attachment_id', 'Attachments', readonly=True), } def init(self, cr): diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index 3b72f183f89..83e5ed4f19f 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -152,29 +152,44 @@ you required for the campaign"), def signal(self, cr, uid, model, res_id, signal, context=None): + record = self.pool.get(model).browse(cr, uid, res_id, context) + return self._signal(cr, uid, record, signal, context) + + def _signal(self, cr, uid, record, signal, context=None): if not signal: raise ValueError('signal cannot be False') Workitems = self.pool.get('marketing.campaign.workitem') - domain = [('object_id.model', '=', model), + domain = [('object_id.model', '=', record._table._name), ('state', '=', 'running')] campaign_ids = self.search(cr, uid, domain, context=context) for campaign in self.browse(cr, uid, campaign_ids, context): for activity in campaign.activity_ids: if activity.signal != signal: continue - wi_domain = [('activity_id', '=', activity.id), - ('res_id', '=', res_id), - ('state', '=', 'todo'), - ('date', '=', False), - ] + + data = dict(activity_id=activity.id, + res_id=record.id, + state='todo') + wi_domain = [(k, '=', v) for k, v in data.items()] + wi_ids = Workitems.search(cr, uid, wi_domain, context=context) + if not wi_ids: + partner = self._get_partner_for(campaign, record) + if partner: + data['partner_id'] = partner.id + wi_id = Workitems.create(cr, uid, data, context=context) + wi_ids = [wi_id] Workitems.process(cr, uid, wi_ids, context=context) return True - def _signal(self, cr, uid, record, signal, context=None): - return self.signal(cr, uid, record._table._name, - record.id, signal, context) + def _get_partner_for(self, campaign, record): + partner_field = campaign.partner_field_id.name + if partner_field: + return getattr(record, partner_field) + elif campaign.model_id.model == 'res.partner': + return record + return None marketing_campaign() @@ -247,7 +262,6 @@ class marketing_campaign_segment(osv.osv): uid, [('start', '=', True), ('campaign_id', '=', segment.campaign_id.id)], context=context) model_obj = self.pool.get(segment.object_id.model) - partner_field = segment.campaign_id.partner_field_id.name criteria = [] if segment.sync_last_date: criteria += [(segment.sync_mode, '>', segment.sync_last_date)] @@ -269,11 +283,7 @@ class marketing_campaign_segment(osv.osv): 'res_id': o_ids.id } - partner = None - if partner_field: - partner = getattr(o_ids, partner_field) - elif model_obj._name == 'res.partner': - partner = o_ids + partner = self.pool.get('marketing.campaign')._get_partner_for(segment.campaign_id, o_ids) if partner: wi_vals['partner_id'] = partner.id @@ -295,9 +305,7 @@ class marketing_campaign_activity(osv.osv): ('email', 'E-mail'), ('paper', 'Paper'), ('action', 'Action'), - # TODO implement the subcampaigns. The segment_id on woritems must be - # optional (thus campaign_id must be a real many2one, and a constraint - # must be set). + # TODO implement the subcampaigns. # TODO implement the subcampaign out. disallow out transitions from # subcampaign activities ? #('subcampaign', 'Sub-Campaign'), @@ -333,8 +341,9 @@ class marketing_campaign_activity(osv.osv): 'variable_cost': fields.float('Variable Cost'), 'revenue': fields.float('Revenue'), 'signal': fields.char('Signal', size=128, - help='An activity with a signal can be called \ - programmatically'), + help='An activity with a signal can be called programmatically. Attention, the workitem is always created when the signal is send'), + 'keep_if_condition_not_met': fields.boolean('Keep if condition not met', + help="By activating this option, the workitems that aren't processed because the condition is not met are marked as cancelled instead of being deleted.") } _defaults = { @@ -342,20 +351,6 @@ class marketing_campaign_activity(osv.osv): 'condition': lambda *a: 'True', } - def _check_signal(self, cr, uid, ids, context=None): - return all(activity.signal - for activity in self.browse(cr, uid, ids, context) - for transition in activity.from_ids - if transition.trigger == 'signal') - - _constraints = [ - (_check_signal, - "An incoming transition is triggered by a signal but this transition \ - doesn't have one", - ['signal', 'from_ids'] - ), - ] - def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): if context == None: @@ -431,7 +426,7 @@ class marketing_campaign_transition(osv.osv): formatters = { 'auto': _('Automatic transition'), 'time': _('After %(interval_nbr)d %(interval_type)s'), - 'signal': _('On signal'), + 'cosmetic': _('Cosmetic'), } for tr in self.browse(cr, uid, ids, context=context, fields_process=translate_selections): @@ -462,9 +457,10 @@ class marketing_campaign_transition(osv.osv): 'trigger': fields.selection([('auto', 'Automatic'), ('time', 'Time'), - ('signal','Signal')], + ('cosmetic', 'Cosmetic'), # fake plastic transition + ], 'Trigger', required=True, - help="How is trigger the destination workitem"), + help="How is triggered the destination workitem"), } _defaults = { @@ -477,20 +473,6 @@ class marketing_campaign_transition(osv.osv): ('interval_positive', 'CHECK(interval_nbr >= 0)', 'The interval must be positive or zero') ] - def _check_signal(self, cr, uid, ids, context=None): - return all(tr.activity_to_id.signal - for tr in self.browse(cr, uid, ids, context) - if tr.trigger == 'signal') - - _constraints = [ - (_check_signal, - "The transition is triggered by a signal but destination activity \ - doesn't have one", - ['trigger', 'activity_to_ids'] - ), - ] - - marketing_campaign_transition() class marketing_campaign_workitem(osv.osv): @@ -510,13 +492,12 @@ class marketing_campaign_workitem(osv.osv): return res _columns = { - 'segment_id': fields.many2one('marketing.campaign.segment', 'Segment', - required=True), + 'segment_id': fields.many2one('marketing.campaign.segment', 'Segment'), 'activity_id': fields.many2one('marketing.campaign.activity','Activity', required=True), - 'campaign_id': fields.related('segment_id', 'campaign_id', + 'campaign_id': fields.related('activity_id', 'campaign_id', type='many2one', relation='marketing.campaign', string='Campaign', readonly=True), - 'object_id': fields.related('segment_id', 'campaign_id', 'object_id', + 'object_id': fields.related('activity_id', 'campaign_id', 'object_id', type='many2one', relation='ir.model', string='Object', select=1), 'res_id': fields.integer('Resource ID', select=1, readonly=1), 'res_name': fields.function(_res_name_get, method=True, string='Resource Name', type="char", size=64), @@ -564,7 +545,10 @@ class marketing_campaign_workitem(osv.osv): campaign_mode = workitem.campaign_id.mode if condition: if not eval(condition, eval_context): - workitem.write({'state': 'cancelled'}, context=context) + if activity.keep_if_condition_not_met: + workitem.write({'state': 'cancelled'}, context=context) + else: + workitem.unlink(context=context) return result = True if campaign_mode in ('manual', 'active'): @@ -580,6 +564,8 @@ class marketing_campaign_workitem(osv.osv): if result: # process _chain for transition in activity.to_ids: + if transition.trigger == 'cosmetic': + continue launch_date = False if transition.trigger == 'auto': launch_date = datetime.now() @@ -605,7 +591,7 @@ class marketing_campaign_workitem(osv.osv): # # test test_realtime manual normal (active) # time Y N N N - # signal N N N N + # cosmetic N N N N # auto Y Y Y Y # diff --git a/addons/marketing_campaign/marketing_campaign_view.xml b/addons/marketing_campaign/marketing_campaign_view.xml index 4ac70292c32..1d07fc1e99c 100644 --- a/addons/marketing_campaign/marketing_campaign_view.xml +++ b/addons/marketing_campaign/marketing_campaign_view.xml @@ -228,7 +228,12 @@ <separator string="Action" colspan="4"/> <group colspan='4' col='4'> - <field name="condition" colspan='4'/> + <group colspan="4" col="6"> + <field name="condition" colspan='5'/> + <group col='2'> + <field name="keep_if_condition_not_met" /> + </group> + </group> <field name="type" width='100'/> <group colspan='2' col='1'> <group attrs="{'invisible':[('type','!=','email')]}" > diff --git a/addons/mrp/report/order.rml b/addons/mrp/report/order.rml index 3db5396d444..5ed1af444f1 100644 --- a/addons/mrp/report/order.rml +++ b/addons/mrp/report/order.rml @@ -135,14 +135,6 @@ <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/> <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="4,-1" stop="4,-1"/> </blockTableStyle> - <blockTableStyle id="Table7"> - <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"/> - </blockTableStyle> <blockTableStyle id="Table10"> <blockAlignment value="LEFT"/> <blockValign value="TOP"/> @@ -186,25 +178,18 @@ <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_space" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="0.0"/> + <images/> </stylesheet> - <images/> <story> - <section> <para style="terp_default_8">[[ repeatIn(objects,'o') ]] </para> <para style="terp_default_8"> <font color="white"> </font> </para> - <para style="terp_default_8"> - <font color="white"> </font> - </para> - <para style="terp_default_8"> - <font color="white"> </font> - </para> <para style="terp_header">Production Order N° : [[ o.name ]]</para> - <para style="terp_default_space"> + <para style="terp_default_8"> <font color="white"> </font> </para> - <blockTable colWidths="193.0,106.0,96.0,132.0" style="Table3"> + <blockTable colWidths="193.0,83.0,122.0,129.0" style="Table3"> <tr> <td> <para style="terp_tblheader_General_Centre">Product </para> @@ -220,7 +205,7 @@ </td> </tr> </blockTable> - <blockTable colWidths="193.0,106.0,96.0,132.0" style="Table5"> + <blockTable colWidths="193.0,83.0,122.0,129.0" style="Table5"> <tr> <td> <para style="terp_default_Centre_8">[[ o.product_id.code ]] [[ o.product_id.name ]]</para> @@ -236,16 +221,16 @@ </td> </tr> </blockTable> - <para style="terp_default_space"> + <para style="terp_default_8"> <font color="white"> </font> </para> - <blockTable colWidths="118.0,147.0,132.0,131.0" repeatRows="1" style="Table1"> + <blockTable colWidths="193.0,83.0,122.0,129.0" repeatRows="1" style="Table1"> <tr> <td> - <para style="terp_tblheader_General_Centre">Printing date</para> + <para style="terp_tblheader_General_Centre">Planned Date</para> </td> <td> - <para style="terp_tblheader_General_Centre">Planned Date </para> + <para style="terp_tblheader_General_Centre">Printing date</para> </td> <td> <para style="terp_tblheader_General_Centre">Partner Ref</para> @@ -256,37 +241,37 @@ </tr> </blockTable> <section> - <blockTable colWidths="118.0,147.0,132.0,131.0" style="Table2"> + <blockTable colWidths="193.0,83.0,122.0,129.0" style="Table2"> <tr> <td> - <para style="terp_default_Centre_8">[[ formatLang(time.strftime('%Y-%m-%d'),date = True) ]]</para> + <para style="terp_default_Centre_8">[[ formatLang(o.date_planned, date_time = True) ]]</para> </td> <td> - <para style="terp_default_Centre_8">[[ formatLang(o.date_planned, date_time = True) ]]</para> + <para style="terp_default_Centre_8">[[ formatLang(time.strftime('%Y-%m-%d'),date = True) ]]</para> </td> <td> - <para style="terp_default_Centre_8">[[ 'sale_ref' in o._columns.keys() and o.sale_ref or removeParentNode('para') ]]</para> + <para style="terp_default_Centre_8">[[ ('sale_ref' in o._columns.keys() and o.sale_ref) or '' ]]</para> </td> <td> - <para style="terp_default_Centre_8">[[ 'sale_name' in o._columns.keys() and o.sale_name or removeParentNode('para') ]]</para> + <para style="terp_default_Centre_8">[[ ('sale_name' in o._columns.keys() and o.sale_name) or '' ]]</para> </td> </tr> </blockTable> </section> - <para style="terp_default_space"> + <para style="terp_default_8"> <font color="white"> </font> </para> - <para style="terp_default_Bold_8">Work Orders</para> + <para style="terp_default_Bold_8">Work Orders <font face="Helvetica" size="10.0">[[ o.workcenter_lines ==[] and removeParentNode('para')]]</font></para> <para style="terp_default_8"> <font color="white"> </font> </para> - <blockTable colWidths="81.0,155.0,125.0,84.0,83.0" style="Table6"> + <blockTable colWidths="74.0,203.0,121.0,66.0,64.0" style="Table6"> <tr> <td> <para style="terp_tblheader_General_Centre">Sequence</para> </td> <td> - <para style="terp_tblheader_General_Centre">Name </para> + <para style="terp_tblheader_Details_Centre">Name <font face="Helvetica" size="10.0">[[ o.workcenter_lines ==[] and removeParentNode('blockTable')]]</font></para> </td> <td> <para style="terp_tblheader_General_Centre">WorkCenter</para> @@ -301,7 +286,7 @@ </blockTable> <section> <para style="terp_default_8">[[ repeatIn(o.workcenter_lines,'line2') ]]</para> - <blockTable colWidths="81.0,155.0,125.0,84.0,83.0" style="Table4"> + <blockTable colWidths="74.0,203.0,121.0,66.0,64.0" style="Table4"> <tr> <td> <para style="terp_default_Centre_8">[[ line2.sequence ]]</para> @@ -324,17 +309,14 @@ <font color="white"> </font> </para> </section> - <para style="terp_default_space"> + <para style="terp_default_8"> <font color="white"> </font> </para> <para style="terp_default_Bold_9">Bill Of Material </para> <para style="terp_default_8"> <font color="white"> </font> </para> - <section> - <para style="terp_default_Bold_9">Products to Consume</para> - <blockTable colWidths="235.0,82.0,107.0,104.0" style="Table8"> - <para> <font color="white"> [[ o.move_lines ==[] and removeParentNode('section')]]</font></para> + <blockTable colWidths="250.0,66.0,107.0,104.0" style="Table8"> <tr> <td> <para style="terp_tblheader_Details">Product </para> @@ -350,76 +332,58 @@ </td> </tr> </blockTable> - </section> <section> - <blockTable colWidths="235.0,47.0,34.0,108.0,104.0" style="Table9"> - <para style="terp_default_8">[[ repeatIn(o.move_lines,'line') ]]</para> - <tr> - <td> - <para style="terp_default_9">[[ line.product_id.code ]] [[ line.product_id.name ]]</para> - </td> - <td> - <para style="terp_default_Right_9">[[ formatLang( line.product_qty) ]] </para> - </td> - <td> - <para style="terp_default_9">[[line.product_uom.name]]</para> - </td> - <td> - <para style="terp_default_Centre_9">[[ line.location_id.name ]]</para> - </td> - <td> - <para style="terp_default_Centre_9">[[ line.location_dest_id.name ]]</para> - </td> - </tr> - </blockTable> + <para style="terp_default_Bold_9">Products to Consume [[ o.move_lines ==[] and removeParentNode('section')]]</para> + <section> + <para style="terp_default_8">[[ repeatIn(o.move_lines,'line') ]]</para> + <blockTable colWidths="250.0,42.0,23.0,109.0,104.0" style="Table9"> + <tr> + <td> + <para style="terp_default_9">[[ line.product_id.code ]] [[ line.product_id.name ]]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ formatLang( line.product_qty) ]] </para> + </td> + <td> + <para style="terp_default_9">[[line.product_uom.name]]</para> + </td> + <td> + <para style="terp_default_Centre_9">[[ line.location_id.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_9">[[ line.location_dest_id.name ]]</para> + </td> + </tr> + </blockTable> </section> - <para style="terp_default_space"> - <font color="white"> </font> - </para> + </section> <section> - <para style="terp_default_Bold_9">Consumed Products</para> - - <blockTable colWidths="235.0,82.0,107.0,104.0" style="Table7"> - <para> <font color="white"> [[ o.move_lines2 ==[] and removeParentNode('section')]]</font></para> - <tr> - <td> - <para style="terp_tblheader_Details">Product </para> - </td> - <td> - <para style="terp_tblheader_Details_Centre">Quantity</para> - </td> - <td> - <para style="terp_tblheader_Details_Centre">Source Location</para> - </td> - <td> - <para style="terp_tblheader_Details_Centre">Destination Location</para> - </td> - </tr> - </blockTable> - </section> + <para style="terp_default_Bold_9">Consumed Products [[ o.move_lines2 ==[] and removeParentNode('section')]]</para> <section> - <blockTable colWidths="235.0,47.0,34.0,108.0,104.0" style="Table10"> - <para style="terp_default_8">[[ repeatIn(o.move_lines2,'line2') ]]</para> - <tr> - <td> - <para style="terp_default_9">[[ line2.product_id.code ]] [[ line2.product_id.name ]]</para> - </td> - <td> - <para style="terp_default_Right_9">[[ formatLang( line2.product_qty) ]] </para> - </td> - <td> - <para style="terp_default_9">[[line2.product_uom.name]]</para> - </td> - <td> - <para style="terp_default_Centre_9">[[ line2.location_id.name ]]</para> - </td> - <td> - <para style="terp_default_Centre_9">[[ line2.location_dest_id.name ]]</para> - </td> - </tr> - </blockTable> - + <para style="terp_default_8">[[ repeatIn(o.move_lines2,'line2') ]]</para> + <blockTable colWidths="251.0,41.0,23.0,109.0,104.0" style="Table10"> + <tr> + <td> + <para style="terp_default_9">[[ line2.product_id.code ]] [[ line2.product_id.name ]]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ formatLang( line2.product_qty) ]] </para> + </td> + <td> + <para style="terp_default_9">[[line2.product_uom.name]]</para> + </td> + <td> + <para style="terp_default_Centre_9">[[ line2.location_id.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_9">[[ line2.location_dest_id.name ]]</para> + </td> + </tr> + </blockTable> + </section> + <para style="terp_default_2"> + <font color="white"> </font> + </para> </section> - </section> </story> -</document>
\ No newline at end of file +</document> diff --git a/addons/mrp/wizard/change_production_qty_view.xml b/addons/mrp/wizard/change_production_qty_view.xml index 63d9dbcb451..b73d8bcc529 100644 --- a/addons/mrp/wizard/change_production_qty_view.xml +++ b/addons/mrp/wizard/change_production_qty_view.xml @@ -15,7 +15,7 @@ <group col="2" colspan="4"> <button icon='gtk-close' special="cancel" string="Close" /> - <button name="change_prod_qty" string="Validate" + <button name="change_prod_qty" string="Approve" colspan="1" type="object" icon="gtk-ok" /> </group> </form> diff --git a/addons/partner_geo_assign/__openerp__.py b/addons/partner_geo_assign/__openerp__.py index 2d18649236e..ccfe6ba7c45 100644 --- a/addons/partner_geo_assign/__openerp__.py +++ b/addons/partner_geo_assign/__openerp__.py @@ -26,12 +26,14 @@ 'category': 'Generic Modules/Production', 'description': """ This is the module used by OpenERP SA to redirect customers to his partners, -based on geolocalisation. +based on geolocalization. """, 'author': 'OpenERP SA', 'depends': ['crm'], - 'update_xml': ['res_partner_view.xml'], - 'demo_xml': [], + 'data': [ + 'res_partner_view.xml', + 'crm_lead_view.xml', + ], 'installable': True, 'active': False, 'certificate': False, diff --git a/addons/partner_geo_assign/partner_geo_assign.py b/addons/partner_geo_assign/partner_geo_assign.py index 97bca0b1073..0134dd04e72 100644 --- a/addons/partner_geo_assign/partner_geo_assign.py +++ b/addons/partner_geo_assign/partner_geo_assign.py @@ -39,14 +39,14 @@ def geo_find(addr): except Exception, e: raise osv.except_osv(_('Network error'), _('Could not contact geolocation servers, please make sure you have a working internet connection (%s)') % e) - + class res_partner(osv.osv): _inherit = "res.partner" _columns = { 'partner_latitude': fields.float('Geo Latitude'), 'partner_longitude': fields.float('Geo Longitude'), - 'date_assign': fields.date('Assignation Date'), + 'date_localization': fields.date('Geo Localization Date'), 'partner_weight': fields.integer('Weight', help="Gives the probability to assign a lead to this partner. (0 means no assignation.)"), } @@ -64,7 +64,7 @@ class res_partner(osv.osv): self.write(cr, uid, [partner.id], { 'partner_latitude': result[0], 'partner_longitude': result[1], - 'date_assign': time.strftime('%Y-%m-%d') + 'date_localization': time.strftime('%Y-%m-%d') }, context=context) return True res_partner() @@ -74,33 +74,7 @@ class crm_lead(osv.osv): _columns = { 'partner_latitude': fields.float('Geo Latitude'), 'partner_longitude': fields.float('Geo Longitude'), - 'partner_assigned_id': fields.many2one('res.partner','Assigned Partner'), - 'date_assign': fields.date('Assignation Date') } - def forward_to_partner(self, cr, uid, ids, context=None): - fobj = self.pool.get('crm.lead.forward.to.partner') - for lead in self.browse(cr, uid, ids, context=context): - context = {'active_id': lead.id, 'active_ids': [lead.id], 'active_model': 'crm.lead'} - if lead.partner_assigned_id: - email = False - if lead.partner_assigned_id.address: - email = lead.partner_assigned_id.address[0].email - if not email: - raise osv.except_osv(_('Error !'), _('No email on the partner assigned to this opportunity')) - - values = fobj.default_get(cr, uid, ['name', 'email_from'], context=context) - if not values.get('email_from'): - raise osv.except_osv(_('Error !'), _('Please set an email address in your user preferences')) - values.update({ - 'history': 'whole', - 'email_to': email, - 'message': fobj._get_case_history(cr, uid, 'whole', lead.id, context) or False, - }) - forward = fobj.create(cr, uid, values, context) - fobj.action_forward(cr, uid, [forward], context) - else: - raise osv.except_osv(_('Error !'), _('No partner assigned to this opportunity')) - return True def assign_partner(self, cr, uid, ids, context=None): ok = False diff --git a/addons/partner_geo_assign/res_partner_view.xml b/addons/partner_geo_assign/res_partner_view.xml index 26322f23495..f9310fdfbd0 100644 --- a/addons/partner_geo_assign/res_partner_view.xml +++ b/addons/partner_geo_assign/res_partner_view.xml @@ -1,33 +1,6 @@ <?xml version="1.0"?> <openerp> <data> - <record id="view_crm_opportunity_geo_assign_form" model="ir.ui.view"> - <field name="name">crm.lead.geo_assign.inherit</field> - <field name="model">crm.lead</field> - <field name="type">form</field> - <field name="inherit_id" ref="crm.crm_case_form_view_oppor"/> - <field name="arch" type="xml"> - <xpath expr="//notebook[last()]" position="inside"> - <page string="Geo Assignation"> - <field name="partner_assigned_id"/> - <newline/> - <field name="partner_latitude"/> - <field name="partner_longitude"/> - <field name="date_assign"/> - <label string="" colspan="1"/> - <group colspan="1" col="2"> - <button string="Geo Assign" name="assign_partner" type="object" colspan="1" - icon="gtk-apply"/> - <button string="Forward" - name="forward_to_partner" attrs="{'invisible':[('partner_assigned_id','=',False)]}" - icon="gtk-apply" - type="object"/> - </group> - </page> - </xpath> - </field> - </record> - <record id="view_crm_partner_geo_form" model="ir.ui.view"> <field name="name">res.partner.geo.inherit</field> <field name="model">res.partner</field> @@ -35,7 +8,7 @@ <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <xpath expr="//notebook[last()]" position="inside"> - <page string="Geo Location"> + <page string="Geo Localization"> <field name="partner_weight"/> <label string="" colspan="1"/> <button @@ -46,11 +19,10 @@ <newline/> <field name="partner_latitude"/> <field name="partner_longitude"/> - <field name="date_assign"/> + <field name="date_localization"/> </page> </xpath> </field> </record> - </data> </openerp> diff --git a/addons/profile_tools/misc_tools_installer.xml b/addons/profile_tools/misc_tools_installer.xml index efef1dc3649..84b47128fff 100644 --- a/addons/profile_tools/misc_tools_installer.xml +++ b/addons/profile_tools/misc_tools_installer.xml @@ -20,7 +20,10 @@ <xpath expr="//label[@string='description']" position="attributes"> <attribute name="string" - >Here are a few useful applications which, while they don't directly contribute to your business, can improve on it or improve your OpenERP experience</attribute> + >Here are a few useful applications which, while they do not directly contribute to your business, can help you to improve your organization.</attribute> + </xpath> + <xpath expr="//button[@string='Install Modules']" position="attributes"> + <attribute name="string">Configure</attribute> </xpath> <group colspan="8"> <field name="lunch"/> diff --git a/addons/project/wizard/project_task_delegate_view.xml b/addons/project/wizard/project_task_delegate_view.xml index 762810eba64..68ebb1692d2 100644 --- a/addons/project/wizard/project_task_delegate_view.xml +++ b/addons/project/wizard/project_task_delegate_view.xml @@ -26,7 +26,7 @@ <newline/> <group colspan="4" col="6"> <button icon="gtk-cancel" special="cancel" string="_Cancel"/> - <button icon="gtk-ok" name="validate" string="Validate" type="object"/> + <button icon="gtk-ok" name="validate" string="Approve" type="object"/> </group> </form> </field> diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index f1b4ab804c9..e1233bc413e 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -93,8 +93,8 @@ class project_phase(osv.osv): _columns = { 'name': fields.char("Name", size=64, required=True), - 'date_start': fields.datetime('Start Date', help="Starting Date of the phase"), - 'date_end': fields.datetime('End Date', help="Ending Date of the phase"), + 'date_start': fields.date('Start Date', help="Starting Date of the phase"), + 'date_end': fields.date('End Date', help="Ending Date of the phase"), 'constraint_date_start': fields.datetime('Start Date', help='force the phase to start after this date'), 'constraint_date_end': fields.datetime('End Date', help='force the phase to finish before this date'), 'project_id': fields.many2one('project.project', 'Project', required=True), @@ -114,7 +114,7 @@ class project_phase(osv.osv): 'responsible_id': lambda obj,cr,uid,context: uid, 'state': 'draft', 'sequence': 10, - 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', 'day')], context=c)[0] + 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Day'))], context=c)[0] } _order = "name" _constraints = [ diff --git a/addons/sale_layout/__init__.py b/addons/sale_layout/__init__.py new file mode 100755 index 00000000000..e0a5a2b9f9c --- /dev/null +++ b/addons/sale_layout/__init__.py @@ -0,0 +1,25 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +import sale_layout +import report + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/sale_layout/__openerp__.py b/addons/sale_layout/__openerp__.py new file mode 100755 index 00000000000..c8868de9c2b --- /dev/null +++ b/addons/sale_layout/__openerp__.py @@ -0,0 +1,48 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +{ + "name" : "Sale Order Layout Improvement", + "version" : "1.0", + "depends" : ["base", "sale"], + "author" : "Tiny", + "description": """ + This module provides some features to improve the layout of the Sale Order. + + It gives you the possibility to + * order all the lines of an sale order + * add titles, comment lines, sub total lines + * draw horizontal lines and put page breaks + + """, + "website" : "http://www.openerp.com", + "category" : "Generic Modules/Sales & Purchases", + "init_xml" : [], + "demo_xml" : [], + "update_xml" : [ +# "security/ir.model.access.csv", + "sale_layout_view.xml", + "sale_layout_report.xml", + ], + "active": False, + "installable": True +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/sale_layout/i18n/fr.po b/addons/sale_layout/i18n/fr.po new file mode 100755 index 00000000000..41c3115135c --- /dev/null +++ b/addons/sale_layout/i18n/fr.po @@ -0,0 +1,291 @@ +# translation of fr_FR.po to Français +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * sale_layout +# +# Numerigraphe <informatique@numerigraphe.com>, 2009. +msgid "" +msgstr "" +"Project-Id-Version: fr_FR\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2009-11-26 08:45+0000\n" +"PO-Revision-Date: 2010-01-19 05:23+0000\n" +"Last-Translator: Numérigraphe <Unknown>\n" +"Language-Team: Français\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-05-21 03:45+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Sub Total" +msgstr "Sous-total" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Title" +msgstr "Titre" + +#. module: sale_layout +#: model:ir.module.module,shortdesc:sale_layout.module_meta_information +msgid "sale_layout" +msgstr "sale_layout" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Disc. (%)" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Note" +msgstr "Remarque" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Unit Price" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Order N°" +msgstr "" + +#. module: sale_layout +#: field:sale.order,abstract_line_ids:0 +msgid "Order Lines" +msgstr "Lignes de commande" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Disc.(%)" +msgstr "" + +#. module: sale_layout +#: field:sale.order.line,layout_type:0 +msgid "Layout Type" +msgstr "Mise en page" + +#. module: sale_layout +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "Seq." +msgstr "Séq." + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Product" +msgstr "Produit" + +#. module: sale_layout +#: model:ir.module.module,description:sale_layout.module_meta_information +msgid "" +"\n" +" This module provides some features to improve the layout of the Sale " +"Order.\n" +"\n" +" It gives you the possibility to\n" +" * order all the lines of an sale order\n" +" * add titles, comment lines, sub total lines\n" +" * draw horizontal lines and put page breaks \n" +"\n" +" " +msgstr "" +"\n" +" Ce module ajoute des options pour améliorer la mise en page des " +"commandes de vente.\n" +"\n" +" Il vous permet :\n" +" * de réordonner toutes les lignes d'une commande\n" +" * d'ajouter des titres, des lignes de remarques, des sous-totaux\n" +" * de tracer des lignes horizontales et de faire des sauts de page " +"\n" +"\n" +" " + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Description" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Manual Description" +msgstr "Description manuelle" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Our Salesman" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Automatic Declaration" +msgstr "Déclaration automatique" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Invoice Lines" +msgstr "Lignes de facture" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Quantity" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Quotation N°" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "VAT" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Make Invoice" +msgstr "Créer facture" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Properties" +msgstr "Propriétés" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Invoice address :" +msgstr "" + +#. module: sale_layout +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "XML non valide pour l'architecture de la vue" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Page Break" +msgstr "Saut de page" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Notes" +msgstr "Notes" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Date Ordered" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Shipping address :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Taxes" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Net Total :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Tel. :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Total :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Payment Terms" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "History" +msgstr "Historique" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sale Order Lines" +msgstr "Lignes de commande" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Separator Line" +msgstr "Ligne de séparation" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Your Reference" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sales order lines" +msgstr "Lignes de commande" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Qty" +msgstr "Qté" + +#. module: sale_layout +#: view:sale.order:0 +msgid "States" +msgstr "États" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "TVA :" +msgstr "" + +#. module: sale_layout +#: model:ir.actions.report.xml,name:sale_layout.sale_order_1 +msgid "Order with Layout" +msgstr "Commande avec mise en page" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Extra Info" +msgstr "Info supplémentaires" + +#. module: sale_layout +#: view:sale.order:0 +msgid "UoM" +msgstr "UDM" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Fax :" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Order Line" +msgstr "Commande client" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Price" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Taxes :" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Stock Moves" +msgstr "Mouvements de stocks" diff --git a/addons/sale_layout/i18n/fr_BE.po b/addons/sale_layout/i18n/fr_BE.po new file mode 100755 index 00000000000..6a44937a3d3 --- /dev/null +++ b/addons/sale_layout/i18n/fr_BE.po @@ -0,0 +1,276 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * sale_layout +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 5.0.6\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2009-11-26 08:45:52+0000\n" +"PO-Revision-Date: 2009-11-26 08:45:52+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Sub Total" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Title" +msgstr "" + +#. module: sale_layout +#: model:ir.module.module,shortdesc:sale_layout.module_meta_information +msgid "sale_layout" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Disc. (%)" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Note" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Unit Price" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Order N°" +msgstr "" + +#. module: sale_layout +#: field:sale.order,abstract_line_ids:0 +msgid "Order Lines" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Disc.(%)" +msgstr "" + +#. module: sale_layout +#: field:sale.order.line,layout_type:0 +msgid "Layout Type" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "Seq." +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Product" +msgstr "" + +#. module: sale_layout +#: model:ir.module.module,description:sale_layout.module_meta_information +msgid "\n" +" This module provides some features to improve the layout of the Sale Order.\n" +"\n" +" It gives you the possibility to\n" +" * order all the lines of an sale order\n" +" * add titles, comment lines, sub total lines\n" +" * draw horizontal lines and put page breaks \n" +"\n" +" " +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Description" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Manual Description" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Our Salesman" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Automatic Declaration" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Invoice Lines" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Quantity" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Quotation N°" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "VAT" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Make Invoice" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Properties" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Invoice address :" +msgstr "" + +#. module: sale_layout +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Page Break" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Notes" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Date Ordered" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Shipping address :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Taxes" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Net Total :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Tel. :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Total :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Payment Terms" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "History" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sale Order Lines" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Separator Line" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Your Reference" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sales order lines" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Qty" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "States" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "TVA :" +msgstr "" + +#. module: sale_layout +#: model:ir.actions.report.xml,name:sale_layout.sale_order_1 +msgid "Order with Layout" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Extra Info" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "UoM" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Fax :" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Order Line" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Price" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Taxes :" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Stock Moves" +msgstr "" + diff --git a/addons/sale_layout/i18n/fr_FR.po b/addons/sale_layout/i18n/fr_FR.po new file mode 100755 index 00000000000..349a32e2c84 --- /dev/null +++ b/addons/sale_layout/i18n/fr_FR.po @@ -0,0 +1,179 @@ +# translation of fr_FR.po to Français +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * sale_layout +# +# Numerigraphe <informatique@numerigraphe.com>, 2009. +msgid "" +msgstr "" +"Project-Id-Version: fr_FR\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2009-03-25 10:13:19+0000\n" +"PO-Revision-Date: 2009-03-25 11:25+0100\n" +"Last-Translator: Numerigraphe <informatique@numerigraphe.com>\n" +"Language-Team: Français\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: KBabel 1.11.4\n" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Sub Total" +msgstr "Sous-total" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Title" +msgstr "Titre" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sale Order Lines" +msgstr "Lignes de commande" + +#. module: sale_layout +#: field:sale.order,abstract_line_ids:0 +msgid "Order Lines" +msgstr "Lignes de commande" + +#. module: sale_layout +#: model:ir.module.module,description:sale_layout.module_name_translation +msgid "" +"\n" +" This module provides some features to improve the layout of the Sale Order.\n" +"\n" +" It gives you the possibility to\n" +" * order all the lines of an sale order\n" +" * add titles, comment lines, sub total lines\n" +" * draw horizontal lines and put page breaks \n" +"\n" +" " +msgstr "" +"\n" +" Ce module ajoute des options pour améliorer la mise en page des commandes de vente.\n" +"\n" +" Il vous permet :\n" +" * de réordonner toutes les lignes d'une commande\n" +" * d'ajouter des titres, des lignes de remarques, des sous-totaux\n" +" * de tracer des lignes horizontales et de faire des sauts de page \n" +"\n" +" " + +#. module: sale_layout +#: field:sale.order.line,layout_type:0 +msgid "Layout Type" +msgstr "Mise en page" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Product" +msgstr "Produit" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Manual Description" +msgstr "Description manuelle" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Automatic Declaration" +msgstr "Déclaration automatique" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Invoice Lines" +msgstr "Lignes de facture" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Make Invoice" +msgstr "Créer facture" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Properties" +msgstr "Propriétés" + +#. module: sale_layout +#: view:sale.order:0 +msgid "UoM" +msgstr "UDM" + +#. module: sale_layout +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "XML non valide pour l'architecture de la vue" + +#. module: sale_layout +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "Seq." +msgstr "Séq." + +#. module: sale_layout +#: view:sale.order:0 +msgid "Notes" +msgstr "Notes" + +#. module: sale_layout +#: view:sale.order:0 +msgid "History" +msgstr "Historique" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Note" +msgstr "Remarque" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Separator Line" +msgstr "Ligne de séparation" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sales order lines" +msgstr "Lignes de commande" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Qty" +msgstr "Qté" + +#. module: sale_layout +#: view:sale.order:0 +msgid "States" +msgstr "États" + +#. module: sale_layout +#: model:ir.actions.report.xml,name:sale_layout.sale_order_1 +msgid "Order with Layout" +msgstr "Commande avec mise en page" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Extra Info" +msgstr "Info supplémentaires" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Page Break" +msgstr "Saut de page" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Order Line" +msgstr "Commande client" + +#. module: sale_layout +#: model:ir.module.module,shortdesc:sale_layout.module_name_translation +msgid "sale_layout" +msgstr "sale_layout" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Stock Moves" +msgstr "Mouvements de stocks" + diff --git a/addons/sale_layout/i18n/sale_layout.pot b/addons/sale_layout/i18n/sale_layout.pot new file mode 100755 index 00000000000..6a44937a3d3 --- /dev/null +++ b/addons/sale_layout/i18n/sale_layout.pot @@ -0,0 +1,276 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * sale_layout +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 5.0.6\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2009-11-26 08:45:52+0000\n" +"PO-Revision-Date: 2009-11-26 08:45:52+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Sub Total" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Title" +msgstr "" + +#. module: sale_layout +#: model:ir.module.module,shortdesc:sale_layout.module_meta_information +msgid "sale_layout" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Disc. (%)" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Note" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Unit Price" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Order N°" +msgstr "" + +#. module: sale_layout +#: field:sale.order,abstract_line_ids:0 +msgid "Order Lines" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Disc.(%)" +msgstr "" + +#. module: sale_layout +#: field:sale.order.line,layout_type:0 +msgid "Layout Type" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +#: view:sale.order.line:0 +msgid "Seq." +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Product" +msgstr "" + +#. module: sale_layout +#: model:ir.module.module,description:sale_layout.module_meta_information +msgid "\n" +" This module provides some features to improve the layout of the Sale Order.\n" +"\n" +" It gives you the possibility to\n" +" * order all the lines of an sale order\n" +" * add titles, comment lines, sub total lines\n" +" * draw horizontal lines and put page breaks \n" +"\n" +" " +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Description" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Manual Description" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Our Salesman" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Automatic Declaration" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Invoice Lines" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Quantity" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Quotation N°" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "VAT" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Make Invoice" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Properties" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Invoice address :" +msgstr "" + +#. module: sale_layout +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Page Break" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Notes" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Date Ordered" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Shipping address :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Taxes" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Net Total :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Tel. :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Total :" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Payment Terms" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "History" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sale Order Lines" +msgstr "" + +#. module: sale_layout +#: selection:sale.order.line,layout_type:0 +msgid "Separator Line" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Your Reference" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Sales order lines" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Qty" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "States" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "TVA :" +msgstr "" + +#. module: sale_layout +#: model:ir.actions.report.xml,name:sale_layout.sale_order_1 +msgid "Order with Layout" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Extra Info" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "UoM" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Fax :" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Order Line" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Price" +msgstr "" + +#. module: sale_layout +#: rml:sale.order.layout:0 +msgid "Taxes :" +msgstr "" + +#. module: sale_layout +#: view:sale.order:0 +msgid "Stock Moves" +msgstr "" + diff --git a/addons/sale_layout/report/__init__.py b/addons/sale_layout/report/__init__.py new file mode 100755 index 00000000000..21b30a51454 --- /dev/null +++ b/addons/sale_layout/report/__init__.py @@ -0,0 +1,24 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +import report_sale_layout + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/sale_layout/report/order.rml b/addons/sale_layout/report/order.rml new file mode 100755 index 00000000000..8c7cfaa0d2d --- /dev/null +++ b/addons/sale_layout/report/order.rml @@ -0,0 +1,378 @@ +<?xml version="1.0"?> +<document filename="test.pdf"> + <template pageSize="(595.0,842.0)" title="Test" author="Martin Simon" allowSplitting="20"> + <pageTemplate id="first"> + <frame id="first" x1="15.0" y1="42.0" width="539" height="758"/> + </pageTemplate> + </template> + <stylesheet> + <blockTableStyle id="Standard_Outline"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="AddressTable"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="Table1"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,0" stop="0,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="0,0" stop="0,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="1,0" stop="1,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="1,0" stop="1,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="2,0" stop="2,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="2,0" stop="2,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="3,0" stop="3,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/> + </blockTableStyle> + <blockTableStyle id="OrderTable"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,0" stop="0,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="0,0" stop="0,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="1,0" stop="1,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="1,0" stop="1,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="2,0" stop="2,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="2,0" stop="2,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="3,0" stop="3,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/> + </blockTableStyle> + <blockTableStyle id="HeadingTable"> + <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"/> + </blockTableStyle> + <blockTableStyle id="Order_Desc_Table"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="4,-1" stop="4,-1"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="5,-1" stop="5,-1"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="6,-1" stop="6,-1"/> + </blockTableStyle> + <blockTableStyle id="Total_Table"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEABOVE" colorName="#ffffff" start="0,0" stop="0,0"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="1,0" stop="1,0"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="2,0" stop="2,0"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="3,0" stop="3,0"/> + <lineStyle kind="LINEBEFORE" colorName="#ffffff" start="0,1" stop="0,-1"/> + <lineStyle kind="LINEBELOW" colorName="#ffffff" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#ffffff" start="0,2" stop="0,-1"/> + <lineStyle kind="LINEBELOW" colorName="#ffffff" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="1,2" stop="1,2"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="2,2" stop="2,2"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="3,2" stop="3,2"/> + </blockTableStyle> + <blockTableStyle id="Partner_Note_Table"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <initialize> + <paraStyle name="all" alignment="justify"/> + </initialize> + <paraStyle name="P1" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P2" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P3" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P4" rightIndent="0.0" leftIndent="14.0" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P5" rightIndent="0.0" leftIndent="11.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P6" rightIndent="0.0" leftIndent="-2.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P7" rightIndent="0.0" leftIndent="11.0" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="Standard" fontName="Times-Roman"/> + <paraStyle name="Text body" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="Heading" fontName="Helvetica" fontSize="8.0" leading="10" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="List" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="Table Contents" fontName="Times-Roman"/> + <paraStyle name="Table Heading" fontName="Times-Roman" alignment="CENTER"/> + <paraStyle name="Caption" fontName="Times-Roman" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="Index" fontName="Times-Roman"/> + <paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.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_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" 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_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.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_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.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="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.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_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="15.0" leading="19" 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_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_1" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9_Bold" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Italic" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="Preformatted Text" fontName="Times-Roman" fontSize="10.0" leading="13" spaceBefore="0.0" spaceAfter="0.0"/> + </stylesheet> + <images/> + <story> + <para style="terp_default_8">[[ repeatIn(objects,'o') ]]</para> + <para style="terp_default_8">[[ setLang(o.partner_id.lang) ]]</para> + <blockTable colWidths="265.0,51.0,225.0" style="AddressTable"> + <tr> + <td> + <para style="terp_default_Bold_9">Shipping address :</para> + <para style="terp_default_9">[[ o.partner_id.title or '' ]][[ o.partner_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.title or '' ]][[ o.partner_shipping_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.street ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.street2 or '' ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.city or '' ]] [[ o.partner_shipping_id.zip or '' ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.state_id and o.partner_shipping_id.state_id.name or '' ]][[ o.partner_shipping_id.country_id and o.partner_shipping_id.country_id.name or '' ]]</para> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + <para style="terp_default_Bold_9">Invoice address :</para> + <para style="terp_default_9">[[ o.partner_invoice_id.street ]][[ o.partner_invoice_id.street2 and (', %s' % o.partner_invoice_id.street2 or '') ]]</para> + <para style="terp_default_9">[[ o.partner_invoice_id.city or '' ]] [[ o.partner_invoice_id.zip or '' ]]</para> + <para style="terp_default_9">[[ o.partner_invoice_id.country_id and ('%s' % (o.partner_invoice_id.country_id and o.partner_invoice_id.country_id.name or '')) ]]</para> + </td> + <td> + <para style="terp_default_8"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_9">[[ o.partner_id.title or '' ]][[ o.partner_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.title or '' ]][[ o.partner_order_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.street ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.street2 or '' ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.city or '' ]] [[ o.partner_order_id.zip or '' ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.state_id and o.partner_order_id.state_id.name or '' ]][[ o.partner_order_id.country_id and o.partner_order_id.country_id.name or '' ]]</para> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + <para style="terp_default_9">Tel. : [[ o.partner_order_id.phone or removeParentNode('para') ]]</para> + <para style="terp_default_9">Fax : [[ o.partner_order_id.fax or removeParentNode('para') ]]</para> + <para style="terp_default_9">TVA : [[ o.partner_id.vat or removeParentNode('para') ]]</para> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + </td> + </tr> + </blockTable> + <para style="terp_default_8"> + <font color="white"> </font> + </para> + <para style="terp_header">[[ o.state<>'draft' and removeParentNode('para') ]] Quotation N° [[ o.name ]]</para> + <para style="terp_header">[[ o.state=='draft' and removeParentNode('para') ]] Order N° [[ o.name ]]</para> + <para style="terp_default_8"> + <font color="white"> </font> + </para> + <blockTable colWidths="132.0,134.0,135.0,135.0" style="Table1"> + <tr> + <td> + <para style="terp_tblheader_General_Centre">Your Reference </para> + </td> + <td> + <para style="terp_tblheader_General_Centre">Date Ordered </para> + </td> + <td> + <para style="terp_tblheader_General_Centre">Our Salesman </para> + </td> + <td> + <para style="terp_tblheader_General_Centre">Payment Terms</para> + </td> + </tr> + </blockTable> + <blockTable colWidths="132.0,134.0,135.0,135.0" style="OrderTable"> + <tr> + <td> + <para style="terp_default_Centre_8">[[ o.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_8">[[ o.date_order ]]</para> + </td> + <td> + <para style="terp_default_Centre_8">[[ o.user_id.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_8">[[ o.payment_term.name ]]</para> + </td> + </tr> + </blockTable> + <para style="terp_default_8"> + <font color="white"> </font> + </para> + <blockTable colWidths="208.0,99.0,64.0,59.0,43.0,65.0" repeatRows="1" style="HeadingTable"> + <tr> + <td> + <para style="terp_tblheader_Details">Description</para> + </td> + <td> + <para style="terp_tblheader_Details_Centre">VAT</para> + </td> + <td> + <para style="terp_tblheader_Details_Centre">Quantity</para> + </td> + <td> + <para style="terp_tblheader_Details_Right">Unit Price</para> + </td> + <td> + <para style="terp_tblheader_Details_Right">Disc.(%)</para> + </td> + <td> + <para style="terp_tblheader_Details_Right">Price</para> + </td> + </tr> + </blockTable> + <section> + <para style="terp_default_1">[[ repeatIn(o.order_line,'line') ]]</para> + <blockTable colWidths="207.0,99.0,43.0,21.0,59.0,43.0,65.0" style="Order_Desc_Table"> + <tr> + <td> + <para style="terp_default_9">[[ line.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_9">[[ ', '.join(map(lambda x: x.name, line.tax_id)) or '0.00' ]]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ line.product_uos and line.product_uos_qty or line.product_uom_qty or '0.00']]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ line.product_uos and line.product_uos.name or line.product_uom.name ]]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ line.price_unit or '0.00' ]]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ line.discount and str(line.discount) or '0.00' ]]</para> + </td> + <td> + <para style="terp_default_Right_9">[[ line.price_subtotal or '0.00' ]]</para> + </td> + </tr> + <tr> + <td> + <para style="P7">[[ format(line.notes or removeParentNode('tr')) ]]</para> + </td> + <td> + <para style="terp_default_Centre_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_Right_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_Right_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_Right_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_Right_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_Right_9"> + <font color="white"> </font> + </para> + </td> + </tr> + </blockTable> + </section> + <blockTable colWidths="384.0,67.0,64.0,22.0" style="Total_Table"> + <tr> + <td> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="P6">Net Total :</para> + </td> + <td> + <para style="terp_default_Right_9">[[ o.amount_untaxed or '0.00' ]]</para> + </td> + <td> + <para style="P2">[[ o.pricelist_id.currency_id.name ]]</para> + </td> + </tr> + <tr> + <td> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="P5">Taxes :</para> + </td> + <td> + <para style="terp_default_Right_9">[[ o.amount_tax or '0.00' ]]</para> + </td> + <td> + <para style="P2">[[ o.pricelist_id.currency_id.name ]]</para> + </td> + </tr> + <tr> + <td> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="P4">Total :</para> + </td> + <td> + <para style="terp_default_Right_9_Bold">[[ o.amount_total or '0.00' ]] </para> + </td> + <td> + <para style="P3">[[ o.pricelist_id.currency_id.name ]]</para> + </td> + </tr> + </blockTable> + <para style="terp_default_8"> + <font color="white"> </font> + </para> + <blockTable colWidths="533.0" style="Partner_Note_Table"> + <tr> + <td> + <para style="terp_default_9">[[ format(o.note or '') ]]</para> + </td> + </tr> + <tr> + <td> + <para style="terp_default_9">[[ format((o.partner_id.property_payment_term and o.partner_id.property_payment_term.note) or '') ]]</para> + </td> + </tr> + </blockTable> + <para style="P1"> + <font color="white"> </font> + </para> + </story> +</document> diff --git a/addons/sale_layout/report/report_sale_layout.py b/addons/sale_layout/report/report_sale_layout.py new file mode 100755 index 00000000000..20ad66313a2 --- /dev/null +++ b/addons/sale_layout/report/report_sale_layout.py @@ -0,0 +1,140 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +import time +import pooler +from report import report_sxw + + +rml_parents = { + 'tr':1, + 'li':1, + 'story': 0, + 'section': 0 +} +class sale_order_1(report_sxw.rml_parse): + def __init__(self, cr, uid, name, context): + super(sale_order_1, self).__init__(cr, uid, name, context) + self.localcontext.update({ + 'time': time, + 'sale_order_lines': self.sale_order_lines, + # 'repeat_In':self.repeat_In, + }) + self.context = context + +# + + def sale_order_lines(self,sale_order): + result =[] + sub_total={} + info=[] + order_lines=[] + res={} + list_in_seq=[] + ids = self.pool.get('sale.order.line').search(self.cr, self.uid, [('order_id', '=', sale_order.id)]) + for id in range(0,len(ids)): + order = self.pool.get('sale.order.line').browse(self.cr, self.uid,ids[id], self.context.copy()) + order_lines.append(order) + + i=1 + j=0 + sum_flag={} + sum_flag[j]=-1 + for entry in order_lines: + res={} + + if entry.layout_type=='article': + res['tax_id']=', '.join(map(lambda x: x.name, entry.tax_id)) or '' + res['name']=entry.name + res['product_uom_qty']="%.2f"%(entry.product_uos and entry.product_uos_qty or entry.product_uom_qty or 0.00) + res['product_uom']=entry.product_uos and entry.product_uos.name or entry.product_uom.name + res['price_unit']="%.2f"%(entry.price_unit or 0.00) + res['discount']="%.2f"%(entry.discount and entry.discount or 0.00) + res['price_subtotal']="%.2f"%(entry.price_subtotal and entry.price_subtotal or 0.00) + sub_total[i]= entry.price_subtotal and entry.price_subtotal + i=i+1 + res['note']=entry.notes or '' + res['currency']=sale_order.pricelist_id.currency_id.name + res['layout_type']=entry.layout_type + + else: + + res['product_uom_qty']='' + res['price_unit']='' + res['discount']='' + res['tax_id']='' + res['layout_type']=entry.layout_type + res['note']=entry.notes or '' + res['product_uom']='' + + if entry.layout_type=='subtotal': + res['name']=entry.name + sum=0 + sum_id=0 + if sum_flag[j]==-1: + temp=1 + else: + temp=sum_flag[j] + + for sum_id in range(temp,len(sub_total)+1): + sum+=sub_total[sum_id] + sum_flag[j+1]= sum_id +1 + + j=j+1 + res['price_subtotal']="%.2f"%(sum) + res['currency']=sale_order.pricelist_id.currency_id.name + res['quantity']='' + res['price_unit']='' + res['discount']='' + res['tax_id']='' + res['product_uom']='' + elif entry.layout_type=='title': + res['name']=entry.name + res['price_subtotal']='' + res['currency']='' + elif entry.layout_type=='text': + res['name']=entry.name + res['price_subtotal']='' + res['currency']='' + elif entry.layout_type=='line': + res['product_uom_qty']='__________' + res['price_unit']='______________' + res['discount']='___________' + res['tax_id']='_________________' + res['product_uom']='_____' + res['name']='_______________________________________' + res['price_subtotal']='_________' + res['currency']='_______' + elif entry.layout_type=='break': + res['layout_type']=entry.layout_type + res['name']=entry.name + res['price_subtotal']='' + res['currency']='' + else: + res['name']=entry.name + res['price_subtotal']='' + res['currency']=sale_order.pricelist_id.currency_id.name + + result.append(res) + return result +report_sxw.report_sxw('report.sale.order.layout', 'sale.order', 'addons/sale_layout/report/report_sale_layout.rml', parser=sale_order_1) +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + + diff --git a/addons/sale_layout/report/report_sale_layout.rml b/addons/sale_layout/report/report_sale_layout.rml new file mode 100755 index 00000000000..28e007ecfdc --- /dev/null +++ b/addons/sale_layout/report/report_sale_layout.rml @@ -0,0 +1,352 @@ +<?xml version="1.0"?> +<document filename="test.pdf"> + <template pageSize="(595.0,842.0)" title="Test" author="Martin Simon" allowSplitting="20"> + <pageTemplate id="first"> + <frame id="first" x1="34.0" y1="28.0" width="527" height="786"/> + </pageTemplate> + </template> + <stylesheet> + <blockTableStyle id="Standard_Outline"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="Tableau2"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="Table5"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,0" stop="0,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="0,0" stop="0,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="1,0" stop="1,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="1,0" stop="1,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="2,0" stop="2,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="2,0" stop="2,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="3,0" stop="3,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/> + </blockTableStyle> + <blockTableStyle id="Table6"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,0" stop="0,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="0,0" stop="0,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="1,0" stop="1,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="1,0" stop="1,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="2,0" stop="2,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="2,0" stop="2,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="3,0" stop="3,-1"/> + <lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="3,0" stop="3,0"/> + <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/> + </blockTableStyle> + <blockTableStyle id="Table7"> + <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"/> + </blockTableStyle> + <blockTableStyle id="Table1"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="Table2"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="Table3"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + </blockTableStyle> + <blockTableStyle id="Table4"> + <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"/> + </blockTableStyle> + <blockTableStyle id="Table8"> + <blockAlignment value="LEFT"/> + <blockValign value="TOP"/> + <lineStyle kind="LINEABOVE" colorName="#ffffff" start="0,0" stop="0,0"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="1,0" stop="1,0"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="2,0" stop="2,0"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="3,0" stop="3,0"/> + <lineStyle kind="LINEBEFORE" colorName="#ffffff" start="0,1" stop="0,-1"/> + <lineStyle kind="LINEBELOW" colorName="#ffffff" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEBEFORE" colorName="#ffffff" start="0,2" stop="0,-1"/> + <lineStyle kind="LINEBELOW" colorName="#ffffff" start="0,-1" stop="0,-1"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="1,2" stop="1,2"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="2,2" stop="2,2"/> + <lineStyle kind="LINEABOVE" colorName="#000000" start="3,2" stop="3,2"/> + </blockTableStyle> + <initialize> + <paraStyle name="all" alignment="justify"/> + </initialize> + <paraStyle name="P1" rightIndent="0.0" leftIndent="14.0" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P2" rightIndent="0.0" leftIndent="-2.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P3" rightIndent="0.0" leftIndent="11.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P4" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P5" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P6" fontName="Helvetica" fontSize="5.0" leading="7" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P7" fontName="Helvetica"/> + <paraStyle name="P8" fontName="Helvetica" fontSize="9.0" leading="13" alignment="LEFT"/> + <paraStyle name="P9" fontName="Helvetica-Bold" fontSize="20.0" leading="25" alignment="LEFT"/> + <paraStyle name="P10" fontName="Helvetica-BoldOblique" fontSize="20.0" leading="25" alignment="LEFT"/> + <paraStyle name="P11" fontName="Helvetica" fontSize="11.0" leading="14"/> + <paraStyle name="P12" fontName="Helvetica" fontSize="11.0" leading="14"/> + <paraStyle name="P13" fontName="Helvetica" fontSize="11.0" leading="14" alignment="LEFT"/> + <paraStyle name="P14" fontName="Helvetica-BoldOblique" fontSize="6.0" leading="8" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P15" fontName="Helvetica-BoldOblique" fontSize="14.0" leading="17" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P16" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P17" fontName="Helvetica" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P18" fontName="Helvetica-BoldOblique" fontSize="11.0" leading="14" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P19" fontName="Helvetica-BoldOblique" fontSize="11.0" leading="14" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P20" fontName="Helvetica" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P21" fontName="Helvetica" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P22" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P23" fontName="Helvetica" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P24" fontName="Helvetica-Bold" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P25" fontName="Helvetica-Bold" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="P26" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P27" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P28" rightIndent="0.0" leftIndent="-2.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P29" rightIndent="0.0" leftIndent="11.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P30" rightIndent="0.0" leftIndent="14.0" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P31" fontName="Helvetica-Bold" fontSize="9.0" leading="13" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="P32" fontName="Helvetica-Bold" fontSize="5.0" leading="7" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P33" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P34" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.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="Heading" fontName="Helvetica" fontSize="8.0" leading="10" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.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_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" 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_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.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_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.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_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_1" fontName="Helvetica" fontSize="2.0" leading="3" 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_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" 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_Italic" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9_Bold" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + </stylesheet> + <images/> + <story> + <para style="terp_default_8">[[repeatIn(objects,'o')]]</para> + <para style="P14">[[ setLang(o.partner_id.lang) ]]</para> + <para style="P8"> + <font color="white"> </font> + </para> + <blockTable colWidths="254.0,62.0,211.0" style="Tableau2"> + <tr> + <td> + <para style="terp_default_Bold_9">Shipping address :</para> + <para style="terp_default_9">[[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.title or '' ]] [[ o.partner_shipping_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.street ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.street2 or '' ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.city or '' ]] [[ o.partner_shipping_id.zip or '' ]]</para> + <para style="terp_default_9">[[ o.partner_shipping_id.state_id and o.partner_shipping_id.state_id.name or '' ]] [[ o.partner_shipping_id.country_id and o.partner_shipping_id.country_id.name or '' ]]</para> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + <para style="terp_default_Bold_9">Invoice address :</para> + <para style="terp_default_9">[[ o.partner_invoice_id.street ]] [[ o.partner_invoice_id.street2 and (', %s' % o.partner_invoice_id.street2 or '') ]]</para> + <para style="P27">[[ o.partner_invoice_id.zip or '' ]] [[ o.partner_invoice_id.city or '' ]] [[ o.partner_invoice_id.country_id and (', %s' % (o.partner_invoice_id.country_id and o.partner_invoice_id.country_id.name or '')) ]]</para> + </td> + <td> + <para style="P17"> + <font color="white"> </font> + </para> + </td> + <td> + <para style="terp_default_9">[[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.title or '' ]] [[ o.partner_order_id.name ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.street ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.street2 or '' ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.zip or '' ]] [[ o.partner_order_id.city or '' ]]</para> + <para style="terp_default_9">[[ o.partner_order_id.state_id and o.partner_order_id.state_id.name or '' ]] [[ o.partner_order_id.country_id and o.partner_order_id.country_id.name or '' ]]</para> + <para style="terp_default_9"> + <font color="white"> </font> + </para> + <para style="terp_default_9">Tel. : [[ o.partner_order_id.phone or removeParentNode('para') ]]</para> + <para style="terp_default_9">Fax : [[ o.partner_order_id.fax or removeParentNode('para') ]]</para> + <para style="terp_default_9">TVA : [[ o.partner_id.vat or removeParentNode('para') ]]</para> + <para style="P26"> + <font color="white"> </font> + </para> + </td> + </tr> + </blockTable> + <para style="P8"> + <font color="white"> </font> + </para> + <para style="terp_header">[[ o.state<>'draft' and removeParentNode('para') ]] Quotation N° [[ o.name ]]</para> + <para style="terp_header">[[ o.state=='draft' and removeParentNode('para') ]] Order N° [[ o.name ]]</para> + <para style="P15"> + <font color="white"> </font> + </para> + <blockTable colWidths="132.0,134.0,135.0,135.0" style="Table5"> + <tr> + <td> + <para style="terp_tblheader_General_Centre">Your Reference </para> + </td> + <td> + <para style="terp_tblheader_General_Centre">Date Ordered </para> + </td> + <td> + <para style="terp_tblheader_General_Centre">Our Salesman </para> + </td> + <td> + <para style="terp_tblheader_General_Centre">Payment Terms</para> + </td> + </tr> + </blockTable> + <blockTable colWidths="132.0,134.0,135.0,135.0" style="Table6"> + <tr> + <td> + <para style="terp_default_Centre_8">[[ o.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_8">[[ o.date_order ]]</para> + </td> + <td> + <para style="terp_default_Centre_8">[[ o.user_id.name ]]</para> + </td> + <td> + <para style="terp_default_Centre_8">[[ o.payment_term.name ]]</para> + </td> + </tr> + </blockTable> + <para style="P7"> + <font color="white"> </font> + </para> + <blockTable colWidths="216.0,62.0,62.0,62.0,51.0,74.0" style="Table7"> + <tr> + <td> + <para style="terp_tblheader_Details">Description</para> + </td> + <td> + <para style="terp_tblheader_Details_Centre">VAT</para> + </td> + <td> + <para style="terp_tblheader_Details_Centre">Quantity</para> + </td> + <td> + <para style="terp_tblheader_Details_Right">Unit Price</para> + </td> + <td> + <para style="terp_tblheader_Details_Right">Disc.(%)</para> + </td> + <td> + <para style="terp_tblheader_Details_Right">Price</para> + </td> + </tr> + </blockTable> + + <section> + <para style="P32">[[ repeatIn(sale_order_lines(o),'a') ]]</para> + <blockTable colWidths="0.0,216.0,66,46,24,66,55,54" style="Table1"> + <tr> + <td> + <para style="P8">[[ a['layout_type']=='text' and removeParentNode('blockTable')]]</para> + </td> + <td> + <para style="Table Contents"><font>[[ (a['layout_type']=='title' or a['layout_type']=='subtotal') and ( setTag('para','para',{'fontName':'Helvetica-bold'})) or removeParentNode('font') ]]</font>[[ a['name'] ]]</para> + </td> + <td> + <para style="Table Contents"><font>[[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]]</font><font>[[ a['tax_id'] ]]</font></para> + </td> + <td> + <para style="Table Contents"><font>[[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]]</font><font>[[ a['product_uom_qty'] ]]</font></para> + </td> + <td> + <para style="Table Contents"><font>[[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]]</font><font>[[ a['product_uom'] ]]</font></para> + </td> + <td> + <para style="Table Contents"><font>[[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]] </font><font>[[ a['price_unit'] ]]</font></para> + </td> + <td> + <para style="Table Contents"><font>[[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]]</font><font>[[ a['discount'] ]]</font></para> + </td> + <td> + <para style="Table Contents"><font>[[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]]</font><font>[[ a['price_subtotal'] ]]</font></para> + </td> + </tr> + </blockTable> + <blockTable colWidths="453.0,74.0" style="Table2"> + <tr> + <td> + <para style="P7">[[ a['layout_type']=='text' and a['name'] or removeParentNode('blockTable') ]]</para> + </td> + <td> + <para style="P7"></para> + </td> + </tr> + </blockTable> + <blockTable colWidths="66.0,461.0" style="Table3"> + <tr> + <td> + + <para style="P7"><font>[[ a['note']=='' and removeParentNode('blockTable') ]]</font><font>[[ repeatIn(( a['note'] and a['note'].splitlines()) or [], 'note') ]]</font></para> + </td> + <td> + <para style="P7">[[ a['note'] and note or removeParentNode('blockTable') ]]</para> + </td> + </tr> + </blockTable> + <pageBreak>[[ a['layout_type']!='break' and removeParentNode('pageBreak')]]</pageBreak> + <blockTable colWidths="216.0,62.0,62.0,62.0,51.0,74.0" style="Table4"> + <tr> + <td> + <para style="P31">Description [[ a['layout_type']!='break' and removeParentNode('blockTable')]]</para> + </td> + <td> + <para style="P31">Taxes</para> + </td> + <td> + <para style="P31">Quantity</para> + </td> + <td> + <para style="P31">Unit Price</para> + </td> + <td> + <para style="P31">Disc. (%)</para> + </td> + <td> + <para style="P31">Price</para> + </td> + </tr> + </blockTable> + </section> + + </story> +</document> diff --git a/addons/sale_layout/sale_layout.py b/addons/sale_layout/sale_layout.py new file mode 100755 index 00000000000..d493b7d6840 --- /dev/null +++ b/addons/sale_layout/sale_layout.py @@ -0,0 +1,160 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved +# $Id$ +# +# 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 3 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, see <http://www.gnu.org/licenses/>. +# +############################################################################## +from osv import fields,osv +from tools import config +import decimal_precision as dp +from tools.translate import _ +class sale_order_line(osv.osv): + + def _amount_line(self, cr, uid, ids, field_name, arg, context=None): + tax_obj = self.pool.get('account.tax') + cur_obj = self.pool.get('res.currency') + res = {} + context = context or {} + for line in self.browse(cr, uid, ids, context=context): + if line.layout_type=='article': + return super(sale_order_line, self)._amount_line(cr, uid, ids, field_name, arg, context) + return res + def invoice_line_create(self, cr, uid, ids, context={}): + new_ids = [] + list_seq = [] + for line in self.browse(cr, uid, ids, context): + if line.layout_type == 'article': + new_ids.append(line.id) + list_seq.append(line.sequence) + invoice_line_ids = super(sale_order_line, self).invoice_line_create(cr, uid, new_ids, context) + pool_inv_line = self.pool.get('account.invoice.line') + seq = 0 + for obj_inv_line in pool_inv_line.browse(cr, uid, invoice_line_ids, context=context): + pool_inv_line.write(cr, uid, [obj_inv_line.id], {'sequence': list_seq[seq]}, context=context) + seq += 1 + return invoice_line_ids + + def onchange_sale_order_line_view(self, cr, uid, id, type, context={}, *args): + temp ={} + temp['value']= {} + if (not type): + return {} + if type != 'article': + temp = {'value': { + 'product_id': False, + 'uos_id': False, + 'account_id': False, + 'price_unit': 0.0, + 'price_subtotal': 0.0, + 'quantity': 0, + 'discount': 0.0, + 'invoice_line_tax_id': False, + 'account_analytic_id': False, + 'product_uom_qty':0.0, + }, + } + if type == 'line': + temp['value']['name'] = ' ' + if type == 'break': + temp['value']['name'] = ' ' + if type == 'subtotal': + temp['value']['name'] = 'Sub Total' + return temp + return {} + + def create(self, cr, user, vals, context=None): + if vals.has_key('layout_type'): + if vals['layout_type'] == 'line': + vals['name'] = ' ' + if vals['layout_type'] == 'break': + vals['name'] = ' ' + if vals['layout_type'] != 'article': + vals['product_uom_qty']= 0 + return super(sale_order_line, self).create(cr, user, vals, context) + + def write(self, cr, user, ids, vals, context=None): + if vals.has_key('layout_type'): + if vals['layout_type'] == 'line': + vals['name'] = ' ' + if vals['layout_type'] == 'break': + vals['name'] = ' ' + return super(sale_order_line, self).write(cr, user, ids, vals, context) + + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} + default['layout_type'] = self.browse(cr, uid, id).layout_type + return super(sale_order_line, self).copy(cr, uid, id, default, context) + + + _name = "sale.order.line" + _order = "order_id, sequence asc" + _description = "Sale Order line" + _inherit = "sale.order.line" + _columns = { + 'layout_type': fields.selection([ + ('article','Product'), + ('title','Title'), + ('text','Note'), + ('subtotal','Sub Total'), + ('line','Separator Line'), + ('break','Page Break'),] + ,'Layout Type', select=True, required=True), + 'sequence': fields.integer('Sequence Number'), + 'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Sale Price'), readonly=True, states={'draft':[('readonly',False)]}), + 'product_uom_qty': fields.float('Quantity (UoM)', digits=(16,2)), + 'product_uom': fields.many2one('product.uom', 'Product UoM'), + } + + _defaults = { + 'layout_type': lambda *a: 'article', + } +sale_order_line() + + +class one2many_mod2(fields.one2many): + def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): + if not context: + context = {} + if not values: + values = {} + res = {} + for id in ids: + res[id] = [] + ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids),('layout_type','=','article')], limit=self._limit) + for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'): + res[r[self._fields_id]].append( r['id'] ) + return res + + +class sale_order(osv.osv): + + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} + default['order_line'] = False + return super(sale_order, self).copy(cr, uid, id, default, context) + + _inherit = "sale.order" + _columns = { + 'abstract_line_ids': fields.one2many('sale.order.line', 'order_id', 'Order Lines',readonly=True, states={'draft':[('readonly',False)]}), + 'order_line': one2many_mod2('sale.order.line', 'order_id', 'Order Lines',readonly=True, states={'draft':[('readonly',False)]}), + } +sale_order() +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/sale_layout/sale_layout_report.xml b/addons/sale_layout/sale_layout_report.xml new file mode 100755 index 00000000000..53775fdb149 --- /dev/null +++ b/addons/sale_layout/sale_layout_report.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<openerp> + <data> + + <report id="sale_order_1" + string="Order with Layout" + model="sale.order" + name="sale.order.layout" + rml="sale_layout/report/report_sale_layout.rml" + auto="False"/> + </data> +</openerp> diff --git a/addons/sale_layout/sale_layout_view.xml b/addons/sale_layout/sale_layout_view.xml new file mode 100755 index 00000000000..2cfd109f52d --- /dev/null +++ b/addons/sale_layout/sale_layout_view.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record model="ir.ui.view" id="view_order_line_form2_inherit_1"> + <field name="name">sale.order.line.form2.inherit_1</field> + <field name="model">sale.order.line</field> + <field name="inherit_id" ref="sale.view_order_line_form2"/> + <field name="type">form</field> + <field name="arch" type="xml"> + <xpath expr="/form/notebook/page/field[@name='name']" position="before"> + <field name="layout_type" select="1" on_change="onchange_sale_order_line_view(layout_type)" /> + <field name="sequence"/> + </xpath> + </field> + </record> + + <record model="ir.ui.view" id="view_order_line_tree_inherit_1"> + <field name="name">sale.order.line.tree.inherit_1</field> + <field name="model">sale.order.line</field> + <field name="inherit_id" ref="sale.view_order_line_tree"/> + <field name="type">tree</field> + <field name="arch" type="xml"> + <xpath expr="/tree/field[@name='name']" position="before"> + <field name="sequence" string="Seq."/> + <field name="layout_type"/> + </xpath> + </field> + </record> + + + <record model="ir.ui.view" id="view_order_form_inherit_1"> + <field name="name">sale.order.form.inherit_1</field> + <field name="model">sale.order</field> + <field name="inherit_id" ref="sale.view_order_form"/> + <field name="type">form</field> + <field name="arch" type="xml"> + <xpath expr="/form/notebook/page/field[@name='order_line']" position="replace"> + <field name="abstract_line_ids" colspan="4" nolabel="1" widget="one2many_list"> + <form string="Sale Order Lines"> + <notebook> + <page string="Order Line"> + <separator colspan="4" string="Automatic Declaration"/> + <field colspan="4" + context="partner_id=parent.partner_id,quantity=product_uom_qty,pricelist=parent.pricelist_id,shop=parent.shop_id,uom=product_uom" + name="product_id" + attrs="{'readonly':[('layout_type','!=','article')]}" + on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, 'lang' in context and context['lang'], True, parent.date_order, product_packaging, parent.fiscal_position)" + select="1"/> + <field + context="partner_id=parent.partner_id,quantity=product_uom_qty,pricelist=parent.pricelist_id,shop=parent.shop_id,uom=product_uom" + name="product_uom_qty" + attrs="{'readonly':[('layout_type','!=','article')]}" + on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, 'lang' in context and context['lang'], False, parent.date_order, product_packaging, parent.fiscal_position)" + select="1"/> + <field name="product_uom" + required="0" + attrs="{'readonly':[('layout_type','!=','article')], 'required':[('layout_type','not in',['title','text','subtotal','line','break'])]}" + on_change="product_uom_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, 'lang' in context and context['lang'], False, parent.date_order)"/> + <field + name="product_packaging" + attrs="{'readonly':[('layout_type','!=','article')]}" + context="partner_id=parent.partner_id,quantity=product_uom_qty,pricelist=parent.pricelist_id,shop=parent.shop_id,uom=product_uom" + on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, 'lang' in context and context['lang'], False, parent.date_order, product_packaging, parent.fiscal_position)" + domain="[('product_id','=',product_id)]" + groups="base.group_extended"/> + <separator colspan="4" string="Manual Description" /> + <field name="layout_type" on_change="onchange_sale_order_line_view(layout_type)"/> + <field name="sequence" string="Seq."/> + <field colspan="4" name="name" select="2" attrs="{'readonly':[('layout_type','in',('line','break'))] }"/> + <field name="price_unit" select="2" attrs="{'readonly':[('layout_type','!=','article')],'required':[('layout_type','not in',['title','text','subtotal','line','break'])]}"/> + <field name="discount" attrs="{'readonly':[('layout_type','!=','article')]}"/> + <field name="type" attrs="{'readonly':[('layout_type','!=','article')]}"/> + <field name="delay" select="2" attrs="{'readonly':[('layout_type','!=','article')]}"/> + <field colspan="4" name="tax_id" domain="[('parent_id','=',False)]" attrs="{'readonly':[('layout_type','!=','article')]}"/> + <separator colspan="4" string="States"/> + <field name="state" select="2"/> + <group col="3" colspan="2"> + <field name="invoiced" select="2"/> + <button colspan="1" name="%(sale.action_view_sale_order_line_make_invoice)d" states="confirmed" string="Make Invoice" type="action"/> + </group> + </page> + <page groups="base.group_extended" string="Extra Info"> + <field groups="product.group_uos" name="product_uos_qty" on_change="uos_change(product_uos, product_uos_qty, product_id)"/> + <field groups="product.group_uos" name="product_uos"/> + <field name="address_allotment_id" select="2"/> + <separator colspan="4" string="Properties"/> + <field colspan="4" name="property_ids" nolabel="1"/> + </page> + <page string="Notes"> + <field colspan="4" name="notes" nolabel="1"/> + </page> + <page string="History" groups="base.group_extended"> + <separator colspan="4" string="Invoice Lines"/> + <field colspan="4" name="invoice_lines" nolabel="1"/> + <separator colspan="4" string="Stock Moves"/> + <field colspan="4" name="move_ids" nolabel="1" widget="many2many"/> + </page> + </notebook> + </form> + <tree string="Sales order lines"> + <field colspan="4" name="name"/> + <field name="product_uom_qty" string="Qty"/> + <field name="product_uom" string="UoM"/> + <field name="discount"/> + <field name="price_unit"/> + <!-- field name="price_net"/--> + <field name="price_subtotal"/> + <field name="sequence"/> + </tree> + </field> + </xpath> + </field> + </record> + + </data> +</openerp> diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml index fb4c0046cec..6f744ce784d 100644 --- a/addons/stock/stock_view.xml +++ b/addons/stock/stock_view.xml @@ -604,7 +604,7 @@ <field name="invoice_state"/> <field name="stock_journal_id" groups="base.group_extended" widget="selection"/> <field name="state"/> - <button name="%(action_partial_picking)d" states="assigned" string="Validate" type="action" icon="gtk-go-forward" help="Validate Picking"/> + <button name="%(action_partial_picking)d" states="assigned" string="Approve" type="action" icon="gtk-go-forward" help="Approve Picking"/> <button name="button_cancel" states="assigned,confirmed,draft" string="Cancel" icon="gtk-cancel" help="Cancel" confirm="This operation will cancel the picking. Do you want to continue?"/> </tree> </field> @@ -714,7 +714,7 @@ <button name="draft_validate" states="draft" string="Process Now" type="object" icon="gtk-media-play"/> <button name="action_assign" states="confirmed" string="Check Availability" type="object" icon="gtk-find"/> <button name="force_assign" states="confirmed" string="Force Availability" type="object" icon="gtk-jump-to"/> - <button name="%(action_partial_picking)d" states="assigned" string="Validate" type="action" icon="gtk-apply"/> + <button name="%(action_partial_picking)d" states="assigned" string="Approve" type="action" icon="gtk-apply"/> <button name="button_cancel" states="assigned,confirmed,draft" string="Cancel" icon="gtk-cancel"/> </group> </page> @@ -774,7 +774,7 @@ <field name="min_date"/> <field name="stock_journal_id" groups="base.group_extended" widget="selection"/> <field name="state"/> - <button name="%(action_partial_picking)d" states="assigned" string="Validate" type="action" icon="gtk-go-forward" help="Validate Delivery"/> + <button name="%(action_partial_picking)d" states="assigned" string="Approve" type="action" icon="gtk-go-forward" help="Approve Delivery"/> <button name="button_cancel" states="assigned,confirmed,draft" string="Cancel" icon="gtk-cancel" help="Cancel" confirm="This operation will cancel the delivery. Do you want to continue?"/> </tree> </field> @@ -978,7 +978,7 @@ <field name="invoice_state"/> <field name="stock_journal_id" groups="base.group_extended" widget="selection"/> <field name="state"/> - <button name="%(action_partial_picking)d" states="assigned" string="Validate" type="action" icon="gtk-go-forward" help="Validate Picking"/> + <button name="%(action_partial_picking)d" states="assigned" string="Approve" type="action" icon="gtk-go-forward" help="Approve Picking"/> </tree> </field> </record> @@ -1175,7 +1175,7 @@ <field name="invoice_state" groups="base.group_extended"/> <field name="stock_journal_id" groups="base.group_extended" widget="selection"/> <field name="state"/> - <button name="%(action_partial_picking)d" states="assigned" string="Validate" type="action" icon="gtk-ok" help="Receive products"/> + <button name="%(action_partial_picking)d" states="assigned" string="Approve" type="action" icon="gtk-ok" help="Receive products"/> <button name="button_cancel" states="assigned,confirmed,draft" string="Cancel" icon="gtk-cancel" help="Cancel" confirm="This operation will cancel the shipment. Do you want to continue?" /> </tree> </field> diff --git a/addons/stock_planning/stock_planning_view.xml b/addons/stock_planning/stock_planning_view.xml index 7da194d91e1..0bb9222df35 100644 --- a/addons/stock_planning/stock_planning_view.xml +++ b/addons/stock_planning/stock_planning_view.xml @@ -153,7 +153,7 @@ <field name="product_qty" /> <field name="state"/> <label string = ""/> - <button name="action_validate" icon="gtk-apply" string="Validate" states="draft" type="object" colspan = "1"/> + <button name="action_validate" icon="gtk-apply" string="Approve" states="draft" type="object" colspan = "1"/> </group> </group> |
