import datetime
import logging
import time
+import traceback
from openerp.osv import osv, fields
from openerp.osv.orm import intersect, except_orm
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):
</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)]}">