[IMP] Upgrade the translations
[odoo/odoo.git] / addons / report_crm / report_crm.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution   
5 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6 #    $Id$
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU General Public License as published by
10 #    the Free Software Foundation, either version 3 of the License, or
11 #    (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU General Public License for more details.
17 #
18 #    You should have received a copy of the GNU General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22
23 from osv import fields,osv
24
25 AVAILABLE_STATES = [
26     ('draft','Draft'),
27     ('open','Open'),
28     ('cancel', 'Canceled'),
29     ('done', 'Closed'),
30     ('pending','Pending')
31 ]
32
33 class report_crm_case_user(osv.osv):
34     _name = "report.crm.case.user"
35     _description = "Cases by user and section"
36     _auto = False
37     _columns = {
38         'name': fields.date('Month', readonly=True),
39         'user_id':fields.many2one('res.users', 'User', readonly=True),
40         'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
41         'amount_revenue': fields.float('Est.Revenue', readonly=True),
42         'amount_costs': fields.float('Est.Cost', readonly=True),
43         'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
44         'nbr': fields.integer('# of Cases', readonly=True),
45         'probability': fields.float('Avg. Probability', readonly=True),
46         'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True),
47         'delay_close': fields.char('Delay to close', size=20, readonly=True),
48     }
49     _order = 'name desc, user_id, section_id'
50     def init(self, cr):
51         cr.execute("""
52             create or replace view report_crm_case_user as (
53                 select
54                     min(c.id) as id,
55                     to_char(c.create_date, 'YYYY-MM-01') as name,
56                     c.state,
57                     c.user_id,
58                     c.section_id,
59                     count(*) as nbr,
60                     sum(planned_revenue) as amount_revenue,
61                     sum(planned_cost) as amount_costs,
62                     sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
63                     avg(probability)::decimal(16,2) as probability,
64                     to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
65                 from
66                     crm_case c
67                 group by to_char(c.create_date, 'YYYY-MM-01'), c.state, c.user_id, c.section_id
68             )""")
69 report_crm_case_user()
70
71 class report_crm_case_categ(osv.osv):
72     _name = "report.crm.case.categ"
73     _description = "Cases by section and category"
74     _auto = False
75     _columns = {
76         'name': fields.date('Month', readonly=True),
77         'categ_id':fields.many2one('crm.case.categ', 'Category', readonly=True),
78         'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
79         'amount_revenue': fields.float('Est.Revenue', readonly=True),
80         'amount_costs': fields.float('Est.Cost', readonly=True),
81         'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
82         'nbr': fields.integer('# of Cases', readonly=True),
83         'probability': fields.float('Avg. Probability', readonly=True),
84         'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True),
85         'delay_close': fields.char('Delay Close', size=20, readonly=True),
86     }
87     _order = 'name desc, categ_id, section_id'
88     def init(self, cr):
89         cr.execute("""
90             create or replace view report_crm_case_categ as (
91                 select
92                     min(c.id) as id,
93                     to_char(c.create_date, 'YYYY-MM-01') as name,
94                     c.state,
95                     c.categ_id,
96                     c.section_id,
97                     count(*) as nbr,
98                     sum(planned_revenue) as amount_revenue,
99                     sum(planned_cost) as amount_costs,
100                     sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
101                     avg(probability)::decimal(16,2) as probability,
102                     to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
103                 from
104                     crm_case c
105                 group by to_char(c.create_date, 'YYYY-MM-01'), c.state, c.categ_id, c.section_id
106             )""")
107 report_crm_case_categ()
108
109
110 class report_crm_case_section(osv.osv):
111     _name = "report.crm.case.section"
112     _description = "Cases by Section"
113     _auto = False
114     
115     def _get_data(self, cr, uid, ids, field_name, arg, context={}):
116         res = {}
117         state_perc = 0.0
118         avg_ans = 0.0
119         
120         for case in self.browse(cr, uid, ids, context):
121             if field_name != 'avg_answers':
122                 state = field_name[5:]
123                 cr.execute("select count(*) from crm_case where section_id =%s and state='%s'"%(case.section_id.id,state))
124                 state_cases = cr.fetchone()[0]
125                 perc_state = (state_cases / float(case.nbr_cases) ) * 100
126                 
127                 res[case.id] = perc_state
128             else:
129                 cr.execute('select count(*) from crm_case_log l  where l.section_id=%s'%(case.section_id.id))
130                 logs = cr.fetchone()[0]
131                 
132                 avg_ans = logs / case.nbr_cases
133                 res[case.id] = avg_ans       
134         
135         return res
136     
137     _columns = {
138         'name': fields.date('Month', readonly=True),
139 #        'user_id':fields.many2one('res.users', 'User', readonly=True),
140         'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
141         'nbr_cases': fields.integer('# of Cases', readonly=True),
142         'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
143         'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
144         'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
145         'delay_close': fields.char('Delay to close', size=20, readonly=True),
146     }
147     _order = 'name desc, section_id'
148     def init(self, cr):
149         cr.execute("""
150             create or replace view report_crm_case_section as (
151                 select
152                     min(c.id) as id,
153                     to_char(c.create_date, 'YYYY-MM-01') as name,
154                     c.section_id as section_id,
155                     count(*) as nbr_cases,
156                     0 as avg_answers,
157                     0.0 as perc_done,
158                     0.0 as perc_cancel,
159                     to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
160                 from
161                     crm_case c
162                 group by to_char(c.create_date, 'YYYY-MM-01'),c.section_id
163             )""")
164 report_crm_case_section()
165
166 class report_crm_case_service_dashboard(osv.osv):
167     _name = "report.crm.case.service.dashboard"
168     _description = "Report of Closed and Open CRM Cases within past 15 days"
169     _auto = False
170     _columns = {
171         'date': fields.datetime('Date', readonly=True),
172         'date_deadline': fields.datetime('Deadline', readonly=True),
173         'name': fields.char('Description', size=64, readonly=True),
174         'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
175         'user_id': fields.many2one('res.users', 'Responsible', readonly=True),
176         'priority': fields.char('Priority', size=64, readonly=True),
177         'planned_revenue': fields.float('Planned Revenue', readonly=True),
178         'planned_cost': fields.float('Planned Costs', readonly=True),
179         'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True),
180         'date_closed' : fields.datetime('Date Closed', readonly=True),
181         'create_date' : fields.datetime('Create Date', readonly=True)
182     }
183     _order = 'date_closed, create_date'
184     
185     def init(self, cr):
186         cr.execute("""create or replace view report_crm_case_service_dashboard as (
187             select
188                 cse.id as id, cse.date as date, cse.date_deadline as date_deadline,
189                 cse.name as name, cse.partner_id as partner_id, cse.user_id as user_id,
190                 cse.priority as priority, cse.planned_revenue as planned_revenue,
191                 cse.planned_cost as planned_cost, cse.state as state,
192                 cse.date_closed as date_closed, cse.create_date as create_date
193             from
194                 crm_case cse
195             where
196                 ((to_date(to_char(cse.date_closed, 'YYYY-MM-dd'),'YYYY-MM-dd') <= CURRENT_DATE)
197                     AND
198                 (to_date(to_char(cse.date_closed, 'YYYY-MM-dd'),'YYYY-MM-dd') > (CURRENT_DATE-15)) 
199                     AND
200                     cse.state='done')
201                 
202                 OR
203                 
204                 ((to_date(to_char(cse.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') <= CURRENT_DATE)
205                     AND
206                 (to_date(to_char(cse.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') > (CURRENT_DATE-15))
207                     AND
208                     cse.state='open')
209             )""")
210 report_crm_case_service_dashboard()
211
212
213 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
214