Subversion Repositories SmartDukaan

Rev

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

Rev 8702 Rev 8714
Line 34... Line 34...
34
from shop2020.thriftpy.model.v1.order.ttypes import TransactionServiceException, \
34
from shop2020.thriftpy.model.v1.order.ttypes import TransactionServiceException, \
35
    OrderStatus
35
    OrderStatus
36
from shop2020.utils.EmailAttachmentSender import get_attachment_part, mail
36
from shop2020.utils.EmailAttachmentSender import get_attachment_part, mail
37
from shop2020.utils.Utils import to_py_date
37
from shop2020.utils.Utils import to_py_date
38
from xml.etree.ElementTree import parse, XML, fromstring
38
from xml.etree.ElementTree import parse, XML, fromstring
-
 
39
from datetime import datetime
39
import csv
40
import csv
40
import datetime
41
import datetime
41
import optparse
42
import optparse
42
import sys
43
import sys
43
import time
44
import time
44
import traceback
45
import traceback
45
import urllib2
46
import urllib2
46
from suds.client import Client
47
from suds.client import Client
-
 
48
import json
-
 
49
import StringIO
-
 
50
import zlib
-
 
51
import gzip
-
 
52
import xmltodict
-
 
53
import ast
47
if __name__ == '__main__' and __package__ is None:
54
if __name__ == '__main__' and __package__ is None:
48
    import os
55
    import os
49
    sys.path.insert(0, os.getcwd())
56
    sys.path.insert(0, os.getcwd())
50
 
57
 
51
 
58
 
52
RED_EXPRESS_URL = "http://tracking.getsetred.net/TrackingService.svc?wsdl"
59
RED_EXPRESS_URL = "http://tracking.getsetred.net/TrackingService.svc?wsdl"
53
username = 'C00086721141'
60
username = 'C00086721141'
54
password = 'SANDEEP.SACHDEVA@SHOP2020.IN'
61
password = 'SANDEEP.SACHDEVA@SHOP2020.IN'
-
 
62
tracking_Id_Type = 'REFERENCENO'
-
 
63
tracking_Level = 'ALL_DETAILS'
-
 
64
 
-
 
65
RED_EXPRESS_TRACKING_URL = 'http://webservices.getsetred.net/Services/BulkTracking.svc/'
-
 
66
headers = {
-
 
67
               "User-Agent" : "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.218 Safari/535.1",
-
 
68
               "Accept" : "    text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8",
-
 
69
               "Accept-Language" : "en-us,en;q=0.5",
-
 
70
               "Accept-Encoding" : "gzip, deflate",
-
 
71
               "Connection" : "keep-alive",
-
 
72
               "Accept-Charset" : "ISO-8859-1",
-
 
73
               "Content-type": "application/json; charset=UTF-8"
-
 
74
               }
55
 
75
 
56
client = None
76
client = None
57
def getClient():
77
def getClient():
58
    global client
78
    global client
59
    if client is None:
79
    if client is None:
Line 82... Line 102...
82
            timestring = element.findtext('Time', '')
102
            timestring = element.findtext('Time', '')
83
            description = element.findtext('ServiceEvent', '')
103
            description = element.findtext('ServiceEvent', '')
84
            results.append(datestring+"~!~"+timestring+"~!~"+description)
104
            results.append(datestring+"~!~"+timestring+"~!~"+description)
85
    return results
105
    return results
86
 
106
 
-
 
107
def get_track_updates(awb_numbers):
-
 
108
    req_args = json.dumps({'password':password,
-
 
109
                           'trackingIdType':'REFERENCENO',
-
 
110
                           'trackingLevel':'ALL_DETAILS',
-
 
111
                           'userId':username,
-
 
112
                           'waybillNo': awb_numbers 
-
 
113
                           })
-
 
114
    request = urllib2.Request(RED_EXPRESS_TRACKING_URL, req_args, headers)
-
 
115
    response = urllib2.urlopen(request)
-
 
116
 
-
 
117
    encoding = response.info().get("Content-Encoding")    
-
 
118
    if encoding in ('gzip', 'x-gzip', 'deflate'):
-
 
119
        content = response.read()
-
 
120
        if encoding == 'deflate':
-
 
121
            track_data_decoded = StringIO.StringIO(zlib.decompress(content))
-
 
122
        else:
-
 
123
            track_data_decoded = gzip.GzipFile('', 'rb', 9, StringIO.StringIO(content))
-
 
124
    track_data_readable = track_data_decoded.read()
-
 
125
    
-
 
126
    conv_dict = xmltodict.parse(track_data_readable)
-
 
127
    track_data_json= json.dumps(conv_dict)
-
 
128
    if track_data_json.find('null') > 0:
-
 
129
        track_data_json = track_data_json.replace('null','\"No Description Available\"');
-
 
130
    if len(awb_numbers) > 0:
-
 
131
        track_data_dict = ast.literal_eval(track_data_json)
-
 
132
 
-
 
133
    if len(awb_numbers)==1:
-
 
134
        track_data_list=[]
-
 
135
        track_data_list.append(track_data_dict['BulkTrackingResponse']['BulkResponse']['TrackingResponse'])
-
 
136
        track_data_list.append('DUMMY')
-
 
137
    elif len(awb_numbers)==0:
-
 
138
        track_data_list=[]
-
 
139
    else:
-
 
140
        track_data_list = track_data_dict['BulkTrackingResponse']['BulkResponse']['TrackingResponse']    
-
 
141
    
-
 
142
    return track_data_list
-
 
143
    
-
 
144
    
87
def process_dao_pickup_orders(provider):
145
def process_dao_pickup_orders(provider):
88
    try:
146
    try:
89
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
147
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
90
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
148
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
91
        if doa_pickup_details:
149
        if doa_pickup_details:
Line 348... Line 406...
348
    print picked_up_orders
406
    print picked_up_orders
349
    return picked_up_orders
407
    return picked_up_orders
350
 
408
 
351
def read_pickup_orders(orders_tobe_picked_up):
409
def read_pickup_orders(orders_tobe_picked_up):
352
    picked_up_orders = {}
410
    picked_up_orders = {}
-
 
411
    awb_number_list =[]
353
    for order in orders_tobe_picked_up:
412
    for order in orders_tobe_picked_up:
354
        try:
-
 
355
            root =  fromstring(str(get_updates(order.airwaybill_no)))
413
        awb_number_list.append(order.airwaybill_no)
356
            children = root.getchildren()
-
 
357
            for child in children:
-
 
358
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
-
 
359
                for element in reversed(nodes):
-
 
360
                    datestring = element.findtext('Date', '')
-
 
361
                    timestring = element.findtext('Time', '')
-
 
362
                    delivery_date = get_py_datetime(datestring, timestring)
-
 
363
                    picked_up_orders[order.airwaybill_no] = str(delivery_date)
-
 
364
                    break
-
 
365
                break
-
 
366
        except:
414
    
367
            pass
415
    track_update_list = get_track_updates(awb_number_list)
368
    
416
    
-
 
417
    for update in track_update_list:
-
 
418
        if update == 'DUMMY':
-
 
419
            continue
-
 
420
        else:
-
 
421
            try:
-
 
422
                airwaybill_no = update['ReferenceNo'] 
-
 
423
                track_list = update['TrackingList']['TrackingList']
-
 
424
                track_list.reverse()
-
 
425
                for track_update in track_list:
-
 
426
                    if track_update['TrackingCode'] == 'BKD' :
-
 
427
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
428
                        datestring  = date_obj.strftime("%Y-%m-%d")
-
 
429
                        timestring = track_update['ExecutionTime']+':00'
-
 
430
                        delivery_date = datestring + timestring
-
 
431
                        picked_up_orders[airwaybill_no] = delivery_date
-
 
432
                        break
-
 
433
                break
-
 
434
            except:
-
 
435
                pass
-
 
436
        
369
    print "Picked up Orders:"
437
    print "Picked up Orders:"
370
    print picked_up_orders
438
    print picked_up_orders
371
    return picked_up_orders
439
    return picked_up_orders
372
 
440
 
373
def read_local_connection_orders(orders_tobe_local_connected):
441
def read_local_connection_orders(orders_tobe_local_connected):
374
    local_connected_orders = {}
442
    local_connected_orders = {}
-
 
443
    
-
 
444
    awb_number_list =[]
375
    for order in orders_tobe_local_connected:
445
    for order in orders_tobe_local_connected:
-
 
446
        awb_number_list.append(order.airwaybill_no)
376
        try:
447
    
377
            root =  fromstring(str(get_updates(order.airwaybill_no)))
448
    track_update_list = get_track_updates(awb_number_list)
-
 
449
    
-
 
450
    for update in track_update_list:
378
            children = root.getchildren()
451
        if update == 'DUMMY':
379
            for child in children:
452
            continue
-
 
453
        else:
-
 
454
            try:
-
 
455
                airwaybill_no = update['ReferenceNo'] 
380
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
456
                track_list = update['TrackingList']['TrackingList']
381
                for element in reversed(nodes):
457
                track_list.reverse()
-
 
458
                for track_update in track_list:
382
                    if element.findtext('TrackingCode', '') == 'PRO':
459
                    if track_update['TrackingCode'] == 'PRO' :
-
 
460
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
383
                        datestring = element.findtext('Date', '')
461
                        datestring  = date_obj.strftime("%Y-%m-%d")
384
                        timestring = element.findtext('Time', '')
462
                        timestring = track_update['ExecutionTime']+':00'
385
                        delivery_date = get_py_datetime(datestring, timestring)
463
                        delivery_date = datestring + timestring
386
                        local_connected_orders[order.airwaybill_no] = str(delivery_date)
464
                        local_connected_orders[airwaybill_no] = delivery_date
387
                        break
465
                        break
388
                break
466
                break
389
        except:
467
            except:
390
            pass
468
                pass
391
            
469
            
392
    print "Local Connected Orders"
470
    print "Local Connected Orders"
393
    print local_connected_orders
471
    print local_connected_orders
394
    
472
    
395
    return local_connected_orders
473
    return local_connected_orders
396
 
474
 
397
def read_reached_destination_orders(orders_tobe_reached_destination_city):
475
def read_reached_destination_orders(orders_tobe_reached_destination_city):
398
    destination_city_reached_orders = {}
476
    destination_city_reached_orders = {}
-
 
477
    
-
 
478
    awb_number_list =[]
399
    for order in orders_tobe_reached_destination_city:
479
    for order in orders_tobe_reached_destination_city:
-
 
480
        awb_number_list.append(order.airwaybill_no)
400
        try:
481
    
401
            root =  fromstring(str(get_updates(order.airwaybill_no)))
482
    track_update_list = get_track_updates(awb_number_list)
-
 
483
    
-
 
484
    for update in track_update_list:
402
            children = root.getchildren()
485
        if update == 'DUMMY':
403
            child_number = 0
486
            continue
-
 
487
        else:
404
            for child in children:
488
            try:
405
                child_number = child_number + 1
489
                airwaybill_no = update['ReferenceNo'] 
406
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
490
                track_list = update['TrackingList']['TrackingList']
-
 
491
                track_list.reverse()
407
                for element in nodes:
492
                for track_update in track_list:
408
                    if element.findtext('TrackingCode', '') == 'RDB':
493
                    if track_update['TrackingCode'] == 'RDB' :
-
 
494
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
409
                        datestring = element.findtext('Date', '')
495
                        datestring  = date_obj.strftime("%Y-%m-%d")
410
                        timestring = element.findtext('Time', '')
496
                        timestring = track_update['ExecutionTime']+':00'
411
                        delivery_date = get_py_datetime(datestring, timestring)
497
                        delivery_date = datestring + timestring
412
                        destination_city_reached_orders[order.airwaybill_no] = str(delivery_date)
498
                        destination_city_reached_orders[airwaybill_no] = delivery_date
413
                        break
499
                        break
-
 
500
                break
414
        except:
501
            except:
415
            pass
502
                pass
416
    
503
    
417
    print "Destination City Reached Orders"
504
    print "Destination City Reached Orders"
418
    print destination_city_reached_orders
505
    print destination_city_reached_orders
419
    
506
    
420
    return destination_city_reached_orders
507
    return destination_city_reached_orders
421
 
508
 
422
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
509
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
423
    first_atdl_orders = {}
510
    first_atdl_orders = {}
-
 
511
    
-
 
512
    awb_number_list =[]
424
    for order in orders_tobe_first_delivery_attempted:
513
    for order in orders_tobe_first_delivery_attempted:
-
 
514
        awb_number_list.append(order.airwaybill_no)
425
        try:
515
    
426
            root =  fromstring(str(get_updates(order.airwaybill_no)))
516
    track_update_list = get_track_updates(awb_number_list)
-
 
517
    
-
 
518
    for update in track_update_list:
427
            children = root.getchildren()
519
        if update == 'DUMMY':
428
            for child in children:
520
            continue
-
 
521
        else:
-
 
522
            try:
-
 
523
                airwaybill_no = update['ReferenceNo'] 
429
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
524
                track_list = update['TrackingList']['TrackingList']
430
                for element in reversed(nodes):
525
                track_list.reverse()
-
 
526
                for track_update in track_list:
431
                    if element.findtext('TrackingCode', '') == 'OFD':
527
                    if track_update['TrackingCode'] == 'OFD' :
-
 
528
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
432
                        datestring = element.findtext('Date', '')
529
                        datestring  = date_obj.strftime("%Y-%m-%d")
433
                        timestring = element.findtext('Time', '')
530
                        timestring = track_update['ExecutionTime']+':00'
434
                        delivery_date = get_py_datetime(datestring, timestring)
531
                        delivery_date = datestring + timestring
435
                        first_atdl_orders[order.airwaybill_no] = str(delivery_date)
532
                        first_atdl_orders[airwaybill_no] = delivery_date
436
                        break
533
                        break
437
                break
534
                break
438
        except:
535
            except:
439
            pass
536
                pass
-
 
537
        
440
    
538
    
441
    print "FIRST DELIVERY ATTEMPT MADE Orders"
539
    print "FIRST DELIVERY ATTEMPT MADE Orders"
442
    print first_atdl_orders
540
    print first_atdl_orders
443
    
541
    
444
    return first_atdl_orders
542
    return first_atdl_orders
445
 
543
 
446
def read_delivery_orders(orders_tobe_delivered):
544
def read_delivery_orders(orders_tobe_delivered):
447
    delivered_orders = {}
545
    delivered_orders = {}
448
    returned_orders = {}
546
    returned_orders = {}
449
    undelivered_orders = {}
547
    undelivered_orders = {}
-
 
548
    awb_order_map = {}
-
 
549
    
450
    for order in orders_tobe_delivered:
550
    for order in orders_tobe_delivered:
-
 
551
        awb_order_list =[]
-
 
552
        awb_order_list.append(order.id)
-
 
553
        awb_order_list.append(order.shipping_timestamp)
-
 
554
        awb_order_map[order.airwaybill_no]= awb_order_list
-
 
555
    
-
 
556
    track_update_list = get_track_updates(awb_order_map.keys())
-
 
557
    
-
 
558
    for update in track_update_list:
-
 
559
        if update == 'DUMMY':
-
 
560
            continue
-
 
561
        else:
451
        try:
562
            try:
-
 
563
                airwaybill_no = update['ReferenceNo'] 
452
            root =  fromstring(str(get_updates(order.airwaybill_no)))
564
                track_list = update['TrackingList']['TrackingList']
453
            children = root.getchildren()
565
                track_list.reverse()
454
            child_number = 0
566
                reason_for_return = None
455
            for child in children:
567
                for record in track_list:
456
                child_number = child_number + 1
568
                    if record['TrackingCode'] == 'UDLD' :
457
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
569
                        reason_for_return = record['ServiceEvent'].split(" -")[1]
458
                if len(nodes):
570
                        break
459
                    node_number = len(nodes)-1
571
                    
460
                    for element in nodes:
572
                for track_update in track_list:
461
                        if element.findtext('TrackingCode', '') == 'DLVD':
573
                    if track_update['TrackingCode'] == 'DLVD' :
-
 
574
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
462
                            datestring = element.findtext('Date', '')
575
                        datestring  = date_obj.strftime("%Y-%m-%d")
463
                            timestring = element.findtext('Time', '')
576
                        timestring = track_update['ExecutionTime']+':00'
464
                            delivery_date = get_py_datetime(datestring, timestring)
577
                        del_date = datestring + timestring
465
                            element1 = child.findall('ShipmentInfo/Consignee')[0]
578
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
466
                            receiver = element1.findtext('Name', '')
579
                        receiver = track_update['ServiceEvent'].split("[ ")[1].split(" ]")[0]
467
                            if to_py_date(order.shipping_timestamp) > delivery_date:
580
                        if to_py_date(awb_order_map.get(airwaybill_no)[1]) > delivery_date:
468
                                mail(from_user, from_pwd, to, "Delivery Problem for Red Express", "Order id " + str(order.id) + " has shipping date " + str(order.shipping_timestamp) + " larger than delivery date " + str(delivery_date))
581
                            mail(from_user, from_pwd, to, "Delivery Problem for Red Express", "Order id " + str(awb_order_map.get(airwaybill_no)[0]) + " has shipping date " + str(awb_order_map.get(airwaybill_no)[1]) + " larger than delivery date " + str(delivery_date))
469
                            else: 
582
                        else:
470
                                delivered_orders[order.airwaybill_no] = str(delivery_date) + "|" +  receiver
583
                            delivered_orders[airwaybill_no] = str(delivery_date) + "|" +  receiver
471
                            break
584
                        break
472
                        elif element.findtext('TrackingCode', '') == 'RTO':
585
                    elif track_update['TrackingCode'] == 'RTO' :
-
 
586
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
473
                            datestring = element.findtext('Date', '')
587
                        datestring  = date_obj.strftime("%Y-%m-%d")
474
                            timestring = element.findtext('Time', '')
588
                        timestring = track_update['ExecutionTime']+':00'
475
                            delivery_date = get_py_datetime(datestring, timestring)
589
                        del_date = datestring + timestring
-
 
590
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
476
                            if node_number < len(nodes)-1:
591
                        if reason_for_return == None:
477
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
592
                            returned_orders[airwaybill_no] = str(delivery_date) + "|"  + " Order Booked for Return"
478
                            else:
593
                        else:
479
                                reason_for_return = element.findtext('ServiceEvent', '')
-
 
480
                            returned_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
594
                            returned_orders[airwaybill_no] = str(delivery_date) + "|"  + reason_for_return
481
                            break       
595
                        break
482
                        elif element.findtext('TrackingCode', '') == 'UDLD':
596
                    elif track_update['TrackingCode'] == 'UDLD' :
-
 
597
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
483
                            datestring = element.findtext('Date', '')
598
                        datestring  = date_obj.strftime("%Y-%m-%d")
484
                            timestring = element.findtext('Time', '')
599
                        timestring = track_update['ExecutionTime']+':00'
485
                            delivery_date = get_py_datetime(datestring, timestring)
600
                        del_date = datestring + timestring
-
 
601
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
486
                            if node_number < len(nodes)-1:
602
                        if reason_for_return == None:
487
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
603
                            undelivered_orders[airwaybill_no] = str(delivery_date) + "|" + track_update['ServiceEvent'].split(" -")[1]
488
                            else:
604
                        else:
489
                                reason_for_return = element.findtext('ServiceEvent', '')
-
 
490
                            undelivered_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
605
                            undelivered_orders[airwaybill_no] = str(delivery_date) + "|" + reason_for_return
491
                            break
606
                        break
492
                        node_number = node_number - 1
607
                break
493
        except:
608
            except:
494
            pass
609
                pass
495
    
610
    
496
    print "Delivered Orders:"
611
    print "Delivered Orders:"
497
    print delivered_orders
612
    print delivered_orders
498
    
613
    
499
    print "Returned Orders:"
614
    print "Returned Orders:"