diff --git a/addons/crm/__init__.py b/addons/crm/__init__.py index 2d340e7bfc5..de0fac56e29 100644 --- a/addons/crm/__init__.py +++ b/addons/crm/__init__.py @@ -30,7 +30,7 @@ import crm_opportunity import crm_phonecall import crm_installer -#import report +import report import wizard diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py index 2b4f827b6df..e2ea825c63c 100644 --- a/addons/crm/__openerp__.py +++ b/addons/crm/__openerp__.py @@ -93,10 +93,8 @@ between mails and Open ERP.""", 'security/crm_security.xml', # 'security/ir.model.access.csv', -## 'report/crm_report_view.xml', -# 'report/crm_lead_report_view.xml', -## 'report/crm_opportunity_report_view.xml' , -# 'report/crm_phonecall_report_view.xml', + 'report/crm_lead_report_view.xml', + 'report/crm_phonecall_report_view.xml', 'process/crm_configuration_process.xml', 'crm_installer_view.xml' diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml index e6da8228ea6..85347103f5d 100644 --- a/addons/crm/crm_view.xml +++ b/addons/crm/crm_view.xml @@ -4,7 +4,10 @@ - + + + crm.case.section.form @@ -430,6 +433,7 @@ + crm.case.select mailgate.thread diff --git a/addons/crm/report/__init__.py b/addons/crm/report/__init__.py index 11f9ae5b3ad..0ce743bc859 100644 --- a/addons/crm/report/__init__.py +++ b/addons/crm/report/__init__.py @@ -19,11 +19,8 @@ # ############################################################################## -#import report_businessopp -#import crm_report import crm_lead_report import crm_phonecall_report -#import crm_opportunity_report # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py index 0d09185dec8..2c0fa8c8fc6 100644 --- a/addons/crm/report/crm_lead_report.py +++ b/addons/crm/report/crm_lead_report.py @@ -34,10 +34,62 @@ class crm_lead_report(osv.osv): """ CRM Lead Report """ _name = "crm.lead.report" _auto = False -# _inherit = "crm.case.report" _description = "CRM Lead Report" + + def _get_data(self, cr, uid, ids, field_name, arg, context={}): + + """ @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of case and section Data’s IDs + @param context: A standard dictionary for contextual values """ + + res = {} + state_perc = 0.0 + avg_ans = 0.0 + + for case in self.browse(cr, uid, ids, context): + if field_name != 'avg_answers': + state = field_name[5:] + cr.execute("select count(*) from crm_opportunity where \ + section_id =%s and state='%s'"%(case.section_id.id, state)) + state_cases = cr.fetchone()[0] + perc_state = (state_cases / float(case.nbr)) * 100 + + res[case.id] = perc_state + else: + model_name = self._name.split('report.') + if len(model_name) < 2: + res[case.id] = 0.0 + else: + model_name = model_name[1] + + cr.execute("select count(*) from crm_case_log l, ir_model m \ + where l.model_id=m.id and m.model = '%s'" , model_name) + logs = cr.fetchone()[0] + + avg_ans = logs / case.nbr + res[case.id] = avg_ans + + return res _columns = { + 'name': fields.char('Year', size=64, required=False, readonly=True), + 'user_id':fields.many2one('res.users', 'User', readonly=True), + 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), + 'nbr': fields.integer('# of Cases', readonly=True), + 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), + 'avg_answers': fields.function(_get_data, string='Avg. Answers', method=True, type="integer"), + 'perc_done': fields.function(_get_data, string='%Done', method=True, type="float"), + 'perc_cancel': fields.function(_get_data, string='%Cancel', method=True, type="float"), + 'month':fields.selection([('01', 'January'), ('02', 'February'), \ + ('03', 'March'), ('04', 'April'),\ + ('05', 'May'), ('06', 'June'), \ + ('07', 'July'), ('08', 'August'),\ + ('09', 'September'), ('10', 'October'),\ + ('11', 'November'), ('12', 'December')], 'Month', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'create_date': fields.datetime('Create Date', readonly=True), + 'day': fields.char('Day', size=128, readonly=True), 'delay_close': fields.float('Delay to close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), 'categ_id': fields.many2one('crm.case.categ', 'Category',\ domain="[('section_id','=',section_id),\ @@ -46,7 +98,12 @@ class crm_lead_report(osv.osv): domain="[('section_id','=',section_id),\ ('object_id.model', '=', 'crm.lead')]", readonly=True), 'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True), - 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'type':fields.selection([ + ('lead','Lead'), + ('opportunity','Opportunity'), + + ],'Type', help="Type is used to separate Leads and Opportunities"), } def init(self, cr): @@ -66,6 +123,7 @@ class crm_lead_report(osv.osv): c.state as state, c.user_id, c.stage_id, + c.type as type, c.company_id, c.section_id, c.categ_id, @@ -79,7 +137,7 @@ class crm_lead_report(osv.osv): from crm_lead c group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),\ - c.state, c.user_id,c.section_id,c.stage_id,categ_id,c.partner_id,c.company_id + c.state, c.user_id,c.section_id,c.stage_id,categ_id,c.partner_id,c.company_id, c.type ,c.create_date,to_char(c.create_date, 'YYYY-MM-DD') )""") diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml index d6502c190d9..0c6e935050c 100644 --- a/addons/crm/report/crm_lead_report_view.xml +++ b/addons/crm/report/crm_lead_report_view.xml @@ -17,11 +17,12 @@ - + + @@ -31,13 +32,18 @@ crm.lead.report.form crm.lead.report - form - +
+ + + + + - + +
@@ -57,28 +63,135 @@
- - + + crm.lead.report.select crm.lead.report - search - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + crm.lead.report.tree + crm.lead.report + tree + + + + + + + + + + + + + + + + @@ -90,8 +203,8 @@ form {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} tree,graph + [('type', '=', 'lead')] - @@ -107,10 +220,38 @@ + + + Opportunities + crm.lead.report + form + {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} + tree,graph + [('type', '=', 'opportunity')] + + + + + tree + + + + + + + graph + + + + + + diff --git a/addons/crm/report/crm_opportunity_report.py b/addons/crm/report/crm_opportunity_report.py deleted file mode 100644 index a3af4be8b7c..00000000000 --- a/addons/crm/report/crm_opportunity_report.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import fields,osv -import tools - -AVAILABLE_STATES = [ - ('draft','Draft'), - ('open','Open'), - ('cancel', 'Cancelled'), - ('done', 'Closed'), - ('pending','Pending') -] - -class crm_opportunity_report(osv.osv): - """ CRM Opportunity Report """ - _name = "crm.opportunity.report" - _auto = False - _inherit = "crm.case.report" - _description = "CRM Opportunity Report" - _columns = { - 'probability': fields.float('Avg. Probability', readonly=True,group_operator='avg'), - 'amount_revenue': fields.float('Est.Revenue', readonly=True), - 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True), - 'delay_close': fields.float('Delay to close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), - 'categ_id': fields.many2one('crm.case.categ', 'Category',\ - domain="[('section_id','=',section_id),\ - ('object_id.model', '=', 'crm.opportunity')]", readonly=True), - 'stage_id':fields.many2one('crm.case.stage', 'Stage',\ - domain="[('section_id','=',section_id),\ - ('object_id.model', '=', 'crm.opportunity')]", readonly=True), - 'partner_id': fields.many2one('res.partner', 'Partner', readonly=True), - 'company_id': fields.many2one('res.company', 'Company', readonly=True), - 'user_id':fields.many2one('res.users', 'User', readonly=True), - } - - def init(self, cr): - """ Display Est.Revenue , Average Probability ,Est.Revenue Probability - @param cr: the current row, from the database cursor - """ - - tools.drop_view_if_exists(cr, 'crm_opportunity_report') - cr.execute(""" - create or replace view crm_opportunity_report as ( - select - min(c.id) as id, - to_char(c.create_date, 'YYYY') as name, - to_char(c.create_date, 'MM') as month, - to_char(c.create_date, 'YYYY-MM-DD') as day, - c.state as state, - c.user_id, - c.section_id, - c.categ_id, - c.stage_id, - c.partner_id, - c.company_id, - count(*) as nbr, - 0 as avg_answers, - 0.0 as perc_done, - 0.0 as perc_cancel, - date_trunc('day',c.create_date) as create_date, - sum(planned_revenue) as amount_revenue, - sum((planned_revenue*probability)/100.0)::decimal(16,2) as amount_revenue_prob, - avg(probability)::decimal(16,2) as probability, - avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close - from - crm_opportunity c - group by - to_char(c.create_date, 'YYYY'), - to_char(c.create_date, 'MM'), - to_char(c.create_date, 'YYYY-MM-DD'), - c.state, - c.user_id, - c.section_id, - c.stage_id, - c.categ_id, - c.partner_id, - company_id, - create_date - )""") - -crm_opportunity_report() diff --git a/addons/crm/report/crm_opportunity_report_view.xml b/addons/crm/report/crm_opportunity_report_view.xml deleted file mode 100644 index 29a66b838f0..00000000000 --- a/addons/crm/report/crm_opportunity_report_view.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - crm.opportunity.report.tree - crm.opportunity.report - tree - - - - - - - - - - - - - - - - - - - - - - - - - crm.opportunity.report.form - crm.opportunity.report - - form - - - - - - - - - - - - - - - crm.opportunity.report.graph - crm.opportunity.report - graph - - - - - - - - - - - - - crm.opportunity.report.select - crm.opportunity.report - - search - - - - - - - - - - - - - - - - - - - - - - Opportunities - crm.opportunity.report - form - tree,graph - {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} - - - - - tree - - - - - - graph - - - - - - - - diff --git a/addons/crm/report/crm_phonecall_report.py b/addons/crm/report/crm_phonecall_report.py index ad9591188e8..c1954f8607f 100644 --- a/addons/crm/report/crm_phonecall_report.py +++ b/addons/crm/report/crm_phonecall_report.py @@ -22,15 +22,76 @@ from osv import fields,osv import tools +AVAILABLE_STATES = [ + ('draft','Draft'), + ('open','Open'), + ('cancel', 'Cancelled'), + ('done', 'Closed'), + ('pending','Pending') +] + + class crm_phonecall_report(osv.osv): """ Phone calls by user and section """ _name = "crm.phonecall.report" _description = "Phone calls by user and section" _auto = False -# _inherit = "crm.case.report" + + def _get_data(self, cr, uid, ids, field_name, arg, context={}): + + """ @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of case and section Data’s IDs + @param context: A standard dictionary for contextual values """ + + res = {} + state_perc = 0.0 + avg_ans = 0.0 + + for case in self.browse(cr, uid, ids, context): + if field_name != 'avg_answers': + state = field_name[5:] + cr.execute("select count(*) from crm_opportunity where \ + section_id =%s and state='%s'"%(case.section_id.id, state)) + state_cases = cr.fetchone()[0] + perc_state = (state_cases / float(case.nbr)) * 100 + + res[case.id] = perc_state + else: + model_name = self._name.split('report.') + if len(model_name) < 2: + res[case.id] = 0.0 + else: + model_name = model_name[1] + + cr.execute("select count(*) from crm_case_log l, ir_model m \ + where l.model_id=m.id and m.model = '%s'" , model_name) + logs = cr.fetchone()[0] + + avg_ans = logs / case.nbr + res[case.id] = avg_ans + + return res _columns = { + 'name': fields.char('Year', size=64, required=False, readonly=True), + 'user_id':fields.many2one('res.users', 'User', readonly=True), + 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), + 'nbr': fields.integer('# of Cases', readonly=True), + 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), + 'avg_answers': fields.function(_get_data, string='Avg. Answers', method=True, type="integer"), + 'perc_done': fields.function(_get_data, string='%Done', method=True, type="float"), + 'perc_cancel': fields.function(_get_data, string='%Cancel', method=True, type="float"), + 'month':fields.selection([('01', 'January'), ('02', 'February'), \ + ('03', 'March'), ('04', 'April'),\ + ('05', 'May'), ('06', 'June'), \ + ('07', 'July'), ('08', 'August'),\ + ('09', 'September'), ('10', 'October'),\ + ('11', 'November'), ('12', 'December')], 'Month', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True), + 'create_date': fields.datetime('Create Date', readonly=True), + 'day': fields.char('Day', size=128, readonly=True), 'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), 'categ_id': fields.many2one('crm.case.categ', 'Category', \ domain="[('section_id','=',section_id),\ diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml index 698a9b88fa3..83c76578afe 100644 --- a/addons/crm/report/crm_phonecall_report_view.xml +++ b/addons/crm/report/crm_phonecall_report_view.xml @@ -30,15 +30,20 @@ crm.phonecall.report.form crm.phonecall.report - form - - +
+ + + + + + - + +
@@ -58,21 +63,108 @@ - - + + crm.phonecall.report.select crm.phonecall.report - search - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/crm/report/crm_report_view.xml b/addons/crm/report/crm_report_view.xml index 814b056dbf1..c58367ae85d 100644 --- a/addons/crm/report/crm_report_view.xml +++ b/addons/crm/report/crm_report_view.xml @@ -56,7 +56,7 @@ - + crm.case.report.select crm.case.report search