123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- # -*- 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
|