# -*- coding: utf-8 -*- from openerp import models, fields, api from dateutil.relativedelta import relativedelta import datetime import time class AccountAnalyticAccountDate(models.Model): _inherit = 'account.analytic.account' date_invoice = fields.Date('Fecha de la factura') @api.model def _prepare_invoice_data(self, contract): date_vals = super(AccountAnalyticAccountDate, self).\ _prepare_invoice_data( contract) if contract.date_invoice: date_vals['date_invoice'] = contract.date_invoice return date_vals def _recurring_create_invoice(self, cr, uid, ids, automatic=False, context=None): context = context or {} invoice_ids = [] current_date = time.strftime('%Y-%m-%d') if ids: contract_ids = ids else: contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True), ('type', '=', 'contract')]) if contract_ids: cr.execute('SELECT company_id, array_agg(id) as ids FROM account_analytic_account WHERE id IN %s GROUP BY company_id', (tuple(contract_ids),)) for company_id, ids in cr.fetchall(): context_contract = dict(context, company_id=company_id, force_company=company_id) for contract in self.browse(cr, uid, ids, context=context_contract): try: invoice_values = self._prepare_invoice(cr, uid, contract, context=context_contract) invoice_ids.append(self.pool['account.invoice'].create(cr, uid, invoice_values, context=context)) next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d") next_invoice_date = datetime.datetime.strptime(contract.date_invoice 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) elif contract.recurring_rule_type == 'monthly': new_date = next_date+relativedelta(months=+interval) else: new_date = next_date+relativedelta(years=+interval) #calcula new invoice date if contract.recurring_rule_type == 'daily': new_invoice_date = next_invoice_date+relativedelta(days=+interval) elif contract.recurring_rule_type == 'weekly': new_invoice_date = next_invoice_date+relativedelta(weeks=+interval) elif contract.recurring_rule_type == 'monthly': new_invoice_date = next_invoice_date+relativedelta(months=+interval) else: new_invoice_date = next_invoice_date+relativedelta(years=+interval) #recurring_next_date self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) #date invoice self.write(cr, uid, [contract.id], {'date_invoice': new_invoice_date.strftime('%Y-%m-%d')}, context=context) if automatic: cr.commit() except Exception: if automatic: cr.rollback() _logger.exception('Fail to create recurring invoice for contract %s', contract.code) else: raise return invoice_ids