[FIX] account_analytic_analysis: prevent enable recurring invoices if not of type contract. Avoid cron to not continue if one of the contract failed to create its recurring invoices

bzr revid: dle@openerp.com-20140418132917-ztvzinwn3kt786m2
This commit is contained in:
Denis Ledoux 2014-04-18 15:29:17 +02:00
parent cb4d2d16b5
commit 6e04c0c5eb
3 changed files with 36 additions and 16 deletions

View File

@ -22,6 +22,7 @@ from dateutil.relativedelta import relativedelta
import datetime import datetime
import logging import logging
import time import time
import traceback
from openerp.osv import osv, fields from openerp.osv import osv, fields
from openerp.osv.orm import intersect, except_orm 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) inv_obj.button_compute(cr, uid, [invoice_id], context=context)
return invoice_id 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 {} context = context or {}
current_date = time.strftime('%Y-%m-%d') current_date = time.strftime('%Y-%m-%d')
if ids:
contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)]) 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): for contract in self.browse(cr, uid, contract_ids, context=context):
invoice_id = self._prepare_invoice(cr, uid, contract, 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") next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d")
interval = contract.recurring_interval interval = contract.recurring_interval
if contract.recurring_rule_type == 'daily': if contract.recurring_rule_type == 'daily':
new_date = next_date+relativedelta(days=+interval) new_date = next_date+relativedelta(days=+interval)
elif contract.recurring_rule_type == 'weekly': elif contract.recurring_rule_type == 'weekly':
new_date = next_date+relativedelta(weeks=+interval) new_date = next_date+relativedelta(weeks=+interval)
else: else:
new_date = next_date+relativedelta(months=+interval) new_date = next_date+relativedelta(months=+interval)
self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) 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 return True
class account_analytic_account_summary_user(osv.osv): class account_analytic_account_summary_user(osv.osv):

View File

@ -93,7 +93,7 @@ OpenERP Automatic Email
<field name="interval_type">days</field> <field name="interval_type">days</field>
<field name="numbercall">-1</field> <field name="numbercall">-1</field>
<field name="model" eval="'account.analytic.account'"/> <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="'()'"/> <field name="args" eval="'()'"/>
</record> </record>

View File

@ -148,8 +148,10 @@
</group> </group>
<separator string="Recurring Invoices" attrs="{'invisible': [('recurring_invoices','!=',True)]}"/> <separator string="Recurring Invoices" attrs="{'invisible': [('recurring_invoices','!=',True)]}"/>
<div> <div>
<field name="recurring_invoices" on_change="onchange_recurring_invoices(recurring_invoices, date_start)" class="oe_inline"/> <div attrs="{'invisible': [('type','!=', 'contract'), ('recurring_invoices', '=', False)]}">
<label for="recurring_invoices" /> <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"/> <button class="oe_link" name="recurring_create_invoice" attrs="{'invisible': [('recurring_invoices','!=',True)]}" string="⇒ create invoices" type="object" groups="base.group_no_one"/>
</div> </div>
<group attrs="{'invisible': [('recurring_invoices','!=',True)]}"> <group attrs="{'invisible': [('recurring_invoices','!=',True)]}">