Subversion Repositories SmartDukaan

Rev

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

Rev 8292 Rev 8699
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
    
-
 
129
    track_data_dict = ast.literal_eval(track_data_json)
-
 
130
 
-
 
131
    if len(awb_numbers)==1:
-
 
132
        track_data_list=[]
-
 
133
        track_data_list.append(track_data_dict['BulkTrackingResponse']['BulkResponse']['TrackingResponse'])
-
 
134
        track_data_list.append('DUMMY')
-
 
135
    else:
-
 
136
        track_data_list = track_data_dict['BulkTrackingResponse']['BulkResponse']['TrackingResponse']    
-
 
137
    
-
 
138
    return track_data_list
-
 
139
    
-
 
140
    
87
def process_dao_pickup_orders(provider):
141
def process_dao_pickup_orders(provider):
88
    try:
142
    try:
89
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
143
        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)
144
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
91
        if doa_pickup_details:
145
        if doa_pickup_details:
Line 348... Line 402...
348
    print picked_up_orders
402
    print picked_up_orders
349
    return picked_up_orders
403
    return picked_up_orders
350
 
404
 
351
def read_pickup_orders(orders_tobe_picked_up):
405
def read_pickup_orders(orders_tobe_picked_up):
352
    picked_up_orders = {}
406
    picked_up_orders = {}
-
 
407
    awb_number_list =[]
353
    for order in orders_tobe_picked_up:
408
    for order in orders_tobe_picked_up:
354
        try:
-
 
355
            root =  fromstring(str(get_updates(order.airwaybill_no)))
409
        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:
410
    
367
            pass
411
    track_update_list = get_track_updates(awb_number_list)
368
    
412
    
-
 
413
    for update in track_update_list:
-
 
414
        if update == 'DUMMY':
-
 
415
            continue
-
 
416
        else:
-
 
417
            try:
-
 
418
                airwaybill_no = update['ReferenceNo'] 
-
 
419
                track_list = update['TrackingList']['TrackingList']
-
 
420
                track_list.reverse()
-
 
421
                for track_update in track_list:
-
 
422
                    if track_update['TrackingCode'] == 'BKD' :
-
 
423
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
424
                        datestring  = date_obj.strftime("%Y-%m-%d")
-
 
425
                        timestring = track_update['ExecutionTime']+':00'
-
 
426
                        delivery_date = datestring + timestring
-
 
427
                        picked_up_orders[airwaybill_no] = delivery_date
-
 
428
                        break
-
 
429
                break
-
 
430
            except:
-
 
431
                pass
-
 
432
        
369
    print "Picked up Orders:"
433
    print "Picked up Orders:"
370
    print picked_up_orders
434
    print picked_up_orders
371
    return picked_up_orders
435
    return picked_up_orders
372
 
436
 
373
def read_local_connection_orders(orders_tobe_local_connected):
437
def read_local_connection_orders(orders_tobe_local_connected):
374
    local_connected_orders = {}
438
    local_connected_orders = {}
-
 
439
    
-
 
440
    awb_number_list =[]
375
    for order in orders_tobe_local_connected:
441
    for order in orders_tobe_local_connected:
-
 
442
        awb_number_list.append(order.airwaybill_no)
376
        try:
443
    
377
            root =  fromstring(str(get_updates(order.airwaybill_no)))
444
    track_update_list = get_track_updates(awb_number_list)
-
 
445
    
-
 
446
    for update in track_update_list:
378
            children = root.getchildren()
447
        if update == 'DUMMY':
379
            for child in children:
448
            continue
-
 
449
        else:
-
 
450
            try:
-
 
451
                airwaybill_no = update['ReferenceNo'] 
380
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
452
                track_list = update['TrackingList']['TrackingList']
381
                for element in reversed(nodes):
453
                track_list.reverse()
-
 
454
                for track_update in track_list:
382
                    if element.findtext('TrackingCode', '') == 'PRO':
455
                    if track_update['TrackingCode'] == 'PRO' :
-
 
456
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
383
                        datestring = element.findtext('Date', '')
457
                        datestring  = date_obj.strftime("%Y-%m-%d")
384
                        timestring = element.findtext('Time', '')
458
                        timestring = track_update['ExecutionTime']+':00'
385
                        delivery_date = get_py_datetime(datestring, timestring)
459
                        delivery_date = datestring + timestring
386
                        local_connected_orders[order.airwaybill_no] = str(delivery_date)
460
                        local_connected_orders[airwaybill_no] = delivery_date
387
                        break
461
                        break
388
                break
462
                break
389
        except:
463
            except:
390
            pass
464
                pass
391
            
465
            
392
    print "Local Connected Orders"
466
    print "Local Connected Orders"
393
    print local_connected_orders
467
    print local_connected_orders
394
    
468
    
395
    return local_connected_orders
469
    return local_connected_orders
396
 
470
 
397
def read_reached_destination_orders(orders_tobe_reached_destination_city):
471
def read_reached_destination_orders(orders_tobe_reached_destination_city):
398
    destination_city_reached_orders = {}
472
    destination_city_reached_orders = {}
-
 
473
    
-
 
474
    awb_number_list =[]
399
    for order in orders_tobe_reached_destination_city:
475
    for order in orders_tobe_reached_destination_city:
-
 
476
        awb_number_list.append(order.airwaybill_no)
400
        try:
477
    
401
            root =  fromstring(str(get_updates(order.airwaybill_no)))
478
    track_update_list = get_track_updates(awb_number_list)
-
 
479
    
-
 
480
    for update in track_update_list:
402
            children = root.getchildren()
481
        if update == 'DUMMY':
403
            child_number = 0
482
            continue
-
 
483
        else:
404
            for child in children:
484
            try:
405
                child_number = child_number + 1
485
                airwaybill_no = update['ReferenceNo'] 
406
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
486
                track_list = update['TrackingList']['TrackingList']
-
 
487
                track_list.reverse()
407
                for element in nodes:
488
                for track_update in track_list:
408
                    if element.findtext('TrackingCode', '') == 'RDB':
489
                    if track_update['TrackingCode'] == 'RDB' :
-
 
490
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
409
                        datestring = element.findtext('Date', '')
491
                        datestring  = date_obj.strftime("%Y-%m-%d")
410
                        timestring = element.findtext('Time', '')
492
                        timestring = track_update['ExecutionTime']+':00'
411
                        delivery_date = get_py_datetime(datestring, timestring)
493
                        delivery_date = datestring + timestring
412
                        destination_city_reached_orders[order.airwaybill_no] = str(delivery_date)
494
                        destination_city_reached_orders[airwaybill_no] = delivery_date
413
                        break
495
                        break
-
 
496
                break
414
        except:
497
            except:
415
            pass
498
                pass
416
    
499
    
417
    print "Destination City Reached Orders"
500
    print "Destination City Reached Orders"
418
    print destination_city_reached_orders
501
    print destination_city_reached_orders
419
    
502
    
420
    return destination_city_reached_orders
503
    return destination_city_reached_orders
421
 
504
 
422
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
505
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
423
    first_atdl_orders = {}
506
    first_atdl_orders = {}
-
 
507
    
-
 
508
    awb_number_list =[]
424
    for order in orders_tobe_first_delivery_attempted:
509
    for order in orders_tobe_first_delivery_attempted:
-
 
510
        awb_number_list.append(order.airwaybill_no)
425
        try:
511
    
426
            root =  fromstring(str(get_updates(order.airwaybill_no)))
512
    track_update_list = get_track_updates(awb_number_list)
-
 
513
    
-
 
514
    for update in track_update_list:
427
            children = root.getchildren()
515
        if update == 'DUMMY':
428
            for child in children:
516
            continue
-
 
517
        else:
-
 
518
            try:
-
 
519
                airwaybill_no = update['ReferenceNo'] 
429
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
520
                track_list = update['TrackingList']['TrackingList']
430
                for element in reversed(nodes):
521
                track_list.reverse()
-
 
522
                for track_update in track_list:
431
                    if element.findtext('TrackingCode', '') == 'OFD':
523
                    if track_update['TrackingCode'] == 'OFD' :
-
 
524
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
432
                        datestring = element.findtext('Date', '')
525
                        datestring  = date_obj.strftime("%Y-%m-%d")
433
                        timestring = element.findtext('Time', '')
526
                        timestring = track_update['ExecutionTime']+':00'
434
                        delivery_date = get_py_datetime(datestring, timestring)
527
                        delivery_date = datestring + timestring
435
                        first_atdl_orders[order.airwaybill_no] = str(delivery_date)
528
                        first_atdl_orders[airwaybill_no] = delivery_date
436
                        break
529
                        break
437
                break
530
                break
438
        except:
531
            except:
439
            pass
532
                pass
-
 
533
        
440
    
534
    
441
    print "FIRST DELIVERY ATTEMPT MADE Orders"
535
    print "FIRST DELIVERY ATTEMPT MADE Orders"
442
    print first_atdl_orders
536
    print first_atdl_orders
443
    
537
    
444
    return first_atdl_orders
538
    return first_atdl_orders
445
 
539
 
446
def read_delivery_orders(orders_tobe_delivered):
540
def read_delivery_orders(orders_tobe_delivered):
447
    delivered_orders = {}
541
    delivered_orders = {}
448
    returned_orders = {}
542
    returned_orders = {}
449
    undelivered_orders = {}
543
    undelivered_orders = {}
-
 
544
    awb_order_map = {}
-
 
545
    
450
    for order in orders_tobe_delivered:
546
    for order in orders_tobe_delivered:
-
 
547
        awb_order_list =[]
-
 
548
        awb_order_list.append(order.id)
-
 
549
        awb_order_list.append(order.shipping_timestamp)
-
 
550
        awb_order_map[order.airwaybill_no]= awb_order_list
-
 
551
    
-
 
552
    track_update_list = get_track_updates(awb_order_map.keys())
-
 
553
    
-
 
554
    for update in track_update_list:
-
 
555
        if update == 'DUMMY':
-
 
556
            continue
-
 
557
        else:
451
        try:
558
            try:
-
 
559
                airwaybill_no = update['ReferenceNo'] 
452
            root =  fromstring(str(get_updates(order.airwaybill_no)))
560
                track_list = update['TrackingList']['TrackingList']
453
            children = root.getchildren()
561
                track_list.reverse()
454
            child_number = 0
562
                reason_for_return = None
455
            for child in children:
563
                for record in track_list:
456
                child_number = child_number + 1
564
                    if record['TrackingCode'] == 'UDLD' :
457
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
565
                        reason_for_return = record['ServiceEvent'].split(" -")[1]
458
                if len(nodes):
566
                        break
459
                    node_number = len(nodes)-1
567
                    
460
                    for element in nodes:
568
                for track_update in track_list:
461
                        if element.findtext('TrackingCode', '') == 'DLVD':
569
                    if track_update['TrackingCode'] == 'DLVD' :
-
 
570
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
462
                            datestring = element.findtext('Date', '')
571
                        datestring  = date_obj.strftime("%Y-%m-%d")
463
                            timestring = element.findtext('Time', '')
572
                        timestring = track_update['ExecutionTime']+':00'
464
                            delivery_date = get_py_datetime(datestring, timestring)
573
                        del_date = datestring + timestring
465
                            element1 = child.findall('ShipmentInfo/Consignee')[0]
574
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
466
                            receiver = element1.findtext('Name', '')
575
                        receiver = track_update['ServiceEvent'].split("[ ")[1].split(" ]")[0]
467
                            if to_py_date(order.shipping_timestamp) > delivery_date:
576
                        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))
577
                            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: 
578
                        else:
470
                                delivered_orders[order.airwaybill_no] = str(delivery_date) + "|" +  receiver
579
                            delivered_orders[airwaybill_no] = str(delivery_date) + "|" +  receiver
471
                            break
580
                        break
472
                        elif element.findtext('TrackingCode', '') == 'RTO':
581
                    elif track_update['TrackingCode'] == 'RTO' :
-
 
582
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
473
                            datestring = element.findtext('Date', '')
583
                        datestring  = date_obj.strftime("%Y-%m-%d")
474
                            timestring = element.findtext('Time', '')
584
                        timestring = track_update['ExecutionTime']+':00'
475
                            delivery_date = get_py_datetime(datestring, timestring)
585
                        del_date = datestring + timestring
-
 
586
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
476
                            if node_number < len(nodes)-1:
587
                        if reason_for_return == None:
477
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
588
                            returned_orders[airwaybill_no] = str(delivery_date) + "|"  + " Order Booked for Return"
478
                            else:
589
                        else:
479
                                reason_for_return = element.findtext('ServiceEvent', '')
-
 
480
                            returned_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
590
                            returned_orders[airwaybill_no] = str(delivery_date) + "|"  + reason_for_return
481
                            break       
591
                        break
482
                        elif element.findtext('TrackingCode', '') == 'UDLD':
592
                    elif track_update['TrackingCode'] == 'UDLD' :
-
 
593
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
483
                            datestring = element.findtext('Date', '')
594
                        datestring  = date_obj.strftime("%Y-%m-%d")
484
                            timestring = element.findtext('Time', '')
595
                        timestring = track_update['ExecutionTime']+':00'
485
                            delivery_date = get_py_datetime(datestring, timestring)
596
                        del_date = datestring + timestring
-
 
597
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
486
                            if node_number < len(nodes)-1:
598
                        if reason_for_return == None:
487
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
599
                            undelivered_orders[airwaybill_no] = str(delivery_date) + "|" + track_update['ServiceEvent'].split(" -")[1]
488
                            else:
600
                        else:
489
                                reason_for_return = element.findtext('ServiceEvent', '')
-
 
490
                            undelivered_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
601
                            undelivered_orders[airwaybill_no] = str(delivery_date) + "|" + reason_for_return
491
                            break
602
                        break
492
                        node_number = node_number - 1
603
                break
493
        except:
604
            except:
494
            pass
605
                pass
495
    
606
    
496
    print "Delivered Orders:"
607
    print "Delivered Orders:"
497
    print delivered_orders
608
    print delivered_orders
498
    
609
    
499
    print "Returned Orders:"
610
    print "Returned Orders:"