Subversion Repositories SmartDukaan

Rev

Rev 15395 | Go to most recent revision | Details | 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)
265
    worksheet.write(20,1,(contactableData+nonContactableData)/len(list(set(agentLoginList))))
266
    conn.close()
267
    datesql=FRESH_QUERY_DURATION
268
    conn = getDbConnection()
269
 
270
    cursor = conn.cursor()
271
    cursor.execute(datesql)
272
    result = cursor.fetchall()
273
    for r in result:
274
        totalCallDuration= r[0]
275
    averageCallDuration=totalCallDuration/len(list(set(agentLoginList)))    
276
    hours=averageCallDuration/3600
277
    minutesLeft=(averageCallDuration%3600)/60    
278
    worksheet.write(21,1,str(int(hours))+':'+str(int(minutesLeft)))
279
 
280
    workbook.save(TMP_FILE)
281
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
282
 
283
 
284
def generateAgentWiseFreshCallingReport():
285
 
286
    agentId=3
287
    #global workbook
288
    rb = open_workbook(TMP_FILE,formatting_info=True)
289
    workbook = copy(rb)
290
    numberOfSheets=rb.nsheets
291
    print 'Number of sheets ' + str(numberOfSheets)
292
    sheet=rb.sheet_by_index(numberOfSheets-1)
293
    worksheet = workbook.get_sheet(numberOfSheets-1)
294
 
295
    boldStyle = xlwt.XFStyle()
296
    newStyle= xlwt.XFStyle()
297
    style = xlwt.XFStyle()
298
    pattern = xlwt.Pattern()
299
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
300
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
301
    style.pattern = pattern
302
    f = xlwt.Font()
303
    f.bold = True
304
    boldStyle.font = f
305
 
306
    column = agentId
307
    row = 25
308
    worksheet.write(row,column-1,'Call Disposition Type',style)
309
    worksheet.write(row+1, column-1, 'Call Later', newStyle)
310
    worksheet.write(row+2,column-1, 'Ringing No Answer', newStyle)
311
    worksheet.write(row+3,column-1, 'Not Reachable', newStyle)
312
    worksheet.write(row+4,column-1, 'Switched Off', newStyle)
313
    worksheet.write(row+5,column-1, 'Invalid Number', newStyle)
314
    worksheet.write(row+6,column-1, 'Wrong Number', newStyle)
315
    worksheet.write(row+7,column-1, 'Hang Up', newStyle)
316
    worksheet.write(row+8,column-1, 'Retailer Not Interested', newStyle)
317
    worksheet.write(row+9,column-1, 'Already Profitmandi user', boldStyle)   
318
    worksheet.write(row+10,column-1, 'Verified Link Sent', boldStyle)
319
    worksheet.write(row+11,column-1, 'Accessory Retailer', newStyle)
320
    worksheet.write(row+12,column-1, 'Service Center Retailer', newStyle)
321
    worksheet.write(row+13,column-1, 'Not a Retailer', newStyle)
322
    worksheet.write(row+14,column-1, 'Recharge Retailer', newStyle)
323
    worksheet.write(row+15,column-1, 'Contactable Data', newStyle)
324
    worksheet.write(row+16,column-1, 'Non Contactable Data', newStyle)
325
    worksheet.write(row+17,column-1, 'Total Dialed Out', style)
326
    worksheet.write(row+18,column-1, 'Login Time (In Hrs)', style)
327
    worksheet.write(row+19,column-1, 'Call Duration (In Hrs)', style)
328
 
329
    columnId=agentId
330
    while True:
331
            if agentId >5 :
332
                break
333
            else: 
334
                datesql=AGENT_FRESH_QUERY %(agentId)
335
                conn = getDbConnection()
336
 
337
                cursor = conn.cursor()
338
                cursor.execute(datesql)
339
                result = cursor.fetchall()
340
 
341
                currentList=[]
342
                contactableData=0
343
                nonContactableData=0
344
                if cursor.rowcount ==0:
345
 
346
                    agentId+=1
347
                    continue    
348
                else:
349
                    for r in result:
350
                        row = dispositionMap.get(r[0])+26
351
                        if dispositionMap.get(r[0]) == 1 or dispositionMap.get(r[0]) == 2 or dispositionMap.get(r[0]) == 3 or dispositionMap.get(r[0]) == 4:
352
                            nonContactableData+=int(r[1])
353
                        else:
354
                            contactableData+=r[1] 
355
                        currentList.append(str(dispositionMap.get(r[0])))
356
                        column = agentId
357
                        remainingList = list(set(freshList) - set(currentList))
358
 
359
                        worksheet.write(row, columnId, r[1])
360
                        for i,val in enumerate(remainingList):
361
                            row = int(val)+26
362
                            column = agentId
363
                            worksheet.write(row, columnId, 0)
364
                    totalDialedOut = contactableData+nonContactableData
365
                    worksheet.write(25+15,columnId,(contactableData/float(totalDialedOut))*100)
366
                    worksheet.write(25+16,columnId,(nonContactableData/float(totalDialedOut))*100)
367
                    worksheet.write(25+17,columnId,totalDialedOut)
368
                    conn.close()
369
 
370
                    name_query=AGENT_NAME_QUERY %(agentId)
371
                    conn = getDbConnection()
372
                    column=agentId
373
                    cursor = conn.cursor()
374
                    cursor.execute(name_query)
375
                    result = cursor.fetchall()
376
                    for r in result:
377
                        worksheet.write(25,columnId,r,style)
378
 
379
                    conn.close()
380
 
381
 
382
                    name_query=AGENT_FRESH_QUERY_LOGIN_TIME %(agentId)
383
                    conn = getDbConnection()
384
                    column=agentId
385
                    cursor = conn.cursor()
386
                    cursor.execute(name_query)
387
                    result = cursor.fetchall()
388
                    loginTime=0
389
                    for r in result:
390
                        loginTime+=r[0].seconds
391
 
392
                    hours=loginTime/3600
393
                    minutesLeft=(loginTime%3600)/60
394
                    worksheet.write(25+18,columnId,str(hours)+':'+str(minutesLeft))    
395
                    conn.close()
396
 
397
                    name_query=AGENT_FRESH_QUERY_DURATION %(agentId)
398
                    conn = getDbConnection()
399
                    column=agentId
400
                    cursor = conn.cursor()
401
                    cursor.execute(name_query)
402
                    result = cursor.fetchall()
403
                    loginTime=0
404
                    for r in result:
405
                        loginTime+=r[0]
406
                    hours=loginTime/3600
407
                    minutesLeft=(loginTime%3600)/60
408
                    worksheet.write(25+19,columnId,str(int(hours))+':'+str(int(minutesLeft)))    
409
                    conn.close()
410
 
411
                agentId+=1
412
                columnId+=1
413
    workbook.save(TMP_FILE)    
414
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
415
 
416
def generateFollowUpCallingReport():
417
    datesql=FOLLOW_UP_QUERY 
418
    conn = getDbConnection()
419
 
420
    cursor = conn.cursor()
421
    cursor.execute(datesql)
422
    result = cursor.fetchall()
423
    rb = open_workbook(TMP_FILE,formatting_info=True)
424
    workbook = copy(rb)
425
 
426
    worksheet = workbook.add_sheet("FollowUp")
427
    boldStyle = xlwt.XFStyle()
428
    newStyle= xlwt.XFStyle()
429
    style = xlwt.XFStyle()
430
    pattern = xlwt.Pattern()
431
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
432
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
433
    style.pattern = pattern
434
    f = xlwt.Font()
435
    f.bold = True
436
    boldStyle.font = f
437
 
438
    column = 0
439
    row = 0
440
    currentList=[]
441
 
442
    worksheet.write(0,0,'Call Disposition Type',style)
443
    worksheet.write(0,1,'Count',style)
444
 
445
    worksheet.write(1, column, 'Call Later', newStyle)
446
    worksheet.write(2,column, 'Ringing No Answer', newStyle)
447
    worksheet.write(3,column, 'Not Reachable', newStyle)
448
    worksheet.write(4,column, 'Switched Off', newStyle)
449
    worksheet.write(5,column, 'Retailer Not Interested', newStyle)
450
    worksheet.write(6,column, 'Already Profitmandi user', boldStyle)   
451
    worksheet.write(7,column, 'Verified Link Sent', boldStyle)
452
    worksheet.write(8,column, 'Not a retailer', boldStyle)
453
    worksheet.write(9,column, 'Contactable Data', newStyle)
454
    worksheet.write(10,column, 'Non Contactable Data', newStyle)
455
    worksheet.write(11,column, 'Agents Logged In', style)
456
    worksheet.write(12,column, 'Average Login Time (In Hrs)', style)
457
    worksheet.write(13,column, 'Total Dialed Out', style)
458
    worksheet.write(14,column, 'Average Dialed Out per agent', style)
459
    worksheet.write(15,column, 'Average Call Duration (In Hrs)', style)
460
 
461
    contactableData=0
462
    nonContactableData=0
463
    totalDispositions=0
464
    print result
465
    for r in result:
466
        row = followUpDispositionMap.get(r[0])+1
467
        if followUpDispositionMap.get(r[0]) == 1 or followUpDispositionMap.get(r[0]) == 2 or followUpDispositionMap.get(r[0]) == 3 or followUpDispositionMap.get(r[0]) == 4:
468
            nonContactableData+=int(r[1])
469
        else:
470
            contactableData+=r[1] 
471
        currentList.append(str(row))
472
        column = 1
473
        worksheet.write(row, column, r[1])
474
 
475
    remainingList = list(set(followUpList) - set(currentList))
476
    print remainingList
477
    for i,val in enumerate(remainingList):
478
        row = int(val)
479
        print row
480
        column = 1
481
        worksheet.write(row, column, 0)
482
    totalDispositions=contactableData+nonContactableData
483
    worksheet.write(9,1,(contactableData/float(totalDispositions))*100)
484
    worksheet.write(10,1,(nonContactableData/float(totalDispositions))*100)
485
 
486
 
487
    conn.close()
488
    datesql=FOLLOW_UP_QUERY_LOGIN_TIME 
489
    conn = getDbConnection()
490
 
491
    cursor = conn.cursor()
492
    cursor.execute(datesql)
493
    result = cursor.fetchall()
494
    agentLoginList=[]
495
    averageLoginTime=0
496
    loginTime=0
497
    for r in result:
498
        loginTime+=r[1].seconds
499
        agentLoginList.append(str(r[0]))
500
    averageLoginTime=loginTime/len(list(set(agentLoginList)))
501
    hours=averageLoginTime/3600
502
    minutesLeft=(averageLoginTime%3600)/60
503
    worksheet.write(11,1,len(list(set(agentLoginList))))
504
    worksheet.write(12,1,str(hours) + ':'+ str(minutesLeft))   
505
    worksheet.write(13,1,totalDispositions)
506
    worksheet.write(14,1,(contactableData+nonContactableData)/len(list(set(agentLoginList))))
507
    conn.close()
508
    datesql=FOLLOW_UP_QUERY_DURATION
509
    conn = getDbConnection()
510
 
511
    cursor = conn.cursor()
512
    cursor.execute(datesql)
513
    result = cursor.fetchall()
514
    for r in result:
515
        totalCallDuration= r[0]
516
    averageCallDuration=totalCallDuration/len(list(set(agentLoginList)))    
517
    hours=averageCallDuration/3600
518
    minutesLeft=(averageCallDuration%3600)/60    
519
    worksheet.write(15,1,str(int(hours))+':'+str(int(minutesLeft)))
520
    workbook.save(TMP_FILE)
521
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
522
 
523
 
524
def generateAgentWiseFollowupCallingReport():
525
 
526
    agentId=3
527
    rb = open_workbook(TMP_FILE,formatting_info=True)
528
    workbook = copy(rb)
529
    numberOfSheets=rb.nsheets
530
    print 'Number of sheets ' + str(numberOfSheets)
531
    sheet=rb.sheet_by_index(numberOfSheets-1)
532
    worksheet = workbook.get_sheet(numberOfSheets-1)
533
    boldStyle = xlwt.XFStyle()
534
    newStyle= xlwt.XFStyle()
535
    style = xlwt.XFStyle()
536
    pattern = xlwt.Pattern()
537
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
538
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
539
    style.pattern = pattern
540
    f = xlwt.Font()
541
    f.bold = True
542
    boldStyle.font = f
543
 
544
    column = agentId
545
    row = 25
546
    worksheet.write(row,column-1,'Call Disposition Type',style)
547
    worksheet.write(row+1, column-1, 'Call Later', newStyle)
548
    worksheet.write(row+2,column-1, 'Ringing No Answer', newStyle)
549
    worksheet.write(row+3,column-1, 'Not Reachable', newStyle)
550
    worksheet.write(row+4,column-1, 'Switched Off', newStyle)
551
    worksheet.write(row+5,column-1, 'Retailer Not Interested', newStyle)
552
    worksheet.write(row+6,column-1, 'Already Profitmandi user', boldStyle)   
553
    worksheet.write(row+7,column-1, 'Verified Link Sent', boldStyle)
554
    worksheet.write(row+8,column-1, 'Not a Retailer', newStyle)
555
    worksheet.write(row+9,column-1, 'Contactable Data', newStyle)
556
    worksheet.write(row+10,column-1, 'Non Contactable Data', newStyle)
557
    worksheet.write(row+11,column-1, 'Total Dialed Out', style)
558
    worksheet.write(row+12,column-1, 'Login Time (In Hrs)', style)
559
    worksheet.write(row+13,column-1, 'Call Duration (In Hrs)', style)
560
 
561
    columnId=agentId
562
    while True:
563
            if agentId >5 :
564
                break
565
            else: 
566
                datesql=AGENT_FOLLOW_UP_QUERY %(agentId)
567
                conn = getDbConnection()
568
 
569
                cursor = conn.cursor()
570
                cursor.execute(datesql)
571
                result = cursor.fetchall()
572
 
573
                currentList=[]
574
                contactableData=0
575
                nonContactableData=0
576
                if cursor.rowcount ==0:
577
                    agentId+=1
578
                    continue    
579
                else:
580
                    print result
581
                    for r in result:
582
                        row = followUpDispositionMap.get(r[0])+26
583
                        if followUpDispositionMap.get(r[0]) == 1 or followUpDispositionMap.get(r[0]) == 2 or followUpDispositionMap.get(r[0]) == 3 or followUpDispositionMap.get(r[0]) == 4:
584
                            nonContactableData+=int(r[1])
585
                        else:
586
                            contactableData+=r[1] 
587
                        currentList.append(str(followUpDispositionMap.get(r[0])+1))
588
                        column = agentId
589
                        worksheet.write(row, columnId, r[1])
590
                    remainingList = list(set(followUpList) - set(currentList))
591
 
592
                    for i,val in enumerate(remainingList):
593
                        row = int(val)+25
594
                        column = agentId
595
                        worksheet.write(row, columnId, 0)
596
                    totalDialedOut = contactableData+nonContactableData
597
                    worksheet.write(25+9,columnId,(contactableData/float(totalDialedOut))*100)
598
                    worksheet.write(25+10,columnId,(nonContactableData/float(totalDialedOut))*100)
599
                    worksheet.write(25+11,columnId,totalDialedOut)
600
                    conn.close()
601
 
602
                    name_query=AGENT_NAME_QUERY %(agentId)
603
                    conn = getDbConnection()
604
                    column=agentId
605
                    cursor = conn.cursor()
606
                    cursor.execute(name_query)
607
                    result = cursor.fetchall()
608
                    for r in result:
609
                        worksheet.write(25,columnId,r,style)
610
 
611
                    conn.close()
612
 
613
 
614
                    name_query=AGENT_FOLLOW_UP_QUERY_LOGIN_TIME %(agentId)
615
                    conn = getDbConnection()
616
                    column=agentId
617
                    cursor = conn.cursor()
618
                    cursor.execute(name_query)
619
                    result = cursor.fetchall()
620
                    loginTime=0
621
                    for r in result:
622
                        loginTime+=r[0].seconds
623
 
624
                    hours=loginTime/3600
625
                    minutesLeft=(loginTime%3600)/60
626
                    worksheet.write(25+12,columnId,str(hours)+':'+str(minutesLeft))    
627
                    conn.close()
628
 
629
                    name_query=AGENT_FOLLOW_UP_QUERY_DURATION %(agentId)
630
                    conn = getDbConnection()
631
                    column=agentId
632
                    cursor = conn.cursor()
633
                    cursor.execute(name_query)
634
                    result = cursor.fetchall()
635
                    loginTime=0
636
                    for r in result:
637
                        loginTime+=r[0]
638
                    hours=loginTime/3600
639
                    minutesLeft=(loginTime%3600)/60
640
                    worksheet.write(25+13,columnId,str(int(hours))+':'+str(int(minutesLeft)))    
641
                    conn.close()
642
 
643
                agentId+=1
644
                columnId+=1
645
    workbook.save(TMP_FILE)    
646
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)
647
 
648
def generateOnBoardingCallingReport():
649
    datesql=ONBOARDING_QUERY 
650
    conn = getDbConnection()
651
 
652
    cursor = conn.cursor()
653
    cursor.execute(datesql)
654
    result = cursor.fetchall()
655
    rb = open_workbook(TMP_FILE,formatting_info=True)
656
    workbook = copy(rb)
657
 
658
    worksheet = workbook.add_sheet("Onboarding")
659
    boldStyle = xlwt.XFStyle()
660
    newStyle= xlwt.XFStyle()
661
    style = xlwt.XFStyle()
662
    pattern = xlwt.Pattern()
663
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
664
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
665
    style.pattern = pattern
666
    f = xlwt.Font()
667
    f.bold = True
668
    boldStyle.font = f
669
 
670
    column = 0
671
    row = 0
672
    currentList=[]
673
 
674
    worksheet.write(0,0,'Call Disposition Type',style)
675
    worksheet.write(0,1,'Count',style)
676
    worksheet.write(1, column, 'Call Later', newStyle)
677
    worksheet.write(2,column, 'Ringing No Answer', newStyle)
678
    worksheet.write(3,column, 'Not Reachable', newStyle)
679
    worksheet.write(4,column, 'Switched Off', newStyle)
680
    worksheet.write(5,column, 'Successful', newStyle)
681
    worksheet.write(6,column, 'Contactable Data', newStyle)
682
    worksheet.write(7,column, 'Non Contactable Data', newStyle)
683
    worksheet.write(8,column, 'Agents Logged In', style)
684
    worksheet.write(9,column, 'Average Login Time (In Hrs)', style)
685
    worksheet.write(10,column, 'Total Dialed Out', style)
686
    worksheet.write(11,column, 'Average Dialed Out per agent', style)
687
    worksheet.write(12,column, 'Average Call Duration (In Hrs)', style)
688
 
689
    contactableData=0
690
    nonContactableData=0
691
    totalDispositions=0
692
    print result
693
    for r in result:
694
        row = onBoardingDispositionMap.get(r[0])+1
695
        if onBoardingDispositionMap.get(r[0]) == 1 or onBoardingDispositionMap.get(r[0]) == 2 or onBoardingDispositionMap.get(r[0]) == 3:
696
            nonContactableData+=int(r[1])
697
        else:
698
            contactableData+=r[1] 
699
        currentList.append(str(row))
700
        column = 1
701
        worksheet.write(row, column, r[1])
702
 
703
    remainingList = list(set(onBoardingList) - set(currentList))
704
    print remainingList
705
    for i,val in enumerate(remainingList):
706
        row = int(val)
707
        print row
708
        column = 1
709
        worksheet.write(row, column, 0)
710
    totalDispositions=contactableData+nonContactableData
711
    worksheet.write(6,1,(contactableData/float(totalDispositions))*100)
712
    worksheet.write(7,1,(nonContactableData/float(totalDispositions))*100)
713
 
714
 
715
    conn.close()
716
    datesql=ONBOARDING_QUERY_LOGIN_TIME 
717
    conn = getDbConnection()
718
 
719
    cursor = conn.cursor()
720
    cursor.execute(datesql)
721
    result = cursor.fetchall()
722
    agentLoginList=[]
723
    averageLoginTime=0
724
    loginTime=0
725
    for r in result:
726
        loginTime+=r[1].seconds
727
        agentLoginList.append(str(r[0]))
728
    averageLoginTime=loginTime/len(list(set(agentLoginList)))
729
    hours=averageLoginTime/3600
730
    minutesLeft=(averageLoginTime%3600)/60
731
    worksheet.write(8,1,len(list(set(agentLoginList))))
732
    worksheet.write(9,1,str(hours) + ':'+ str(minutesLeft))   
733
    worksheet.write(10,1,totalDispositions)
734
    worksheet.write(11,1,(contactableData+nonContactableData)/len(list(set(agentLoginList))))
735
    conn.close()
736
    datesql=ONBOARDING_QUERY_DURATION
737
    conn = getDbConnection()
738
 
739
    cursor = conn.cursor()
740
    cursor.execute(datesql)
741
    result = cursor.fetchall()
742
    for r in result:
743
        totalCallDuration= r[0]
744
    averageCallDuration=totalCallDuration/len(list(set(agentLoginList)))    
745
    hours=averageCallDuration/3600
746
    minutesLeft=(averageCallDuration%3600)/60    
747
    worksheet.write(12,1,str(int(hours))+':'+str(int(minutesLeft)))
748
    workbook.save(TMP_FILE)
749
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)        
750
 
751
 
752
def generateAgentWiseOnboardingCallingReport():
753
 
754
    agentId=3
755
    rb = open_workbook(TMP_FILE,formatting_info=True)
756
    workbook = copy(rb)
757
    numberOfSheets=rb.nsheets
758
    print 'Number of sheets ' + str(numberOfSheets)
759
    sheet=rb.sheet_by_index(numberOfSheets-1)
760
    worksheet = workbook.get_sheet(numberOfSheets-1)
761
    boldStyle = xlwt.XFStyle()
762
    newStyle= xlwt.XFStyle()
763
    style = xlwt.XFStyle()
764
    pattern = xlwt.Pattern()
765
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
766
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
767
    style.pattern = pattern
768
    f = xlwt.Font()
769
    f.bold = True
770
    boldStyle.font = f
771
 
772
    column = agentId
773
    row = 25
774
 
775
    worksheet.write(row,column-1,'Call Disposition Type',style)
776
    worksheet.write(row+1, column-1, 'Call Later', newStyle)
777
    worksheet.write(row+2,column-1, 'Ringing No Answer', newStyle)
778
    worksheet.write(row+3,column-1, 'Not Reachable', newStyle)
779
    worksheet.write(row+4,column-1, 'Switched Off', newStyle)
780
    worksheet.write(row+5,column-1, 'Successful', newStyle)
781
    worksheet.write(row+6,column-1, 'Contactable Data', newStyle)
782
    worksheet.write(row+7,column-1, 'Non Contactable Data', newStyle)
783
    worksheet.write(row+8,column-1, 'Total Dialed Out', style)
784
    worksheet.write(row+9,column-1, 'Login Time (In Hrs)', style)
785
    worksheet.write(row+10,column-1, 'Call Duration (In Hrs)', style)
786
 
787
    columnId=agentId
788
    while True:
789
            if agentId >5 :
790
                break
791
            else: 
792
                datesql=AGENT_ONBOARDING_QUERY %(agentId)
793
                conn = getDbConnection()
794
 
795
                cursor = conn.cursor()
796
                cursor.execute(datesql)
797
                result = cursor.fetchall()
798
 
799
                currentList=[]
800
                contactableData=0
801
                nonContactableData=0
802
                if cursor.rowcount ==0:
803
                    agentId+=1
804
                    continue    
805
                else:
806
                    print result
807
                    for r in result:
808
                        row = onBoardingDispositionMap.get(r[0])+26
809
                        if onBoardingDispositionMap.get(r[0]) == 1 or onBoardingDispositionMap.get(r[0]) == 2 or onBoardingDispositionMap.get(r[0]) == 3 or followUpDispositionMap.get(r[0]) == 4:
810
                            nonContactableData+=int(r[1])
811
                        else:
812
                            contactableData+=r[1] 
813
                        currentList.append(str(onBoardingDispositionMap.get(r[0])+1))
814
                        column = agentId
815
                        worksheet.write(row, columnId, r[1])
816
                    remainingList = list(set(onBoardingList) - set(currentList))
817
 
818
                    for i,val in enumerate(remainingList):
819
                        row = int(val)+25
820
                        column = agentId
821
                        worksheet.write(row, columnId, 0)
822
                    totalDialedOut = contactableData+nonContactableData
823
                    worksheet.write(25+6,columnId,(contactableData/float(totalDialedOut))*100)
824
                    worksheet.write(25+7,columnId,(nonContactableData/float(totalDialedOut))*100)
825
                    worksheet.write(25+8,columnId,totalDialedOut)
826
                    conn.close()
827
 
828
                    name_query=AGENT_NAME_QUERY %(agentId)
829
                    conn = getDbConnection()
830
                    column=agentId
831
                    cursor = conn.cursor()
832
                    cursor.execute(name_query)
833
                    result = cursor.fetchall()
834
                    for r in result:
835
                        worksheet.write(25,columnId,r,style)
836
 
837
                    conn.close()
838
 
839
 
840
                    name_query=ONBOARDING_QUERY_LOGIN_TIME %(agentId)
841
                    conn = getDbConnection()
842
                    column=agentId
843
                    cursor = conn.cursor()
844
                    cursor.execute(name_query)
845
                    result = cursor.fetchall()
846
                    loginTime=0
847
                    for r in result:
848
                        loginTime+=r[0].seconds
849
 
850
                    hours=loginTime/3600
851
                    minutesLeft=(loginTime%3600)/60
852
                    worksheet.write(25+9,columnId,str(hours)+':'+str(minutesLeft))    
853
                    conn.close()
854
 
855
                    name_query=ONBOARDING_QUERY_DURATION %(agentId)
856
                    conn = getDbConnection()
857
                    column=agentId
858
                    cursor = conn.cursor()
859
                    cursor.execute(name_query)
860
                    result = cursor.fetchall()
861
                    loginTime=0
862
                    for r in result:
863
                        loginTime+=r[0]
864
                    hours=loginTime/3600
865
                    minutesLeft=(loginTime%3600)/60
866
                    worksheet.write(25+10,columnId,str(int(hours))+':'+str(int(minutesLeft)))    
867
                    conn.close()
868
 
869
                agentId+=1
870
                columnId+=1
871
    workbook.save(TMP_FILE)          
872
 
873
 
874
 
875
def main():
876
    generateFreshCallingReport()
877
    generateAgentWiseFreshCallingReport()
878
    generateFollowUpCallingReport()
879
    generateAgentWiseFollowupCallingReport()
880
    generateOnBoardingCallingReport()
881
    generateAgentWiseOnboardingCallingReport()
882
 
883
def sendmail(email, message, fileName, title):
884
    if email == "":
885
        return
886
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
887
    mailServer.ehlo()
888
    mailServer.starttls()
889
    mailServer.ehlo()
890
 
891
    # Create the container (outer) email message.
892
    msg = MIMEMultipart()
893
    msg['Subject'] = title
894
    msg.preamble = title
895
    html_msg = MIMEText(message, 'html')
896
    msg.attach(html_msg)
897
 
898
    fileMsg = MIMEBase('application', 'vnd.ms-excel')
899
    fileMsg.set_payload(file(TMP_FILE).read())
900
    encoders.encode_base64(fileMsg)
901
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
902
    msg.attach(fileMsg)
903
    print 'Sending report'
904
    #MAILTO = ['manas.kapoor@saholic.com','rajneesh.arora@saholic.com']
905
    MAILTO = ['manas.kapoor@saholic.com']
906
    mailServer.login(SENDER, PASSWORD)
907
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
908
 
909
if __name__ == '__main__':
910
    main()