Subversion Repositories SmartDukaan

Rev

Rev 15397 | Rev 15399 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
15394 manas 1
'''
2
Created on 27-May-2015
3
 
4
@author: kshitij
5
'''
6
from datetime import date, datetime, timedelta
7
from dtr.storage.Mysql import getOrdersAfterDate, \
8
    getOrdersByTag
9
from email import encoders
10
from email.mime.base import MIMEBase
11
from email.mime.multipart import MIMEMultipart
12
from email.mime.text import MIMEText
13
from pymongo.mongo_client import MongoClient
14
from xlrd import open_workbook
15
from xlutils.copy import copy
16
from xlwt.Workbook import Workbook
17
import MySQLdb
18
import smtplib
19
import time
20
import xlwt
21
import pymongo
22
from shop2020.utils.Utils import to_py_date, to_java_date
23
from datetime import datetime
24
from elixir import *
25
from dtr.storage import DataService
26
from dtr.storage.DataService import Orders, Users, CallHistory
27
from sqlalchemy.sql.expression import func
28
 
29
DB_HOST = "localhost"
30
DB_USER = "root"
31
DB_PASSWORD = "shop2020"
32
DB_NAME = "dtr"
33
TMP_FILE = "/tmp/CRM_OutBound_Report.xls"  
34
 
35
con = None
36
 
37
SENDER = "cnc.center@shop2020.in"
38
PASSWORD = "5h0p2o2o"
39
SUBJECT = "CRM Outbound Report for" + date.today().isoformat()
40
SMTP_SERVER = "smtp.gmail.com"
41
SMTP_PORT = 587    
42
 
43
date_format = xlwt.XFStyle()
44
date_format.num_format_str = 'yyyy/mm/dd'
45
 
46
datetime_format = xlwt.XFStyle()
47
datetime_format.num_format_str = 'yyyy/mm/dd HH:MM AM/PM'
48
 
49
default_format = xlwt.XFStyle()
50
freshList=['1','2','3','4','5','6','7','8','9','10','11','12','13']
51
followUpList=['1','2','3','4','5','6','7']
52
onBoardingList=['1','2','3','4','5'] 
53
dispositionMap = {  'call_later':0,
54
                    'ringing_no_answer':1,
55
                    'not_reachable':2,
56
                    'switch_off':3,
57
                    'invalid_no':4,
58
                    'wrong_no':5,
59
                    'hang_up':6,
60
                    'retailer_not_interested':7,
61
                    'alreadyuser':8,
62
                    'verified_link_sent':9,
63
                    'accessory_retailer':10,
64
                    'service_center_retailer':11,
65
                    'not_retailer':12, 
66
                    'recharge_retailer':13,
67
                    'onboarded':14
68
                }
69
followUpDispositionMap = {  'call_later':0,
70
                    'ringing_no_answer':1,
71
                    'not_reachable':2,
72
                    'switch_off':3,
73
                    'retailer_not_interested':4,
74
                    'alreadyuser':5,
75
                    'verified_link_sent':6,
76
                    'not_retailer':7,
77
                }
78
onBoardingDispositionMap = {  'call_later':0,
79
                    'ringing_no_answer':1,
80
                    'not_reachable':2,
81
                    'switch_off':3,
82
                    'onboarded':4,
83
                }
84
 
85
FRESH_QUERY="""
86
select call_disposition,count(1) from 
87
(select * from (select * from callhistory where date(created)=date(now()) 
88
and call_type ='fresh' order by created desc) 
89
as a group by retailer_id) 
90
a1 group by date(created), call_disposition;
91
"""
92
AGENT_FRESH_QUERY="""
93
select call_disposition,count(1) from 
94
(select * from (select * from callhistory where date(created)=date(now()) 
95
and call_type ='fresh' and agent_id=%s order by created desc) 
96
as a group by retailer_id) 
97
a1 group by date(created), call_disposition,agent_id;
98
"""
99
AGENT_NAME_QUERY="""
100
select name from agents where id=%s
101
"""
102
FRESH_QUERY_LOGIN_TIME="""
103
select agent_id,TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='fresh' and date(created)=date(now());
104
"""
105
FRESH_QUERY_DURATION="""
106
select sum(duration_sec) from callhistory where call_type ='fresh' and date(created)=date(now());
107
"""
108
AGENT_FRESH_QUERY_LOGIN_TIME="""
109
select TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='fresh' and date(created)=date(now()) and agent_id=%s;
110
"""
111
AGENT_FRESH_QUERY_DURATION="""
112
select sum(duration_sec) from callhistory where call_type ='fresh' and date(created)=date(now()) and agent_id=%s;
113
"""
114
 
115
FOLLOW_UP_QUERY="""
116
select call_disposition,count(1) from 
117
(select * from (select * from callhistory where date(created)=date(now()) 
118
and call_type ='followup' order by created desc) 
119
as a group by retailer_id) 
120
a1 group by date(created), call_disposition;
121
"""
122
AGENT_FOLLOW_UP_QUERY="""
123
select call_disposition,count(1) from 
124
(select * from (select * from callhistory where date(created)=date(now()) 
125
and call_type ='followup' and agent_id=%s order by created desc) 
126
as a group by retailer_id) 
127
a1 group by date(created), call_disposition,agent_id;
128
"""
129
FOLLOW_UP_QUERY_LOGIN_TIME="""
130
select agent_id,TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='followup' and date(created)=date(now());
131
"""
132
FOLLOW_UP_QUERY_DURATION="""
133
select sum(duration_sec) from callhistory where call_type ='followup' and date(created)=date(now());
134
"""
135
AGENT_FOLLOW_UP_QUERY_LOGIN_TIME="""
136
select TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='followup' and date(created)=date(now()) and agent_id=%s;
137
"""
138
AGENT_FOLLOW_UP_QUERY_DURATION="""
139
select sum(duration_sec) from callhistory where call_type ='followup' and date(created)=date(now()) and agent_id=%s;
140
"""
141
 
142
ONBOARDING_QUERY="""
143
select call_disposition,count(1) from 
144
(select * from (select * from callhistory where date(created)=date(now()) 
145
and call_type ='onboarding' order by created desc) 
146
as a group by retailer_id) 
147
a1 group by date(created), call_disposition;
148
"""
149
AGENT_ONBOARDING_QUERY="""
150
select call_disposition,count(1) from 
151
(select * from (select * from callhistory where date(created)=date(now()) 
152
and call_type ='onboarding' and agent_id=%s order by created desc) 
153
as a group by retailer_id) 
154
a1 group by date(created), call_disposition,agent_id;
155
"""
156
ONBOARDING_QUERY_LOGIN_TIME="""
157
select agent_id,TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='onboarding' and date(created)=date(now());
158
"""
159
ONBOARDING_QUERY_DURATION="""
160
select sum(duration_sec) from callhistory where call_type ='onboarding' and date(created)=date(now());
161
"""
162
AGENT_ONBOARDING_QUERY_LOGIN_TIME="""
163
select TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='onboarding' and date(created)=date(now()) and agent_id=%s;
164
"""
165
AGENT_ONBOARDING_QUERY_DURATION="""
166
select sum(duration_sec) from callhistory where call_type ='onboarding' and date(created)=date(now()) and agent_id=%s;
167
"""
168
 
169
 
170
 
171
def getDbConnection():
172
    return MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
173
 
174
 
175
def generateFreshCallingReport():
176
    datesql=FRESH_QUERY 
177
    conn = getDbConnection()
178
 
179
    cursor = conn.cursor()
180
    cursor.execute(datesql)
181
    result = cursor.fetchall()
182
    global workbook
183
    workbook = xlwt.Workbook()
184
    worksheet = workbook.add_sheet("Fresh")
185
    boldStyle = xlwt.XFStyle()
186
    newStyle= xlwt.XFStyle()
187
    style = xlwt.XFStyle()
188
    pattern = xlwt.Pattern()
189
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
190
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
191
    style.pattern = pattern
192
    f = xlwt.Font()
193
    f.bold = True
194
    boldStyle.font = f
195
 
196
    column = 0
197
    row = 0
198
    currentList=[]
199
 
200
    worksheet.write(0,0,'Call Disposition Type',style)
201
    worksheet.write(0,1,'Count',style)
202
 
203
    worksheet.write(1, column, 'Call Later', newStyle)
204
    worksheet.write(2,column, 'Ringing No Answer', newStyle)
205
    worksheet.write(3,column, 'Not Reachable', newStyle)
206
    worksheet.write(4,column, 'Switched Off', newStyle)
207
    worksheet.write(5,column, 'Invalid Number', newStyle)
208
    worksheet.write(6,column, 'Wrong Number', newStyle)
209
    worksheet.write(7,column, 'Hang Up', newStyle)
210
    worksheet.write(8,column, 'Retailer Not Interested', newStyle)
211
    worksheet.write(9,column, 'Already Profitmandi user', boldStyle)   
212
    worksheet.write(10,column, 'Verified Link Sent', boldStyle)
213
    worksheet.write(11,column, 'Accessory Retailer', newStyle)
214
    worksheet.write(12,column, 'Service Center Retailer', newStyle)
215
    worksheet.write(13,column, 'Not a Retailer', newStyle)
216
    worksheet.write(14,column, 'Recharge Retailer', newStyle)
217
    worksheet.write(15,column, 'Contactable Data', newStyle)
218
    worksheet.write(16,column, 'Non Contactable Data', newStyle)
219
    worksheet.write(17,column, 'Agents Logged In', style)
220
    worksheet.write(18,column, 'Average Login Time (In Hrs)', style)
221
    worksheet.write(19,column, 'Total Dialed Out', style)
222
    worksheet.write(20,column, 'Average Dialed Out per agent', style)
223
    worksheet.write(21,column, 'Average Call Duration (In Hrs)', style)
224
    contactableData=0
225
    nonContactableData=0
226
 
227
    for r in result:
228
        row = dispositionMap.get(r[0])+1
229
        if dispositionMap.get(r[0]) == 1 or dispositionMap.get(r[0]) == 2 or dispositionMap.get(r[0]) == 3 or dispositionMap.get(r[0]) == 4:
230
            nonContactableData+=int(r[1])
231
        else:
232
            contactableData+=r[1] 
233
        currentList.append(str(row))
234
        column = 1
235
        worksheet.write(row, column, r[1])
236
 
237
    remainingList = list(set(freshList) - set(currentList))
238
    for i,val in enumerate(remainingList):
239
        row = int(val)
240
        column = 1
241
        worksheet.write(row, column, 0)
242
    totalDispositions=contactableData+nonContactableData
243
    worksheet.write(15,1,(contactableData/float(totalDispositions))*100)
244
    worksheet.write(16,1,(nonContactableData/float(totalDispositions))*100)
245
 
246
 
247
    conn.close()
248
    datesql=FRESH_QUERY_LOGIN_TIME 
249
    conn = getDbConnection()
250
 
251
    cursor = conn.cursor()
252
    cursor.execute(datesql)
253
    result = cursor.fetchall()
254
    agentLoginList=[]
255
    loginTime=0
256
    for r in result:
257
        loginTime+=r[1].seconds
258
        agentLoginList.append(str(r[0]))
259
    averageLoginTime=loginTime/len(list(set(agentLoginList)))
260
    hours=averageLoginTime/3600
261
    minutesLeft=(averageLoginTime%3600)/60
262
    worksheet.write(17,1,len(list(set(agentLoginList))))
263
    worksheet.write(18,1,str(hours) + ':'+ str(minutesLeft))   
264
    worksheet.write(19,1,totalDispositions)
15398 manas 265
    print 'list' + str(agentLoginList)
15397 manas 266
    print 'Avg' + str(totalDispositions/float(len(list(set(agentLoginList)))))
15396 manas 267
    print 'list' + str(list(set(agentLoginList)))
15397 manas 268
    worksheet.write(20,1,totalDispositions/float(len(list(set(agentLoginList)))))
15394 manas 269
    conn.close()
270
    datesql=FRESH_QUERY_DURATION
271
    conn = getDbConnection()
272
 
273
    cursor = conn.cursor()
274
    cursor.execute(datesql)
275
    result = cursor.fetchall()
276
    for r in result:
277
        totalCallDuration= r[0]
278
    averageCallDuration=totalCallDuration/len(list(set(agentLoginList)))    
279
    hours=averageCallDuration/3600
280
    minutesLeft=(averageCallDuration%3600)/60    
281
    worksheet.write(21,1,str(int(hours))+':'+str(int(minutesLeft)))
282
 
283
    workbook.save(TMP_FILE)
284
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
285
 
286
 
287
def generateAgentWiseFreshCallingReport():
288
 
289
    agentId=3
290
    #global workbook
291
    rb = open_workbook(TMP_FILE,formatting_info=True)
292
    workbook = copy(rb)
293
    numberOfSheets=rb.nsheets
294
    print 'Number of sheets ' + str(numberOfSheets)
295
    sheet=rb.sheet_by_index(numberOfSheets-1)
296
    worksheet = workbook.get_sheet(numberOfSheets-1)
297
 
298
    boldStyle = xlwt.XFStyle()
299
    newStyle= xlwt.XFStyle()
300
    style = xlwt.XFStyle()
301
    pattern = xlwt.Pattern()
302
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
303
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
304
    style.pattern = pattern
305
    f = xlwt.Font()
306
    f.bold = True
307
    boldStyle.font = f
308
 
309
    column = agentId
310
    row = 25
311
    worksheet.write(row,column-1,'Call Disposition Type',style)
312
    worksheet.write(row+1, column-1, 'Call Later', newStyle)
313
    worksheet.write(row+2,column-1, 'Ringing No Answer', newStyle)
314
    worksheet.write(row+3,column-1, 'Not Reachable', newStyle)
315
    worksheet.write(row+4,column-1, 'Switched Off', newStyle)
316
    worksheet.write(row+5,column-1, 'Invalid Number', newStyle)
317
    worksheet.write(row+6,column-1, 'Wrong Number', newStyle)
318
    worksheet.write(row+7,column-1, 'Hang Up', newStyle)
319
    worksheet.write(row+8,column-1, 'Retailer Not Interested', newStyle)
320
    worksheet.write(row+9,column-1, 'Already Profitmandi user', boldStyle)   
321
    worksheet.write(row+10,column-1, 'Verified Link Sent', boldStyle)
322
    worksheet.write(row+11,column-1, 'Accessory Retailer', newStyle)
323
    worksheet.write(row+12,column-1, 'Service Center Retailer', newStyle)
324
    worksheet.write(row+13,column-1, 'Not a Retailer', newStyle)
325
    worksheet.write(row+14,column-1, 'Recharge Retailer', newStyle)
326
    worksheet.write(row+15,column-1, 'Contactable Data', newStyle)
327
    worksheet.write(row+16,column-1, 'Non Contactable Data', newStyle)
328
    worksheet.write(row+17,column-1, 'Total Dialed Out', style)
329
    worksheet.write(row+18,column-1, 'Login Time (In Hrs)', style)
330
    worksheet.write(row+19,column-1, 'Call Duration (In Hrs)', style)
331
 
332
    columnId=agentId
333
    while True:
334
            if agentId >5 :
335
                break
336
            else: 
337
                datesql=AGENT_FRESH_QUERY %(agentId)
338
                conn = getDbConnection()
339
 
340
                cursor = conn.cursor()
341
                cursor.execute(datesql)
342
                result = cursor.fetchall()
343
 
344
                currentList=[]
345
                contactableData=0
346
                nonContactableData=0
347
                if cursor.rowcount ==0:
348
 
349
                    agentId+=1
350
                    continue    
351
                else:
352
                    for r in result:
353
                        row = dispositionMap.get(r[0])+26
354
                        if dispositionMap.get(r[0]) == 1 or dispositionMap.get(r[0]) == 2 or dispositionMap.get(r[0]) == 3 or dispositionMap.get(r[0]) == 4:
355
                            nonContactableData+=int(r[1])
356
                        else:
357
                            contactableData+=r[1] 
358
                        currentList.append(str(dispositionMap.get(r[0])))
359
                        column = agentId
360
                        remainingList = list(set(freshList) - set(currentList))
361
 
362
                        worksheet.write(row, columnId, r[1])
363
                        for i,val in enumerate(remainingList):
364
                            row = int(val)+26
365
                            column = agentId
366
                            worksheet.write(row, columnId, 0)
367
                    totalDialedOut = contactableData+nonContactableData
368
                    worksheet.write(25+15,columnId,(contactableData/float(totalDialedOut))*100)
369
                    worksheet.write(25+16,columnId,(nonContactableData/float(totalDialedOut))*100)
370
                    worksheet.write(25+17,columnId,totalDialedOut)
371
                    conn.close()
372
 
373
                    name_query=AGENT_NAME_QUERY %(agentId)
374
                    conn = getDbConnection()
375
                    column=agentId
376
                    cursor = conn.cursor()
377
                    cursor.execute(name_query)
378
                    result = cursor.fetchall()
379
                    for r in result:
380
                        worksheet.write(25,columnId,r,style)
381
 
382
                    conn.close()
383
 
384
 
385
                    name_query=AGENT_FRESH_QUERY_LOGIN_TIME %(agentId)
386
                    conn = getDbConnection()
387
                    column=agentId
388
                    cursor = conn.cursor()
389
                    cursor.execute(name_query)
390
                    result = cursor.fetchall()
391
                    loginTime=0
392
                    for r in result:
393
                        loginTime+=r[0].seconds
394
 
395
                    hours=loginTime/3600
396
                    minutesLeft=(loginTime%3600)/60
397
                    worksheet.write(25+18,columnId,str(hours)+':'+str(minutesLeft))    
398
                    conn.close()
399
 
400
                    name_query=AGENT_FRESH_QUERY_DURATION %(agentId)
401
                    conn = getDbConnection()
402
                    column=agentId
403
                    cursor = conn.cursor()
404
                    cursor.execute(name_query)
405
                    result = cursor.fetchall()
406
                    loginTime=0
407
                    for r in result:
408
                        loginTime+=r[0]
409
                    hours=loginTime/3600
410
                    minutesLeft=(loginTime%3600)/60
411
                    worksheet.write(25+19,columnId,str(int(hours))+':'+str(int(minutesLeft)))    
412
                    conn.close()
413
 
414
                agentId+=1
415
                columnId+=1
416
    workbook.save(TMP_FILE)    
417
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
418
 
419
def generateFollowUpCallingReport():
420
    datesql=FOLLOW_UP_QUERY 
421
    conn = getDbConnection()
422
 
423
    cursor = conn.cursor()
424
    cursor.execute(datesql)
425
    result = cursor.fetchall()
426
    rb = open_workbook(TMP_FILE,formatting_info=True)
427
    workbook = copy(rb)
428
 
429
    worksheet = workbook.add_sheet("FollowUp")
430
    boldStyle = xlwt.XFStyle()
431
    newStyle= xlwt.XFStyle()
432
    style = xlwt.XFStyle()
433
    pattern = xlwt.Pattern()
434
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
435
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
436
    style.pattern = pattern
437
    f = xlwt.Font()
438
    f.bold = True
439
    boldStyle.font = f
440
 
441
    column = 0
442
    row = 0
443
    currentList=[]
444
 
445
    worksheet.write(0,0,'Call Disposition Type',style)
446
    worksheet.write(0,1,'Count',style)
447
 
448
    worksheet.write(1, column, 'Call Later', newStyle)
449
    worksheet.write(2,column, 'Ringing No Answer', newStyle)
450
    worksheet.write(3,column, 'Not Reachable', newStyle)
451
    worksheet.write(4,column, 'Switched Off', newStyle)
452
    worksheet.write(5,column, 'Retailer Not Interested', newStyle)
453
    worksheet.write(6,column, 'Already Profitmandi user', boldStyle)   
454
    worksheet.write(7,column, 'Verified Link Sent', boldStyle)
455
    worksheet.write(8,column, 'Not a retailer', boldStyle)
456
    worksheet.write(9,column, 'Contactable Data', newStyle)
457
    worksheet.write(10,column, 'Non Contactable Data', newStyle)
458
    worksheet.write(11,column, 'Agents Logged In', style)
459
    worksheet.write(12,column, 'Average Login Time (In Hrs)', style)
460
    worksheet.write(13,column, 'Total Dialed Out', style)
461
    worksheet.write(14,column, 'Average Dialed Out per agent', style)
462
    worksheet.write(15,column, 'Average Call Duration (In Hrs)', style)
463
 
464
    contactableData=0
465
    nonContactableData=0
466
    totalDispositions=0
467
    print result
468
    for r in result:
469
        row = followUpDispositionMap.get(r[0])+1
470
        if followUpDispositionMap.get(r[0]) == 1 or followUpDispositionMap.get(r[0]) == 2 or followUpDispositionMap.get(r[0]) == 3 or followUpDispositionMap.get(r[0]) == 4:
471
            nonContactableData+=int(r[1])
472
        else:
473
            contactableData+=r[1] 
474
        currentList.append(str(row))
475
        column = 1
476
        worksheet.write(row, column, r[1])
477
 
478
    remainingList = list(set(followUpList) - set(currentList))
479
    print remainingList
480
    for i,val in enumerate(remainingList):
481
        row = int(val)
482
        print row
483
        column = 1
484
        worksheet.write(row, column, 0)
485
    totalDispositions=contactableData+nonContactableData
486
    worksheet.write(9,1,(contactableData/float(totalDispositions))*100)
487
    worksheet.write(10,1,(nonContactableData/float(totalDispositions))*100)
488
 
489
 
490
    conn.close()
491
    datesql=FOLLOW_UP_QUERY_LOGIN_TIME 
492
    conn = getDbConnection()
493
 
494
    cursor = conn.cursor()
495
    cursor.execute(datesql)
496
    result = cursor.fetchall()
497
    agentLoginList=[]
498
    averageLoginTime=0
499
    loginTime=0
500
    for r in result:
501
        loginTime+=r[1].seconds
502
        agentLoginList.append(str(r[0]))
503
    averageLoginTime=loginTime/len(list(set(agentLoginList)))
504
    hours=averageLoginTime/3600
505
    minutesLeft=(averageLoginTime%3600)/60
506
    worksheet.write(11,1,len(list(set(agentLoginList))))
507
    worksheet.write(12,1,str(hours) + ':'+ str(minutesLeft))   
508
    worksheet.write(13,1,totalDispositions)
509
    worksheet.write(14,1,(contactableData+nonContactableData)/len(list(set(agentLoginList))))
510
    conn.close()
511
    datesql=FOLLOW_UP_QUERY_DURATION
512
    conn = getDbConnection()
513
 
514
    cursor = conn.cursor()
515
    cursor.execute(datesql)
516
    result = cursor.fetchall()
517
    for r in result:
518
        totalCallDuration= r[0]
519
    averageCallDuration=totalCallDuration/len(list(set(agentLoginList)))    
520
    hours=averageCallDuration/3600
521
    minutesLeft=(averageCallDuration%3600)/60    
522
    worksheet.write(15,1,str(int(hours))+':'+str(int(minutesLeft)))
523
    workbook.save(TMP_FILE)
524
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
525
 
526
 
527
def generateAgentWiseFollowupCallingReport():
528
 
529
    agentId=3
530
    rb = open_workbook(TMP_FILE,formatting_info=True)
531
    workbook = copy(rb)
532
    numberOfSheets=rb.nsheets
533
    print 'Number of sheets ' + str(numberOfSheets)
534
    sheet=rb.sheet_by_index(numberOfSheets-1)
535
    worksheet = workbook.get_sheet(numberOfSheets-1)
536
    boldStyle = xlwt.XFStyle()
537
    newStyle= xlwt.XFStyle()
538
    style = xlwt.XFStyle()
539
    pattern = xlwt.Pattern()
540
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
541
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
542
    style.pattern = pattern
543
    f = xlwt.Font()
544
    f.bold = True
545
    boldStyle.font = f
546
 
547
    column = agentId
548
    row = 25
549
    worksheet.write(row,column-1,'Call Disposition Type',style)
550
    worksheet.write(row+1, column-1, 'Call Later', newStyle)
551
    worksheet.write(row+2,column-1, 'Ringing No Answer', newStyle)
552
    worksheet.write(row+3,column-1, 'Not Reachable', newStyle)
553
    worksheet.write(row+4,column-1, 'Switched Off', newStyle)
554
    worksheet.write(row+5,column-1, 'Retailer Not Interested', newStyle)
555
    worksheet.write(row+6,column-1, 'Already Profitmandi user', boldStyle)   
556
    worksheet.write(row+7,column-1, 'Verified Link Sent', boldStyle)
557
    worksheet.write(row+8,column-1, 'Not a Retailer', newStyle)
558
    worksheet.write(row+9,column-1, 'Contactable Data', newStyle)
559
    worksheet.write(row+10,column-1, 'Non Contactable Data', newStyle)
560
    worksheet.write(row+11,column-1, 'Total Dialed Out', style)
561
    worksheet.write(row+12,column-1, 'Login Time (In Hrs)', style)
562
    worksheet.write(row+13,column-1, 'Call Duration (In Hrs)', style)
563
 
564
    columnId=agentId
565
    while True:
566
            if agentId >5 :
567
                break
568
            else: 
569
                datesql=AGENT_FOLLOW_UP_QUERY %(agentId)
570
                conn = getDbConnection()
571
 
572
                cursor = conn.cursor()
573
                cursor.execute(datesql)
574
                result = cursor.fetchall()
575
 
576
                currentList=[]
577
                contactableData=0
578
                nonContactableData=0
579
                if cursor.rowcount ==0:
580
                    agentId+=1
581
                    continue    
582
                else:
583
                    print result
584
                    for r in result:
585
                        row = followUpDispositionMap.get(r[0])+26
586
                        if followUpDispositionMap.get(r[0]) == 1 or followUpDispositionMap.get(r[0]) == 2 or followUpDispositionMap.get(r[0]) == 3 or followUpDispositionMap.get(r[0]) == 4:
587
                            nonContactableData+=int(r[1])
588
                        else:
589
                            contactableData+=r[1] 
590
                        currentList.append(str(followUpDispositionMap.get(r[0])+1))
591
                        column = agentId
592
                        worksheet.write(row, columnId, r[1])
593
                    remainingList = list(set(followUpList) - set(currentList))
594
 
595
                    for i,val in enumerate(remainingList):
596
                        row = int(val)+25
597
                        column = agentId
598
                        worksheet.write(row, columnId, 0)
599
                    totalDialedOut = contactableData+nonContactableData
600
                    worksheet.write(25+9,columnId,(contactableData/float(totalDialedOut))*100)
601
                    worksheet.write(25+10,columnId,(nonContactableData/float(totalDialedOut))*100)
602
                    worksheet.write(25+11,columnId,totalDialedOut)
603
                    conn.close()
604
 
605
                    name_query=AGENT_NAME_QUERY %(agentId)
606
                    conn = getDbConnection()
607
                    column=agentId
608
                    cursor = conn.cursor()
609
                    cursor.execute(name_query)
610
                    result = cursor.fetchall()
611
                    for r in result:
612
                        worksheet.write(25,columnId,r,style)
613
 
614
                    conn.close()
615
 
616
 
617
                    name_query=AGENT_FOLLOW_UP_QUERY_LOGIN_TIME %(agentId)
618
                    conn = getDbConnection()
619
                    column=agentId
620
                    cursor = conn.cursor()
621
                    cursor.execute(name_query)
622
                    result = cursor.fetchall()
623
                    loginTime=0
624
                    for r in result:
625
                        loginTime+=r[0].seconds
626
 
627
                    hours=loginTime/3600
628
                    minutesLeft=(loginTime%3600)/60
629
                    worksheet.write(25+12,columnId,str(hours)+':'+str(minutesLeft))    
630
                    conn.close()
631
 
632
                    name_query=AGENT_FOLLOW_UP_QUERY_DURATION %(agentId)
633
                    conn = getDbConnection()
634
                    column=agentId
635
                    cursor = conn.cursor()
636
                    cursor.execute(name_query)
637
                    result = cursor.fetchall()
638
                    loginTime=0
639
                    for r in result:
640
                        loginTime+=r[0]
641
                    hours=loginTime/3600
642
                    minutesLeft=(loginTime%3600)/60
643
                    worksheet.write(25+13,columnId,str(int(hours))+':'+str(int(minutesLeft)))    
644
                    conn.close()
645
 
646
                agentId+=1
647
                columnId+=1
648
    workbook.save(TMP_FILE)    
649
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)
650
 
651
def generateOnBoardingCallingReport():
652
    datesql=ONBOARDING_QUERY 
653
    conn = getDbConnection()
654
 
655
    cursor = conn.cursor()
656
    cursor.execute(datesql)
657
    result = cursor.fetchall()
658
    rb = open_workbook(TMP_FILE,formatting_info=True)
659
    workbook = copy(rb)
660
 
661
    worksheet = workbook.add_sheet("Onboarding")
662
    boldStyle = xlwt.XFStyle()
663
    newStyle= xlwt.XFStyle()
664
    style = xlwt.XFStyle()
665
    pattern = xlwt.Pattern()
666
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
667
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
668
    style.pattern = pattern
669
    f = xlwt.Font()
670
    f.bold = True
671
    boldStyle.font = f
672
 
673
    column = 0
674
    row = 0
675
    currentList=[]
676
 
677
    worksheet.write(0,0,'Call Disposition Type',style)
678
    worksheet.write(0,1,'Count',style)
679
    worksheet.write(1, column, 'Call Later', newStyle)
680
    worksheet.write(2,column, 'Ringing No Answer', newStyle)
681
    worksheet.write(3,column, 'Not Reachable', newStyle)
682
    worksheet.write(4,column, 'Switched Off', newStyle)
683
    worksheet.write(5,column, 'Successful', newStyle)
684
    worksheet.write(6,column, 'Contactable Data', newStyle)
685
    worksheet.write(7,column, 'Non Contactable Data', newStyle)
686
    worksheet.write(8,column, 'Agents Logged In', style)
687
    worksheet.write(9,column, 'Average Login Time (In Hrs)', style)
688
    worksheet.write(10,column, 'Total Dialed Out', style)
689
    worksheet.write(11,column, 'Average Dialed Out per agent', style)
690
    worksheet.write(12,column, 'Average Call Duration (In Hrs)', style)
691
 
692
    contactableData=0
693
    nonContactableData=0
694
    totalDispositions=0
695
    print result
696
    for r in result:
697
        row = onBoardingDispositionMap.get(r[0])+1
698
        if onBoardingDispositionMap.get(r[0]) == 1 or onBoardingDispositionMap.get(r[0]) == 2 or onBoardingDispositionMap.get(r[0]) == 3:
699
            nonContactableData+=int(r[1])
700
        else:
701
            contactableData+=r[1] 
702
        currentList.append(str(row))
703
        column = 1
704
        worksheet.write(row, column, r[1])
705
 
706
    remainingList = list(set(onBoardingList) - set(currentList))
707
    print remainingList
708
    for i,val in enumerate(remainingList):
709
        row = int(val)
710
        print row
711
        column = 1
712
        worksheet.write(row, column, 0)
713
    totalDispositions=contactableData+nonContactableData
714
    worksheet.write(6,1,(contactableData/float(totalDispositions))*100)
715
    worksheet.write(7,1,(nonContactableData/float(totalDispositions))*100)
716
 
717
 
718
    conn.close()
719
    datesql=ONBOARDING_QUERY_LOGIN_TIME 
720
    conn = getDbConnection()
721
 
722
    cursor = conn.cursor()
723
    cursor.execute(datesql)
724
    result = cursor.fetchall()
725
    agentLoginList=[]
726
    averageLoginTime=0
727
    loginTime=0
728
    for r in result:
729
        loginTime+=r[1].seconds
730
        agentLoginList.append(str(r[0]))
731
    averageLoginTime=loginTime/len(list(set(agentLoginList)))
732
    hours=averageLoginTime/3600
733
    minutesLeft=(averageLoginTime%3600)/60
734
    worksheet.write(8,1,len(list(set(agentLoginList))))
735
    worksheet.write(9,1,str(hours) + ':'+ str(minutesLeft))   
736
    worksheet.write(10,1,totalDispositions)
737
    worksheet.write(11,1,(contactableData+nonContactableData)/len(list(set(agentLoginList))))
738
    conn.close()
739
    datesql=ONBOARDING_QUERY_DURATION
740
    conn = getDbConnection()
741
 
742
    cursor = conn.cursor()
743
    cursor.execute(datesql)
744
    result = cursor.fetchall()
745
    for r in result:
746
        totalCallDuration= r[0]
747
    averageCallDuration=totalCallDuration/len(list(set(agentLoginList)))    
748
    hours=averageCallDuration/3600
749
    minutesLeft=(averageCallDuration%3600)/60    
750
    worksheet.write(12,1,str(int(hours))+':'+str(int(minutesLeft)))
751
    workbook.save(TMP_FILE)
752
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
753
 
754
 
755
def generateAgentWiseOnboardingCallingReport():
756
 
757
    agentId=3
758
    rb = open_workbook(TMP_FILE,formatting_info=True)
759
    workbook = copy(rb)
760
    numberOfSheets=rb.nsheets
761
    print 'Number of sheets ' + str(numberOfSheets)
762
    sheet=rb.sheet_by_index(numberOfSheets-1)
763
    worksheet = workbook.get_sheet(numberOfSheets-1)
764
    boldStyle = xlwt.XFStyle()
765
    newStyle= xlwt.XFStyle()
766
    style = xlwt.XFStyle()
767
    pattern = xlwt.Pattern()
768
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
769
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
770
    style.pattern = pattern
771
    f = xlwt.Font()
772
    f.bold = True
773
    boldStyle.font = f
774
 
775
    column = agentId
776
    row = 25
777
 
778
    worksheet.write(row,column-1,'Call Disposition Type',style)
779
    worksheet.write(row+1, column-1, 'Call Later', newStyle)
780
    worksheet.write(row+2,column-1, 'Ringing No Answer', newStyle)
781
    worksheet.write(row+3,column-1, 'Not Reachable', newStyle)
782
    worksheet.write(row+4,column-1, 'Switched Off', newStyle)
783
    worksheet.write(row+5,column-1, 'Successful', newStyle)
784
    worksheet.write(row+6,column-1, 'Contactable Data', newStyle)
785
    worksheet.write(row+7,column-1, 'Non Contactable Data', newStyle)
786
    worksheet.write(row+8,column-1, 'Total Dialed Out', style)
787
    worksheet.write(row+9,column-1, 'Login Time (In Hrs)', style)
788
    worksheet.write(row+10,column-1, 'Call Duration (In Hrs)', style)
789
 
790
    columnId=agentId
791
    while True:
792
            if agentId >5 :
793
                break
794
            else: 
795
                datesql=AGENT_ONBOARDING_QUERY %(agentId)
796
                conn = getDbConnection()
797
 
798
                cursor = conn.cursor()
799
                cursor.execute(datesql)
800
                result = cursor.fetchall()
801
 
802
                currentList=[]
803
                contactableData=0
804
                nonContactableData=0
805
                if cursor.rowcount ==0:
806
                    agentId+=1
807
                    continue    
808
                else:
809
                    print result
810
                    for r in result:
811
                        row = onBoardingDispositionMap.get(r[0])+26
812
                        if onBoardingDispositionMap.get(r[0]) == 1 or onBoardingDispositionMap.get(r[0]) == 2 or onBoardingDispositionMap.get(r[0]) == 3 or followUpDispositionMap.get(r[0]) == 4:
813
                            nonContactableData+=int(r[1])
814
                        else:
815
                            contactableData+=r[1] 
816
                        currentList.append(str(onBoardingDispositionMap.get(r[0])+1))
817
                        column = agentId
818
                        worksheet.write(row, columnId, r[1])
819
                    remainingList = list(set(onBoardingList) - set(currentList))
820
 
821
                    for i,val in enumerate(remainingList):
822
                        row = int(val)+25
823
                        column = agentId
824
                        worksheet.write(row, columnId, 0)
825
                    totalDialedOut = contactableData+nonContactableData
826
                    worksheet.write(25+6,columnId,(contactableData/float(totalDialedOut))*100)
827
                    worksheet.write(25+7,columnId,(nonContactableData/float(totalDialedOut))*100)
828
                    worksheet.write(25+8,columnId,totalDialedOut)
829
                    conn.close()
830
 
831
                    name_query=AGENT_NAME_QUERY %(agentId)
832
                    conn = getDbConnection()
833
                    column=agentId
834
                    cursor = conn.cursor()
835
                    cursor.execute(name_query)
836
                    result = cursor.fetchall()
837
                    for r in result:
838
                        worksheet.write(25,columnId,r,style)
839
 
840
                    conn.close()
841
 
842
 
843
                    name_query=ONBOARDING_QUERY_LOGIN_TIME %(agentId)
844
                    conn = getDbConnection()
845
                    column=agentId
846
                    cursor = conn.cursor()
847
                    cursor.execute(name_query)
848
                    result = cursor.fetchall()
849
                    loginTime=0
850
                    for r in result:
851
                        loginTime+=r[0].seconds
852
 
853
                    hours=loginTime/3600
854
                    minutesLeft=(loginTime%3600)/60
855
                    worksheet.write(25+9,columnId,str(hours)+':'+str(minutesLeft))    
856
                    conn.close()
857
 
858
                    name_query=ONBOARDING_QUERY_DURATION %(agentId)
859
                    conn = getDbConnection()
860
                    column=agentId
861
                    cursor = conn.cursor()
862
                    cursor.execute(name_query)
863
                    result = cursor.fetchall()
864
                    loginTime=0
865
                    for r in result:
866
                        loginTime+=r[0]
867
                    hours=loginTime/3600
868
                    minutesLeft=(loginTime%3600)/60
869
                    worksheet.write(25+10,columnId,str(int(hours))+':'+str(int(minutesLeft)))    
870
                    conn.close()
871
 
872
                agentId+=1
873
                columnId+=1
874
    workbook.save(TMP_FILE)          
875
 
876
 
877
 
878
def main():
879
    generateFreshCallingReport()
880
    generateAgentWiseFreshCallingReport()
881
    generateFollowUpCallingReport()
882
    generateAgentWiseFollowupCallingReport()
883
    generateOnBoardingCallingReport()
884
    generateAgentWiseOnboardingCallingReport()
885
 
886
def sendmail(email, message, fileName, title):
887
    if email == "":
888
        return
889
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
890
    mailServer.ehlo()
891
    mailServer.starttls()
892
    mailServer.ehlo()
893
 
894
    # Create the container (outer) email message.
895
    msg = MIMEMultipart()
896
    msg['Subject'] = title
897
    msg.preamble = title
898
    html_msg = MIMEText(message, 'html')
899
    msg.attach(html_msg)
900
 
901
    fileMsg = MIMEBase('application', 'vnd.ms-excel')
902
    fileMsg.set_payload(file(TMP_FILE).read())
903
    encoders.encode_base64(fileMsg)
904
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
905
    msg.attach(fileMsg)
906
    print 'Sending report'
907
    #MAILTO = ['manas.kapoor@saholic.com','rajneesh.arora@saholic.com']
908
    MAILTO = ['manas.kapoor@saholic.com']
909
    mailServer.login(SENDER, PASSWORD)
910
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
911
 
912
if __name__ == '__main__':
913
    main()