X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Faccount_analytic_analysis%2Faccount_analytic_analysis.py;h=76aba5312ed0b886dc4e5396d6e5cb28b47756be;hb=c23de40df650df25e45a1586d6e62b450d287c14;hp=fcda8a2606cc1d690ee5a000ac038096e24ab3ca;hpb=11bf57f1bf45f308ad76c35fd0f42560298a86f4;p=odoo%2Fodoo.git diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index fcda8a2..76aba53 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -98,7 +98,7 @@ class account_analytic_account(osv.osv): WHERE account_analytic_account.id IN %s \ AND account_analytic_line.invoice_id IS NULL \ AND account_analytic_line.to_invoice IS NOT NULL \ - AND account_analytic_journal.type = 'sale' \ + AND account_analytic_journal.type IN ('purchase', 'general') \ GROUP BY account_analytic_account.id;""", (parent_ids,)) for account_id, sum in cr.fetchall(): if account_id not in res: @@ -224,45 +224,7 @@ class account_analytic_account(osv.osv): res[account_id] = round(sum,2) res_final = res return res_final - - def _expense_invoiced_calc(self, cr, uid, ids, name, arg, context=None): - res = {} - res_final = {} - child_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. - for i in child_ids: - res[i] = 0.0 - if not child_ids: - return res - - if child_ids: - cr.execute("select hel.analytic_account,SUM(hel.unit_amount*hel.unit_quantity) from hr_expense_line as hel\ - LEFT JOIN hr_expense_expense as he ON he.id = hel.expense_id\ - where he.state = 'paid' and hel.analytic_account IN %s \ - GROUP BY hel.analytic_account",(child_ids,)) - for account_id, sum in cr.fetchall(): - res[account_id] = sum - res_final = res - return res_final - - def _expense_to_invoice_calc(self, cr, uid, ids, name, arg, context=None): - res = {} - res_final = {} - child_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. - for i in child_ids: - res[i] = 0.0 - if not child_ids: - return res - if child_ids: - cr.execute("select hel.analytic_account, SUM(hel.unit_amount*hel.unit_quantity) from hr_expense_line as hel\ - LEFT JOIN hr_expense_expense as he ON he.id = hel.expense_id\ - where he.state = 'invoiced' and hel.analytic_account IN %s \ - GROUP BY hel.analytic_account",(child_ids,)) - for account_id, sum in cr.fetchall(): - res[account_id] = sum - res_final = res - return res_final - def _total_cost_calc(self, cr, uid, ids, name, arg, context=None): res = {} res_final = {} @@ -339,17 +301,6 @@ class account_analytic_account(osv.osv): for id in ids: res[id] = round(res.get(id, 0.0),2) return res - - def _remaining_expnse_calc(self, cr, uid, ids, name, arg, context=None): - res = {} - for account in self.browse(cr, uid, ids, context=context): - if account.expense_max != 0: - res[account.id] = account.expense_max - account.expense_invoiced - else: - res[account.id]=0.0 - for id in ids: - res[id] = round(res.get(id, 0.0),2) - return res def _real_margin_calc(self, cr, uid, ids, name, arg, context=None): res = {} @@ -382,6 +333,47 @@ class account_analytic_account(osv.osv): result.add(line.account_id.id) return list(result) + def _get_total_estimation(self, account): + tot_est = 0.0 + if account.fix_price_invoices: + total_est += account.amount_max + if account.invoice_on_timesheets: + tot_est += account.hours_qtt_est + return tot_est + + def _get_total_invoiced(self, account): + total_invoiced = 0.0 + if account.fix_price_invoices: + total_invoiced += account.ca_invoiced + if account.invoice_on_timesheets: + total_invoiced += account.hours_qtt_invoiced + return total_invoiced + + def _get_total_remaining(self, account): + total_remaining = 0.0 + if account.fix_price_invoices: + total_remaining += account.remaining_ca + if account.invoice_on_timesheets: + total_remaining += account.remaining_hours + return total_remaining + + def _get_total_toinvoice(self, account): + total_toinvoice = 0.0 + if account.fix_price_invoices: + total_toinvoice += account.ca_to_invoice + if account.invoice_on_timesheets: + total_toinvoice += account.hours_qtt_non_invoiced + return total_toinvoice + + def _sum_of_fields(self, cr, uid, ids, name, arg, context=None): + res = dict([(i, {}) for i in ids]) + for account in self.browse(cr, uid, ids, context=context): + res[account.id]['est_total'] = self._get_total_estimation(account) + res[account.id]['invoiced_total'] = self._get_total_invoiced(account) + res[account.id]['remaining_total'] = self._get_total_remaining(account) + res[account.id]['toinvoice_total'] = self._get_total_toinvoice(account) + return res + _columns = { 'is_overdue_quantity' : fields.function(_is_overdue_quantity, method=True, type='boolean', string='Overdue Quantity', store={ @@ -430,17 +422,16 @@ class account_analytic_account(osv.osv): digits_compute=dp.get_precision('Account')), 'fix_price_invoices' : fields.boolean('Fix Price Invoices'), 'invoice_on_timesheets' : fields.boolean("Invoice On Timesheets"), - 'charge_expenses' : fields.boolean('Charge Expenses'), 'month_ids': fields.function(_analysis_all, multi='analytic_analysis', type='many2many', relation='account_analytic_analysis.summary.month', string='Month'), 'user_ids': fields.function(_analysis_all, multi='analytic_analysis', type="many2many", relation='account_analytic_analysis.summary.user', string='User'), - 'template_id':fields.many2one('account.analytic.account', 'Template Of Contract'), - 'expense_invoiced' : fields.function(_expense_invoiced_calc, type="float"), - 'expense_to_invoice' : fields.function(_expense_to_invoice_calc, type='float'), - 'remaining_expense' : fields.function(_remaining_expnse_calc, type="float"), - #'fix_exp_max' : fields.float('Max. amt'), - #'timesheet_max': fields.float('max_timesheet'), - 'expense_max': fields.float('expenses'), + 'template_id':fields.many2one('account.analytic.account', 'Template of Contract'), + 'hours_qtt_est': fields.float('Estimation of Hours to Invoice'), + 'est_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all"), + 'invoiced_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all"), + 'remaining_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all"), + 'toinvoice_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all"), } + def on_change_template(self, cr, uid, id, template_id): if not template_id: return {} @@ -450,8 +441,13 @@ class account_analytic_account(osv.osv): res['value']['date_start'] = str(template.date_start) if template.date: res['value']['date'] = str(template.date) + res['value']['fix_price_invoices'] = template.fix_price_invoices + res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets + res['value']['charge_expenses'] = template.charge_expenses res['value']['quantity_max'] = template.quantity_max res['value']['remaining_hours'] = template.remaining_hours + res['value']['amount_max'] = template.amount_max + res['value']['expense_max'] = template.expense_max res['value']['to_invoice'] = template.to_invoice.id res['value']['pricelist_id'] = template.pricelist_id.id res['value']['description'] = template.description