Subversion Repositories SmartDukaan

Rev

Rev 18059 | Rev 18383 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 18059 Rev 18382
Line 16... Line 16...
16
import MySQLdb
16
import MySQLdb
17
import smtplib
17
import smtplib
18
import time
18
import time
19
import xlwt
19
import xlwt
20
import pymongo
20
import pymongo
21
from shop2020.utils.Utils import to_py_date, to_java_date
-
 
22
from datetime import datetime
21
from datetime import datetime
23
from elixir import *
22
from elixir import *
24
from dtr.storage import DataService
23
from dtr.storage import DataService
25
from dtr.storage.DataService import Orders, Users, CallHistory
24
from dtr.storage.DataService import Orders, Users, CallHistory
26
from sqlalchemy.sql.expression import func
25
from sqlalchemy.sql.expression import func
27
from dtr.utils.MailSender import Email
26
from dtr.utils.MailSender import Email
-
 
27
import optparse
28
 
28
 
29
DB_HOST = "localhost"
29
DB_HOST = "localhost"
30
DB_USER = "root"
30
DB_USER = "root"
31
DB_PASSWORD = "shop2020"
31
DB_PASSWORD = "shop2020"
32
DB_NAME = "dtr"
32
DB_NAME = "dtr"
33
TMP_FILE = "/tmp/CRM_OutBound_Report.xls"  
33
TMP_FILE = "/tmp/CRM_OutBound_Report.xls"
-
 
34
RET_FILE = "/tmp/CRM_Retention_Report.xls"  
34
 
35
 
35
con = None
36
con = None
36
 
37
 
37
SENDER = "adwords@shop2020.in"
38
SENDER = "adwords@shop2020.in"
38
PASSWORD = "adwords_shop2020"
39
PASSWORD = "adwords_shop2020"
39
SUBJECT = "CRM Outbound Report for " + str(date.today() - timedelta(days=1))
40
SUBJECT = "CRM Outbound Report for " + str(date.today() - timedelta(days=1))
40
SMTP_SERVER = "smtp.gmail.com"
41
SMTP_SERVER = "smtp.gmail.com"
41
SMTP_PORT = 587    
42
SMTP_PORT = 587    
42
 
43
 
-
 
44
RET_SUBJECT = "CRM Retention Report for " + str(date.today())
-
 
45
 
43
date_format = xlwt.XFStyle()
46
date_format = xlwt.XFStyle()
44
date_format.num_format_str = 'yyyy/mm/dd'
47
date_format.num_format_str = 'yyyy/mm/dd'
45
 
48
 
46
datetime_format = xlwt.XFStyle()
49
datetime_format = xlwt.XFStyle()
47
datetime_format.num_format_str = 'yyyy/mm/dd HH:MM AM/PM'
50
datetime_format.num_format_str = 'yyyy/mm/dd HH:MM AM/PM'
48
 
51
 
49
default_format = xlwt.XFStyle()
52
default_format = xlwt.XFStyle()
50
freshList=['1','2','3','4','5','6','7','8','9','10','11','12','13']
53
freshList=['1','2','3','4','5','6','7','8','9','10','11','12','13']
51
followUpList=['1','2','3','4','5','6','7','8','9','10']
54
followUpList=['1','2','3','4','5','6','7','8','9','10']
52
onBoardingList=['1','2','3','4','5'] 
55
onBoardingList=['1','2','3','4','5']
-
 
56
accsList=['1','2','3','4','5','6','7','8','9','10','11','12'] 
53
dispositionMap = {  'call_later':0,
57
dispositionMap = {  'call_later':0,
54
                    'ringing_no_answer':1,
58
                    'ringing_no_answer':1,
55
                    'not_reachable':2,
59
                    'not_reachable':2,
56
                    'switch_off':3,
60
                    'switch_off':3,
57
                    'invalid_no':4,
61
                    'invalid_no':4,
Line 83... Line 87...
83
                    'not_reachable':2,
87
                    'not_reachable':2,
84
                    'switch_off':3,
88
                    'switch_off':3,
85
                    'onboarded':4,
89
                    'onboarded':4,
86
                }
90
                }
87
 
91
 
-
 
92
accsDispositionMap = {  'call_later':1,
-
 
93
                'ringing_no_answer':2,
-
 
94
                'not_reachable':3,
-
 
95
                'switch_off':4,
-
 
96
                'technical_issue':5,
-
 
97
                'pricing_issue':6,
-
 
98
                'shipping_issue':7,
-
 
99
                'internet_issue':8,
-
 
100
                'checking_price':9,
-
 
101
                'order_process':10,
-
 
102
                'placed_order':11,
-
 
103
                'place_order':12
-
 
104
              }
88
# FRESH_QUERY="""
105
# FRESH_QUERY="""
89
# select call_disposition,count(1) from 
106
# select call_disposition,count(1) from 
90
# (select * from (select * from callhistory where date(created)=date(now()) 
107
# (select * from (select * from callhistory where date(created)=date(now()) 
91
# and call_type ='fresh' order by created desc) 
108
# and call_type ='fresh' order by created desc) 
92
# as a group by retailer_id) 
109
# as a group by retailer_id) 
Line 246... Line 263...
246
"""
263
"""
247
 
264
 
248
center_alignment=xlwt.easyxf("align: horiz center")
265
center_alignment=xlwt.easyxf("align: horiz center")
249
 
266
 
250
 
267
 
-
 
268
ACCS_CART_QUERY="""
-
 
269
select call_disposition,count(1) from 
-
 
270
(select * from (select * from callhistorycrm where date(created)=date(now()) 
-
 
271
and project_id=1 order by created desc) 
-
 
272
as a group by user_id) 
-
 
273
a1 group by date(created), call_disposition;
-
 
274
"""
-
 
275
ACCS_CART_AGENTS_CALLED_COUNT="""
-
 
276
select distinct(agent_id) from callhistorycrm where project_id=1 and date(created) = date(now())
-
 
277
"""
-
 
278
ACCS_CART_QUERY_LOGIN_TIME="""
-
 
279
select agent_id,TIMEDIFF(logoutTime,loginTime) from agentlogintimings where role='accs_cart' and date(created)=date(now());
-
 
280
"""
-
 
281
ACCS_CART_DISPOSITION_DESCRIPTION="""
-
 
282
select user_id,call_disposition,disposition_description,disposition_comments 
-
 
283
from callhistorycrm where call_disposition not in ('ringing_no_answer','not_reachable','switch_off','call_later') 
-
 
284
and date(created)=date(now())"""
-
 
285
 
-
 
286
ACCS_CART_PRODUCT_PRICING="""
-
 
287
select user_id,call_disposition,product_input,pricing_input from productpricinginputs where 
-
 
288
date(created)=date(now()) and product_input not like '';
-
 
289
"""
251
 
290
 
252
def getDbConnection():
291
def getDbConnection():
253
    return MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
292
    return MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
254
 
293
 
-
 
294
def generateAccessoriesCartReport():
-
 
295
    datesql=ACCS_CART_QUERY 
-
 
296
    conn = getDbConnection()
-
 
297
    
-
 
298
    cursor = conn.cursor()
-
 
299
    cursor.execute(datesql)
-
 
300
    result = cursor.fetchall()
-
 
301
    global newWorkbook
-
 
302
    newWorkbook = xlwt.Workbook()
-
 
303
    worksheet = newWorkbook.add_sheet("Accessories Cart")
-
 
304
    boldStyle = xlwt.XFStyle()
-
 
305
    newStyle= xlwt.XFStyle()
-
 
306
    style = xlwt.XFStyle()
-
 
307
    pattern = xlwt.Pattern()
-
 
308
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
-
 
309
    pattern.pattern_fore_colour = xlwt.Style.colour_map['yellow']
-
 
310
    style.pattern = pattern
-
 
311
    f = xlwt.Font()
-
 
312
    f.bold = True
-
 
313
    boldStyle.font = f
-
 
314
    
-
 
315
    column = 0
-
 
316
    row = 0
-
 
317
    currentList=[]
-
 
318
    
-
 
319
    worksheet.write(0,0,'Call Disposition Type',style)
-
 
320
    worksheet.write(0,1,'Count',style)
-
 
321
    worksheet.write(1, column, 'Call Later', newStyle)
-
 
322
    worksheet.write(2,column, 'Ringing No Answer', newStyle)
-
 
323
    worksheet.write(3,column, 'Not Reachable', newStyle)
-
 
324
    worksheet.write(4,column, 'Switched Off', newStyle)
-
 
325
    worksheet.write(5,column, 'Technical Issue', newStyle)
-
 
326
    worksheet.write(6,column, 'Pricing Issue', newStyle)
-
 
327
    worksheet.write(7,column, 'Shipping Issue', newStyle)
-
 
328
    worksheet.write(8,column, 'Internet Issue', newStyle)
-
 
329
    worksheet.write(9,column, 'Checking Price', newStyle)   
-
 
330
    worksheet.write(10,column, 'Order Process', newStyle)
-
 
331
    worksheet.write(11,column, 'Placed Order', newStyle)
-
 
332
    worksheet.write(12,column, 'Will Place Order', boldStyle)
-
 
333
    worksheet.write(13,column, 'Contactable Data (%)', newStyle)
-
 
334
    worksheet.write(14,column, 'Non Contactable Data (%)', newStyle)
-
 
335
    worksheet.write(15,column, 'Agents Logged In', style)
-
 
336
    worksheet.write(16,column, 'Average Login Time (In Hrs)', style)
-
 
337
    worksheet.write(17,column, 'Total Dialed Out', style)
-
 
338
    worksheet.write(18,column, 'Average Dialed Out per agent', style)
-
 
339
 
-
 
340
    contactableData=0
-
 
341
    nonContactableData=0
-
 
342
    
-
 
343
    for r in result:
-
 
344
        row = accsDispositionMap.get(r[0])
-
 
345
        if accsDispositionMap.get(r[0]) == 2 or accsDispositionMap.get(r[0]) == 3 or accsDispositionMap.get(r[0]) == 4:
-
 
346
            nonContactableData+=int(r[1])
-
 
347
        else:
-
 
348
            contactableData+=r[1] 
-
 
349
        currentList.append(str(row))
-
 
350
        column = 1
-
 
351
        worksheet.write(row, column, r[1],center_alignment)
-
 
352
        
-
 
353
    remainingList = list(set(accsList) - set(currentList))
-
 
354
    for i,val in enumerate(remainingList):
-
 
355
        row = int(val)
-
 
356
        column = 1
-
 
357
        worksheet.write(row, column, 0,center_alignment)
-
 
358
    totalDispositions=contactableData+nonContactableData
-
 
359
    
-
 
360
    if totalDispositions > 0:
-
 
361
        worksheet.write(13,1,round((contactableData/float(totalDispositions))*100,2),center_alignment)
-
 
362
        worksheet.write(14,1,round((nonContactableData/float(totalDispositions))*100,2),center_alignment)
-
 
363
    
-
 
364
    conn.close()
-
 
365
    
-
 
366
    datesql=ACCS_CART_AGENTS_CALLED_COUNT 
-
 
367
    conn = getDbConnection()
-
 
368
    cursor = conn.cursor()
-
 
369
    cursor.execute(datesql)
-
 
370
    result = cursor.fetchall()
-
 
371
    agentLoginList=[]
-
 
372
    for r in result:
-
 
373
        agentLoginList.append(str(r[0]))
-
 
374
    conn.close()
255
 
375
 
-
 
376
    if len(list(set(agentLoginList))) > 0:    
-
 
377
        datesql=ACCS_CART_QUERY_LOGIN_TIME
-
 
378
        conn = getDbConnection()
-
 
379
        cursor = conn.cursor()
-
 
380
        cursor.execute(datesql)
-
 
381
        result = cursor.fetchall()
-
 
382
        loginTime=0
-
 
383
        for r in result:
-
 
384
            loginTime+=r[1].seconds
-
 
385
        averageLoginTime=loginTime/len(list(set(agentLoginList)))
-
 
386
        hours=averageLoginTime/3600
-
 
387
        minutesLeft=(averageLoginTime%3600)/60
-
 
388
        worksheet.write(15,1,len(list(set(agentLoginList))),center_alignment)
-
 
389
        worksheet.write(16,1,str(hours) + ':'+ str(minutesLeft),center_alignment)   
-
 
390
        worksheet.write(17,1,totalDispositions,center_alignment)
-
 
391
        worksheet.write(18,1,totalDispositions/float(len(list(set(agentLoginList)))),center_alignment)
-
 
392
        conn.close()
-
 
393
    
-
 
394
    
-
 
395
    worksheet.write(0,5, 'User Id', style)
-
 
396
    worksheet.write(0,6, 'Call Disposition', style)
-
 
397
    worksheet.write(0,7, 'Disposition Description', style)
-
 
398
    worksheet.write(0,8, 'Disposition Comments', style)    
-
 
399
    datesql = ACCS_CART_DISPOSITION_DESCRIPTION
-
 
400
    conn = getDbConnection()
-
 
401
    cursor = conn.cursor()
-
 
402
    cursor.execute(datesql)
-
 
403
    result = cursor.fetchall()
-
 
404
    row=0
-
 
405
    for r in result:
-
 
406
        row=row+1
-
 
407
        column =5
-
 
408
        for data in r:
-
 
409
            worksheet.write(row,column,data)
-
 
410
            column+=1
-
 
411
    conn.close()
-
 
412
    
-
 
413
    worksheet.write(20,0, 'User Id', style)
-
 
414
    worksheet.write(20,1, 'Call Disposition', style)
-
 
415
    worksheet.write(20,2, 'Product Inputs', style)
-
 
416
    worksheet.write(20,3, 'Pricing Inputs', style)    
-
 
417
    datesql = ACCS_CART_PRODUCT_PRICING
-
 
418
    conn = getDbConnection()
-
 
419
    cursor = conn.cursor()
-
 
420
    cursor.execute(datesql)
-
 
421
    result = cursor.fetchall()
-
 
422
    row=20
-
 
423
    for r in result:
-
 
424
        row=row+1
-
 
425
        column =0
-
 
426
        for data in r:
-
 
427
            worksheet.write(row,column,data)
-
 
428
            column+=1
-
 
429
        
-
 
430
    newWorkbook.save(RET_FILE)
-
 
431
    
256
def generateFreshCallingReport():
432
def generateFreshCallingReport():
257
    datesql=FRESH_QUERY 
433
    datesql=FRESH_QUERY 
258
    conn = getDbConnection()
434
    conn = getDbConnection()
259
    
435
    
260
    cursor = conn.cursor()
436
    cursor = conn.cursor()
Line 1215... Line 1391...
1215
    workbook.save(TMP_FILE)          
1391
    workbook.save(TMP_FILE)          
1216
 
1392
 
1217
 
1393
 
1218
        
1394
        
1219
def main():
1395
def main():
-
 
1396
    parser = optparse.OptionParser()
-
 
1397
    parser.add_option("-T", "--reporttype", dest="reporttype",
-
 
1398
                      default="crmoutbound",
-
 
1399
                      type="str", help="To avoid not needed order backups",
-
 
1400
                      metavar="REPORTTYPE")
-
 
1401
    (options, args) = parser.parse_args()
-
 
1402
    if options.reporttype == 'crmoutbound':
1220
    generateFreshCallingReport()
1403
        generateFreshCallingReport()
1221
    generateAgentWiseFreshCallingReport()
1404
        generateAgentWiseFreshCallingReport()
1222
    generateFollowUpCallingReport()
1405
        generateFollowUpCallingReport()
1223
    generateAgentWiseFollowupCallingReport()
1406
        generateAgentWiseFollowupCallingReport()
1224
    generateOnBoardingCallingReport()
1407
        generateOnBoardingCallingReport()
1225
    generateAgentWiseOnboardingCallingReport()
1408
        generateAgentWiseOnboardingCallingReport()
1226
    sendmail(["amit.sirohi@shop2020.in","rajneesh.arora@saholic.com","ritesh.chauhan@shop2020.in", "shailesh.kumar@shop2020.in","utkarsh@coreoutsourcingservices.com","gupta.varun@coreoutsourcingservices.com","manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)
1409
        sendmailretention(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)
1227
    #sendmail(["manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)
1410
        sendmail(["amit.sirohi@shop2020.in","rajneesh.arora@saholic.com","ritesh.chauhan@shop2020.in", "shailesh.kumar@shop2020.in","utkarsh@coreoutsourcingservices.com","gupta.varun@coreoutsourcingservices.com","manas.kapoor@shop2020.in"], "", TMP_FILE, SUBJECT)
-
 
1411
    if options.reporttype == 'retention':
1228
    
1412
        generateAccessoriesCartReport()
1229
 
-
 
-
 
1413
        sendmailretention(["manas.kapoor@shop2020.in"], "", RET_FILE, RET_SUBJECT)
-
 
1414
        #sendmailretention(["amit.sirohi@shop2020.in","rajneesh.arora@saholic.com", "shailesh.kumar@shop2020.in","chaitnaya.vats@shop2020.in","manas.kapoor@shop2020.in"], "", RET_FILE, RET_SUBJECT)
1230
         
1415
         
1231
def sendmail(email, message, fileName, title):
1416
def sendmail(email, message, fileName, title):
1232
    if email == "":
1417
    if email == "":
1233
        return
1418
        return
1234
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
1419
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
Line 1250... Line 1435...
1250
    fileMsg.set_payload(file(TMP_FILE).read())
1435
    fileMsg.set_payload(file(TMP_FILE).read())
1251
    encoders.encode_base64(fileMsg)
1436
    encoders.encode_base64(fileMsg)
1252
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
1437
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
1253
    msg.attach(fileMsg)
1438
    msg.attach(fileMsg)
1254
    
1439
    
1255
    MAILTO = ['amit.sirohi@shop2020.in','rajneesh.arora@saholic.com', 'ritesh.chauhan@shop2020.in', 'shailesh.kumar@shop2020.in','gupta.varun@coreoutsourcingservices.com','utkarsh@coreoutsourcingservices.com','manas.kapoor@shop2020.in']
1440
    MAILTO = ['amit.sirohi@shop2020.in','rajneesh.arora@saholic.com', 'shailesh.kumar@shop2020.in','gupta.varun@coreoutsourcingservices.com','utkarsh@coreoutsourcingservices.com','manas.kapoor@shop2020.in']
1256
    #MAILTO = ['manas.kapoor@saholic.com']
1441
    #MAILTO = ['manas.kapoor@saholic.com']
1257
    mailServer.login(SENDER, PASSWORD)
1442
    mailServer.login(SENDER, PASSWORD)
1258
    try:
1443
    try:
1259
        mailServer.sendmail(SENDER, MAILTO, msg.as_string())
1444
        mailServer.sendmail(SENDER, MAILTO, msg.as_string())
1260
    except:
1445
    except:
Line 1265... Line 1450...
1265
            m.addRecipient(receipient)
1450
            m.addRecipient(receipient)
1266
        m.setSubject(title)
1451
        m.setSubject(title)
1267
        m.setHtmlBody(message+"<br>"+message1+"<br>"+message2)
1452
        m.setHtmlBody(message+"<br>"+message1+"<br>"+message2)
1268
        m.send()
1453
        m.send()
1269
 
1454
 
-
 
1455
 
-
 
1456
def sendmailretention(email, message, fileName, title):
-
 
1457
    if email == "":
-
 
1458
        return
-
 
1459
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
-
 
1460
    mailServer.ehlo()
-
 
1461
    mailServer.starttls()
-
 
1462
    mailServer.ehlo()
-
 
1463
    
-
 
1464
    # Create the container (outer) email message.
-
 
1465
    msg = MIMEMultipart()
-
 
1466
    msg['Subject'] = title
-
 
1467
    msg.preamble = title
-
 
1468
    
-
 
1469
    fileMsg = MIMEBase('application', 'vnd.ms-excel')
-
 
1470
    fileMsg.set_payload(file(RET_FILE).read())
-
 
1471
    encoders.encode_base64(fileMsg)
-
 
1472
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
-
 
1473
    msg.attach(fileMsg)
-
 
1474
    
-
 
1475
    MAILTO = ['amit.sirohi@shop2020.in','rajneesh.arora@saholic.com', 'shailesh.kumar@shop2020.in','chaitnaya.vats@shop2020.in','manas.kapoor@shop2020.in']
-
 
1476
    #MAILTO = ['manas.kapoor@saholic.com']
-
 
1477
    mailServer.login(SENDER, PASSWORD)
-
 
1478
    try:
-
 
1479
        mailServer.sendmail(SENDER, MAILTO, msg.as_string())
-
 
1480
    except:
-
 
1481
        m = Email('localhost')
-
 
1482
        mFrom = "dtr@shop2020.in"
-
 
1483
        m.setFrom(mFrom)
-
 
1484
        for receipient in MAILTO:
-
 
1485
            m.addRecipient(receipient)
-
 
1486
        m.setSubject(title)
-
 
1487
        m.send()
-
 
1488
 
1270
if __name__ == '__main__':
1489
if __name__ == '__main__':
1271
    main()
1490
    main()
1272
1491