from openerp.addons.decimal_precision import decimal_precision as dp
+ _logger = logging.getLogger(__name__)
+
+class account_virtual_invoice(osv.osv):
+ _name = "account.virtual.invoice"
+ _auto = False
+
+ def _amount_line(self, cr, uid, ids, prop, unknow_none, unknow_dict):
+ res = {}
+ tax_obj = self.pool.get('account.tax')
+ cur_obj = self.pool.get('res.currency')
+ for line in self.browse(cr, uid, ids):
+ price = line.unit_price
+ taxes = tax_obj.compute_all(cr, uid, line.tax_ids, price, line.qty, product=line.product_id, partner=line.analytic_account_id.partner_id)
+ res[line.id] = taxes['total']
+ if line.analytic_account_id:
+ cur = line.analytic_account_id.currency_id
+ res[line.id] = cur_obj.round(cr, uid, cur, res[line.id])
+ return res
+
+ def _get_tax_lines(self, cr, uid, ids,name, arg, context=None):
+ res = {}
+ product_ids = []
+ product_obj = self.pool.get('product.product')
+ account_obj = self.pool.get('account.account')
+ for line in self.browse(cr, uid, ids, context=context):
+ res[line.id] = []
+ if not line.product_id:
+ continue
+ product = product_obj.browse(cr, uid, line.product_id.id, context=context)
+ a = product.property_account_income.id
+ if not a:
+ a = product.categ_id.property_account_income_categ.id
+ taxes = product.taxes_id and product.taxes_id or (a and account_obj.browse(cr, uid, a, context=context).tax_ids or False)
+ res[line.id] = [x.id for x in taxes]
+ return res
+
+ _columns = {
+ 'product_id': fields.many2one('product.product','Product'),
+ 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
+ 'name': fields.char('Description', size=64, readonly=True),
+ 'qty': fields.float('Quantity', readonly=True),
+ 'uom': fields.many2one('product.uom', 'Unit of Measure', required=True),
+ 'unit_price': fields.float('Unit Price', readonly=True),
+ 'sub_total': fields.function(_amount_line, string='Amount', type="float",
+ digits_compute= dp.get_precision('Account')),
+ 'tax_ids':fields.function(_get_tax_lines, type='many2many', relation='account.tax', string='Taxes'),
+ }
+
+ _order = 'name desc'
+
+ def init(self, cr):
+ tools.drop_view_if_exists(cr, 'account_virtual_invoice')
+ cr.execute("""
+ create or replace view account_virtual_invoice as (
+
+ SELECT
+ l.id as id,
+ account.id as analytic_account_id,
+ l.product_id as product_id,
+ l.name as name,
+ l.unit_amount as qty,
+ l.product_uom_id as uom,
+ t.list_price as unit_price
+ FROM
+ account_analytic_line as l
+ LEFT JOIN account_analytic_account account ON (l.account_id = account.id)
+ LEFT JOIN account_analytic_journal journal ON (l.journal_id = journal.id)
+ left join product_product p on (l.product_id=p.id)
+ left join product_template t on (p.product_tmpl_id=t.id)
+ WHERE (l.to_invoice IS NOT NULL) and (l.invoice_id IS NULL)
+UNION
+ SELECT
+ sol.id as id,
+ account.id as analytic_account_id,
+ sol.product_id as product_id,
+ sol.name as name,
+ sol.product_uom_qty as qty,
+ sol.product_uom as uom,
+ sol.price_unit as unit_price
+ FROM
+ sale_order as so
+ LEFT JOIN account_analytic_account account ON (so.project_id = account.id)
+ LEFT JOIN sale_order_line sol on (so.id = sol.order_id)
+ WHERE so.partner_id = account.partner_id
+UNION
+
+ SELECT
+ exp.id as id,
+ account.id as analytic_account_id,
+ exp.product_id as product_id,
+ exp.name as name,
+ exp.unit_quantity as qty,
+ exp.uom_id as uom,
+ exp.unit_amount as unit_price
+ FROM
+ hr_expense_line as exp
+ LEFT JOIN account_analytic_account account ON (exp.analytic_account = account.id)
+
+ )
+ """)
+account_virtual_invoice()
+
class account_analytic_account(osv.osv):
_name = "account.analytic.account"
_inherit = "account.analytic.account"
res['value']['pricelist_id'] = template.pricelist_id.id
return res
+ def onchange_recurring_invoices(self, cr, uid, ids, recurring_invoices, date_start=False, context=None):
+ result = {}
+ if not ids:
+ result = {'value': {
+ 'next_date': lambda *a: time.strftime('%Y-%m-%d'),
+ 'rrule_type':'monthly'
+ }
+ }
+ if date_start and recurring_invoices == True:
+ result = {'value': {
+ 'next_date': date_start,
+ 'rrule_type':'monthly'
+ }
+ }
+ return result
+
- account_analytic_account()
+ def cron_account_analytic_account(self, cr, uid, context=None):
+ if context is None:
+ context = {}
+ remind = {}
+
+ def fill_remind(key, domain, write_pending=False):
+ base_domain = [
+ ('type', '=', 'contract'),
+ ('partner_id', '!=', False),
+ ('manager_id', '!=', False),
+ ('manager_id.email', '!=', False),
+ ]
+ base_domain.extend(domain)
+
+ accounts_ids = self.search(cr, uid, base_domain, context=context, order='name asc')
+ accounts = self.browse(cr, uid, accounts_ids, context=context)
+ for account in accounts:
+ if write_pending:
+ account.write({'state' : 'pending'}, context=context)
+ remind_user = remind.setdefault(account.manager_id.id, {})
+ remind_type = remind_user.setdefault(key, {})
+ remind_partner = remind_type.setdefault(account.partner_id, []).append(account)
+
+ # Already expired
+ fill_remind("old", [('state', 'in', ['pending'])])
+
+ # Expires now
+ fill_remind("new", [('state', 'in', ['draft', 'open']), '|', '&', ('date', '!=', False), ('date', '<=', time.strftime('%Y-%m-%d')), ('is_overdue_quantity', '=', True)], True)
+
+ # Expires in less than 30 days
+ fill_remind("future", [('state', 'in', ['draft', 'open']), ('date', '!=', False), ('date', '<', (datetime.datetime.now() + datetime.timedelta(30)).strftime("%Y-%m-%d"))])
+
+ context['base_url'] = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
+ context['action_id'] = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_analytic_analysis', 'action_account_analytic_overdue_all')[1]
+ template_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_analytic_analysis', 'account_analytic_cron_email_template')[1]
+ for user_id, data in remind.items():
+ context["data"] = data
+ _logger.debug("Sending reminder to uid %s", user_id)
+ self.pool.get('email.template').send_mail(cr, uid, template_id, user_id, context=context)
+
+ return True
+
++ def cron_create_invoice(self, cr, uid, context=None):
++ res = []
++ inv_obj = self.pool.get('account.invoice')
++ journal_obj = self.pool.get('account.journal')
++ inv_lines = []
++ contract_ids = self.search(cr, uid, [('next_date','<=',time.strftime("%Y-%m-%d")), ('state','=', 'open'), ('recurring_invoices','=', True)], context=context, order='name asc')
++ a = self.pool.get('hr.timesheet.invoice.create.final').do_create(cr, uid, contract_ids, context=None)
++ contracts = self.browse(cr, uid, contract_ids, context=context)
++ for contract in contracts:
++ next_date = datetime.datetime.strptime(contract.next_date, "%Y-%m-%d")
++ interval = contract.interval
++
++ if contract.rrule_type == 'monthly':
++ new_date = next_date+relativedelta(months=+interval)
++ if contract.rrule_type == 'daily':
++ new_date = next_date+relativedelta(days=+interval)
++ if contract.rrule_type == 'weekly':
++ new_date = next_date+relativedelta(weeks=+interval)
++
++ # Link this new invoice to related contract
++ contract.write({'next_date':new_date}, context=context)
++ return True
+
class account_analytic_account_summary_user(osv.osv):
_name = "account_analytic_analysis.summary.user"
_description = "Hours Summary by User"