diff options
| author | Martin Trigaux <mat@openerp.com> | 2013-06-05 11:04:53 +0200 |
|---|---|---|
| committer | Martin Trigaux <mat@openerp.com> | 2013-06-05 11:04:53 +0200 |
| commit | ccb38117ee79fdf5aba6e530efdebeed886cd31f (patch) | |
| tree | bfcc643127864c8112a702b275194e7e7450e6d0 /addons | |
| parent | 5cc8c30adfeccc6db22ebf7487b8e4ebdbe10423 (diff) | |
| parent | 45c3fd063b10a8da77ee21ad3e1a2c892977e369 (diff) | |
[MERGE] Forward porting of saas-1 until rev 8739
bzr revid: mat@openerp.com-20130605090453-e4mg37kms5j1r18n
Diffstat (limited to 'addons')
72 files changed, 766 insertions, 616 deletions
diff --git a/addons/account/account.py b/addons/account/account.py index e92bd3a7879..d65c5d62c0a 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1034,9 +1034,15 @@ class account_period(osv.osv): context = {} ids = [] if name: - ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit) + ids = self.search(cr, user, + [('code', 'ilike', name)] + args, + limit=limit, + context=context) if not ids: - ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit) + ids = self.search(cr, user, + [('name', operator, name)] + args, + limit=limit, + context=context) return self.name_get(cr, user, ids, context=context) def write(self, cr, uid, ids, vals, context=None): @@ -1059,10 +1065,14 @@ class account_period(osv.osv): raise osv.except_osv(_('Error!'), _('You should choose the periods that belong to the same company.')) if period_date_start > period_date_stop: raise osv.except_osv(_('Error!'), _('Start period should precede then end period.')) + + # /!\ We do not include a criterion on the company_id field below, to allow producing consolidated reports + # on multiple companies. It will only work when start/end periods are selected and no fiscal year is chosen. + #for period from = january, we want to exclude the opening period (but it has same date_from, so we have to check if period_from is special or not to include that clause or not in the search). if period_from.special: - return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id)]) - return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id), ('special', '=', False)]) + return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop)]) + return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('special', '=', False)]) class account_journal_period(osv.osv): @@ -1854,6 +1864,12 @@ class account_tax_code(osv.osv): _order = 'code' +def get_precision_tax(): + def change_digit_tax(cr): + res = openerp.registry(cr.dbname)['decimal.precision'].precision_get(cr, SUPERUSER_ID, 'Account') + return (16, res+3) + return change_digit_tax + class account_tax(osv.osv): """ A tax object. @@ -1874,12 +1890,6 @@ class account_tax(osv.osv): default.update({'name': name + _(' (Copy)')}) return super(account_tax, self).copy_data(cr, uid, id, default=default, context=context) - def get_precision_tax(): - def change_digit_tax(cr): - res = openerp.registry(cr.dbname)['decimal.precision'].precision_get(cr, SUPERUSER_ID, 'Account') - return (16, res+2) - return change_digit_tax - _name = 'account.tax' _description = 'Tax' _columns = { @@ -2795,7 +2805,7 @@ class account_tax_template(osv.osv): 'chart_template_id': fields.many2one('account.chart.template', 'Chart Template', required=True), 'name': fields.char('Tax Name', size=64, required=True), 'sequence': fields.integer('Sequence', required=True, help="The sequence field is used to order the taxes lines from lower sequences to higher ones. The order is important if you have a tax that has several tax children. In this case, the evaluation order is important."), - 'amount': fields.float('Amount', required=True, digits=(14,4), help="For Tax Type percent enter % ratio between 0-1."), + 'amount': fields.float('Amount', required=True, digits_compute=get_precision_tax(), help="For Tax Type percent enter % ratio between 0-1."), 'type': fields.selection( [('percent','Percent'), ('fixed','Fixed'), ('none','None'), ('code','Python Code'), ('balance','Balance')], 'Tax Type', required=True), 'applicable_type': fields.selection( [('true','True'), ('code','Python Code')], 'Applicable Type', required=True, help="If not applicable (computed through a Python code), the tax won't appear on the invoice."), 'domain':fields.char('Domain', size=32, help="This field is only used if you develop your own module allowing developers to create specific taxes in a custom domain."), diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index ab6ad97b180..0c49bed2fb5 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -89,13 +89,43 @@ class account_invoice(osv.osv): return [('none', _('Free Reference'))] def _amount_residual(self, cr, uid, ids, name, args, context=None): + """Function of the field residua. It computes the residual amount (balance) for each invoice""" + if context is None: + context = {} + ctx = context.copy() result = {} + currency_obj = self.pool.get('res.currency') for invoice in self.browse(cr, uid, ids, context=context): + nb_inv_in_partial_rec = max_invoice_id = 0 result[invoice.id] = 0.0 if invoice.move_id: - for m in invoice.move_id.line_id: - if m.account_id.type in ('receivable','payable'): - result[invoice.id] += m.amount_residual_currency + for aml in invoice.move_id.line_id: + if aml.account_id.type in ('receivable','payable'): + if aml.currency_id and aml.currency_id.id == invoice.currency_id.id: + result[invoice.id] += aml.amount_residual_currency + else: + ctx['date'] = aml.date + result[invoice.id] += currency_obj.compute(cr, uid, aml.company_id.currency_id.id, invoice.currency_id.id, aml.amount_residual, context=ctx) + + if aml.reconcile_partial_id.line_partial_ids: + #we check if the invoice is partially reconciled and if there are other invoices + #involved in this partial reconciliation (and we sum these invoices) + for line in aml.reconcile_partial_id.line_partial_ids: + if line.invoice: + nb_inv_in_partial_rec += 1 + #store the max invoice id as for this invoice we will make a balance instead of a simple division + max_invoice_id = max(max_invoice_id, line.invoice.id) + if nb_inv_in_partial_rec: + #if there are several invoices in a partial reconciliation, we split the residual by the number + #of invoice to have a sum of residual amounts that matches the partner balance + new_value = currency_obj.round(cr, uid, invoice.currency_id, result[invoice.id] / nb_inv_in_partial_rec) + if invoice.id == max_invoice_id: + #if it's the last the invoice of the bunch of invoices partially reconciled together, we make a + #balance to avoid rounding errors + result[invoice.id] = result[invoice.id] - ((nb_inv_in_partial_rec - 1) * new_value) + else: + result[invoice.id] = new_value + #prevent the residual amount on the invoice to be less than 0 result[invoice.id] = max(result[invoice.id], 0.0) return result diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 7469c38decb..c71b97d5796 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -197,7 +197,7 @@ <field name="name"/> <field name="company_id" invisible="1"/> <field name="account_id" groups="account.group_account_user" - domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '!=', 'view')]" + domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '=', 'other')]" on_change="onchange_account_id(product_id, parent.partner_id, parent.type, parent.fiscal_position,account_id)"/> <field name="account_analytic_id" groups="analytic.group_analytic_accounting" domain="[('type','!=','view'), ('company_id', '=', parent.company_id)]"/> @@ -320,7 +320,7 @@ <group> <field string="Customer" name="partner_id" on_change="onchange_partner_id(type,partner_id,date_invoice,payment_term, partner_bank_id,company_id)" - groups="base.group_user" context="{'search_default_customer':1, 'show_address': 1}" + context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}' domain="[('customer', '=', True)]"/> <field name="fiscal_position" widget="selection" /> @@ -353,7 +353,7 @@ <field name="name"/> <field name="company_id" invisible="1"/> <field name="account_id" groups="account.group_account_user" - domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '!=', 'view')]" + domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '=', 'other')]" on_change="onchange_account_id(product_id, parent.partner_id, parent.type, parent.fiscal_position,account_id)"/> <field name="account_analytic_id" groups="analytic.group_analytic_accounting" domain="[('type','!=','view'), ('company_id', '=', parent.company_id)]"/> diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 603c4254b19..e921e639642 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -907,9 +907,7 @@ <label for="type"/> <div> <field name="type"/> - <field name="amount" class="oe_inline" - attrs="{'invisible':[('type','in',('none', 'code', 'balance'))]}"/> - <label string="%%" attrs="{'invisible':[('type','<>','percent')]}"/> + <field name="amount" attrs="{'invisible':[('type','in',('none', 'code', 'balance'))]}"/> </div> <field name="python_compute" attrs="{'invisible':[('type','!=','code')],'required':[('type','=','code')]}"/> <field name="python_compute_inv" attrs="{'invisible':[('type','!=','code')],'required':[('type','=','code')]}"/> diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index f6c89a92560..3dcc68e315e 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -68,7 +68,7 @@ name="%(account.action_invoice_tree)d" context="{'search_default_partner_id': active_id,'default_partner_id': active_id}" groups="account.group_account_invoice"/> <button type="action" string="Journal Items" name="%(account.action_account_moves_all_tree)d" groups="account.group_account_user"/> - <button type="action" string="Contracts/Analytic Accounts" name="%(account.action_open_partner_analytic_accounts)d" + <button type="action" string="Contracts" name="%(account.action_open_partner_analytic_accounts)d" groups="analytic.group_analytic_accounting"/> </xpath> </field> diff --git a/addons/account/product_view.xml b/addons/account/product_view.xml index 44d53839700..2c540cb6ee6 100644 --- a/addons/account/product_view.xml +++ b/addons/account/product_view.xml @@ -11,11 +11,11 @@ <page string="Accounting" groups="account.group_account_invoice"> <group name="properties"> <group> - <field name="property_account_income" domain="[('type','<>','view'),('type','<>','consolidation')]" groups="account.group_account_user"/> + <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"/> <field name="taxes_id" colspan="2" attrs="{'readonly':[('sale_ok','=',0)]}" widget="many2many_tags"/> </group> <group> - <field name="property_account_expense" domain="[('type','<>','view'),('type','<>','consolidation')]" groups="account.group_account_user"/> + <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"/> <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/> </group> </group> diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index 4dbdf41abf0..6ce97b5c868 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -68,6 +68,7 @@ <field name="parent_id" invisible="1"/> <field name="type"/> <field name="company_id" groups="base.group_multi_company"/> + <field name="template_id" invisible="1"/> </tree> </field> </record> diff --git a/addons/account/report/account_print_invoice.rml b/addons/account/report/account_print_invoice.rml index 9268c94d4c7..3582221df44 100644 --- a/addons/account/report/account_print_invoice.rml +++ b/addons/account/report/account_print_invoice.rml @@ -99,42 +99,39 @@ <initialize> <paraStyle name="all" alignment="justify"/> </initialize> - <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="15.0" leading="19" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_8" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="Footer" fontName="Helvetica"/> - <paraStyle name="Horizontal Line" fontName="Helvetica" 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" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_Bold_8" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_Right_8" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_8" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_address" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_9" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_9" rightIndent="0.0" leftIndent="-3.0" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_9" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Right_9" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_Right_9" rightIndent="0.0" leftIndent="-3.0" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_2" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_White_2" rightIndent="0.0" leftIndent="0.0" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#ffffff"/> - <paraStyle name="terp_default_Note" rightIndent="0.0" leftIndent="9.0" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="Table" fontName="Helvetica" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="User Index 10" rightIndent="0.0" leftIndent="127.0" fontName="Helvetica"/> - <paraStyle name="Preformatted Text" fontName="Helvetica" fontSize="10.0" leading="13" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="Standard"/> + <paraStyle name="Text body" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="List" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="Table Contents" spaceBefore="0.0" spaceAfter="6.0"/> + <paraStyle name="Caption" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="Index"/> + + <paraStyle name="terp_header" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_8" rightIndent="0.0" leftIndent="0.0" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="Footer"/> + <paraStyle name="Horizontal Line" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/> + + <paraStyle name="terp_tblheader_General" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_General_Centre" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_General_Right" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details_Centre" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details_Right" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> + + <paraStyle name="terp_default_Right_8" rightIndent="0.0" leftIndent="0.0" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Centre_8" rightIndent="0.0" leftIndent="0.0" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_address" rightIndent="0.0" leftIndent="0.0" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_9" rightIndent="0.0" leftIndent="0.0" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_9" rightIndent="0.0" leftIndent="-3.0" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Centre_9" rightIndent="0.0" leftIndent="0.0" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9" rightIndent="0.0" leftIndent="0.0" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_Right_9" rightIndent="0.0" leftIndent="-3.0" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_2" rightIndent="0.0" leftIndent="0.0" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_White_2" rightIndent="0.0" leftIndent="0.0" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0" textColor="#ffffff"/> + + <paraStyle name="Table" fontSize="10.0" leading="13" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="User Index 10" rightIndent="0.0" leftIndent="127.0"/> + <paraStyle name="Preformatted Text" fontSize="10.0" leading="13" spaceBefore="0.0" spaceAfter="0.0"/> <images/> </stylesheet> <story> @@ -144,12 +141,12 @@ <pto_header><!-- Must be after setLang() --> <blockTable colWidths="202.0,87.0,71.0,57.0,42.0,71.0" style="Table7"> <tr> - <td> <para style="terp_tblheader_Details">Description</para> </td> - <td> <para style="terp_tblheader_Details_Centre">Taxes</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> + <td><para style="terp_tblheader_Details"><b>Description</b></para></td> + <td><para style="terp_tblheader_Details_Centre"><b>Taxes</b></para></td> + <td><para style="terp_tblheader_Details_Centre"><b>Quantity</b></para></td> + <td><para style="terp_tblheader_Details_Right"><b>Unit Price</b></para></td> + <td><para style="terp_tblheader_Details_Right"><b>Disc.(%)</b></para></td> + <td><para style="terp_tblheader_Details_Right"><b>Price</b></para></td> </tr> </blockTable> </pto_header> @@ -172,29 +169,29 @@ </td> </tr> </blockTable> - <para style="terp_header">Invoice [[ ((o.type == 'out_invoice' and (o.state == 'open' or o.state == 'paid')) or removeParentNode('para')) and '' ]] [[ o.number ]]</para> - <para style="terp_header">PRO-FORMA [[ ((o.type == 'out_invoice' and o.state == 'proforma2') or removeParentNode('para')) and '' ]]</para> - <para style="terp_header">Draft Invoice [[ ((o.type == 'out_invoice' and o.state == 'draft') or removeParentNode('para')) and '' ]]</para> - <para style="terp_header">Cancelled Invoice [[ ((o.type == 'out_invoice' and o.state == 'cancel') or removeParentNode('para')) and '' ]] [[ o.number ]]</para> - <para style="terp_header">Refund [[ (o.type=='out_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]</para> - <para style="terp_header">Supplier Refund [[ (o.type=='in_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]</para> - <para style="terp_header">Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]] [[ o.number ]]</para> + <para style="terp_header"><b>Invoice [[ ((o.type == 'out_invoice' and (o.state == 'open' or o.state == 'paid')) or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para> + <para style="terp_header"><b>PRO-FORMA [[ ((o.type == 'out_invoice' and o.state == 'proforma2') or removeParentNode('para')) and '' ]]</b></para> + <para style="terp_header"><b>Draft Invoice [[ ((o.type == 'out_invoice' and o.state == 'draft') or removeParentNode('para')) and '' ]]</b></para> + <para style="terp_header"><b>Cancelled Invoice [[ ((o.type == 'out_invoice' and o.state == 'cancel') or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para> + <para style="terp_header"><b>Refund [[ (o.type=='out_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para> + <para style="terp_header"><b>Supplier Refund [[ (o.type=='in_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para> + <para style="terp_header"><b>Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="132.50,132.50,132.50,132.50" style="Table_Invoice_General_Header"> <tr> <td> - <para style="terp_tblheader_General_Centre">Description</para> + <para style="terp_tblheader_General_Centre"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Invoice Date</para> + <para style="terp_tblheader_General_Centre"><b>Invoice Date</b></para> </td> - <td> - <para style="terp_tblheader_General_Centre">Source</para> + <td> + <para style="terp_tblheader_General_Centre"><b>Source</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Customer Code</para> + <para style="terp_tblheader_General_Centre"><b>Customer Code</b></para> </td> </tr> </blockTable> @@ -220,22 +217,22 @@ <blockTable colWidths="185.0,70.0,80.0,60.0,50.0,85.0" style="Table7"> <tr> <td> - <para style="terp_tblheader_General">Description</para> + <para style="terp_tblheader_General"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Taxes</para> + <para style="terp_tblheader_General_Centre"><b>Taxes</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Quantity</para> + <para style="terp_tblheader_General_Right"><b>Quantity</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Unit Price</para> + <para style="terp_tblheader_General_Right"><b>Unit Price</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Disc.(%)</para> + <para style="terp_tblheader_General_Right"><b>Disc.(%)</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Price</para> + <para style="terp_tblheader_General_Right"><b>Price</b></para> </td> </tr> </blockTable> @@ -298,10 +295,10 @@ </para> </td> <td> - <para style="terp_tblheader_Details">Total:</para> + <para style="terp_tblheader_Details"><b>Total:</b></para> </td> <td> - <para style="terp_default_Bold_Right_9">[[ formatLang(o.amount_total, digits=get_digits(dp='Account'), currency_obj=o.currency_id) ]]</para> + <para style="terp_default_Bold_Right_9"><b>[[ formatLang(o.amount_total, digits=get_digits(dp='Account'), currency_obj=o.currency_id) ]]</b></para> </td> </tr> </blockTable> @@ -311,13 +308,13 @@ <blockTable colWidths="205.0,71.0,71.0,183.0" style="Table9"> <tr> <td> - <para style="terp_tblheader_Details">Tax [[ o.tax_line==[] and removeParentNode('blockTable') ]]</para> + <para style="terp_tblheader_Details"><b>Tax [[ o.tax_line==[] and removeParentNode('blockTable') ]]</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Base </para> + <para style="terp_tblheader_Details_Right"><b>Base </b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Amount </para> + <para style="terp_tblheader_Details_Right"><b>Amount </b></para> </td> <td> <para style="terp_default_8"> @@ -361,7 +358,7 @@ <blockTable colWidths="120.0,410.0" style="Table1"> <tr> <td> - <para style="terp_default_Bold_9">Fiscal Position Remark : </para> + <para style="terp_default_Bold_9"><b>Fiscal Position Remark : </b></para> </td> <td> <para style="terp_default_9">[[ (o.fiscal_position and o.fiscal_position.note and format(o.fiscal_position.note)) or removeParentNode('blockTable') ]]</para> diff --git a/addons/account/wizard/pos_box.py b/addons/account/wizard/pos_box.py index bd38e6bbed6..4b7e63585d8 100644 --- a/addons/account/wizard/pos_box.py +++ b/addons/account/wizard/pos_box.py @@ -22,7 +22,7 @@ class CashBox(osv.osv_memory): records = self.pool[active_model].browse(cr, uid, active_ids, context=context) - return self._run(cr, uid, ids, records, context=None) + return self._run(cr, uid, ids, records, context=context) def _run(self, cr, uid, ids, records, context=None): for box in self.browse(cr, uid, ids, context=context): diff --git a/addons/account_followup/account_followup_customers.xml b/addons/account_followup/account_followup_customers.xml index 6893abe012e..fba0bce460b 100644 --- a/addons/account_followup/account_followup_customers.xml +++ b/addons/account_followup/account_followup_customers.xml @@ -9,11 +9,12 @@ <field name="model">res.partner</field> <field name="priority" eval="20"/> <field name="arch" type="xml"> - <tree string="Customer Followup"> + <tree string="Customer Followup" create="false" delete="false"> <field name="display_name"/> <field name="payment_next_action_date"/> <field name="payment_next_action"/> <field name="user_id" invisible="1"/> + <field name="country_id" invisible="1"/> <field name="parent_id" invisible="1"/> <field name="payment_responsible_id"/> <field name="payment_earliest_due_date"/> @@ -97,7 +98,7 @@ <button name="action_done" type="object" string="⇾ Mark as Done" help="Click to mark the action as done." class="oe_link" attrs="{'invisible':[('payment_next_action_date','=', False)]}" - groups="base.group_partner_manager"/> + groups="account.group_account_user"/> <field name="payment_next_action" placeholder="Action to be taken e.g. Give a phonecall, Check if it's paid, ..."/> </div> </group> diff --git a/addons/account_followup/report/account_followup_report.xml b/addons/account_followup/report/account_followup_report.xml index 6fee6a77ac1..b7c38e89f5e 100644 --- a/addons/account_followup/report/account_followup_report.xml +++ b/addons/account_followup/report/account_followup_report.xml @@ -6,7 +6,7 @@ <field name="name">account_followup.stat.tree</field> <field name="model">account_followup.stat</field> <field name="arch" type="xml"> - <tree string="Follow-up lines"> + <tree string="Follow-up lines" create="false"> <field name="partner_id"/> <field name="date_move"/> <field name="date_move_last"/> diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py index 08d36c45eff..03e25dfbc45 100644 --- a/addons/account_payment/wizard/account_payment_order.py +++ b/addons/account_payment/wizard/account_payment_order.py @@ -23,6 +23,7 @@ import time from lxml import etree from openerp.osv import fields, osv +from openerp.tools.translate import _ class payment_order_create(osv.osv_memory): """ @@ -108,7 +109,7 @@ class payment_order_create(osv.osv_memory): context.update({'line_ids': line_ids}) model_data_ids = mod_obj.search(cr, uid,[('model', '=', 'ir.ui.view'), ('name', '=', 'view_create_payment_order_lines')], context=context) resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] - return {'name': ('Entrie Lines'), + return {'name': _('Entry Lines'), 'context': context, 'view_type': 'form', 'view_mode': 'form', diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py index ad28bbb1d57..891837f8813 100644 --- a/addons/auth_signup/res_users.py +++ b/addons/auth_signup/res_users.py @@ -56,19 +56,22 @@ class res_partner(osv.Model): def _get_signup_url_for_action(self, cr, uid, ids, action='login', view_type=None, menu_id=None, res_id=None, model=None, context=None): """ generate a signup url for the given partner ids and action, possibly overriding the url state components (menu_id, id, view_type) """ + if context is None: + context= {} res = dict.fromkeys(ids, False) base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url') for partner in self.browse(cr, uid, ids, context): # when required, make sure the partner has a valid signup token - if context and context.get('signup_valid') and not partner.user_ids: + if context.get('signup_valid') and not partner.user_ids: self.signup_prepare(cr, uid, [partner.id], context=context) partner.refresh() # the parameters to encode for the query and fragment part of url query = {'db': cr.dbname} - fragment = {'action': action, 'type': partner.signup_type} + signup_type = context.get('signup_force_type_in_url', partner.signup_type or '') + fragment = {'action': action, 'type': signup_type} - if partner.signup_token: + if partner.signup_token and signup_type: fragment['token'] = partner.signup_token elif partner.user_ids: fragment['db'] = cr.dbname diff --git a/addons/auth_signup/static/src/js/auth_signup.js b/addons/auth_signup/static/src/js/auth_signup.js index 545ee6cf60e..b825d683099 100644 --- a/addons/auth_signup/static/src/js/auth_signup.js +++ b/addons/auth_signup/static/src/js/auth_signup.js @@ -7,7 +7,7 @@ openerp.auth_signup = function(instance) { var self = this; this.signup_enabled = false; this.reset_password_enabled = false; - return this._super().then(function() { + return this._super().always(function() { // Switches the login box to the select mode whith mode == [default|signup|reset] self.on('change:login_mode', self, function() { diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index 9309f790013..3497255fa76 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -66,6 +66,7 @@ class base_action_rule(osv.osv): [('on_create', 'On Creation'), ('on_write', 'On Update'), ('on_time', 'Based on Timed Condition')], string='When to Run'), 'trg_date_id': fields.many2one('ir.model.fields', string='Trigger Date', + help="When should the condition be triggered. If present, will be checked by the scheduler. If empty, will be checked at creation and update.", domain="[('model_id', '=', model_id), ('ttype', 'in', ('date', 'datetime'))]"), 'trg_date_range': fields.integer('Delay after trigger date', help="Delay after the trigger date." \ diff --git a/addons/base_vat/base_vat.py b/addons/base_vat/base_vat.py index e7501334997..52db18b7307 100644 --- a/addons/base_vat/base_vat.py +++ b/addons/base_vat/base_vat.py @@ -83,6 +83,8 @@ class res_partner(osv.osv): Check the VAT number depending of the country. http://sima-pc.com/nif.php ''' + if not ustr(country_code).encode('utf-8').isalpha(): + return False check_func_name = 'check_vat_' + country_code check_func = getattr(self, check_func_name, None) or \ getattr(vatnumber, check_func_name, None) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 455ad89003c..b8673e73927 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -77,12 +77,12 @@ class crm_lead(base_stage, format_address, osv.osv): _track = { 'state': { - 'crm.mt_lead_create': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'new', + 'crm.mt_lead_create': lambda self, cr, uid, obj, ctx=None: obj['state'] in ['new', 'draft'], 'crm.mt_lead_won': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'done', 'crm.mt_lead_lost': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'cancel', }, 'stage_id': { - 'crm.mt_lead_stage': lambda self, cr, uid, obj, ctx=None: obj['state'] not in ['new', 'cancel', 'done'], + 'crm.mt_lead_stage': lambda self, cr, uid, obj, ctx=None: obj['state'] not in ['new', 'draft', 'cancel', 'done'], }, } @@ -103,7 +103,9 @@ class crm_lead(base_stage, format_address, osv.osv): if vals.get('type'): ctx['default_type'] = vals['type'] vals['stage_id'] = self._get_default_stage_id(cr, uid, context=ctx) - return super(crm_lead, self).create(cr, uid, vals, context=context) + # context: no_log, because subtype already handle this + create_context = dict(context, mail_create_nolog=True) + return super(crm_lead, self).create(cr, uid, vals, context=create_context) def _get_default_section_id(self, cr, uid, context=None): """ Gives default section by checking if present in the context """ @@ -678,8 +680,9 @@ class crm_lead(base_stage, format_address, osv.osv): merged_data['stage_id'] = section_stage_ids and section_stage_ids[0] or False # Write merged data into first opportunity self.write(cr, uid, [highest.id], merged_data, context=context) - # Delete tail opportunities - self.unlink(cr, uid, [x.id for x in tail_opportunities], context=context) + # Delete tail opportunities + # We use the SUPERUSER to avoid access rights issues because as the user had the rights to see the records it should be safe to do so + self.unlink(cr, SUPERUSER_ID, [x.id for x in tail_opportunities], context=context) return highest.id diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py index 924f96180cc..724102a84b1 100644 --- a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py +++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py @@ -124,6 +124,7 @@ class crm_lead_forward_to_partner(osv.TransientModel): lead_ids = context and context.get('active_ids', []) or [] value = self.default_get(cr, uid, ['body', 'email_to', 'email_cc', 'subject', 'history_mode'], context=context) value.pop('composition_mode') + self.pool.get('crm.lead').message_subscribe(cr, uid, lead_ids, [partner.id for partner in wizard.partner_ids], context=context) self.write(cr, uid, ids, value, context=context) return self.send_mail(cr, uid, ids, context=context) diff --git a/addons/document_page/document_page_view.xml b/addons/document_page/document_page_view.xml index 08c77647d17..4d0b5596e75 100644 --- a/addons/document_page/document_page_view.xml +++ b/addons/document_page/document_page_view.xml @@ -26,6 +26,7 @@ <tree string="Document Page"> <field name="name"/> <field name="parent_id"/> + <field name="create_uid" invisible="1"/> <field name="write_uid"/> <field name="write_date"/> </tree> diff --git a/addons/fetchmail/security/ir.model.access.csv b/addons/fetchmail/security/ir.model.access.csv index 7deea6eb9f4..c006546659f 100644 --- a/addons/fetchmail/security/ir.model.access.csv +++ b/addons/fetchmail/security/ir.model.access.csv @@ -1,3 +1,2 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_fetchmail_server,fetchmail.server,model_fetchmail_server,,1,0,0,0
access_fetchmail_server,fetchmail.server,model_fetchmail_server,base.group_system,1,1,1,1
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 73daa64f841..8d707baa50e 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -57,10 +57,7 @@ class hr_expense_expense(osv.osv): def _get_currency(self, cr, uid, context=None): user = self.pool.get('res.users').browse(cr, uid, [uid], context=context)[0] - if user.company_id: - return user.company_id.currency_id.id - else: - return self.pool.get('res.currency').search(cr, uid, [('rate','=',1.0)], context=context)[0] + return user.company_id.currency_id.id _name = "hr.expense.expense" _inherit = ['mail.thread'] @@ -99,11 +96,13 @@ class hr_expense_expense(osv.osv): ('cancelled', 'Refused'), ('confirm', 'Waiting Approval'), ('accepted', 'Approved'), - ('done', 'Done'), + ('done', 'Waiting Payment'), + ('paid', 'Paid'), ], 'Status', readonly=True, track_visibility='onchange', help='When the expense request is created the status is \'Draft\'.\n It is confirmed by the user and request is sent to admin, the status is \'Waiting Confirmation\'.\ - \nIf the admin accepts it, the status is \'Accepted\'.\n If a receipt is made for the expense request, the status is \'Done\'.'), + \nIf the admin accepts it, the status is \'Accepted\'.\n If the accounting entries are made for the expense request, the status is \'Waiting Payment\'.'), + } _defaults = { 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'hr.employee', context=c), @@ -114,6 +113,12 @@ class hr_expense_expense(osv.osv): 'currency_id': _get_currency, } + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} + default.update(account_move_id=False) + return super(hr_expense_expense, self).copy(cr, uid, id, default=default, context=context) + def unlink(self, cr, uid, ids, context=None): for rec in self.browse(cr, uid, ids, context=context): if rec.state != 'draft': @@ -282,7 +287,6 @@ class hr_expense_expense(osv.osv): tax_code_found= False #Calculate tax according to default tax on product - taxes = [] #Taken from product_id_onchange in account.invoice if line.product_id: @@ -319,8 +323,11 @@ class hr_expense_expense(osv.osv): tax_code_found = True res[-1]['tax_code_id'] = tax_code_id res[-1]['tax_amount'] = cur_obj.compute(cr, uid, exp.currency_id.id, company_currency, tax_amount, context={'date': exp.date_confirm}) - - #Will create the tax here as we don't have the access + ## + is_price_include = tax_obj.read(cr,uid,tax['id'],['price_include'],context)['price_include'] + if is_price_include: + ## We need to deduce the price for the tax + res[-1]['price'] = res[-1]['price'] - (tax['amount'] * tax['base_sign'] or 0.0) assoc_tax = { 'type':'tax', 'name':tax['name'], @@ -449,4 +456,26 @@ class hr_expense_line(osv.osv): return res +class account_move_line(osv.osv): + _inherit = "account.move.line" + + def reconcile(self, cr, uid, ids, type='auto', writeoff_acc_id=False, writeoff_period_id=False, writeoff_journal_id=False, context=None): + res = super(account_move_line, self).reconcile(cr, uid, ids, type=type, writeoff_acc_id=writeoff_acc_id, writeoff_period_id=writeoff_period_id, writeoff_journal_id=writeoff_journal_id, context=context) + #when making a full reconciliation of account move lines 'ids', we may need to recompute the state of some hr.expense + account_move_ids = [aml.move_id.id for aml in self.browse(cr, uid, ids, context=context)] + expense_obj = self.pool.get('hr.expense.expense') + currency_obj = self.pool.get('res.currency') + if account_move_ids: + expense_ids = expense_obj.search(cr, uid, [('account_move_id', 'in', account_move_ids)], context=context) + for expense in expense_obj.browse(cr, uid, expense_ids, context=context): + if expense.state == 'done': + #making the postulate it has to be set paid, then trying to invalidate it + new_status_is_paid = True + for aml in expense.account_move_id.line_id: + if aml.account_id.type == 'payable' and not currency_obj.is_zero(cr, uid, expense.company_id.currency_id, aml.amount_residual): + new_status_is_paid = False + if new_status_is_paid: + expense_obj.write(cr, uid, [expense.id], {'state': 'paid'}, context=context) + return res + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 10abe95d892..ca882406d63 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -68,7 +68,7 @@ <button name="draft" states="confirm,cancelled" string="Set to Draft" type="workflow" groups="base.group_hr_user" /> <button name="done" states="accepted" string="Generate Accounting Entries" type="workflow" groups="account.group_account_invoice" class="oe_highlight"/> <button name="action_view_move" states="done" string="Open Accounting Entries" type="object" groups="account.group_account_invoice"/> - <field name="state" widget="statusbar" statusbar_visible="draft,confirm,accepted,done" statusbar_colors='{"confirm":"blue","cancelled":"red"}'/> + <field name="state" widget="statusbar" statusbar_visible="draft,confirm,accepted,done,paid" statusbar_colors='{"confirm":"blue","cancelled":"red"}'/> </header> <sheet> <group> diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 5828790c152..5ffbff10040 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -40,8 +40,8 @@ <field name="name">Leave Request</field> <field name="model">hr.holidays</field> <field name="arch" type="xml"> - <calendar string="Leave Request" color="user_id" date_start="date_from" date_stop="date_to"> - <field name="user_id"/> + <calendar string="Leave Request" color="employee_id" date_start="date_from" date_stop="date_to"> + <field name="employee_id"/> <field name="holiday_status_id"/> </calendar> </field> diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index fe7d0c82767..e7d13c425b6 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -163,24 +163,42 @@ openerp.hr_timesheet_sheet = function(instance) { this.dfm = undefined; } }, + is_valid_value:function(value){ + var split_value = value.split(":"); + var valid_value = true; + if (split_value.length > 2) + return false; + _.detect(split_value,function(num){ + if(isNaN(num)){ + valid_value = false; + } + }); + return valid_value; + }, display_data: function() { var self = this; self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self})); _.each(self.accounts, function(account) { _.each(_.range(account.days.length), function(day_count) { if (!self.get('effective_readonly')) { - self.get_box(account, day_count).val(self.sum_box(account, day_count)).change(function() { - var num = Number($(this).val()); + self.get_box(account, day_count).val(self.sum_box(account, day_count, true)).change(function() { + var num = $(this).val(); + if (self.is_valid_value(num)){ + num = (num == 0)?0:Number(self.parse_client(num)); + } if (isNaN(num)) { - $(this).val(self.sum_box(account, day_count)); + $(this).val(self.sum_box(account, day_count, true)); } else { account.days[day_count].lines[0].unit_amount += num - self.sum_box(account, day_count); self.display_totals(); self.sync(); + if(!isNaN($(this).val())){ + $(this).val(self.sum_box(account, day_count, true)); + } } }); } else { - self.get_box(account, day_count).html(self.sum_box(account, day_count)); + self.get_box(account, day_count).html(self.sum_box(account, day_count, true)); } }); }); @@ -247,12 +265,12 @@ openerp.hr_timesheet_sheet = function(instance) { get_super_total: function() { return this.$('.oe_timesheet_weekly_supertotal'); }, - sum_box: function(account, day_count) { + sum_box: function(account, day_count, show_value_in_hour) { var line_total = 0; _.each(account.days[day_count].lines, function(line) { line_total += line.unit_amount; }); - return line_total; + return (show_value_in_hour && line_total != 0)?this.format_client(line_total):line_total; }, display_totals: function() { var self = this; @@ -266,12 +284,12 @@ openerp.hr_timesheet_sheet = function(instance) { day_tots[day_count] += sum; super_tot += sum; }); - self.get_total(account).html(acc_tot); + self.get_total(account).html(self.format_client(acc_tot)); }); _.each(_.range(self.dates.length), function(day_count) { - self.get_day_total(day_count).html(day_tots[day_count]); + self.get_day_total(day_count).html(self.format_client(day_tots[day_count])); }); - self.get_super_total().html(super_tot); + self.get_super_total().html(self.format_client(super_tot)); }, sync: function() { var self = this; @@ -279,6 +297,14 @@ openerp.hr_timesheet_sheet = function(instance) { self.set({sheets: this.generate_o2m_value()}); self.setting = false; }, + //converts hour value to float + parse_client: function(value) { + return instance.web.parse_value(value, { type:"float_time" }); + }, + //converts float value to hour + format_client:function(value){ + return instance.web.format_value(value, { type:"float_time" }); + }, generate_o2m_value: function() { var self = this; var ops = []; diff --git a/addons/im/im.py b/addons/im/im.py index 0de9ea8c79b..cee1705ec35 100644 --- a/addons/im/im.py +++ b/addons/im/im.py @@ -90,79 +90,6 @@ POLL_TIMER = 30 DISCONNECTION_TIMER = POLL_TIMER + 5 WATCHER_ERROR_DELAY = 10 -if openerp.evented: - import gevent - import gevent.event - - class ImWatcher(object): - watchers = {} - - @staticmethod - def get_watcher(db_name): - if not ImWatcher.watchers.get(db_name): - ImWatcher(db_name) - return ImWatcher.watchers[db_name] - - def __init__(self, db_name): - self.db_name = db_name - ImWatcher.watchers[db_name] = self - self.waiting = 0 - self.wait_id = 0 - self.users = {} - self.users_watch = {} - gevent.spawn(self.loop) - - def loop(self): - _logger.info("Begin watching on channel im_channel for database " + self.db_name) - stop = False - while not stop: - try: - registry = openerp.modules.registry.RegistryManager.get(self.db_name) - with registry.cursor() as cr: - listen_channel(cr, "im_channel", self.handle_message, self.check_stop) - stop = True - except: - # if something crash, we wait some time then try again - _logger.exception("Exception during watcher activity") - time.sleep(WATCHER_ERROR_DELAY) - _logger.info("End watching on channel im_channel for database " + self.db_name) - del ImWatcher.watchers[self.db_name] - - def handle_message(self, message): - if message["type"] == "message": - for waiter in self.users.get(message["receiver"], {}).values(): - waiter.set() - else: #type status - for waiter in self.users_watch.get(message["user"], {}).values(): - waiter.set() - - def check_stop(self): - return self.waiting == 0 - - def _get_wait_id(self): - self.wait_id += 1 - return self.wait_id - - def stop(self, user_id, watch_users, timeout=None): - wait_id = self._get_wait_id() - event = gevent.event.Event() - self.waiting += 1 - self.users.setdefault(user_id, {})[wait_id] = event - for watch in watch_users: - self.users_watch.setdefault(watch, {})[wait_id] = event - try: - event.wait(timeout) - finally: - for watch in watch_users: - del self.users_watch[watch][wait_id] - if len(self.users_watch[watch]) == 0: - del self.users_watch[watch] - del self.users[user_id][wait_id] - if len(self.users[user_id]) == 0: - del self.users[user_id] - self.waiting -= 1 - - class LongPollingController(openerp.addons.web.http.Controller): _cp_path = '/longpolling/im' @@ -171,6 +98,7 @@ class LongPollingController(openerp.addons.web.http.Controller): assert_uuid(uuid) if not openerp.evented: raise Exception("Not usable in a server not running gevent") + from openerp.addons.im.watcher import ImWatcher if db is not None: req.session._db = db req.session._uid = uid diff --git a/addons/im/security/ir.model.access.csv b/addons/im/security/ir.model.access.csv index ed639353e21..db3fe77f690 100644 --- a/addons/im/security/ir.model.access.csv +++ b/addons/im/security/ir.model.access.csv @@ -1,3 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_im_message,im.message,model_im_message,base.group_user,1,0,1,0 -access_im_user,im.user,model_im_user,base.group_user,1,1,1,0
\ No newline at end of file +access_im_user,im.user,model_im_user,,1,1,1,0
\ No newline at end of file diff --git a/addons/im/static/src/audio/Ting.mp3 b/addons/im/static/src/audio/Ting.mp3 Binary files differindex 6fd090a89ce..ffbb77144b2 100644 --- a/addons/im/static/src/audio/Ting.mp3 +++ b/addons/im/static/src/audio/Ting.mp3 diff --git a/addons/im/static/src/audio/Ting.ogg b/addons/im/static/src/audio/Ting.ogg Binary files differindex 8d17ea85bd3..74ee13a4e5a 100644 --- a/addons/im/static/src/audio/Ting.ogg +++ b/addons/im/static/src/audio/Ting.ogg diff --git a/addons/im/static/src/js/im.js b/addons/im/static/src/js/im.js index b21a339cb84..a271c9eccf0 100644 --- a/addons/im/static/src/js/im.js +++ b/addons/im/static/src/js/im.js @@ -284,6 +284,10 @@ openerp.im = function(instance) { return this.activated; }, create_ting: function() { + if (typeof(Audio) === "undefined") { + this.ting = {play: function() {}}; + return; + } var kitten = jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined; this.ting = new Audio(instance.webclient.session.origin + "/im/static/src/audio/" + (kitten ? "purr" : "Ting") + (new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg" : ".mp3")); @@ -408,6 +412,9 @@ openerp.im = function(instance) { return; } var mes = this.$("input").val(); + if (! mes.trim()) { + return; + } this.$("input").val(""); var send_it = _.bind(function() { var model = new instance.web.Model("im.message"); diff --git a/addons/im/watcher.py b/addons/im/watcher.py new file mode 100644 index 00000000000..b8cb74df5ba --- /dev/null +++ b/addons/im/watcher.py @@ -0,0 +1,84 @@ + +import openerp +import openerp.tools.config +import openerp.modules.registry +from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT +import datetime +from openerp.osv import osv, fields +import time +import logging +import json +import select +import gevent +import gevent.event +from openerp.addons.im.im import * + +_logger = logging.getLogger(__name__) + +class ImWatcher(object): + watchers = {} + + @staticmethod + def get_watcher(db_name): + if not ImWatcher.watchers.get(db_name): + ImWatcher(db_name) + return ImWatcher.watchers[db_name] + + def __init__(self, db_name): + self.db_name = db_name + ImWatcher.watchers[db_name] = self + self.waiting = 0 + self.wait_id = 0 + self.users = {} + self.users_watch = {} + gevent.spawn(self.loop) + + def loop(self): + _logger.info("Begin watching on channel im_channel for database " + self.db_name) + stop = False + while not stop: + try: + registry = openerp.modules.registry.RegistryManager.get(self.db_name) + with registry.cursor() as cr: + listen_channel(cr, "im_channel", self.handle_message, self.check_stop) + stop = True + except: + # if something crash, we wait some time then try again + _logger.exception("Exception during watcher activity") + time.sleep(WATCHER_ERROR_DELAY) + _logger.info("End watching on channel im_channel for database " + self.db_name) + del ImWatcher.watchers[self.db_name] + + def handle_message(self, message): + if message["type"] == "message": + for waiter in self.users.get(message["receiver"], {}).values(): + waiter.set() + else: #type status + for waiter in self.users_watch.get(message["user"], {}).values(): + waiter.set() + + def check_stop(self): + return self.waiting == 0 + + def _get_wait_id(self): + self.wait_id += 1 + return self.wait_id + + def stop(self, user_id, watch_users, timeout=None): + wait_id = self._get_wait_id() + event = gevent.event.Event() + self.waiting += 1 + self.users.setdefault(user_id, {})[wait_id] = event + for watch in watch_users: + self.users_watch.setdefault(watch, {})[wait_id] = event + try: + event.wait(timeout) + finally: + for watch in watch_users: + del self.users_watch[watch][wait_id] + if len(self.users_watch[watch]) == 0: + del self.users_watch[watch] + del self.users[user_id][wait_id] + if len(self.users[user_id]) == 0: + del self.users[user_id] + self.waiting -= 1 diff --git a/addons/im_livechat/security/ir.model.access.csv b/addons/im_livechat/security/ir.model.access.csv index 6e17c1a127f..0dcf0bdee6f 100644 --- a/addons/im_livechat/security/ir.model.access.csv +++ b/addons/im_livechat/security/ir.model.access.csv @@ -2,5 +2,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_ls_chann1,im_livechat.channel,model_im_livechat_channel,,1,0,0,0 access_ls_chann2,im_livechat.channel,model_im_livechat_channel,group_im_livechat,1,1,1,0 access_ls_chann3,im_livechat.channel,model_im_livechat_channel,group_im_livechat_manager,1,1,1,1 +access_ls_message_portal,im_livechat.im.message.portal,im.model_im_message,portal.group_portal,0,0,0,0 +access_im_user_portal,im_livechat.im.user.portal,im.model_im_user,portal.group_portal,1,0,0,0 access_ls_message,im_livechat.im.message,im.model_im_message,portal.group_anonymous,0,0,0,0 access_im_user,im_livechat.im.user,im.model_im_user,portal.group_anonymous,1,0,0,0
\ No newline at end of file diff --git a/addons/im_livechat/static/ext/static/audio/Ting.mp3 b/addons/im_livechat/static/ext/static/audio/Ting.mp3 Binary files differindex 6fd090a89ce..ffbb77144b2 100644 --- a/addons/im_livechat/static/ext/static/audio/Ting.mp3 +++ b/addons/im_livechat/static/ext/static/audio/Ting.mp3 diff --git a/addons/im_livechat/static/ext/static/audio/Ting.ogg b/addons/im_livechat/static/ext/static/audio/Ting.ogg Binary files differindex 8d17ea85bd3..74ee13a4e5a 100644 --- a/addons/im_livechat/static/ext/static/audio/Ting.ogg +++ b/addons/im_livechat/static/ext/static/audio/Ting.ogg diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index 0b9e52d2c07..c45e9588c83 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -268,6 +268,10 @@ define(["nova", "underscore", "oeclient", "require", "jquery", return this.activated; }, create_ting: function() { + if (typeof(Audio) === "undefined") { + this.ting = {play: function() {}}; + return; + } this.ting = new Audio(new Audio().canPlayType("audio/ogg; codecs=vorbis") ? require.toUrl("../audio/Ting.ogg") : require.toUrl("../audio/Ting.mp3") @@ -395,6 +399,9 @@ define(["nova", "underscore", "oeclient", "require", "jquery", return; } var mes = this.$("input").val(); + if (! mes.trim()) { + return; + } this.$("input").val(""); var send_it = _.bind(function() { var model = connection.getModel("im.message"); diff --git a/addons/l10n_ca/__openerp__.py b/addons/l10n_ca/__openerp__.py index 05279b6ef8e..945327a06bc 100644 --- a/addons/l10n_ca/__openerp__.py +++ b/addons/l10n_ca/__openerp__.py @@ -20,7 +20,7 @@ ############################################################################## { 'name': 'Canada - Accounting', - 'version': '1.0', + 'version': '1.1', 'author': 'Savoir-faire Linux', 'website': 'http://www.savoirfairelinux.com', 'category': 'Localization/Account Charts', @@ -49,7 +49,7 @@ Canadian accounting charts and localizations. 'account_chart_template_fr.xml', 'account_tax_fr.xml', 'fiscal_templates_fr.xml', - 'l10n_ca_wizard.xml', + 'l10n_ca_wizard.xml' ], 'demo': [], 'installable': True, diff --git a/addons/l10n_ca/account_tax_en.xml b/addons/l10n_ca/account_tax_en.xml index 1ff884ac361..afe505f27f5 100644 --- a/addons/l10n_ca/account_tax_en.xml +++ b/addons/l10n_ca/account_tax_en.xml @@ -12,7 +12,6 @@ <field name="description">GSTPST_MB_SALE</field> <field name="type_tax_use">sale</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -39,7 +38,7 @@ <field name="name">PST for sales - 7%</field> <field name="description">PST</field> <field name="type_tax_use">sale</field> - <field name="amount">0.700000</field> + <field name="amount">0.070000</field> <field name="type">percent</field> <field name="sequence">2</field> <field name="account_collected_id" ref="chart2132_en"/> @@ -106,7 +105,6 @@ <field name="description">GSTTVQ_SALE</field> <field name="type_tax_use">sale</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -152,7 +150,6 @@ <field name="description">GSTPST_SK_SALE</field> <field name="type_tax_use">sale</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -281,7 +278,6 @@ <field name="description">GSTPST_MB_PURC</field> <field name="type_tax_use">purchase</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -308,7 +304,7 @@ <field name="name">PST for purchases - 7%</field> <field name="description">PST</field> <field name="type_tax_use">purchase</field> - <field name="amount">0.700000</field> + <field name="amount">0.070000</field> <field name="type">percent</field> <field name="sequence">2</field> <field name="account_collected_id" ref="chart1182_en"/> @@ -375,7 +371,6 @@ <field name="description">GSTTVQ_PURC</field> <field name="type_tax_use">purchase</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -421,7 +416,6 @@ <field name="description">GSTPST_SK_PURC</field> <field name="type_tax_use">purchase</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> diff --git a/addons/l10n_ca/account_tax_fr.xml b/addons/l10n_ca/account_tax_fr.xml index b344feeec83..c34f329be3a 100644 --- a/addons/l10n_ca/account_tax_fr.xml +++ b/addons/l10n_ca/account_tax_fr.xml @@ -12,7 +12,6 @@ <field name="description">TPSTVP_MB_SALE</field> <field name="type_tax_use">sale</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -39,7 +38,7 @@ <field name="name">TVP sur les ventes - 7%</field> <field name="description">TVP</field> <field name="type_tax_use">sale</field> - <field name="amount">0.700000</field> + <field name="amount">0.070000</field> <field name="type">percent</field> <field name="sequence">2</field> <field name="account_collected_id" ref="chart2132_fr"/> @@ -106,7 +105,6 @@ <field name="description">TPSTVQ_SALE</field> <field name="type_tax_use">sale</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -152,7 +150,6 @@ <field name="description">TPSTVP_SK_SALE</field> <field name="type_tax_use">sale</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -281,7 +278,6 @@ <field name="description">TPSTVP_MB_PURC</field> <field name="type_tax_use">purchase</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -308,7 +304,7 @@ <field name="name">TVP sur les achats - 7%</field> <field name="description">TVP</field> <field name="type_tax_use">purchase</field> - <field name="amount">0.700000</field> + <field name="amount">0.070000</field> <field name="type">percent</field> <field name="sequence">2</field> <field name="account_collected_id" ref="chart1182_fr"/> @@ -375,7 +371,6 @@ <field name="description">TPSTVQ_PURC</field> <field name="type_tax_use">purchase</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> @@ -421,7 +416,6 @@ <field name="description">TPSTVP_SK_PURC</field> <field name="type_tax_use">purchase</field> <field name="amount">1</field> - <field name="child_depend">1</field> <field name="type">percent</field> </record> diff --git a/addons/l10n_ca/fiscal_templates_en.xml b/addons/l10n_ca/fiscal_templates_en.xml index 68e881c3541..a3bab5b89dd 100644 --- a/addons/l10n_ca/fiscal_templates_en.xml +++ b/addons/l10n_ca/fiscal_templates_en.xml @@ -5,17 +5,17 @@ <!-- Fiscal Position Templates --> <record id="fiscal_position_template_1_en" model="account.fiscal.position.template"> - <field name="name">Provincial Regime</field> + <field name="name">Provincial Regime (PROV)</field> <field name="chart_template_id" ref="ca_en_chart_template_en"/> </record> <record id="fiscal_position_template_21_en" model="account.fiscal.position.template"> - <field name="name">Harmonized Provinces Regime (12%)</field> + <field name="name">Harmonized Provinces Regime (12%) (BC)</field> <field name="chart_template_id" ref="ca_en_chart_template_en"/> </record> <record id="fiscal_position_template_22_en" model="account.fiscal.position.template"> - <field name="name">Harmonized Provinces Regime (13%)</field> + <field name="name">Harmonized Provinces Regime (13%) (ON, NB, NL)</field> <field name="chart_template_id" ref="ca_en_chart_template_en"/> </record> @@ -25,17 +25,17 @@ </record> <record id="fiscal_position_template_24_en" model="account.fiscal.position.template"> - <field name="name">Harmonized Provinces Regime (15%)</field> + <field name="name">Harmonized Provinces Regime (15%) (NS)</field> <field name="chart_template_id" ref="ca_en_chart_template_en"/> </record> <record id="fiscal_position_template_3_en" model="account.fiscal.position.template"> - <field name="name">Non-Harmonized Provinces Regime</field> + <field name="name">Non-Harmonized Provinces Regime (AB, MB, SK, PE, NT, NU, YT)</field> <field name="chart_template_id" ref="ca_en_chart_template_en"/> </record> <record id="fiscal_position_template_4_en" model="account.fiscal.position.template"> - <field name="name">International Regime</field> + <field name="name">International Regime (INTL)</field> <field name="chart_template_id" ref="ca_en_chart_template_en"/> </record> diff --git a/addons/l10n_ca/fiscal_templates_fr.xml b/addons/l10n_ca/fiscal_templates_fr.xml index 3ba13d6642e..b01ab0985ea 100644 --- a/addons/l10n_ca/fiscal_templates_fr.xml +++ b/addons/l10n_ca/fiscal_templates_fr.xml @@ -5,7 +5,7 @@ <!-- Fiscal Position Templates --> <record id="fiscal_position_template_1_fr" model="account.fiscal.position.template"> - <field name="name">Régime Provincial</field> + <field name="name">Régime Provincial (PROV)</field> <field name="chart_template_id" ref="ca_fr_chart_template_fr"/> </record> @@ -30,12 +30,12 @@ </record> <record id="fiscal_position_template_3_fr" model="account.fiscal.position.template"> - <field name="name">Régime Provinces Non-Harmonisées</field> + <field name="name">Régime Provinces Non-Harmonisées (AB, MB, SK, PE, NT, NU, YT)</field> <field name="chart_template_id" ref="ca_fr_chart_template_fr"/> </record> <record id="fiscal_position_template_4_fr" model="account.fiscal.position.template"> - <field name="name">Régime International</field> + <field name="name">Régime International (INTL)</field> <field name="chart_template_id" ref="ca_fr_chart_template_fr"/> </record> diff --git a/addons/l10n_it/__openerp__.py b/addons/l10n_it/__openerp__.py index 00ba19e9c42..686fb5ff0d4 100644 --- a/addons/l10n_it/__openerp__.py +++ b/addons/l10n_it/__openerp__.py @@ -29,7 +29,7 @@ { 'name': 'Italy - Accounting', - 'version': '0.1', + 'version': '0.2', 'depends': ['base_vat','account_chart','base_iban'], 'author': 'OpenERP Italian Community', 'description': """ diff --git a/addons/l10n_it/data/account.tax.code.template.csv b/addons/l10n_it/data/account.tax.code.template.csv index d6d6667f43b..e5435945556 100644 --- a/addons/l10n_it/data/account.tax.code.template.csv +++ b/addons/l10n_it/data/account.tax.code.template.csv @@ -1,28 +1,37 @@ code,id,name,parent_id:id ,vat_code_chart_root,Tassazione, IVC,template_ivacode_pagata,IVA a credito,vat_code_chart_root -IVC0,template_ivacode_pagata_0,Esente IVA (credito),template_ivacode_pagata +IVCN,template_ivacode_pagata_ind,IVA a credito indetraibile,vat_code_chart_root +IVC0,template_ivacode_pagata_0,Fuori Campo IVA (credito),template_ivacode_pagata IVCI,template_impcode_pagata,IVA a credito (imponibile),vat_code_chart_root -IVC0I,template_impcode_pagata_0,Esente IVA a credito (imponibile),template_impcode_pagata +IVC0I,template_impcode_pagata_0,Fuori Campo IVA (credito) (imponibile),template_impcode_pagata +IVCart15,template_ivacode_pagata_art15,Escluso Art.15 (credito),template_ivacode_pagata +IVCart15I,template_impcode_pagata_art15,Escluso Art.15. (credito) (imponibile),template_impcode_pagata IVC10,template_ivacode_pagata_10,IVA a credito 10%,template_ivacode_pagata IVC10I,template_impcode_pagata_10,IVA a credito 10% (imponibile),template_impcode_pagata -IVC10ind,template_ivacode_pagata_10ind,IVA a credito 10% indetraibile,template_ivacode_pagata +IVC10ind,template_ivacode_pagata_10ind,IVA a credito 10% indetraibile,template_ivacode_pagata_ind IVC10Iind,template_impcode_pagata_10ind,IVA a credito 10% indetraibile (imponibile),template_impcode_pagata -IVC20ind,template_ivacode_pagata_20ind,IVA a credito 20% indetraibile,template_ivacode_pagata +IVC20ind,template_ivacode_pagata_20ind,IVA a credito 20% indetraibile,template_ivacode_pagata_ind IVC20Iind,template_impcode_pagata_20ind,IVA a credito 20% indetraibile (imponibile),template_impcode_pagata -IVC4ind,template_ivacode_pagata_4ind,IVA a credito 4% indetraibile,template_ivacode_pagata +IVC4ind,template_ivacode_pagata_4ind,IVA a credito 4% indetraibile,template_ivacode_pagata_ind IVC4Iind,template_impcode_pagata_4ind,IVA a credito 4% indetraibile (imponibile),template_impcode_pagata IVC20det10,template_ivacode_pagata_20det10,IVA a credito 20% detraibile 10%,template_ivacode_pagata +IVC20Ndet10,template_ivacode_pagata_20det10ind,IVA a credito 20% detraibile 10% (indetraibile),template_ivacode_pagata_ind IVC20Idet10,template_impcode_pagata_20det10,IVA a credito 20% detraibile 10% (imponibile),template_impcode_pagata IVC20det15,template_ivacode_pagata_20det15,IVA a credito 20% detraibile 15%,template_ivacode_pagata +IVC20Ndet15,template_ivacode_pagata_20det15ind,IVA a credito 20% detraibile 15% (indetraibile),template_ivacode_pagata_ind IVC20Idet15,template_impcode_pagata_20det15,IVA a credito 20% detraibile 15% (imponibile),template_impcode_pagata IVC20det40,template_ivacode_pagata_20det40,IVA a credito 20% detraibile 40%,template_ivacode_pagata +IVC20Ndet40,template_ivacode_pagata_20det40ind,IVA a credito 20% detraibile 40% (indetraibile),template_ivacode_pagata_ind IVC20Idet40,template_impcode_pagata_20det40,IVA a credito 20% detraibile 40% (imponibile),template_impcode_pagata IVC20det50,template_ivacode_pagata_20det50,IVA a credito 20% detraibile 50%,template_ivacode_pagata +IVC20Ndet50,template_ivacode_pagata_20det50ind,IVA a credito 20% detraibile 50% (indetraibile),template_ivacode_pagata_ind IVC20Idet50,template_impcode_pagata_20det50,IVA a credito 20% detraibile 50% (imponibile),template_impcode_pagata IVC10det50,template_ivacode_pagata_10det50,IVA a credito 10% detraibile 50%,template_ivacode_pagata +IVC10Ndet50,template_ivacode_pagata_10det50ind,IVA a credito 10% detraibile 50% (indetraibile),template_ivacode_pagata_ind IVC10Idet50,template_impcode_pagata_10det50,IVA a credito 10% detraibile 50% (imponibile),template_impcode_pagata IVC4det50,template_ivacode_pagata_4det50,IVA a credito 4% detraibile 50%,template_ivacode_pagata +IVC4Ndet50,template_ivacode_pagata_4det50ind,IVA a credito 4% detraibile 50% (indetraibile),template_ivacode_pagata_ind IVC4Idet50,template_impcode_pagata_4det50,IVA a credito 4% detraibile 50% (imponibile),template_impcode_pagata IVC20,template_ivacode_pagata_20,IVA a credito 20%,template_ivacode_pagata IVC20I,template_impcode_pagata_20,IVA a credito 20% (imponibile),template_impcode_pagata @@ -35,9 +44,11 @@ IVC12I,template_impcode_pagata_12,IVA a credito 12% (imponibile),template_impco IVC2,template_ivacode_pagata_2,IVA a credito 2%,template_ivacode_pagata IVC2I,template_impcode_pagata_2,IVA a credito 2% (imponibile),template_impcode_pagata IVD,template_ivacode_riscossa,IVA a debito,vat_code_chart_root -IVD0,template_ivacode_riscossa_0,Esente IVA (debito),template_ivacode_riscossa +IVD0,template_ivacode_riscossa_0,Fuori Campo IVA (debito),template_ivacode_riscossa IVDI,template_impcode_riscossa,IVA a debito (imponibile),vat_code_chart_root -IVD0I,template_impcode_riscossa_0,Esente IVA a debito (imponibile),template_impcode_riscossa +IVD0I,template_impcode_riscossa_0,Fuori Campo IVA (debito) (imponibile),template_impcode_riscossa +IVDart15,template_ivacode_riscossa_art15,Escluso Art.15 (debito),template_ivacode_riscossa +IVDart15I,template_impcode_riscossa_art15,Escluso Art.15 (debito) (imponibile),template_impcode_riscossa IVD10,template_ivacode_riscossa_10,IVA a debito 10%,template_ivacode_riscossa IVD10I,template_impcode_riscossa_10,IVA a debito 10% (imponibile),template_impcode_riscossa IVD20,template_ivacode_riscossa_20,IVA a debito 20%,template_ivacode_riscossa @@ -50,13 +61,17 @@ IVD12,template_ivacode_riscossa_12,IVA a debito 12%,template_ivacode_riscossa IVD12I,template_impcode_riscossa_12,IVA a debito 12% (imponibile),template_impcode_riscossa IVD2,template_ivacode_riscossa_2,IVA a debito 2%,template_ivacode_riscossa IVD2I,template_impcode_riscossa_2,IVA a debito 2% (imponibile),template_impcode_riscossa -IVC21ind,template_ivacode_pagata_21ind,IVA a credito 21% indetraibile,template_ivacode_pagata +IVC21ind,template_ivacode_pagata_21ind,IVA a credito 21% indetraibile,template_ivacode_pagata_ind IVC21Iind,template_impcode_pagata_21ind,IVA a credito 21% indetraibile (imponibile),template_impcode_pagata IVC21det10,template_ivacode_pagata_21det10,IVA a credito 21% detraibile 10%,template_ivacode_pagata +IVC21Ndet10,template_ivacode_pagata_21det10ind,IVA a credito 21% detraibile 10% (indetraibile),template_ivacode_pagata_ind IVC21Idet10,template_impcode_pagata_21det10,IVA a credito 21% detraibile 10% (imponibile),template_impcode_pagata IVC21det15,template_ivacode_pagata_21det15,IVA a credito 21% detraibile 15%,template_ivacode_pagata +IVC21Ndet15,template_ivacode_pagata_21det15ind,IVA a credito 21% detraibile 15% (indetraibile),template_ivacode_pagata_ind IVC21Idet15,template_impcode_pagata_21det15,IVA a credito 21% detraibile 15% (imponibile),template_impcode_pagata IVC21det40,template_ivacode_pagata_21det40,IVA a credito 21% detraibile 40%,template_ivacode_pagata +IVC21Ndet40,template_ivacode_pagata_21det40ind,IVA a credito 21% detraibile 40% (indetraibile),template_ivacode_pagata_ind IVC21Idet40,template_impcode_pagata_21det40,IVA a credito 21% detraibile 40% (imponibile),template_impcode_pagata IVC21det50,template_ivacode_pagata_21det50,IVA a credito 21% detraibile 50%,template_ivacode_pagata +IVC21Ndet50,template_ivacode_pagata_21det50ind,IVA a credito 21% detraibile 50% (indetraibile),template_ivacode_pagata_ind IVC21Idet50,template_impcode_pagata_21det50,IVA a credito 21% detraibile 50% (imponibile),template_impcode_pagata diff --git a/addons/l10n_it/data/account.tax.template.csv b/addons/l10n_it/data/account.tax.template.csv index e003afd1a23..5654b32e5e9 100644 --- a/addons/l10n_it/data/account.tax.template.csv +++ b/addons/l10n_it/data/account.tax.template.csv @@ -1,71 +1,66 @@ id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depend,type,account_collected_id:id,account_paid_id:id,type_tax_use,base_code_id:id,tax_code_id:id,ref_base_code_id:id,ref_tax_code_id:id,ref_base_sign,ref_tax_sign,price_include,base_sign,tax_sign -21a,21a,l10n_it_chart_template_generic,Iva al 21% (debito),,0.21,,False,percent,2601,2601,sale,template_impcode_riscossa_21,template_ivacode_riscossa_21,template_impcode_riscossa_21,template_ivacode_riscossa_21,-1,-1,False,, -21b,21b,l10n_it_chart_template_generic,Iva al 21% (credito),,0.21,,False,percent,1601,1601,purchase,template_impcode_pagata_21,template_ivacode_pagata_21,template_impcode_pagata_21,template_ivacode_pagata_21,,,False,-1,-1 -20a,20a,l10n_it_chart_template_generic,Iva al 20% (debito),,0.2,,False,percent,2601,2601,sale,template_impcode_riscossa_20,template_ivacode_riscossa_20,template_impcode_riscossa_20,template_ivacode_riscossa_20,-1,-1,False,, -20b,20b,l10n_it_chart_template_generic,Iva al 20% (credito),,0.2,,False,percent,1601,1601,purchase,template_impcode_pagata_20,template_ivacode_pagata_20,template_impcode_pagata_20,template_ivacode_pagata_20,,,False,-1,-1 -10a,10a,l10n_it_chart_template_generic,Iva al 10% (debito),,0.1,,False,percent,2601,2601,sale,template_impcode_riscossa_10,template_ivacode_riscossa_10,template_impcode_riscossa_10,template_ivacode_riscossa_10,-1,-1,False,, -10b,10b,l10n_it_chart_template_generic,Iva al 10% (credito),,0.1,,False,percent,1601,1601,purchase,template_impcode_pagata_10,template_ivacode_pagata_10,template_impcode_pagata_10,template_ivacode_pagata_10,,,False,-1,-1 -10AO,10AO,l10n_it_chart_template_generic,Iva al 10% indetraibile,,0.1,,True,percent,,,purchase,template_impcode_pagata_10ind,,template_impcode_pagata_10ind,,,,False,-1,-1 -10AOa,10AOa,l10n_it_chart_template_generic,Iva al 10% indetraibile (D),2,0,10AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_10ind,,template_ivacode_pagata_10ind,,,False,, -10AOb,10AOb,l10n_it_chart_template_generic,Iva al 10% indetraibile (I),1,1,10AO,False,percent,,,purchase,,,,,,,False,, -12a,12a,l10n_it_chart_template_generic,Iva 12% (debito),,0.12,,False,percent,2601,2601,sale,template_impcode_riscossa_12,template_ivacode_riscossa_12,template_impcode_riscossa_12,template_ivacode_riscossa_12,-1,-1,False,, -12b,12b,l10n_it_chart_template_generic,Iva 12% (credito),,0.12,,False,percent,1601,1601,purchase,template_impcode_pagata_12,template_ivacode_pagata_12,template_impcode_pagata_12,template_ivacode_pagata_12,,,False,-1,-1 -2010,2010,l10n_it_chart_template_generic,Iva al 20% detraibile 10%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det10,,template_impcode_pagata_20det10,,,,False,-1,-1 -2010a,2010a,l10n_it_chart_template_generic,Iva al 20% detraibile 10% (D),2,0,2010,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det10,,template_ivacode_pagata_20det10,,,False,, -2010b,2010b,l10n_it_chart_template_generic,Iva al 20% detraibile 10% (I),1,0.9,2010,False,percent,,,purchase,,,,,,,False,, -2015,2015,l10n_it_chart_template_generic,Iva al 20% detraibile 15%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det15,,template_impcode_pagata_20det15,,,,False,-1,-1 -2015a,2015a,l10n_it_chart_template_generic,Iva al 20% detraibile 15% (D),2,0,2015,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det15,,template_ivacode_pagata_20det15,,,False,, -2015b,2015b,l10n_it_chart_template_generic,Iva al 20% detraibile 15% (I),1,0.85,2015,False,percent,,,purchase,,,,,,,False,, -2040,2040,l10n_it_chart_template_generic,Iva al 20% detraibile 40%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det40,,template_impcode_pagata_20det40,,,,False,-1,-1 -2040a,2040a,l10n_it_chart_template_generic,Iva al 20% detraibile 40% (D),2,0,2040,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det40,,template_ivacode_pagata_20det40,,,False,, -2040b,2040b,l10n_it_chart_template_generic,Iva al 20% detraibile 40% (I),1,0.6,2040,False,percent,,,purchase,,,,,,,False,, -20AO,20AO,l10n_it_chart_template_generic,Iva al 20% indetraibile,,0.2,,True,percent,,,purchase,template_impcode_pagata_20ind,,template_impcode_pagata_20ind,,,,False,-1,-1 -20AOa,20AOa,l10n_it_chart_template_generic,Iva al 20% indetraibile (D),2,0,20AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_20ind,,template_ivacode_pagata_20ind,,,False,, -20AOb,20AOb,l10n_it_chart_template_generic,Iva al 20% indetraibile (I),1,1,20AO,False,percent,,,purchase,,,,,,,False,, -20I5,20I5,l10n_it_chart_template_generic,IVA al 20% detraibile al 50%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det50,,template_impcode_pagata_20det50,,,,False,-1,-1 -20I5b,20I5b,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (I),1,0.5,20I5,False,percent,,,purchase,,,,,,,False,, -20I5a,20I5a,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (D),2,0,20I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det50,,template_ivacode_pagata_20det50,,,False,, -22a,22a,l10n_it_chart_template_generic,Iva 2% (debito),,0.02,,False,percent,2601,2601,sale,template_impcode_riscossa_2,template_ivacode_riscossa_2,template_impcode_riscossa_2,template_ivacode_riscossa_2,-1,-1,False,, -22b,22b,l10n_it_chart_template_generic,Iva 2% (credito),,0.02,,False,percent,1601,1601,purchase,template_impcode_pagata_2,template_ivacode_pagata_2,template_impcode_pagata_2,template_ivacode_pagata_2,,,False,-1,-1 -4a,4a,l10n_it_chart_template_generic,Iva 4% (debito),,0.04,,False,percent,2601,2601,sale,template_impcode_riscossa_4,template_ivacode_riscossa_4,template_impcode_riscossa_4,template_ivacode_riscossa_4,-1,-1,False,, -4b,4b,l10n_it_chart_template_generic,Iva 4% (credito),,0.04,,False,percent,1601,1601,purchase,template_impcode_pagata_4,template_ivacode_pagata_4,template_impcode_pagata_4,template_ivacode_pagata_4,,,False,-1,-1 -4AO,4AO,l10n_it_chart_template_generic,Iva al 4% indetraibile,,0.04,,True,percent,,,purchase,template_impcode_pagata_4ind,,template_impcode_pagata_4ind,,,,False,-1,-1 -4AOa,4AOa,l10n_it_chart_template_generic,Iva al 4% indetraibile (D),2,0,4AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_4ind,,template_ivacode_pagata_4ind,,,False,, -4AOb,4AOb,l10n_it_chart_template_generic,Iva al 4% indetraibile (I),1,1,4AO,False,percent,,,purchase,,,,,,,False,, -10I5,10I5,l10n_it_chart_template_generic,IVA al 10% detraibile al 50%,,0.1,,True,percent,,,purchase,template_impcode_pagata_10det50,,template_impcode_pagata_10det50,,,,False,-1,-1 -10I5a,10I5a,l10n_it_chart_template_generic,IVA al 10% detraibile al 50% (D),2,0,10I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_10det50,,template_ivacode_pagata_10det50,,,False,, -10I5b,10I5b,l10n_it_chart_template_generic,IVA al 10% detraibile al 50% (I),1,0.5,10I5,False,percent,,,purchase,,,,,,,False,, -4I5,4I5,l10n_it_chart_template_generic,IVA al 4% detraibile al 50%,,0.04,,True,percent,,,purchase,template_impcode_pagata_4det50,,template_impcode_pagata_4det50,,,,False,-1,-1 -4I5a,4I5a,l10n_it_chart_template_generic,IVA al 4% detraibile al 50% (D),2,0,4I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_4det50,,template_ivacode_pagata_4det50,,,False,, -4I5b,4I5b,l10n_it_chart_template_generic,IVA al 4% detraibile al 50% (I),1,0.5,4I5,False,percent,,,purchase,,,,,,,False,, -00a,00a,l10n_it_chart_template_generic,Esente IVA (debito),,0,,False,percent,2601,2601,sale,template_impcode_riscossa_0,template_ivacode_riscossa_0,template_impcode_riscossa_0,template_ivacode_riscossa_0,-1,-1,False,, -00b,00b,l10n_it_chart_template_generic,Esente IVA (credito),,0,,False,percent,1601,1601,purchase,template_impcode_pagata_0,template_ivacode_pagata_0,template_impcode_pagata_0,template_ivacode_pagata_0,,,False,-1,-1 -21a INC,21a INC,l10n_it_chart_template_generic,Iva al 21% (debito) INC,,0.21,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,-1,-1,True,, -21b INC,21b INC,l10n_it_chart_template_generic,Iva al 21% (credito) INC,,0.21,,False,percent,1601,1601,purchase,template_impcode_pagata_21,template_ivacode_pagata_21,template_impcode_pagata_21,template_ivacode_pagata_21,,,True,-1,-1 -20a INC,20a INC,l10n_it_chart_template_generic,Iva al 20% (debito) INC,,0.2,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,-1,-1,True,, -20b INC,20b INC,l10n_it_chart_template_generic,Iva al 20% (credito) INC,,0.2,,False,percent,1601,1601,purchase,template_impcode_pagata_20,template_ivacode_pagata_20,template_impcode_pagata_20,template_ivacode_pagata_20,,,True,-1,-1 -10a INC,10a INC,l10n_it_chart_template_generic,Iva al 10% (debito) INC,,0.1,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,-1,-1,True,, -10b INC,10b INC,l10n_it_chart_template_generic,Iva al 10% (credito) INC,,0.1,,False,percent,1601,1601,purchase,template_impcode_pagata_10,template_ivacode_pagata_10,template_impcode_pagata_10,template_ivacode_pagata_10,,,True,-1,-1 -12a INC,12a INC,l10n_it_chart_template_generic,Iva 12% (debito) INC,,0.12,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,-1,-1,True,, -12b INC,12b INC,l10n_it_chart_template_generic,Iva 12% (credito) INC,,0.12,,False,percent,1601,1601,purchase,template_impcode_pagata_12,template_ivacode_pagata_12,template_impcode_pagata_12,template_ivacode_pagata_12,,,True,-1,-1 -22a INC,22a INC,l10n_it_chart_template_generic,Iva 2% (debito) INC,,0.02,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,-1,-1,True,, -22b INC,22b INC,l10n_it_chart_template_generic,Iva 2% (credito) INC,,0.02,,False,percent,1601,1601,purchase,template_impcode_pagata_2,template_ivacode_pagata_2,template_impcode_pagata_2,template_ivacode_pagata_2,,,True,-1,-1 -4a INC,4a INC,l10n_it_chart_template_generic,Iva 4% (debito) INC,,0.04,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,-1,-1,True,, -4b INC,4b INC,l10n_it_chart_template_generic,Iva 4% (credito) INC,,0.04,,False,percent,1601,1601,purchase,template_impcode_pagata_4,template_ivacode_pagata_4,template_impcode_pagata_4,template_ivacode_pagata_4,,,True,-1,-1 -00a INC,00a INC,l10n_it_chart_template_generic,Esente IVA (debito) INC,,0,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,-1,-1,True,, -2110,2110,l10n_it_chart_template_generic,Iva al 21% detraibile 10%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det10,,template_impcode_pagata_21det10,,,,False,-1,-1 -2110a,2110a,l10n_it_chart_template_generic,Iva al 21% detraibile 10% (D),2,0,2110,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det10,,template_ivacode_pagata_21det10,,,False,, -2110b,2110b,l10n_it_chart_template_generic,Iva al 21% detraibile 10% (I),1,0.9,2110,False,percent,,,purchase,,,,,,,False,, -2115,2115,l10n_it_chart_template_generic,Iva al 21% detraibile 15%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det15,,template_impcode_pagata_21det15,,,,False,-1,-1 -2115a,2115a,l10n_it_chart_template_generic,Iva al 21% detraibile 15% (D),2,0,2115,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det15,,template_ivacode_pagata_21det15,,,False,, -2115b,2115b,l10n_it_chart_template_generic,Iva al 21% detraibile 15% (I),1,0.85,2115,False,percent,,,purchase,,,,,,,False,, -2140,2140,l10n_it_chart_template_generic,Iva al 21% detraibile 40%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det40,,template_impcode_pagata_21det40,,,,False,-1,-1 -2140a,2140a,l10n_it_chart_template_generic,Iva al 21% detraibile 40% (D),2,0,2140,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det40,,template_ivacode_pagata_21det40,,,False,, -2140b,2140b,l10n_it_chart_template_generic,Iva al 21% detraibile 40% (I),1,0.6,2140,False,percent,,,purchase,,,,,,,False,, -21AO,21AO,l10n_it_chart_template_generic,Iva al 21% indetraibile,,0.21,,True,percent,,,purchase,template_impcode_pagata_21ind,,template_impcode_pagata_21ind,,,,False,-1,-1 -21AOa,21AOa,l10n_it_chart_template_generic,Iva al 21% indetraibile (D),2,0,21AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_21ind,,template_ivacode_pagata_21ind,,,False,, -21AOb,21AOb,l10n_it_chart_template_generic,Iva al 21% indetraibile (I),1,1,21AO,False,percent,,,purchase,,,,,,,False,, -21I5,21I5,l10n_it_chart_template_generic,IVA al 21% detraibile al 50%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det50,,template_impcode_pagata_21det50,,,,False,-1,-1 -21I5b,21I5b,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (I),1,0.5,21I5,False,percent,,,purchase,,,,,,,False,, -21I5a,21I5a,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (D),2,0,21I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det50,,template_ivacode_pagata_21det50,,,False,, - +21v,21v,l10n_it_chart_template_generic,Iva al 21% (debito),1,0.21,,False,percent,2601,2601,sale,template_impcode_riscossa_21,template_ivacode_riscossa_21,template_impcode_riscossa_21,template_ivacode_riscossa_21,-1,-1,False,1,1 +21a,21a,l10n_it_chart_template_generic,Iva al 21% (credito),2,0.21,,False,percent,1601,1601,purchase,template_impcode_pagata_21,template_ivacode_pagata_21,template_impcode_pagata_21,template_ivacode_pagata_21,1,1,False,-1,-1 +20v,20v,l10n_it_chart_template_generic,Iva al 20% (debito),3,0.2,,False,percent,2601,2601,sale,template_impcode_riscossa_20,template_ivacode_riscossa_20,template_impcode_riscossa_20,template_ivacode_riscossa_20,-1,-1,False,1,1 +20a,20a,l10n_it_chart_template_generic,Iva al 20% (credito),4,0.2,,False,percent,1601,1601,purchase,template_impcode_pagata_20,template_ivacode_pagata_20,template_impcode_pagata_20,template_ivacode_pagata_20,1,1,False,-1,-1 +10v,10v,l10n_it_chart_template_generic,Iva al 10% (debito),5,0.1,,False,percent,2601,2601,sale,template_impcode_riscossa_10,template_ivacode_riscossa_10,template_impcode_riscossa_10,template_ivacode_riscossa_10,-1,-1,False,1,1 +10a,10a,l10n_it_chart_template_generic,Iva al 10% (credito),6,0.1,,False,percent,1601,1601,purchase,template_impcode_pagata_10,template_ivacode_pagata_10,template_impcode_pagata_10,template_ivacode_pagata_10,1,1,False,-1,-1 +10AO,10AO,l10n_it_chart_template_generic,Iva al 10% indetraibile,7,0.1,,True,percent,,,purchase,template_impcode_pagata_10ind,,template_impcode_pagata_10ind,,1,1,False,-1,-1 +10AOb,10AOb,l10n_it_chart_template_generic,Iva al 10% indetraibile (D),200,0,10AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_10,,template_ivacode_pagata_10,1,1,False,-1,-1 +10AOa,10AOa,l10n_it_chart_template_generic,Iva al 10% indetraibile (I),100,1,10AO,False,percent,,,purchase,,template_ivacode_pagata_10ind,,template_ivacode_pagata_10ind,1,1,False,-1,-1 +12v,12v,l10n_it_chart_template_generic,Iva 12% (debito),8,0.12,,False,percent,2601,2601,sale,template_impcode_riscossa_12,template_ivacode_riscossa_12,template_impcode_riscossa_12,template_ivacode_riscossa_12,-1,-1,False,1,1 +12a,12a,l10n_it_chart_template_generic,Iva 12% (credito),9,0.12,,False,percent,1601,1601,purchase,template_impcode_pagata_12,template_ivacode_pagata_12,template_impcode_pagata_12,template_ivacode_pagata_12,1,1,False,-1,-1 +2010,2010,l10n_it_chart_template_generic,Iva al 20% detraibile 10%,10,0.2,,True,percent,,,purchase,template_impcode_pagata_20det10,,template_impcode_pagata_20det10,,1,1,False,-1,-1 +2010b,2010b,l10n_it_chart_template_generic,Iva al 20% detraibile 10% (D),200,0,2010,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det10,,template_ivacode_pagata_20det10,1,1,False,-1,-1 +2010a,2010a,l10n_it_chart_template_generic,Iva al 20% detraibile 10% (I),100,0.9,2010,False,percent,,,purchase,,template_ivacode_pagata_20det10ind,,template_ivacode_pagata_20det10ind,1,1,False,-1,-1 +2015,2015,l10n_it_chart_template_generic,Iva al 20% detraibile 15%,11,0.2,,True,percent,,,purchase,template_impcode_pagata_20det15,,template_impcode_pagata_20det15,,1,1,False,-1,-1 +2015b,2015b,l10n_it_chart_template_generic,Iva al 20% detraibile 15% (D),200,0,2015,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det15,,template_ivacode_pagata_20det15,1,1,False,-1,-1 +2015a,2015a,l10n_it_chart_template_generic,Iva al 20% detraibile 15% (I),100,0.85,2015,False,percent,,,purchase,,template_ivacode_pagata_20det15ind,,template_ivacode_pagata_20det15ind,1,1,False,-1,-1 +2040,2040,l10n_it_chart_template_generic,Iva al 20% detraibile 40%,12,0.2,,True,percent,,,purchase,template_impcode_pagata_20det40,,template_impcode_pagata_20det40,,1,1,False,-1,-1 +2040b,2040b,l10n_it_chart_template_generic,Iva al 20% detraibile 40% (D),200,0,2040,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det40,,template_ivacode_pagata_20det40,1,1,False,-1,-1 +2040a,2040a,l10n_it_chart_template_generic,Iva al 20% detraibile 40% (I),100,0.6,2040,False,percent,,,purchase,,template_ivacode_pagata_20det40ind,,template_ivacode_pagata_20det40ind,1,1,False,-1,-1 +20AO,20AO,l10n_it_chart_template_generic,Iva al 20% indetraibile,13,0.2,,True,percent,,,purchase,template_impcode_pagata_20ind,,template_impcode_pagata_20ind,,1,1,False,-1,-1 +20AOb,20AOb,l10n_it_chart_template_generic,Iva al 20% indetraibile (D),200,0,20AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_20ind,,template_ivacode_pagata_20ind,1,1,False,-1,-1 +20AOa,20AOa,l10n_it_chart_template_generic,Iva al 20% indetraibile (I),100,1,20AO,False,percent,,,purchase,,template_ivacode_pagata_20ind,,template_ivacode_pagata_20ind,1,1,False,-1,-1 +20I5,20I5,l10n_it_chart_template_generic,IVA al 20% detraibile al 50%,14,0.2,,True,percent,,,purchase,template_impcode_pagata_20det50,,template_impcode_pagata_20det50,,1,1,False,-1,-1 +20I5b,20I5b,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (D),200,0,20I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det50,,template_ivacode_pagata_20det50,1,1,False,-1,-1 +20I5a,20I5a,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (I),100,0.5,20I5,False,percent,,,purchase,,template_ivacode_pagata_20det50ind,,template_ivacode_pagata_20det50ind,1,1,False,-1,-1 +22v,22v,l10n_it_chart_template_generic,Iva 2% (debito),15,0.02,,False,percent,2601,2601,sale,template_impcode_riscossa_2,template_ivacode_riscossa_2,template_impcode_riscossa_2,template_ivacode_riscossa_2,-1,-1,False,1,1 +22a,22a,l10n_it_chart_template_generic,Iva 2% (credito),16,0.02,,False,percent,1601,1601,purchase,template_impcode_pagata_2,template_ivacode_pagata_2,template_impcode_pagata_2,template_ivacode_pagata_2,1,1,False,-1,-1 +4v,4v,l10n_it_chart_template_generic,Iva 4% (debito),17,0.04,,False,percent,2601,2601,sale,template_impcode_riscossa_4,template_ivacode_riscossa_4,template_impcode_riscossa_4,template_ivacode_riscossa_4,-1,-1,False,1,1 +4a,4a,l10n_it_chart_template_generic,Iva 4% (credito),18,0.04,,False,percent,1601,1601,purchase,template_impcode_pagata_4,template_ivacode_pagata_4,template_impcode_pagata_4,template_ivacode_pagata_4,1,1,False,-1,-1 +4AO,4AO,l10n_it_chart_template_generic,Iva al 4% indetraibile,19,0.04,,True,percent,,,purchase,template_impcode_pagata_4ind,,template_impcode_pagata_4ind,,1,1,False,-1,-1 +4AOb,4AOb,l10n_it_chart_template_generic,Iva al 4% indetraibile (D),200,0,4AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_4ind,,template_ivacode_pagata_4ind,1,1,False,-1,-1 +4AOa,4AOa,l10n_it_chart_template_generic,Iva al 4% indetraibile (I),100,1,4AO,False,percent,,,purchase,,template_ivacode_pagata_4ind,,template_ivacode_pagata_4ind,1,1,False,-1,-1 +10I5,10I5,l10n_it_chart_template_generic,IVA al 10% detraibile al 50%,20,0.1,,True,percent,,,purchase,template_impcode_pagata_10det50,,template_impcode_pagata_10det50,,1,1,False,-1,-1 +10I5b,10I5b,l10n_it_chart_template_generic,IVA al 10% detraibile al 50% (D),200,0,10I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_10det50,,template_ivacode_pagata_10det50,1,1,False,-1,-1 +10I5a,10I5a,l10n_it_chart_template_generic,IVA al 10% detraibile al 50% (I),100,0.5,10I5,False,percent,,,purchase,,template_ivacode_pagata_10det50ind,,template_ivacode_pagata_10det50ind,1,1,False,-1,-1 +4I5,4I5,l10n_it_chart_template_generic,IVA al 4% detraibile al 50%,21,0.04,,True,percent,,,purchase,template_impcode_pagata_4det50,,template_impcode_pagata_4det50,,1,1,False,-1,-1 +4I5b,4I5b,l10n_it_chart_template_generic,IVA al 4% detraibile al 50% (D),200,0,4I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_4det50,,template_ivacode_pagata_4det50,1,1,False,-1,-1 +4I5a,4I5a,l10n_it_chart_template_generic,IVA al 4% detraibile al 50% (I),100,0.5,4I5,False,percent,,,purchase,,template_ivacode_pagata_4det50ind,,template_ivacode_pagata_4det50ind,1,1,False,-1,-1 +00v,00v,l10n_it_chart_template_generic,Fuori Campo IVA (debito),22,0,,False,percent,2601,2601,sale,template_impcode_riscossa_0,template_ivacode_riscossa_0,template_impcode_riscossa_0,template_ivacode_riscossa_0,-1,-1,False,1,1 +00a,00a,l10n_it_chart_template_generic,Fuori Campo IVA (credito),23,0,,False,percent,1601,1601,purchase,template_impcode_pagata_0,template_ivacode_pagata_0,template_impcode_pagata_0,template_ivacode_pagata_0,1,1,False,-1,-1 +00art15v,00art15v,l10n_it_chart_template_generic,Imponibile Escluso Art.15 (debito),22,0,,False,percent,2601,2601,sale,template_impcode_riscossa_art15,template_ivacode_riscossa_art15,template_impcode_riscossa_art15,template_ivacode_riscossa_art15,-1,-1,False,1,1 +00art15a,00art15a,l10n_it_chart_template_generic,Imponibile Escluso Art.15 (credito),23,0,,False,percent,1601,1601,purchase,template_impcode_pagata_art15,template_ivacode_pagata_art15,template_impcode_pagata_art15,template_ivacode_pagata_art15,1,1,False,-1,-1 +21v INC,21v INC,l10n_it_chart_template_generic,Iva al 21% (debito) INC,24,0.21,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,-1,-1,True,1,1 +20v INC,20v INC,l10n_it_chart_template_generic,Iva al 20% (debito) INC,25,0.2,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,-1,-1,True,1,1 +10v INC,10v INC,l10n_it_chart_template_generic,Iva al 10% (debito) INC,26,0.1,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,-1,-1,True,1,1 +12v INC,12v INC,l10n_it_chart_template_generic,Iva 12% (debito) INC,27,0.12,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,-1,-1,True,1,1 +22v INC,22v INC,l10n_it_chart_template_generic,Iva 2% (debito) INC,28,0.02,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,-1,-1,True,1,1 +4v INC,4v INC,l10n_it_chart_template_generic,Iva 4% (debito) INC,29,0.04,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,-1,-1,True,1,1 +00v INC,00v INC,l10n_it_chart_template_generic,Fuori Campo IVA (debito) INC,30,0,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,-1,-1,True,1,1 +2110,2110,l10n_it_chart_template_generic,Iva al 21% detraibile 10%,31,0.21,,True,percent,,,purchase,template_impcode_pagata_21det10,,template_impcode_pagata_21det10,,1,1,False,-1,-1 +2110b,2110b,l10n_it_chart_template_generic,Iva al 21% detraibile 10% (D),200,0,2110,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det10,,template_ivacode_pagata_21det10,1,1,False,-1,-1 +2110a,2110a,l10n_it_chart_template_generic,Iva al 21% detraibile 10% (I),100,0.9,2110,False,percent,,,purchase,,template_ivacode_pagata_21det10ind,,template_ivacode_pagata_21det10ind,1,1,False,-1,-1 +2115,2115,l10n_it_chart_template_generic,Iva al 21% detraibile 15%,32,0.21,,True,percent,,,purchase,template_impcode_pagata_21det15,,template_impcode_pagata_21det15,,1,1,False,-1,-1 +2115b,2115b,l10n_it_chart_template_generic,Iva al 21% detraibile 15% (D),200,0,2115,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det15,,template_ivacode_pagata_21det15,1,1,False,-1,-1 +2115a,2115a,l10n_it_chart_template_generic,Iva al 21% detraibile 15% (I),100,0.85,2115,False,percent,,,purchase,,template_ivacode_pagata_21det15ind,,template_ivacode_pagata_21det15ind,1,1,False,-1,-1 +2140,2140,l10n_it_chart_template_generic,Iva al 21% detraibile 40%,33,0.21,,True,percent,,,purchase,template_impcode_pagata_21det40,,template_impcode_pagata_21det40,,1,1,False,-1,-1 +2140b,2140b,l10n_it_chart_template_generic,Iva al 21% detraibile 40% (D),200,0,2140,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det40,,template_ivacode_pagata_21det40,1,1,False,-1,-1 +2140a,2140a,l10n_it_chart_template_generic,Iva al 21% detraibile 40% (I),100,0.6,2140,False,percent,,,purchase,,template_ivacode_pagata_21det40ind,,template_ivacode_pagata_21det40ind,1,1,False,-1,-1 +21AO,21AO,l10n_it_chart_template_generic,Iva al 21% indetraibile,34,0.21,,True,percent,,,purchase,template_impcode_pagata_21ind,,template_impcode_pagata_21ind,,1,1,False,-1,-1 +21AOb,21AOb,l10n_it_chart_template_generic,Iva al 21% indetraibile (D),200,0,21AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_21ind,,template_ivacode_pagata_21ind,1,1,False,-1,-1 +21AOa,21AOa,l10n_it_chart_template_generic,Iva al 21% indetraibile (I),100,1,21AO,False,percent,,,purchase,,template_ivacode_pagata_21ind,,template_ivacode_pagata_21ind,1,1,False,-1,-1 +21I5,21I5,l10n_it_chart_template_generic,IVA al 21% detraibile al 50%,35,0.21,,True,percent,,,purchase,template_impcode_pagata_21det50,,template_impcode_pagata_21det50,,1,1,False,-1,-1 +21I5b,21I5b,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (D),200,0,21I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det50,,template_ivacode_pagata_21det50,1,1,False,-1,-1 +21I5a,21I5a,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (I),100,0.5,21I5,False,percent,,,purchase,,template_ivacode_pagata_21det50ind,,template_ivacode_pagata_21det50ind,1,1,False,-1,-1 diff --git a/addons/l10n_lu/account_financial_report.xml b/addons/l10n_lu/account_financial_report.xml index b39b0ceb15f..62a7a8c8d7e 100644 --- a/addons/l10n_lu/account_financial_report.xml +++ b/addons/l10n_lu/account_financial_report.xml @@ -84,7 +84,7 @@ </record> <record model="account.financial.report" id="account_financial_report_23"> - <field name="name">2. Concessions, brevets, licences, marques, ainsi que droits et valeurs similaires s’ils ont été</field> + <field name="name">2. Concessions, brevets, licences, marques, ainsi que droits et valeurs similaires s’ils ont été</field> <field name="sequence">115</field> <field name="sign" eval="1"/> <field name="display_detail">detail_flat</field> @@ -256,7 +256,7 @@ </record> <record model="account.financial.report" id="account_financial_report_42"> - <field name="name">I. Stocks </field> + <field name="name">I. Stocks</field> <field name="sequence">153</field> <field name="sign" eval="1"/> <field name="display_detail">detail_flat</field> @@ -292,7 +292,7 @@ </record> <record model="account.financial.report" id="account_financial_report_46"> - <field name="name">4. Acomptes versés </field> + <field name="name">4. Acomptes versés</field> <field name="sequence">161</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -301,7 +301,7 @@ </record> <record model="account.financial.report" id="account_financial_report_47"> - <field name="name">II. Créances </field> + <field name="name">II. Créances</field> <field name="sequence">163</field> <field name="sign" eval="1"/> <field name="display_detail">detail_flat</field> @@ -364,7 +364,7 @@ </record> <record model="account.financial.report" id="account_financial_report_54"> - <field name="name">3. Créances sur des entreprises avec lesquelles la société a un</field> + <field name="name">3. Créances sur des entreprises avec lesquelles la société a un lien de participation</field> <field name="sequence">177</field> <field name="sign" eval="1"/> <field name="display_detail">detail_flat</field> @@ -436,7 +436,7 @@ </record> <record model="account.financial.report" id="account_financial_report_62"> - <field name="name">2. Actions propres ou parts propres </field> + <field name="name">2. Actions propres ou parts propres</field> <field name="sequence">193</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -445,7 +445,7 @@ </record> <record model="account.financial.report" id="account_financial_report_63"> - <field name="name">3. Autres valeurs mobilières </field> + <field name="name">3. Autres valeurs mobilières</field> <field name="sequence">195</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -963,7 +963,7 @@ </record> <record model="account.financial.report" id="account_financial_report_119"> - <field name="name">CHARGES</field> + <field name="name">A. CHARGES</field> <field name="sequence">641</field> <field name="sign" eval="1"/> <field name="display_detail">detail_flat</field> @@ -972,7 +972,7 @@ </record> <record model="account.financial.report" id="account_financial_report_120"> - <field name="name">1. Consommation de marchandises et de matières premières et consommables</field> + <field name="name">1. Consommation de marchandises et de matières premières et consommables</field> <field name="sequence">601</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -1044,7 +1044,7 @@ </record> <record model="account.financial.report" id="account_financial_report_128"> - <field name="name">a) sur frais d'établissement et sur immobilisations corporelles</field> + <field name="name">a) sur frais d'établissement et sur immobilisations corporelles et incorporelles</field> <field name="sequence">617</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -1071,7 +1071,7 @@ </record> <record model="account.financial.report" id="account_financial_report_131"> - <field name="name">6. Corrections de valeur sur immobilisations financières et aj</field> + <field name="name">6. Corrections de valeur sur immobilisations financières et ajustement de juste valeur sur immobilisations financières</field> <field name="sequence">623</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -1080,7 +1080,7 @@ </record> <record model="account.financial.report" id="account_financial_report_132"> - <field name="name">7. Corrections de valeur et ajustement de juste valeur sur élém</field> + <field name="name">7. Corrections de valeur et ajustement de juste valeur sur éléments financiers de l'actif circulant. Moins-values de cessions des valeurs mobilières</field> <field name="sequence">625</field> <field name="sign" eval="1"/> <field name="display_detail">no_detail</field> @@ -1143,7 +1143,7 @@ </record> <record model="account.financial.report" id="account_financial_report_140"> - <field name="name">PRODUITS</field> + <field name="name">B. PRODUITS</field> <field name="sequence">737</field> <field name="sign" eval="-1"/> <field name="display_detail">detail_flat</field> @@ -1161,7 +1161,7 @@ </record> <record model="account.financial.report" id="account_financial_report_142"> - <field name="name">2. Variation des stocks de produits finis, et de produits et de commandes en cours</field> + <field name="name">2. Variation des stocks de produits finis, et de produits et de commandes en cours</field> <field name="sequence">703</field> <field name="sign" eval="-1"/> <field name="display_detail">no_detail</field> @@ -1188,7 +1188,7 @@ </record> <record model="account.financial.report" id="account_financial_report_145"> - <field name="name">a) sur frais d'établissement et sur immobilisations corporelles</field> + <field name="name">a) sur frais d'établissement et sur immobilisations corporelles et incorporelles</field> <field name="sequence">709</field> <field name="sign" eval="-1"/> <field name="display_detail">no_detail</field> diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index 8fab4347d0d..bd2b9c3f18a 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -60,9 +60,6 @@ class mail_mail(osv.Model): 'recipient_ids': fields.many2many('res.partner', string='To (Partners)'), 'email_cc': fields.char('Cc', help='Carbon copy message recipients'), 'body_html': fields.text('Rich-text Contents', help="Rich-text/HTML message"), - # If not set in create values, auto-detected based on create values (res_id, model, email_from) - 'reply_to': fields.char('Reply-To', - help='Preferred response address for the message'), # Auto-detected based on create() - if 'mail_message_id' was passed then this mail is a notification # and during unlink() we will not cascade delete the parent and its attachments 'notification': fields.boolean('Is Notification', diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index c30d00f5af7..252179614c6 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -158,6 +158,7 @@ class mail_message(osv.Model): 'author_id': fields.many2one('res.partner', 'Author', select=1, ondelete='set null', help="Author of the message. If not set, email_from may hold an email address that did not match any partner."), + 'author_avatar': fields.related('author_id', 'image_small', type="binary", string="Author's Avatar"), 'partner_ids': fields.many2many('res.partner', string='Recipients'), 'notified_partner_ids': fields.many2many('res.partner', 'mail_notification', 'message_id', 'partner_id', 'Notified partners', @@ -291,7 +292,7 @@ class mail_message(osv.Model): } if starred: values['read'] = False - + notif_ids = notification_obj.search(cr, uid, domain, context=context) # all message have notifications: already set them as (un)starred @@ -398,6 +399,7 @@ class mail_message(osv.Model): 'parent_id': parent_id, 'is_private': is_private, 'author_id': False, + 'author_avatar': message.author_avatar, 'is_author': False, 'partner_ids': [], 'vote_nb': vote_nb, @@ -528,7 +530,6 @@ class mail_message(osv.Model): message_unload_ids = message_unload_ids if message_unload_ids is not None else [] if message_unload_ids: domain += [('id', 'not in', message_unload_ids)] - notification_obj = self.pool.get('mail.notification') limit = limit or self._message_read_limit message_tree = {} message_list = [] @@ -738,12 +739,10 @@ class mail_message(osv.Model): for model, doc_dict in model_record_ids.items(): model_obj = self.pool[model] mids = model_obj.exists(cr, uid, doc_dict.keys()) - if operation in ['create', 'write', 'unlink']: - model_obj.check_access_rights(cr, uid, 'write') - model_obj.check_access_rule(cr, uid, mids, 'write', context=context) + if hasattr(model_obj, 'check_mail_message_access'): + model_obj.check_mail_message_access(cr, uid, mids, operation, context=context) else: - model_obj.check_access_rights(cr, uid, operation) - model_obj.check_access_rule(cr, uid, mids, operation, context=context) + self.pool['mail.thread'].check_mail_message_access(cr, uid, mids, operation, model_obj=model_obj, context=context) document_related_ids += [mid for mid, message in message_values.iteritems() if message.get('model') == model and message.get('res_id') in mids] diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 80df8ad6e99..a46f416f44b 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -101,12 +101,16 @@ class mail_thread(osv.AbstractModel): if catchall_domain and model and res_id: # specific res_id -> find its alias (i.e. section_id specified) object_id = self.pool.get(model).browse(cr, uid, res_id, context=context) - alias = object_id.alias_id + # check that the alias effectively creates new records + if object_id.alias_id and object_id.alias_id.alias_model_id and \ + object_id.alias_id.alias_model_id.model == self._name and \ + object_id.alias_id.alias_force_thread_id == 0: + alias = object_id.alias_id elif catchall_domain and model: # no specific res_id given -> generic help message, take an example alias (i.e. alias of some section_id) model_id = self.pool.get('ir.model').search(cr, uid, [("model", "=", self._name)], context=context)[0] alias_obj = self.pool.get('mail.alias') - alias_ids = alias_obj.search(cr, uid, [("alias_model_id", "=", model_id)], context=context, limit=1, order='id ASC') - if alias_ids: + alias_ids = alias_obj.search(cr, uid, [("alias_model_id", "=", model_id), ('alias_force_thread_id', '=', 0)], context=context, order='id ASC') + if alias_ids and len(alias_ids) == 1: # if several aliases -> incoherent to propose one guessed from nowhere, therefore avoid if several aliases alias = alias_obj.browse(cr, uid, alias_ids[0], context=context) if alias: @@ -281,14 +285,21 @@ class mail_thread(osv.AbstractModel): context = {} thread_id = super(mail_thread, self).create(cr, uid, values, context=context) + # automatic logging unless asked not to (mainly for various testing purpose) + if not context.get('mail_create_nolog'): + self.message_post(cr, uid, thread_id, body=_('%s created') % (self._description), context=context) + # subscribe uid unless asked not to if not context.get('mail_create_nosubscribe'): self.message_subscribe_users(cr, uid, [thread_id], [uid], context=context) self.message_auto_subscribe(cr, uid, [thread_id], values.keys(), context=context) - # automatic logging unless asked not to (mainly for various testing purpose) - if not context.get('mail_create_nolog'): - self.message_post(cr, uid, thread_id, body=_('%s created') % (self._description), context=context) + # track values + tracked_fields = self._get_tracked_fields(cr, uid, values.keys(), context=context) + if tracked_fields: + initial_values = {thread_id: dict((item, False) for item in tracked_fields)} + self.message_track(cr, uid, [thread_id], tracked_fields, initial_values, context=context) + return thread_id def write(self, cr, uid, ids, values, context=None): @@ -449,6 +460,20 @@ class mail_thread(osv.AbstractModel): ir_attachment_obj.unlink(cr, uid, attach_ids, context=context) return True + def check_mail_message_access(self, cr, uid, mids, operation, model_obj=None, context=None): + """ mail.message check permission rules for related document. This method is + meant to be inherited in order to implement addons-specific behavior. + A common behavior would be to allow creating messages when having read + access rule on the document, for portal document such as issues. """ + if not model_obj: + model_obj = self + if operation in ['create', 'write', 'unlink']: + model_obj.check_access_rights(cr, uid, 'write') + model_obj.check_access_rule(cr, uid, mids, 'write', context=context) + else: + model_obj.check_access_rights(cr, uid, operation) + model_obj.check_access_rule(cr, uid, mids, operation, context=context) + def _get_formview_action(self, cr, uid, id, model=None, context=None): """ Return an action to open the document. This method is meant to be overridden in addons that want to give specific view ids for example. diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 8631bc70baa..7df6cdbef0d 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -219,6 +219,7 @@ openerp.mail = function (session) { this.type = datasets.type || false, this.subtype = datasets.subtype || false, this.is_author = datasets.is_author || false, + this.author_avatar = datasets.author_avatar || false, this.is_private = datasets.is_private || false, this.subject = datasets.subject || false, this.name = datasets.name || false, @@ -260,8 +261,10 @@ openerp.mail = function (session) { this.date = this.date ? session.web.str_to_datetime(this.date) : false; if (this.date && new Date().getTime()-this.date.getTime() < 7*24*60*60*1000) { this.timerelative = $.timeago(this.date); - } - if (this.type == 'email' && (!this.author_id || !this.author_id[0])) { + } + if (this.author_avatar) { + this.avatar = "data:image/png;base64," + this.author_avatar; + } else if (this.type == 'email' && (!this.author_id || !this.author_id[0])) { this.avatar = ('/mail/static/src/img/email_icon.png'); } else if (this.author_id && this.template != 'mail.compose_message') { this.avatar = mail.ChatterUtils.get_image(this.session, 'res.partner', 'image_small', this.author_id[0]); @@ -850,9 +853,9 @@ openerp.mail = function (session) { on_checked_recipient: function (event) { var $input = $(event.target); - var email = $input.attr("data"); + var full_name = $input.attr("data"); _.each(this.recipients, function (recipient) { - if (recipient.email_address == email) { + if (recipient.full_name == full_name) { recipient.checked = $input.is(":checked"); } }); diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml index ab82d650f30..f5004941a8d 100644 --- a/addons/mail/static/src/xml/mail.xml +++ b/addons/mail/static/src/xml/mail.xml @@ -143,7 +143,7 @@ <div class="oe_recipients" t-if="!widget.is_log"> <t t-foreach='widget.recipients' t-as='recipient'> <label t-attf-title="Add as recipient and follower (reason: #{recipient.reason})"> - <input type="checkbox" t-att-checked="recipient.checked ? 'checked' : undefined" t-att-data="recipient.email_address"/> + <input type="checkbox" t-att-checked="recipient.checked ? 'checked' : undefined" t-att-data="recipient.full_name"/> <t t-raw="recipient.name"/> <t t-if="recipient.email_address">(<t t-raw="recipient.email_address"/>)</t> <t t-if="!recipient.email_address">(no email address)</t> diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index dfda3038de8..7bf4d47d1ff 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -270,6 +270,7 @@ class mail_compose_message(osv.TransientModel): context.pop('default_partner_ids', None) # post the message if mass_mail_mode and not wizard.post: + post_values['body_html'] = post_values.get('body', '') post_values['recipient_ids'] = [(4, id) for id in post_values.pop('partner_ids', [])] self.pool.get('mail.mail').create(cr, uid, post_values, context=context) else: diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py index 3ad7155dad6..6347e22d576 100644 --- a/addons/mrp/procurement.py +++ b/addons/mrp/procurement.py @@ -33,6 +33,11 @@ class procurement_order(osv.osv): 'production_id': fields.many2one('mrp.production', 'Manufacturing Order'), } + def _prepare_order_line_procurement(self, cr, uid, order, line, move_id, date_planned, context=None): + result = super(procurement_order, self)._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, context) + result['property_ids'] = [(6, 0, [x.id for x in line.property_ids])] + return result + def check_produce_product(self, cr, uid, procurement, context=None): ''' Depict the capacity of the procurement workflow to produce products (not services)''' return True diff --git a/addons/mrp/report/order.rml b/addons/mrp/report/order.rml index 8833d08e596..f413a6cfc70 100644 --- a/addons/mrp/report/order.rml +++ b/addons/mrp/report/order.rml @@ -139,37 +139,18 @@ <initialize> <paraStyle name="all" alignment="justify"/> </initialize> - <paraStyle name="Standard" fontName="Helvetica"/> - <paraStyle name="Text body" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> - <paraStyle name="Heading" fontName="Helvetica" fontSize="14.0" leading="17" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="List" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> - <paraStyle name="Table Contents" fontName="Helvetica"/> - <paraStyle name="Table Heading" fontName="Helvetica" alignment="CENTER"/> - <paraStyle name="Caption" fontName="Helvetica" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="Index" fontName="Helvetica"/> - <paraStyle name="Footer" fontName="Helvetica"/> - <paraStyle name="Horizontal Line" fontName="Helvetica" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/> - <paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_Right_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="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_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_2" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_space" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="0.0"/> + <paraStyle name="terp_header" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_8" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_8" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_tblheader_General_Centre" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details_Centre" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_Centre_8" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Centre_9" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_2" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> <images/> </stylesheet> <story> @@ -178,16 +159,16 @@ <blockTable colWidths="256.0,61.0,107.0,104.0" style="Table8"> <tr> <td> - <para style="terp_tblheader_Details">Product </para> + <para style="terp_tblheader_Details"><b>Product </b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Quantity</para> + <para style="terp_tblheader_Details_Centre"><b>Quantity</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Source Location</para> + <para style="terp_tblheader_Details_Centre"><b>Source Location</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Destination Location</para> + <para style="terp_tblheader_Details_Centre"><b>Destination Location</b></para> </td> </tr> </blockTable> @@ -196,20 +177,20 @@ <para style="terp_default_8"> <font color="white"> </font> </para> - <para style="terp_header">Production Order N° : [[ o.name ]]</para> + <para style="terp_header"><b>Production Order N° : [[ o.name ]]</b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="193.0,206.0,129.0" style="Table3"> <tr> <td> - <para style="terp_tblheader_General_Centre">Source Document</para> + <para style="terp_tblheader_General_Centre"><b>Source Document</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Product </para> + <para style="terp_tblheader_General_Centre"><b>Product </b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Quantity</para> + <para style="terp_tblheader_General_Centre"><b>Quantity</b></para> </td> </tr> </blockTable> @@ -232,16 +213,16 @@ <blockTable colWidths="193.0,92.0,114.0,129.0" repeatRows="1" style="Table1"> <tr> <td> - <para style="terp_tblheader_General_Centre">Scheduled Date</para> + <para style="terp_tblheader_General_Centre"><b>Scheduled Date</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Printing date</para> + <para style="terp_tblheader_General_Centre"><b>Printing date</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Partner Ref</para> + <para style="terp_tblheader_General_Centre"><b>Partner Ref</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">SO Number</para> + <para style="terp_tblheader_General_Centre"><b>SO Number</b></para> </td> </tr> </blockTable> @@ -266,26 +247,26 @@ <para style="terp_default_8"> <font color="white"> </font> </para> - <para style="terp_default_Bold_8">Work Orders [[ o.workcenter_lines ==[] and removeParentNode('para')]]</para> + <para style="terp_default_Bold_8"><b>Work Orders [[ o.workcenter_lines ==[] and removeParentNode('para')]]</b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="74.0,212.0,112.0,66.0,64.0" style="Table6"> <tr> <td> - <para style="terp_tblheader_General_Centre">Sequence</para> + <para style="terp_tblheader_General_Centre"><b>Sequence</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Name [[ o.workcenter_lines ==[] and removeParentNode('blockTable')]]</para> + <para style="terp_tblheader_Details_Centre"><b>Name [[ o.workcenter_lines ==[] and removeParentNode('blockTable')]]</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">WorkCenter</para> + <para style="terp_tblheader_General_Centre"><b>WorkCenter</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">No. Of Cycles</para> + <para style="terp_tblheader_General_Centre"><b>No. Of Cycles</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">No. Of Hours</para> + <para style="terp_tblheader_General_Centre"><b>No. Of Hours</b></para> </td> </tr> </blockTable> @@ -317,28 +298,28 @@ <para style="terp_default_8"> <font color="white"> </font> </para> - <para style="terp_default_Bold_9">Bill Of Material </para> + <para style="terp_default_Bold_9"><b>Bill Of Material </b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="256.0,61.0,107.0,104.0" style="Table8"> <tr> <td> - <para style="terp_tblheader_Details">Product </para> + <para style="terp_tblheader_Details"><b>Product </b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Quantity</para> + <para style="terp_tblheader_Details_Centre"><b>Quantity</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Source Location</para> + <para style="terp_tblheader_Details_Centre"><b>Source Location</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Destination Location</para> + <para style="terp_tblheader_Details_Centre"><b>Destination Location</b></para> </td> </tr> </blockTable> <section> - <para style="terp_default_Bold_9">Products to Consume [[ o.move_lines ==[] and removeParentNode('section')]]</para> + <para style="terp_default_Bold_9"><b>Products to Consume [[ o.move_lines ==[] and removeParentNode('section')]]</b></para> <section> <para style="terp_default_2">[[ repeatIn(o.move_lines,'line') ]]</para> <blockTable colWidths="250.0,65.0,108.0,104.0" style="Table9"> @@ -363,7 +344,7 @@ <para style="terp_default_Bold_9"> <font color="white"> </font> </para> - <para style="terp_default_Bold_9">Consumed Products [[ o.move_lines2 ==[] and removeParentNode('section')]]</para> + <para style="terp_default_Bold_9"><b>Consumed Products [[ o.move_lines2 ==[] and removeParentNode('section')]]</b></para> <section> <para style="terp_default_2">[[ repeatIn(o.move_lines2,'line2') ]]</para> <blockTable colWidths="251.0,66.0,106.0,104.0" style="Table10"> diff --git a/addons/portal/security/portal_security.xml b/addons/portal/security/portal_security.xml index b2a76800023..02080bdc0ab 100644 --- a/addons/portal/security/portal_security.xml +++ b/addons/portal/security/portal_security.xml @@ -5,7 +5,7 @@ <record id="portal_read_own_res_partner" model="ir.rule"> <field name="name">res_partner: read access on my partner</field> <field name="model_id" ref="base.model_res_partner"/> - <field name="domain_force">[('user_ids', 'in', user.id)]</field> + <field name="domain_force">[('id', 'child_of', user.commercial_partner_id.id)]</field> <field name="groups" eval="[(4, ref('group_portal')), (4, ref('group_anonymous'))]"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py index e363afa47cb..dc3211d0a71 100644 --- a/addons/portal/wizard/portal_wizard.py +++ b/addons/portal/wizard/portal_wizard.py @@ -20,7 +20,6 @@ ############################################################################## import logging -import random from openerp.osv import fields, osv from openerp.tools.translate import _ @@ -34,14 +33,15 @@ _logger = logging.getLogger(__name__) WELCOME_EMAIL_SUBJECT = _("Your OpenERP account at %(company)s") WELCOME_EMAIL_BODY = _("""Dear %(name)s, -You have been given access to %(portal)s. +You have been given access to %(company)s's %(portal)s. Your login account data is: -Database: %(db)s -Username: %(login)s + Username: %(login)s + Portal: %(portal_url)s + Database: %(db)s -In order to complete the signin process, click on the following url: -%(url)s +You can set or change your password via the following url: + %(signup_url)s %(welcome_message)s @@ -116,24 +116,57 @@ class wizard_user(osv.osv_memory): _description = 'Portal User Config' _columns = { - 'wizard_id': fields.many2one('portal.wizard', string='Wizard', required=True), + 'wizard_id': fields.many2one('portal.wizard', string='Wizard', required=True, ondelete='cascade'), 'partner_id': fields.many2one('res.partner', string='Contact', required=True, readonly=True), 'email': fields.char(size=240, string='Email'), 'in_portal': fields.boolean('In Portal'), } - def create(self, cr, uid, values, context=None): - """ overridden to update the partner's email (if necessary) """ - id = super(wizard_user, self).create(cr, uid, values, context) - wuser = self.browse(cr, uid, id, context) - if wuser.partner_id.email != wuser.email: - wuser.partner_id.write({'email': wuser.email}) - return id + def get_error_messages(self, cr, uid, ids, context=None): + res_users = self.pool.get('res.users') + emails = [] + error_empty = [] + error_emails = [] + error_user = [] + ctx = dict(context or {}, active_test=False) + for wizard_user in self.browse(cr, SUPERUSER_ID, ids, context): + if wizard_user.in_portal and not self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context): + email = extract_email(wizard_user.email) + if not email: + error_empty.append(wizard_user.partner_id) + elif email in emails and email not in error_emails: + error_emails.append(wizard_user.partner_id) + user = res_users.search(cr, SUPERUSER_ID, [('login', '=', email)], context=ctx) + if user: + error_user.append(wizard_user.partner_id) + emails.append(email) + + error_msg = [] + if error_empty: + error_msg.append("%s\n- %s" % (_("Some contacts don't have a valid email: "), + '\n- '.join(['%s' % (p.display_name,) for p in error_empty]))) + if error_emails: + error_msg.append("%s\n- %s" % (_("Several contacts have the same email: "), + '\n- '.join([p.email for p in error_emails]))) + if error_user: + error_msg.append("%s\n- %s" % (_("Some contacts have the same email as an existing portal user:"), + '\n- '.join(['%s <%s>' % (p.display_name, p.email) for p in error_user]))) + if error_msg: + error_msg.append(_("To resolve this error, you can: \n" + "- Correct the emails of the relevant contacts\n" + "- Grant access only to contacts with unique emails")) + return error_msg def action_apply(self, cr, uid, ids, context=None): + error_msg = self.get_error_messages(cr, uid, ids, context=context) + if error_msg: + raise osv.except_osv(_('Contacts Error'), "\n\n".join(error_msg)) + for wizard_user in self.browse(cr, SUPERUSER_ID, ids, context): portal = wizard_user.wizard_id.portal_id user = self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context) + if wizard_user.partner_id.email != wizard_user.email: + wizard_user.partner_id.write({'email': wizard_user.email}) if wizard_user.in_portal: # create a user if necessary, and make sure it is in the portal group if not user: @@ -142,8 +175,8 @@ class wizard_user(osv.osv_memory): user.write({'active': True, 'groups_id': [(4, portal.id)]}) # prepare for the signup process user.partner_id.signup_prepare() - wizard_user = self.browse(cr, SUPERUSER_ID, wizard_user.id, context) - self._send_email(cr, uid, wizard_user, context) + wizard_user.refresh() + self._send_email(cr, uid, wizard_user, context) else: # remove the user (if it exists) from the portal group if user and (portal in user.groups_id): @@ -158,13 +191,11 @@ class wizard_user(osv.osv_memory): @param wizard_user: browse record of model portal.wizard.user @return: browse record of model res.users """ - if wizard_user.partner_id.user_ids: - return wizard_user.partner_id.user_ids[0] - # the user may be inactive, search for it + context = dict(context or {}, active_test=False) res_users = self.pool.get('res.users') - domain = [('partner_id', '=', wizard_user.partner_id.id), ('active', '=', False)] - user_ids = res_users.search(cr, uid, domain) - return user_ids and res_users.browse(cr, uid, user_ids[0], context) or False + domain = [('partner_id', '=', wizard_user.partner_id.id)] + user_ids = res_users.search(cr, uid, domain, context=context) + return user_ids and res_users.browse(cr, uid, user_ids[0], context=context) or False def _create_user(self, cr, uid, wizard_user, context=None): """ create a new user for wizard_user.partner_id @@ -174,6 +205,7 @@ class wizard_user(osv.osv_memory): res_users = self.pool.get('res.users') create_context = dict(context or {}, noshortcut=True, no_reset_password=True) # to prevent shortcut creation values = { + 'email': extract_email(wizard_user.email), 'login': extract_email(wizard_user.email), 'partner_id': wizard_user.partner_id.id, 'groups_id': [(6, 0, [])], @@ -187,6 +219,7 @@ class wizard_user(osv.osv_memory): @param wizard_user: browse record of model portal.wizard.user @return: the id of the created mail.mail record """ + res_partner = self.pool['res.partner'] this_context = context this_user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context) if not this_user.email: @@ -196,6 +229,12 @@ class wizard_user(osv.osv_memory): # determine subject and body in the portal user's language user = self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context) context = dict(this_context or {}, lang=user.lang) + ctx_portal_url = dict(context, signup_force_type_in_url='') + portal_url = res_partner._get_signup_url_for_action(cr, uid, + [user.partner_id.id], + context=ctx_portal_url)[user.partner_id.id] + res_partner.signup_prepare(cr, uid, [user.partner_id.id], context=context) + data = { 'company': this_user.company_id.name, 'portal': wizard_user.wizard_id.portal_id.name, @@ -203,7 +242,8 @@ class wizard_user(osv.osv_memory): 'db': cr.dbname, 'name': user.name, 'login': user.login, - 'url': user.signup_url, + 'signup_url': user.signup_url, + 'portal_url': portal_url, } mail_mail = self.pool.get('mail.mail') mail_values = { diff --git a/addons/portal_hr_employees/hr_employee_view.xml b/addons/portal_hr_employees/hr_employee_view.xml index ace0daaff87..eca13258ff9 100644 --- a/addons/portal_hr_employees/hr_employee_view.xml +++ b/addons/portal_hr_employees/hr_employee_view.xml @@ -33,8 +33,9 @@ </record> <record model="ir.ui.view" id="portal_hr_kanban_view_employees"> - <field name="name">HR - Employess Kanban</field> + <field name="name">HR - Employees Kanban</field> <field name="model">hr.employee</field> + <field name="inherit_id" eval="False"/> <field name="arch" type="xml"> <kanban> <field name="last_login"/> diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml index 7f0a28d94dc..76432157555 100644 --- a/addons/procurement/procurement_view.xml +++ b/addons/procurement/procurement_view.xml @@ -18,6 +18,7 @@ <field name="product_uom" string="Unit of Measure"/> <field name="procure_method"/> <field name="state"/> + <field name="name" invisible="1"/> <field name="message"/> </tree> </field> diff --git a/addons/project/project.py b/addons/project/project.py index 5d5abce3066..e907e4b3652 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -85,7 +85,7 @@ class project(osv.osv): if context and context.get('user_preference'): cr.execute("""SELECT project.id FROM project_project project LEFT JOIN account_analytic_account account ON account.id = project.analytic_account_id - LEFT JOIN project_user_rel rel ON rel.project_id = project.analytic_account_id + LEFT JOIN project_user_rel rel ON rel.project_id = project.id WHERE (account.user_id = %s or rel.uid = %s)"""%(user, user)) return [(r[0]) for r in cr.fetchall()] return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, @@ -581,12 +581,12 @@ class task(base_stage, osv.osv): _track = { 'state': { - 'project.mt_task_new': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'new', + 'project.mt_task_new': lambda self, cr, uid, obj, ctx=None: obj['state'] in ['new', 'draft'], 'project.mt_task_started': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'open', 'project.mt_task_closed': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'done', }, 'stage_id': { - 'project.mt_task_stage': lambda self, cr, uid, obj, ctx=None: obj['state'] not in ['new', 'done', 'open'], + 'project.mt_task_stage': lambda self, cr, uid, obj, ctx=None: obj['state'] not in ['new', 'draft', 'done', 'open'], }, 'kanban_state': { # kanban state: tracked, but only block subtype 'project.mt_task_blocked': lambda self, cr, uid, obj, ctx=None: obj['kanban_state'] == 'blocked', @@ -1120,10 +1120,12 @@ class task(base_stage, osv.osv): context = {} if not vals.get('stage_id'): ctx = context.copy() - if vals.get('project_id'): + if vals.get('project_id'): ctx['default_project_id'] = vals['project_id'] vals['stage_id'] = self._get_default_stage_id(cr, uid, context=ctx) - task_id = super(task, self).create(cr, uid, vals, context=context) + # context: no_log, because subtype already handle this + create_context = dict(context, mail_create_nolog=True) + task_id = super(task, self).create(cr, uid, vals, context=create_context) self._store_history(cr, uid, [task_id], context=context) return task_id @@ -1197,6 +1199,17 @@ class task(base_stage, osv.osv): return [task.project_id.message_get_reply_to()[0] if task.project_id else False for task in self.browse(cr, uid, ids, context=context)] + def check_mail_message_access(self, cr, uid, mids, operation, model_obj=None, context=None): + """ mail.message document permission rule: can post a new message if can read + because of portal document. """ + if not model_obj: + model_obj = self + if operation == 'create': + model_obj.check_access_rights(cr, uid, 'read') + model_obj.check_access_rule(cr, uid, mids, 'read', context=context) + else: + return super(task, self).check_mail_message_access(cr, uid, mids, operation, model_obj=model_obj, context=context) + def message_new(self, cr, uid, msg, custom_values=None, context=None): """ Override to updates the document according to the email. """ if custom_values is None: custom_values = {} @@ -1205,7 +1218,7 @@ class task(base_stage, osv.osv): 'planned_hours': 0.0, } defaults.update(custom_values) - return super(task,self).message_new(cr, uid, msg, custom_values=defaults, context=context) + return super(task, self).message_new(cr, uid, msg, custom_values=defaults, context=context) def message_update(self, cr, uid, ids, msg, update_vals=None, context=None): """ Override to update the task according to the email. """ diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index c30c91fe6c0..17e059c8de7 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -6,7 +6,7 @@ <field name="name">project.task.history.cumulative.tree</field> <field name="model">project.task.history.cumulative</field> <field name="arch" type="xml"> - <tree string="Tasks's Cumulative Flow"> + <tree string="Tasks's Cumulative Flow" create="false"> <field name="date"/> <field name="project_id"/> <field name="task_id"/> diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index a008c670138..8bcac4581c3 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -19,11 +19,12 @@ # ############################################################################## +from openerp import SUPERUSER_ID from openerp.addons.base_status.base_stage import base_stage from openerp.addons.project.project import _TASK_STATE from openerp.addons.crm import crm from datetime import datetime -from openerp.osv import fields,osv +from openerp.osv import fields, osv, orm from openerp.tools.translate import _ import binascii import time @@ -49,12 +50,12 @@ class project_issue(base_stage, osv.osv): _track = { 'state': { - 'project_issue.mt_issue_new': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'new', + 'project_issue.mt_issue_new': lambda self, cr, uid, obj, ctx=None: obj['state'] in ['new', 'draft'], 'project_issue.mt_issue_closed': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'done', 'project_issue.mt_issue_started': lambda self, cr, uid, obj, ctx=None: obj['state'] == 'open', }, 'stage_id': { - 'project_issue.mt_issue_stage': lambda self, cr, uid, obj, ctx=None: obj['state'] not in ['new', 'done', 'open'], + 'project_issue.mt_issue_stage': lambda self, cr, uid, obj, ctx=None: obj['state'] not in ['new', 'draft', 'done', 'open'], }, 'kanban_state': { 'project_issue.mt_issue_blocked': lambda self, cr, uid, obj, ctx=None: obj['kanban_state'] == 'blocked', @@ -69,7 +70,9 @@ class project_issue(base_stage, osv.osv): if vals.get('project_id'): ctx['default_project_id'] = vals['project_id'] vals['stage_id'] = self._get_default_stage_id(cr, uid, context=ctx) - return super(project_issue, self).create(cr, uid, vals, context=context) + # context: no_log, because subtype already handle this + create_context = dict(context, mail_create_nolog=True) + return super(project_issue, self).create(cr, uid, vals, context=create_context) def _get_default_project_id(self, cr, uid, context=None): """ Gives default project by checking if present in the context """ @@ -492,13 +495,27 @@ class project_issue(base_stage, osv.osv): return [issue.project_id.message_get_reply_to()[0] if issue.project_id else False for issue in self.browse(cr, uid, ids, context=context)] + def check_mail_message_access(self, cr, uid, mids, operation, model_obj=None, context=None): + """ mail.message document permission rule: can post a new message if can read + because of portal document. """ + if not model_obj: + model_obj = self + if operation == 'create': + model_obj.check_access_rights(cr, uid, 'read') + model_obj.check_access_rule(cr, uid, mids, 'read', context=context) + else: + return super(project_issue, self).check_mail_message_access(cr, uid, mids, operation, model_obj=model_obj, context=context) + def message_get_suggested_recipients(self, cr, uid, ids, context=None): recipients = super(project_issue, self).message_get_suggested_recipients(cr, uid, ids, context=context) - for issue in self.browse(cr, uid, ids, context=context): - if issue.email_from: - self._message_add_suggested_recipient(cr, uid, recipients, issue, email=issue.email_from, reason=_('Customer Email')) - elif issue.partner_id: - self._message_add_suggested_recipient(cr, uid, recipients, issue, partner=issue.partner_id, reason=_('Customer')) + try: + for issue in self.browse(cr, uid, ids, context=context): + if issue.partner_id: + self._message_add_suggested_recipient(cr, uid, recipients, issue, partner=issue.partner_id, reason=_('Customer')) + elif issue.email_from: + self._message_add_suggested_recipient(cr, uid, recipients, issue, email=issue.email_from, reason=_('Customer Email')) + except (osv.except_osv, orm.except_orm): # no read access rights -> just ignore suggested recipients because this imply modifying followers + pass return recipients def message_new(self, cr, uid, msg, custom_values=None, context=None): @@ -560,13 +577,10 @@ class project_issue(base_stage, osv.osv): """ if context is None: context = {} - res = super(project_issue, self).message_post(cr, uid, thread_id, body=body, subject=subject, type=type, subtype=subtype, parent_id=parent_id, attachments=attachments, context=context, content_subtype=content_subtype, **kwargs) - if thread_id: - self.write(cr, uid, thread_id, {'date_action_last': time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)}, context=context) - - return res + self.write(cr, SUPERUSER_ID, thread_id, {'date_action_last': time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)}, context=context) + return res class project(osv.Model): diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index f15355e9cc8..46caba0021e 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -68,15 +68,16 @@ <label for="categ_ids" class="oe_edit_only"/> <field name="categ_ids" widget="many2many_tags"/> <group> - <group groups="base.group_user"> + <group> <field name="user_id" context="{'default_groups_ref': ['base.group_user', 'project.group_project_user']}"/> <field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)"/> <field name="email_from"/> - <label for="project_id" groups="base.group_user"/> - <div groups="base.group_user"> + <label for="project_id"/> + <div> <field name="project_id" on_change="on_change_project(project_id)" class="oe_inline" context="{'default_use_issues':1}"/> - <button name="case_escalate" string="⇒ Escalate" type="object" states="draft,open,pending" class="oe_link"/> + <button name="case_escalate" string="⇒ Escalate" type="object" states="draft,open,pending" class="oe_link" + groups="base.group_user"/> </div> </group> <group> @@ -150,8 +151,8 @@ <field name="id"/> <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> <separator/> - <filter string="New" icon="terp-document-new" domain="[('state','=','draft')]" help="New Issues"/> - <filter string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-check"/> + <filter name="filter_new" string="New" icon="terp-document-new" domain="[('state','=','draft')]" help="New Issues"/> + <filter name="filter_open" string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-check"/> <separator/> <filter string="Unassigned Issues" domain="[('user_id','=',False)]" help="Unassigned Issues" icon="terp-personal-"/> <separator/> @@ -160,13 +161,13 @@ <field name="categ_ids"/> <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/> <group expand="0" string="Group By..." > - <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="Contact" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/> - <filter string="Project" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}"/> - <filter string="Version" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'version_id'}"/> - <filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}"/> - <filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/> - <filter string="Month" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}" help="Creation Month"/> + <filter string="Responsible" name="group_user_id" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/> + <filter string="Contact" name="group_partner_id" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/> + <filter string="Project" name="group_project_id" icon="terp-folder-violet" domain="[]" context="{'group_by':'project_id'}"/> + <filter string="Version" name="group_version" icon="terp-gtk-jump-to-rtl" domain="[]" context="{'group_by':'version_id'}"/> + <filter string="Priority" name="group_priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}"/> + <filter string="Stage" name="group_stage_id" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/> + <filter string="Month" name="group_create_date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}" help="Creation Month"/> </group> </search> </field> diff --git a/addons/project_issue_sheet/project_issue_sheet_view.xml b/addons/project_issue_sheet/project_issue_sheet_view.xml index fb245a0510a..4911cac8f25 100644 --- a/addons/project_issue_sheet/project_issue_sheet_view.xml +++ b/addons/project_issue_sheet/project_issue_sheet_view.xml @@ -19,7 +19,8 @@ </field> <xpath expr="//notebook/page[@string='Extra Info']" position="before"> <page string="Worklogs"> - <field name="timesheet_ids" colspan="4" nolabel="1" context="{'default_user_id' : user_id, 'default_account_id' : analytic_account_id}"> + <field name="timesheet_ids" colspan="4" nolabel="1" context="{'default_user_id' : user_id, 'default_account_id' : analytic_account_id}" + groups="base.group_user"> <tree editable="top" string="Timesheets"> <field name="name"/> <field name="unit_amount" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id)" widget="float_time"/> diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 4066b6133c1..e61af0c6c32 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -120,7 +120,8 @@ </field> <xpath expr="//div[contains(@class, 'oe_kanban_project_list')]" position="inside"> <a t-if="record.use_phases.raw_value" - name="%(act_project_phases)d" type="action"> + name="%(act_project_phases)d" type="action" + groups="base.group_user"> <span t-if="record.phase_count.raw_value gt 1"><field name="phase_count"/> Phases</span> <span t-if="record.phase_count.raw_value lt 2"><field name="phase_count"/> Phase</span> </a> @@ -322,7 +323,7 @@ <field name="inherit_id" ref="project.view_task_search_form"/> <field name="arch" type="xml"> <field name="user_id" position="before"> - <field name="phase_id"/> + <field name="phase_id" domain="[]"/> </field> </field> </record> diff --git a/addons/purchase/report/order.rml b/addons/purchase/report/order.rml index 1794bea19c4..6eb1b2167ee 100644 --- a/addons/purchase/report/order.rml +++ b/addons/purchase/report/order.rml @@ -94,38 +94,16 @@ <initialize> <paraStyle name="all" alignment="justify"/> </initialize> - <paraStyle name="Standard" fontName="Helvetica"/> - <paraStyle name="Text body" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> - <paraStyle name="Heading" fontName="Helvetica" fontSize="14.0" leading="17" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="List" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> - <paraStyle name="Table Contents" fontName="Helvetica"/> - <paraStyle name="Table Heading" fontName="Helvetica" alignment="CENTER"/> - <paraStyle name="Caption" fontName="Helvetica" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="Index" fontName="Helvetica"/> - <paraStyle name="Footer" fontName="Helvetica"/> - <paraStyle name="Horizontal Line" fontName="Helvetica" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/> - <paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_Right_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_address" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_9_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_8_Italic" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" 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_header" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_General" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_8" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_tblheader_General_Centre" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_General_Right" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_Centre_8" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_9_Right" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> <images/> </stylesheet> <story> @@ -136,22 +114,22 @@ <blockTable colWidths="180.0,70.0,60.0,80.0,60.0,85.0" repeatRows="1" style="Table_Header_Pur_ord_Line"> <tr> <td> - <para style="terp_tblheader_General">Description</para> + <para style="terp_tblheader_General"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_General">Taxes</para> + <para style="terp_tblheader_General"><b>Taxes</b></para> </td> <td> - <para style="terp_tblheader_General">Date Req.</para> + <para style="terp_tblheader_General"><b>Date Req.</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Qty</para> + <para style="terp_tblheader_General_Right"><b>Qty</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Unit Price</para> + <para style="terp_tblheader_General_Right"><b>Unit Price</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Net Price</para> + <para style="terp_tblheader_General_Right"><b>Net Price</b></para> </td> </tr> </blockTable> @@ -165,7 +143,7 @@ <blockTable colWidths="253.0" style="Tableau2"> <tr> <td> - <para style="terp_default_Bold_9">Shipping address :</para> + <para style="terp_default_Bold_9"><b>Shipping address :</b></para> <para style="terp_default_9">[[ (o.dest_address_id and o.dest_address_id.name) or (o.warehouse_id and o.warehouse_id.name) or '']]</para> <para style="terp_default_9">[[ (o.dest_address_id and display_address(o.dest_address_id)) or (o.warehouse_id and display_address(o.warehouse_id.partner_id)) or '']]</para> </td> @@ -195,24 +173,24 @@ <para style="terp_default_9"> <font color="white"> </font> </para> - <para style="terp_header">[[ o.state=='draft' and removeParentNode('para') ]] Purchase Order Confirmation N° [[ o.name ]]</para> - <para style="terp_header">[[ o.state<>'draft' and removeParentNode('para') ]] Request for Quotation N° [[ o.name ]]</para> + <para style="terp_header"><b>[[ o.state=='draft' and removeParentNode('para') ]] Purchase Order Confirmation N° [[ o.name ]]</b></para> + <para style="terp_header"><b>[[ o.state<>'draft' and removeParentNode('para') ]] Request for Quotation N° [[ o.name ]]</b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="136.0,132.0,133.0,133.0" style="Header_Order_Reference_Tbl"> <tr> <td> - <para style="terp_tblheader_General_Centre">Our Order Reference</para> + <para style="terp_tblheader_General_Centre"><b>Our Order Reference</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Your Order Reference</para> + <para style="terp_tblheader_General_Centre"><b>Your Order Reference</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Order Date</para> + <para style="terp_tblheader_General_Centre"><b>Order Date</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Validated By</para> + <para style="terp_tblheader_General_Centre"><b>Validated By</b></para> </td> </tr> </blockTable> @@ -238,22 +216,22 @@ <blockTable colWidths="180.0,70.0,60.0,80.0,60.0,85.0" repeatRows="1" style="Table_Header_Pur_ord_Line"> <tr> <td> - <para style="terp_tblheader_General">Description</para> + <para style="terp_tblheader_General"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_General">Taxes</para> + <para style="terp_tblheader_General"><b>Taxes</b></para> </td> <td> - <para style="terp_tblheader_General">Date Req.</para> + <para style="terp_tblheader_General"><b>Date Req.</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Qty</para> + <para style="terp_tblheader_General_Right"><b>Qty</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Unit Price</para> + <para style="terp_tblheader_General_Right"><b>Unit Price</b></para> </td> <td> - <para style="terp_tblheader_General_Right">Net Price</para> + <para style="terp_tblheader_General_Right"><b>Net Price</b></para> </td> </tr> </blockTable> @@ -316,10 +294,10 @@ </para> </td> <td> - <para style="terp_default_Bold_9">Total :</para> + <para style="terp_default_Bold_9"><b>Total :</b></para> </td> <td> - <para style="terp_default_Bold_9_Right">[[ formatLang(o.amount_total, digits=get_digits(dp='Account') , currency_obj=o.pricelist_id.currency_id) ]]</para> + <para style="terp_default_Bold_9_Right"><b>[[ formatLang(o.amount_total, digits=get_digits(dp='Account') , currency_obj=o.pricelist_id.currency_id) ]]</b></para> </td> </tr> </blockTable> diff --git a/addons/purchase/report/request_quotation.rml b/addons/purchase/report/request_quotation.rml index 8e5e73ee588..b7b4776d635 100644 --- a/addons/purchase/report/request_quotation.rml +++ b/addons/purchase/report/request_quotation.rml @@ -36,40 +36,17 @@ <initialize> <paraStyle name="all" alignment="justify"/> </initialize> - <paraStyle name="P1" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" 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="Heading" fontName="Helvetica" fontSize="14.0" leading="17" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="List" fontName="Helvetica" spaceBefore="0.0" spaceAfter="6.0"/> - <paraStyle name="Table Contents" fontName="Helvetica"/> - <paraStyle name="Table Heading" fontName="Helvetica" alignment="CENTER"/> - <paraStyle name="Caption" fontName="Helvetica" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="Index" fontName="Helvetica"/> - <paraStyle name="Footer" fontName="Helvetica"/> - <paraStyle name="Horizontal Line" fontName="Helvetica" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/> - <paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_Right_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/> - <paraStyle name="terp_default_address" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_2" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_8_italic" rightIndent="0.0" leftIndent="20.0" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Note" rightIndent="0.0" leftIndent="9.0" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="Space bet user and signature" fontName="Helvetica" fontSize="4.0" leading="5" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="P1" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="Standard"/> + <paraStyle name="terp_header" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_8" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_tblheader_Details_Centre" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Centre_9" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="Space bet user and signature" fontSize="4.0" leading="5" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> <images/> </stylesheet> <story> @@ -84,7 +61,7 @@ <blockTable colWidths="250.0" style="Tableau2"> <tr> <td> - <para style="terp_default_Bold_9">Expected Delivery address:</para> + <para style="terp_default_Bold_9"><b>Expected Delivery address:</b></para> <para style="terp_default_9">[[ (order.dest_address_id and order.dest_address_id.name) or (order.warehouse_id and order.warehouse_id.name) or '']]</para> <para style="P1">[[ order.dest_address_id and display_address(order.dest_address_id) ]]</para> </td> @@ -114,20 +91,20 @@ <para style="Standard"> <font color="white"> </font> </para> - <para style="terp_header">Request for Quotation : [[order.name]]</para> + <para style="terp_header"><b>Request for Quotation : [[order.name]]</b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="371.0,98.0,61.0" repeatRows="1" style="Table_Product_Header_Title"> <tr> <td> - <para style="terp_tblheader_Details">Description</para> + <para style="terp_tblheader_Details"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Expected Date</para> + <para style="terp_tblheader_Details_Centre"><b>Expected Date</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Qty</para> + <para style="terp_tblheader_Details_Centre"><b>Qty</b></para> </td> </tr> </blockTable> diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index 82061daa758..dbc0cc6fdc5 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -280,7 +280,9 @@ class WebKitParser(report_sxw): template = False if report_xml.report_file : - path = get_module_resource(*report_xml.report_file.split(os.path.sep)) + # backward-compatible if path in Windows format + report_path = report_xml.report_file.replace("\\", "/") + path = get_module_resource(*report_path.split('/')) if path and os.path.exists(path) : template = file(path).read() if not template and report_xml.report_webkit_data : diff --git a/addons/sale/report/sale_order.rml b/addons/sale/report/sale_order.rml index 130220535f9..3bddf81ade8 100644 --- a/addons/sale/report/sale_order.rml +++ b/addons/sale/report/sale_order.rml @@ -89,40 +89,19 @@ <initialize> <paraStyle name="all" alignment="justify"/> </initialize> - <paraStyle name="Standard" fontName="Helvetica"/> - <paraStyle name="Text body" fontName="Helvetica" 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="Helvetica"/> - <paraStyle name="Table Heading" fontName="Helvetica" alignment="CENTER"/> - <paraStyle name="Caption" fontName="Helvetica" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/> - <paraStyle name="Index" fontName="Helvetica"/> - <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="Helvetica"/> - <paraStyle name="Horizontal Line" fontName="Helvetica" 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" rightIndent="0.0" leftIndent="20.0" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="Preformatted Text" fontName="Helvetica" fontSize="10.0" leading="13" spaceBefore="0.0" spaceAfter="0.0"/> - <paraStyle name="terp_default_Centre_9_Bold" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_header" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_8" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Bold_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_9" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_tblheader_General_Centre" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_Centre_8" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_tblheader_Details" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details_Centre" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_tblheader_Details_Right" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="6.0" spaceAfter="6.0"/> + <paraStyle name="terp_default_Centre_9" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_1" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/> + <paraStyle name="terp_default_Right_9_Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/> <images/> </stylesheet> <story> @@ -133,22 +112,22 @@ <blockTable colWidths="181.0,70.0,80.0,70.0,50.0,85.0" repeatRows="1" style="Table4"> <tr> <td> - <para style="terp_tblheader_Details">Description</para> + <para style="terp_tblheader_Details"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Tax</para> + <para style="terp_tblheader_Details_Centre"><b>Tax</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Quantity</para> + <para style="terp_tblheader_Details_Right"><b>Quantity</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Unit Price</para> + <para style="terp_tblheader_Details_Right"><b>Unit Price</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Disc.(%)</para> + <para style="terp_tblheader_Details_Centre"><b>Disc.(%)</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Price</para> + <para style="terp_tblheader_Details_Right"><b>Price</b></para> </td> </tr> </blockTable> @@ -162,13 +141,13 @@ <blockTable colWidths="265.0,51.0,225.0" style="Table1"> <tr> <td> - <para style="terp_default_Bold_9">Shipping address :</para> + <para style="terp_default_Bold_9"><b>Shipping address :</b></para> <para style="terp_default_9">[[ (o.partner_shipping_id and o.partner_id.title and o.partner_shipping_id.title.name) or '' ]] [[ (o.partner_shipping_id and o.partner_shipping_id.name) or '' ]]</para> <para style="terp_default_9">[[ o.partner_shipping_id and display_address(o.partner_shipping_id) ]]</para> <para style="terp_default_9"> <font color="white"> </font> </para> - <para style="terp_default_Bold_9">Invoice address :</para> + <para style="terp_default_Bold_9"><b>Invoice address :</b></para> <para style="terp_default_9">[[ (o.partner_invoice_id and o.partner_invoice_id.title and o.partner_invoice_id.title.name) or '' ]] [[ (o.partner_invoice_id and o.partner_invoice_id.name) or '' ]]</para> <para style="terp_default_9">[[ o.partner_invoice_id and display_address(o.partner_invoice_id) ]] </para> </td> @@ -195,25 +174,25 @@ <para style="terp_default_8"> <font color="white"> </font> </para> - <para style="terp_header">[[ o.state not in ['draft','sent'] and removeParentNode('para') ]] Quotation N° [[ o.name ]]</para> - <para style="terp_header">[[ o.state in ['draft','sent'] and removeParentNode('para') ]] Order N° [[ o.name ]]</para> + <para style="terp_header"><b>[[ o.state not in ['draft','sent'] and removeParentNode('para') ]] Quotation N° [[ o.name ]]</b></para> + <para style="terp_header"><b>[[ o.state in ['draft','sent'] and removeParentNode('para') ]] Order N° [[ o.name ]]</b></para> <para style="terp_default_8"> <font color="white"> </font> </para> <blockTable colWidths="132.0,134.0,135.0,135.0" style="Table2"> <tr> <td> - <para style="terp_tblheader_General_Centre">Your Reference </para> + <para style="terp_tblheader_General_Centre"><b>Your Reference </b></para> </td> <td> - <para style="terp_tblheader_General_Centre">[[ o.state in ['draft','sent'] and removeParentNode('para') ]] Date Ordered</para> - <para style="terp_tblheader_General_Centre">[[ o.state not in ['draft','sent'] and removeParentNode('para') ]] Quotation Date</para> + <para style="terp_tblheader_General_Centre"><b>[[ o.state in ['draft','sent'] and removeParentNode('para') ]] Date Ordered</b></para> + <para style="terp_tblheader_General_Centre"><b>[[ o.state not in ['draft','sent'] and removeParentNode('para') ]] Quotation Date</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Salesperson</para> + <para style="terp_tblheader_General_Centre"><b>Salesperson</b></para> </td> <td> - <para style="terp_tblheader_General_Centre">Payment Term</para> + <para style="terp_tblheader_General_Centre"><b>Payment Term</b></para> </td> </tr> </blockTable> @@ -239,22 +218,22 @@ <blockTable colWidths="181.0,70.0,80.0,70.0,50.0,85.0" repeatRows="1" style="Table4"> <tr> <td> - <para style="terp_tblheader_Details">Description</para> + <para style="terp_tblheader_Details"><b>Description</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">Tax</para> + <para style="terp_tblheader_Details_Centre"><b>Tax</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Quantity</para> + <para style="terp_tblheader_Details_Right"><b>Quantity</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Unit Price</para> + <para style="terp_tblheader_Details_Right"><b>Unit Price</b></para> </td> <td> - <para style="terp_tblheader_Details_Centre">[[not show_discount(user.id) and removeParentNode('para') ]]Disc.(%)</para> + <para style="terp_tblheader_Details_Centre"><b>[[not show_discount(user.id) and removeParentNode('para') ]]Disc.(%)</b></para> </td> <td> - <para style="terp_tblheader_Details_Right">Price</para> + <para style="terp_tblheader_Details_Right"><b>Price</b></para> </td> </tr> </blockTable> @@ -317,10 +296,10 @@ </para> </td> <td> - <para style="terp_default_Bold_9">Total :</para> + <para style="terp_default_Bold_9"><b>Total :</b></para> </td> <td> - <para style="terp_default_Right_9_Bold">[[ formatLang(o.amount_total, dp='Account', currency_obj=o.pricelist_id.currency_id) ]]</para> + <para style="terp_default_Right_9_Bold"><b>[[ formatLang(o.amount_total, dp='Account', currency_obj=o.pricelist_id.currency_id) ]]</b></para> </td> </tr> </blockTable> diff --git a/addons/sale/res_partner.py b/addons/sale/res_partner.py index 1b37b609179..8201e147e34 100644 --- a/addons/sale/res_partner.py +++ b/addons/sale/res_partner.py @@ -41,7 +41,7 @@ class res_partner(osv.osv): default.update({'sale_order_ids': []}) - super(res_partner, self).copy(cr, uid, record_id, default, context) + return super(res_partner, self).copy(cr, uid, record_id, default, context) _columns = { 'sale_order_count': fields.function(_sale_order_count, string='# of Sales Order', type='integer'), diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 210e4dd3be6..f00fb6afd19 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -695,7 +695,7 @@ class sale_order_line(osv.osv): _description = 'Sales Order Line' _columns = { 'order_id': fields.many2one('sale.order', 'Order Reference', required=True, ondelete='cascade', select=True, readonly=True, states={'draft':[('readonly',False)]}), - 'name': fields.text('Description', required=True, select=True, readonly=True, states={'draft': [('readonly', False)]}), + 'name': fields.text('Description', required=True, readonly=True, states={'draft': [('readonly', False)]}), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of sales order lines."), 'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True), 'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_id', 'Invoice Lines', readonly=True), diff --git a/addons/sale_margin/sale_margin_view.xml b/addons/sale_margin/sale_margin_view.xml index 88647ea3c46..be16429526a 100644 --- a/addons/sale_margin/sale_margin_view.xml +++ b/addons/sale_margin/sale_margin_view.xml @@ -9,7 +9,7 @@ <field name="arch" type="xml"> <xpath expr="//group[@name='sale_total']" position="after"> <group name="sale_margin_grp"> - <field name="margin" widget='monetary' options="{'currency_field': 'currency_id'}"/> + <field name="margin" widget='monetary' options="{'currency_field': 'currency_id'}" groups="base.group_user"/> </group> </xpath> </field> diff --git a/addons/sale_stock/test/cancel_order_sale_stock.yml b/addons/sale_stock/test/cancel_order_sale_stock.yml index 9081cac9fa3..d970e0c9cad 100644 --- a/addons/sale_stock/test/cancel_order_sale_stock.yml +++ b/addons/sale_stock/test/cancel_order_sale_stock.yml @@ -8,7 +8,7 @@ - !python {model: stock.picking}: | delivery_orders = self.search(cr, uid, [('sale_id','=',ref("sale.sale_order_8"))]) - first_picking = self.browse(cr, uid, delivery_orders[0], context=context) + first_picking = self.browse(cr, uid, delivery_orders[-1], context=context) if first_picking.force_assign(cr, uid, first_picking): first_move = first_picking.move_lines[0] values = {'move%s'%(first_move.id): {'product_qty': 2, 'product_uom':ref('product.product_uom_unit')}} @@ -18,7 +18,7 @@ - !python {model: stock.picking}: | delivery_orders = self.search(cr, uid, [('sale_id','=',ref("sale.sale_order_8"))]) - last_delivery_order_id = delivery_orders[0] + last_delivery_order_id = delivery_orders[-1] self.pool.get('stock.picking').signal_button_cancel(cr, uid, [last_delivery_order_id]) - I run the scheduler. diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index b45e3b17ea2..68c30949161 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -414,7 +414,8 @@ class share_wizard(osv.TransientModel): relation_model_id = model_obj.search(cr, UID_ROOT, [('model','=',coldef._obj)])[0] relation_model_browse = model_obj.browse(cr, UID_ROOT, relation_model_id, context=context) relation_osv = self.pool[coldef._obj] - if coltype == 'one2many': + #skip virtual one2many fields (related, ...) as there is no reverse relationship + if coltype == 'one2many' and hasattr(coldef, '_fields_id'): # don't record reverse path if it's not a real m2o (that happens, but rarely) dest_model_ci = relation_osv._all_columns reverse_rel = coldef._fields_id diff --git a/addons/stock/stock.py b/addons/stock/stock.py index db73bae3b6c..e0b93af1f4f 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -543,6 +543,7 @@ class stock_picking(osv.osv): _name = "stock.picking" _inherit = ['mail.thread'] _description = "Picking List" + _order = "id desc" def _set_maximum_date(self, cr, uid, ids, name, value, arg, context=None): """ Calculates planned date if it is greater than 'value'. diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py index 47599d5f99e..5f9f09e0074 100644 --- a/addons/stock/wizard/stock_partial_picking.py +++ b/addons/stock/wizard/stock_partial_picking.py @@ -144,7 +144,7 @@ class stock_partial_picking(osv.osv_memory): def _partial_move_for(self, cr, uid, move): partial_move = { 'product_id' : move.product_id.id, - 'quantity' : move.product_qty if move.state in ('assigned','draft','confirmed') else 0, + 'quantity' : move.product_qty if move.state == 'assigned' else 0, 'product_uom' : move.product_uom.id, 'prodlot_id' : move.prodlot_id.id, 'move_id' : move.id, |
