From: Harry (Open ERP) Date: Fri, 5 Mar 2010 11:54:27 +0000 (+0530) Subject: [MERGE] merge from lp:~openerp-commiter/openobject-addons/crm-improvement/ X-Git-Tag: 6.0.0-rc1-addons~1203^2~6 X-Git-Url: http://git.inspyration.org/?a=commitdiff_plain;h=39d1e6b57af0f9ee2227588cd1c0960338d31c28;p=odoo%2Fodoo.git [MERGE] merge from lp:~openerp-commiter/openobject-addons/crm-improvement/ bzr revid: hmo@tinyerp.com-20100305115427-ret1u3hnl13am4lu --- 39d1e6b57af0f9ee2227588cd1c0960338d31c28 diff --cc addons/crm/__init__.py index ec083dd,cb88f55..b3142be --- a/addons/crm/__init__.py +++ b/addons/crm/__init__.py @@@ -31,8 -31,8 +31,8 @@@ import crm_clai import crm_fundraising import crm_helpdesk -import crm_report -#import report + - #import report ++import report import wizard diff --cc addons/crm/__terp__.py index 8302d67,691a668..f359d8e --- a/addons/crm/__terp__.py +++ b/addons/crm/__terp__.py @@@ -26,7 -26,7 +26,7 @@@ 'category': 'Generic Modules/CRM & SRM', 'description': """The generic Open ERP Customer Relationship Management system enables a group of people to intelligently and efficiently manage --leads, opportunities, tasks, issues, requests, bugs, campaign, claims, etc. ++leads, opportunities, claims, meeting, phonecall etc. It manages key tasks such as communication, identification, prioritization, assignment, resolution and notification. @@@ -81,14 -81,22 +81,21 @@@ between mails and Open ERP.""" 'crm_claims_view.xml', 'crm_claims_menu.xml', --# 'crm_report_view.xml', 'crm_helpdesk_view.xml', 'crm_helpdesk_menu.xml', -- #'crm_report.xml', ++ 'security/crm_security.xml', 'security/ir.model.access.csv', - 'process/crm_configuration_process.xml' - 'crm_report/crm_report_view.xml', - 'crm_report/crm_report_claim_view.xml', - 'crm_report/crm_report_lead_view.xml', - 'crm_report/crm_report_fundraising_view.xml', - 'crm_report/crm_report_opportunity_view.xml' , - 'crm_report/crm_report_phonecall_view.xml', ++ 'report/crm_report_view.xml', ++ 'report/crm_report_claim_view.xml', ++ 'report/crm_report_lead_view.xml', ++ 'report/crm_report_fundraising_view.xml', ++ 'report/crm_report_opportunity_view.xml' , ++ 'report/crm_report_phonecall_view.xml', + + 'process/crm_configuration_process.xml', + ], 'demo_xml': [ 'crm_demo.xml', diff --cc addons/crm/report/__init__.py index 2c08aba,2c08aba..6b42b8d --- a/addons/crm/report/__init__.py +++ b/addons/crm/report/__init__.py @@@ -19,8 -19,8 +19,13 @@@ # ############################################################################## --import report_businessopp ++#import report_businessopp import crm_report ++import crm_report_claim ++import crm_report_lead ++import crm_report_phonecall ++import crm_report_fundraising ++import crm_report_opportunity # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report.py index e847f01,e847f01..91ad726 --- a/addons/crm/report/crm_report.py +++ b/addons/crm/report/crm_report.py @@@ -20,8 -20,8 +20,7 @@@ ############################################################################## from osv import fields,osv -- --import tools.sql ++import tools AVAILABLE_STATES = [ ('draft','Draft'), @@@ -31,170 -31,170 +30,106 @@@ ('pending','Pending') ] --class report_crm_case_section_categ2(osv.osv): -- _name = "report.crm.case.section.categ2" -- _description = "Cases by section and category2" ++class report_crm_case(osv.osv): ++ _name = "report.crm.case" ++ _description = "Cases and section" _auto = False -- _columns = { -- 'name': fields.char('Year',size=64,required=False, readonly=True), -- '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), -- 'user_id':fields.many2one('res.users', 'User', readonly=True), -- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), -- 'category2_id':fields.many2one('crm.case.category2', 'Type', readonly=True), -- 'stage_id':fields.many2one('crm.case.stage', 'Stage', readonly=True), -- 'amount_revenue': fields.float('Est.Revenue', readonly=True), -- 'nbr': fields.integer('# of Cases', readonly=True), -- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), -- 'delay_close': fields.char('Delay Close', size=20, readonly=True), -- } -- _order = 'category2_id, section_id' -- def init(self, cr): -- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_categ2") -- cr.execute(""" -- create view report_crm_case_section_categ2 as ( -- select -- min(c.id) as id, -- to_char(c.create_date,'YYYY') as name, -- to_char(c.create_date, 'MM') as month, -- c.user_id, -- c.state, -- c.category2_id, -- c.stage_id, -- c.section_id, -- count(*) as nbr, -- sum(planned_revenue) as amount_revenue, -- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close -- from -- crm_case c -- where c.category2_id is not null -- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.category2_id, c.section_id)""") -- --report_crm_case_section_categ2() ++ def _get_data(self, cr, uid, ids, field_name, arg, context={}): ++ 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 --class report_crm_case_section_stage(osv.osv): -- _name = "report.crm.case.section.stage" -- _description = "Cases by section and stage" -- _auto = False _columns = { 'name': fields.char('Year',size=64,required=False, readonly=True), -- '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), 'user_id':fields.many2one('res.users', 'User', readonly=True), -- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), -- 'categ_id':fields.many2one('crm.case.categ', 'Category', readonly=True), -- 'stage_id':fields.many2one('crm.case.stage', 'Stage', readonly=True), -- 'amount_revenue': fields.float('Est.Revenue', 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), -- 'delay_close': fields.char('Delay Close', size=20, readonly=True), -- } -- _order = 'stage_id, section_id' -- -- def init(self, cr): -- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_stage") -- cr.execute(""" -- create view report_crm_case_section_stage as ( -- select -- min(c.id) as id, -- to_char(c.create_date,'YYYY') as name, -- to_char(c.create_date, 'MM') as month, -- c.user_id, -- c.state, -- c.stage_id, -- c.section_id, -- c.categ_id, -- count(*) as nbr, -- sum(planned_revenue) as amount_revenue, -- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close -- from -- crm_case c -- where c.stage_id is not null -- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.categ_id, c.section_id)""") -- --report_crm_case_section_stage() -- --class report_crm_case_section_categ_stage(osv.osv): -- _name = "report.crm.case.section.categ.stage" -- _description = "Cases by section, Category and stage" -- _auto = False -- _columns = { -- 'name': fields.char('Year',size=64,required=False, 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), -- 'user_id':fields.many2one('res.users', 'User', readonly=True), -- 'categ_id':fields.many2one('crm.case.categ', 'Category', readonly=True), -- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), -- 'stage_id':fields.many2one('crm.case.stage', 'Stage', readonly=True), -- 'nbr': fields.integer('# of Cases', readonly=True), -- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), -- 'delay_close': fields.char('Delay Close', size=20, readonly=True), -- } -- _order = 'stage_id, section_id, categ_id' -- ++ 'company_id': fields.many2one('res.company','Company',readonly=True), ++ } ++ _order = 'name desc, user_id' def init(self, cr): -- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_categ_stage") ++ tools.drop_view_if_exists(cr, 'report_crm_case') cr.execute(""" -- create view report_crm_case_section_categ_stage as ( ++ create or replace view report_crm_case as ( select min(c.id) as id, -- to_char(c.create_date,'YYYY') as name, ++ to_char(c.create_date, 'YYYY') as name, to_char(c.create_date, 'MM') as month, -- c.user_id, -- c.categ_id, c.state, -- c.stage_id, ++ c.user_id, c.section_id, -- count(*) as nbr, -- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close ++ c.company_id, ++ count(*) as nbr from crm_case c -- where c.categ_id is not null AND c.stage_id is not null -- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.state, c.stage_id, c.section_id)""") ++ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id,c.company_id ++ )""") ++report_crm_case() --report_crm_case_section_categ_stage() -- --class report_crm_case_section_categ_categ2(osv.osv): -- _name = "report.crm.case.section.categ.categ2" -- _description = "Cases by section, Category and Category2" ++class report_crm_case_service_dashboard(osv.osv): ++ _name = "report.crm.case.service.dashboard" ++ _description = "Report of Closed and Open CRM Cases within past 15 days" _auto = False -- _columns = { -- 'name': fields.char('Year',size=64,required=False, readonly=True), -- '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), -- 'user_id':fields.many2one('res.users', 'User', readonly=True), -- 'categ_id':fields.many2one('crm.case.categ', 'Category', readonly=True), -- 'category2_id':fields.many2one('crm.case.category2', 'Type', readonly=True), -- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), -- 'stage_id':fields.many2one('crm.case.stage', 'Stage', readonly=True), -- 'nbr': fields.integer('# of Cases', readonly=True), -- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), -- 'delay_close': fields.char('Delay Close', size=20, readonly=True), -- } -- _order = 'section_id, categ_id, category2_id' -- ++ _columns = { ++ 'date_deadline': fields.datetime('Deadline', readonly=True), ++ 'name': fields.char('Description', size=64, readonly=True), ++ 'user_id': fields.many2one('res.users', 'Responsible', readonly=True), ++ 'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True), ++ 'create_date' : fields.datetime('Create Date', readonly=True) ++ } ++ _order = 'create_date' ++ def init(self, cr): -- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_categ_categ2") -- cr.execute(""" -- create view report_crm_case_section_categ_categ2 as ( -- select -- min(c.id) as id, -- to_char(c.create_date, 'YYYY') as name, -- to_char(c.create_date, 'MM') as month, -- c.user_id, -- c.categ_id, -- c.category2_id, -- c.state, -- c.stage_id, -- c.section_id, -- count(*) as nbr, -- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close -- from -- crm_case c -- where c.categ_id is not null AND c.category2_id is not null -- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.category2_id, c.state, c.stage_id, c.section_id)""") ++ cr.execute("""create or replace view report_crm_case_service_dashboard as ( ++ select ++ cse.id as id, cse.date_deadline as date_deadline, ++ cse.name as name, cse.user_id as user_id, ++ cse.state as state, ++ cse.create_date as create_date ++ from ++ crm_case cse ++ where ++ (cse.state='done') ++ OR ++ ++ ((to_date(to_char(cse.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') <= CURRENT_DATE) ++ AND ++ (to_date(to_char(cse.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') > (CURRENT_DATE-15)) ++ AND ++ cse.state='open') ++ )""") ++report_crm_case_service_dashboard() ++ --report_crm_case_section_categ_categ2() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report_claim.py index 0000000,0000000..5ec1cf0 new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_claim.py @@@ -1,0 -1,0 +1,41 @@@ ++from osv import fields,osv ++import tools ++ ++class report_crm_claim(osv.osv): ++ _name = "report.crm.claim" ++ _auto = False ++ _inherit = "report.crm.case" ++ _columns = { ++ 'delay_close': fields.char('Delay to close', size=20, readonly=True), ++ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True), ++ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]",readonly=True), ++ 'partner_id': fields.many2one('res.partner', 'Partner',readonly=True), ++ 'company_id': fields.many2one('res.company','Company',readonly=True), ++ } ++ def init(self, cr): ++ tools.drop_view_if_exists(cr, 'report_crm_claim') ++ cr.execute(""" ++ create or replace view report_crm_claim as ( ++ select ++ min(c.id) as id, ++ to_char(c.create_date, 'YYYY') as name, ++ to_char(c.create_date, 'MM') as month, ++ c.state, ++ c.user_id, ++ c.stage_id, ++ c.section_id, ++ c.partner_id, ++ c.company_id, ++ c.categ_id, ++ count(*) as nbr, ++ 0 as avg_answers, ++ 0.0 as perc_done, ++ 0.0 as perc_cancel, ++ to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close ++ from ++ crm_claim 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,c.categ_id,c.partner_id,c.company_id ++ )""") ++report_crm_claim() ++ ++# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report_claim_view.xml index 0000000,0000000..99a715b new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_claim_view.xml @@@ -1,0 -1,0 +1,96 @@@ ++ ++ ++ ++ ++ ++ report.crm.claim.tree ++ report.crm.claim ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.claim.form ++ report.crm.claim ++ ++ form ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.claim.graph ++ report.crm.claim ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.claim.select ++ report.crm.claim ++ ++ search ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Claims ++ report.crm.claim ++ form ++ tree,graph ++ ++ ++ ++ ++ ++ ++ ++ tree ++ ++ ++ ++ ++ ++ ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ diff --cc addons/crm/report/crm_report_fundraising.py index 0000000,0000000..70497a7 new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_fundraising.py @@@ -1,0 -1,0 +1,44 @@@ ++from osv import fields,osv ++import tools ++ ++class report_crm_fundraising(osv.osv): ++ _name = "report.crm.fundraising" ++ _auto = False ++ _inherit = "report.crm.case" ++ _columns = { ++ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]"), ++ 'probability': fields.float('Avg. Probability', readonly=True), ++ 'amount_revenue': fields.float('Est.Revenue', readonly=True), ++ 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True), ++ 'delay_close': fields.char('Delay to close', size=20, readonly=True), ++ 'partner_id': fields.many2one('res.partner', 'Partner'), ++ 'company_id': fields.many2one('res.company','Company'), ++ } ++ def init(self, cr): ++ tools.drop_view_if_exists(cr, 'report_crm_fundraising') ++ cr.execute(""" ++ create or replace view report_crm_fundraising as ( ++ select ++ min(c.id) as id, ++ to_char(c.create_date, 'YYYY') as name, ++ to_char(c.create_date, 'MM') as month, ++ c.state, ++ c.user_id, ++ c.section_id, ++ c.categ_id, ++ c.company_id, ++ c.partner_id, ++ count(*) as nbr, ++ 0 as avg_answers, ++ 0.0 as perc_done, ++ 0.0 as perc_cancel, ++ sum(planned_revenue) as amount_revenue, ++ sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob, ++ avg(probability)::decimal(16,2) as probability, ++ to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close ++ from ++ crm_fundraising c ++ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id,c.categ_id,c.partner_id,c.company_id ++ )""") ++report_crm_fundraising() ++# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report_fundraising_view.xml index 0000000,0000000..0861cd5 new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_fundraising_view.xml @@@ -1,0 -1,0 +1,96 @@@ ++ ++ ++ ++ ++ ++ ++ report.crm.fundraising.tree ++ report.crm.fundraising ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.fundraising.form ++ report.crm.fundraising ++ ++ form ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.fundraising.graph ++ report.crm.fundraising ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.fundraising.select ++ report.crm.fundraising ++ ++ search ++ ++ ++ ++ ++ ++ ++ ++ Fundraising ++ report.crm.fundraising ++ form ++ tree,graph ++ ++ ++ ++ ++ ++ ++ ++ tree ++ ++ ++ ++ ++ ++ ++ graph ++ ++ ++ ++ ++ ++ ++ diff --cc addons/crm/report/crm_report_lead.py index 0000000,0000000..e9c79ed new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_lead.py @@@ -1,0 -1,0 +1,40 @@@ ++from osv import fields,osv ++import tools ++ ++class report_crm_lead(osv.osv): ++ _name = "report.crm.lead" ++ _auto = False ++ _inherit = "report.crm.case" ++ _columns = { ++ 'delay_close': fields.char('Delay to close', size=20, readonly=True), ++ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]" ,readonly=True), ++ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', 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), ++ } ++ def init(self, cr): ++ tools.drop_view_if_exists(cr, 'report_crm_lead') ++ cr.execute(""" ++ create or replace view report_crm_lead as ( ++ select ++ min(c.id) as id, ++ to_char(c.create_date, 'YYYY') as name, ++ to_char(c.create_date, 'MM') as month, ++ c.state, ++ c.user_id, ++ c.stage_id, ++ c.company_id, ++ c.section_id, ++ c.categ_id, ++ c.partner_id, ++ count(*) as nbr, ++ 0 as avg_answers, ++ 0.0 as perc_done, ++ 0.0 as perc_cancel, ++ to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close ++ 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 ++ )""") ++report_crm_lead() ++# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report_lead_view.xml index 0000000,0000000..fd7e56a new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_lead_view.xml @@@ -1,0 -1,0 +1,92 @@@ ++ ++ ++ ++ ++ ++ ++ report.crm.lead.tree ++ report.crm.lead ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.lead.form ++ report.crm.lead ++ ++ form ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.lead.graph ++ report.crm.lead ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.lead.select ++ report.crm.lead ++ ++ search ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Leads ++ report.crm.lead ++ form ++ tree,graph ++ ++ ++ ++ ++ ++ ++ tree ++ ++ ++ ++ ++ ++ ++ graph ++ ++ ++ ++ ++ ++ ++ diff --cc addons/crm/report/crm_report_opportunity.py index 0000000,0000000..2ded021 new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_opportunity.py @@@ -1,0 -1,0 +1,47 @@@ ++from osv import fields,osv ++import tools ++ ++class report_crm_opportunity(osv.osv): ++ _name = "report.crm.opportunity" ++ _auto = False ++ _inherit = "report.crm.case" ++ ++ _columns = { ++ 'probability': fields.float('Avg. Probability', readonly=True), ++ 'amount_revenue': fields.float('Est.Revenue', readonly=True), ++ 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True), ++ 'delay_close': fields.char('Delay to close', size=20, readonly=True), ++ '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), ++ } ++ def init(self, cr): ++ tools.drop_view_if_exists(cr, 'report_crm_opportunity') ++ cr.execute(""" ++ create or replace view report_crm_opportunity as ( ++ select ++ min(c.id) as id, ++ to_char(c.create_date, 'YYYY') as name, ++ to_char(c.create_date, 'MM') as month, ++ c.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, ++ 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, ++ to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close ++ from ++ crm_opportunity 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,c.categ_id,c.partner_id,company_id ++ )""") ++report_crm_opportunity() ++# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report_opportunity_view.xml index 0000000,0000000..8dfe91c new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_opportunity_view.xml @@@ -1,0 -1,0 +1,96 @@@ ++ ++ ++ ++ ++ ++ ++ report.crm.opportunity.tree ++ report.crm.opportunity ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.opportunity.form ++ report.crm.opportunity ++ ++ form ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.opportunity.graph ++ report.crm.opportunity ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.opportunity.select ++ report.crm.opportunity ++ ++ search ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Opportunities ++ report.crm.opportunity ++ form ++ tree,graph ++ ++ ++ ++ ++ tree ++ ++ ++ ++ ++ ++ graph ++ ++ ++ ++ ++ ++ ++ diff --cc addons/crm/report/crm_report_phonecall.py index 0000000,0000000..f89af4b new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_phonecall.py @@@ -1,0 -1,0 +1,39 @@@ ++from osv import fields,osv ++import tools ++ ++class report_crm_phonecall(osv.osv): ++ _name = "report.crm.phonecall" ++ _description = "Phone calls by user and section" ++ _auto = False ++ _inherit = "report.crm.case" ++ _columns = { ++ 'delay_close': fields.char('Delay to close', size=20, readonly=True), ++ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.phonecall')]"), ++ 'partner_id': fields.many2one('res.partner', 'Partner' ,readonly=True), ++ 'company_id': fields.many2one('res.company','Company',readonly=True), ++ } ++ def init(self, cr): ++ tools.drop_view_if_exists(cr, 'report_crm_phonecall') ++ cr.execute(""" ++ create or replace view report_crm_phonecall as ( ++ select ++ min(c.id) as id, ++ to_char(c.create_date, 'YYYY') as name, ++ to_char(c.create_date, 'MM') as month, ++ c.state, ++ c.user_id, ++ c.section_id, ++ c.categ_id, ++ c.partner_id, ++ c.company_id, ++ count(*) as nbr, ++ 0 as avg_answers, ++ 0.0 as perc_done, ++ 0.0 as perc_cancel, ++ to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close ++ from ++ crm_phonecall c ++ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id, c.categ_id,c.partner_id,c.company_id ++ )""") ++report_crm_phonecall() ++# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --cc addons/crm/report/crm_report_phonecall_view.xml index 0000000,0000000..71889fb new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_phonecall_view.xml @@@ -1,0 -1,0 +1,91 @@@ ++ ++ ++ ++ ++ ++ ++ report.crm.phonecall.tree ++ report.crm.phonecall ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.phonecall.form ++ report.crm.phonecall ++ ++ form ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.phonecall.graph ++ report.crm.phonecall ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.phonecall.select ++ report.crm.phonecall ++ ++ search ++ ++ ++ ++ ++ ++ ++ ++ Phone Calls ++ report.crm.phonecall ++ form ++ tree,graph ++ ++ ++ ++ ++ ++ ++ tree ++ ++ ++ ++ ++ ++ ++ graph ++ ++ ++ ++ ++ ++ ++ ++ diff --cc addons/crm/report/crm_report_view.xml index 0000000,0000000..2e52d59 new file mode 100644 --- /dev/null +++ b/addons/crm/report/crm_report_view.xml @@@ -1,0 -1,0 +1,163 @@@ ++ ++ ++ ++ ++ ++ report.crm.case.tree ++ report.crm.case ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.case.form ++ report.crm.case ++ form ++ ++
++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ report.crm.case.graph ++ report.crm.case ++ graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.case.select ++ report.crm.case ++ search ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Cases ++ report.crm.case ++ form ++ tree,graph ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.case.service.dashboard.tree ++ report.crm.case.service.dashboard ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ report.crm.case.service.dashboard.tree ++ report.crm.case.service.dashboard ++ tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Closed CRM Cases Within Past 15 Days ++ report.crm.case.service.dashboard ++ form ++ tree,form ++ ++ [('state','=','done')] ++ ++ ++ ++ Open CRM Cases Within Past 15 Days ++ report.crm.case.service.dashboard ++ form ++ tree,form ++ ++ [('state','=','open')] ++ ++ ++
++