[FIX] account_analytic_analysis: prevent enable recurring invoices if not of type...
authorDenis Ledoux <dle@openerp.com>
Fri, 18 Apr 2014 13:29:17 +0000 (15:29 +0200)
committerDenis Ledoux <dle@openerp.com>
Fri, 18 Apr 2014 13:29:17 +0000 (15:29 +0200)
bzr revid: dle@openerp.com-20140418132917-ztvzinwn3kt786m2

addons/account_analytic_analysis/account_analytic_analysis.py
addons/account_analytic_analysis/account_analytic_analysis_cron.xml
addons/account_analytic_analysis/account_analytic_analysis_view.xml

index b73dad2..f8905d6 100644 (file)
@@ -22,6 +22,7 @@ from dateutil.relativedelta import relativedelta
 import datetime
 import logging
 import time
+import traceback
 
 from openerp.osv import osv, fields
 from openerp.osv.orm import intersect, except_orm
@@ -714,23 +715,40 @@ class account_analytic_account(osv.osv):
         inv_obj.button_compute(cr, uid, [invoice_id], context=context)
         return invoice_id
 
-    def recurring_create_invoice(self, cr, uid, automatic=False, context=None):
+    def recurring_create_invoice(self, cr, uid, ids, context=None):
+        return self._recurring_create_invoice(cr, uid, ids, context=context)
+
+    def _cron_recurring_create_invoice(self, cr, uid, context=None):
+        return self._recurring_create_invoice(cr, uid, [], automatic=True, context=context)
+
+    def _recurring_create_invoice(self, cr, uid, ids, automatic=False, context=None):
         context = context or {}
         current_date =  time.strftime('%Y-%m-%d')
-
-        contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)])
+        if ids:
+            contract_ids = ids
+        else:
+            contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)])
         for contract in self.browse(cr, uid, contract_ids, context=context):
-            invoice_id = self._prepare_invoice(cr, uid, contract, context=context)
-
-            next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d")
-            interval = contract.recurring_interval
-            if contract.recurring_rule_type == 'daily':
-                new_date = next_date+relativedelta(days=+interval)
-            elif contract.recurring_rule_type == 'weekly':
-                new_date = next_date+relativedelta(weeks=+interval)
-            else:
-                new_date = next_date+relativedelta(months=+interval)
-            self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context)
+            try:
+                invoice_id = self._prepare_invoice(cr, uid, contract, context=context)
+
+                next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d")
+                interval = contract.recurring_interval
+                if contract.recurring_rule_type == 'daily':
+                    new_date = next_date+relativedelta(days=+interval)
+                elif contract.recurring_rule_type == 'weekly':
+                    new_date = next_date+relativedelta(weeks=+interval)
+                else:
+                    new_date = next_date+relativedelta(months=+interval)
+                self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context)
+                if automatic:
+                    cr.commit()
+            except Exception:
+                if automatic:
+                    cr.rollback()
+                    _logger.error(traceback.format_exc())
+                else:
+                    raise
         return True
 
 class account_analytic_account_summary_user(osv.osv):
index 492278a..0637c2a 100644 (file)
@@ -93,7 +93,7 @@ OpenERP Automatic Email
            <field name="interval_type">days</field>
            <field name="numbercall">-1</field>
            <field name="model" eval="'account.analytic.account'"/>
-           <field name="function" eval="'recurring_create_invoice'"/>
+           <field name="function" eval="'_cron_recurring_create_invoice'"/>
            <field name="args" eval="'()'"/>
         </record>
 
index f5b89db..a6fe828 100644 (file)
                     </group>
                     <separator string="Recurring Invoices" attrs="{'invisible': [('recurring_invoices','!=',True)]}"/>
                     <div>
-                        <field name="recurring_invoices" on_change="onchange_recurring_invoices(recurring_invoices, date_start)" class="oe_inline"/>
-                        <label for="recurring_invoices" />
+                        <div attrs="{'invisible': [('type','!=', 'contract'), ('recurring_invoices', '=', False)]}">
+                            <field name="recurring_invoices" on_change="onchange_recurring_invoices(recurring_invoices, date_start)" class="oe_inline" />
+                            <label for="recurring_invoices" />
+                        </div>
                         <button class="oe_link" name="recurring_create_invoice" attrs="{'invisible': [('recurring_invoices','!=',True)]}" string="⇒ create invoices" type="object" groups="base.group_no_one"/>
                     </div>
                     <group attrs="{'invisible': [('recurring_invoices','!=',True)]}">