diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index b73dad2d385..f8905d6e546 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -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) + 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) + 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): diff --git a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml index 492278a87b5..0637c2ad276 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml @@ -93,7 +93,7 @@ OpenERP Automatic Email days -1 - + diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index f5b89db7089..a6fe828926a 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -148,8 +148,10 @@
- -