Subversion Repositories SmartDukaan

Rev

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

Rev 8700 Rev 8702
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
-
 
40
import csv
39
import csv
41
import datetime
40
import datetime
42
import optparse
41
import optparse
43
import sys
42
import sys
44
import time
43
import time
45
import traceback
44
import traceback
46
import urllib2
45
import urllib2
47
from suds.client import Client
46
from suds.client import Client
48
import json
-
 
49
import StringIO
-
 
50
import zlib
-
 
51
import gzip
-
 
52
import xmltodict
-
 
53
import ast
-
 
54
if __name__ == '__main__' and __package__ is None:
47
if __name__ == '__main__' and __package__ is None:
55
    import os
48
    import os
56
    sys.path.insert(0, os.getcwd())
49
    sys.path.insert(0, os.getcwd())
57
 
50
 
58
 
51
 
59
RED_EXPRESS_URL = "http://tracking.getsetred.net/TrackingService.svc?wsdl"
52
RED_EXPRESS_URL = "http://tracking.getsetred.net/TrackingService.svc?wsdl"
60
username = 'C00086721141'
53
username = 'C00086721141'
61
password = 'SANDEEP.SACHDEVA@SHOP2020.IN'
54
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
               }
-
 
75
 
55
 
76
client = None
56
client = None
77
def getClient():
57
def getClient():
78
    global client
58
    global client
79
    if client is None:
59
    if client is None:
Line 102... Line 82...
102
            timestring = element.findtext('Time', '')
82
            timestring = element.findtext('Time', '')
103
            description = element.findtext('ServiceEvent', '')
83
            description = element.findtext('ServiceEvent', '')
104
            results.append(datestring+"~!~"+timestring+"~!~"+description)
84
            results.append(datestring+"~!~"+timestring+"~!~"+description)
105
    return results
85
    return results
106
 
86
 
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 len(awb_numbers) > 0:
-
 
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
    elif len(awb_numbers)==0:
-
 
136
        track_data_list=[]
-
 
137
    else:
-
 
138
        track_data_list = track_data_dict['BulkTrackingResponse']['BulkResponse']['TrackingResponse']    
-
 
139
    
-
 
140
    return track_data_list
-
 
141
    
-
 
142
    
-
 
143
def process_dao_pickup_orders(provider):
87
def process_dao_pickup_orders(provider):
144
    try:
88
    try:
145
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
89
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
146
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
90
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
147
        if doa_pickup_details:
91
        if doa_pickup_details:
Line 404... Line 348...
404
    print picked_up_orders
348
    print picked_up_orders
405
    return picked_up_orders
349
    return picked_up_orders
406
 
350
 
407
def read_pickup_orders(orders_tobe_picked_up):
351
def read_pickup_orders(orders_tobe_picked_up):
408
    picked_up_orders = {}
352
    picked_up_orders = {}
409
    awb_number_list =[]
-
 
410
    for order in orders_tobe_picked_up:
353
    for order in orders_tobe_picked_up:
411
        awb_number_list.append(order.airwaybill_no)
-
 
412
    
-
 
413
    track_update_list = get_track_updates(awb_number_list)
-
 
414
    
-
 
415
    for update in track_update_list:
-
 
416
        if update == 'DUMMY':
-
 
417
            continue
-
 
418
        else:
-
 
419
            try:
354
        try:
420
                airwaybill_no = update['ReferenceNo'] 
-
 
421
                track_list = update['TrackingList']['TrackingList']
355
            root =  fromstring(str(get_updates(order.airwaybill_no)))
422
                track_list.reverse()
356
            children = root.getchildren()
423
                for track_update in track_list:
357
            for child in children:
424
                    if track_update['TrackingCode'] == 'BKD' :
358
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
425
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
359
                for element in reversed(nodes):
426
                        datestring  = date_obj.strftime("%Y-%m-%d")
360
                    datestring = element.findtext('Date', '')
427
                        timestring = track_update['ExecutionTime']+':00'
361
                    timestring = element.findtext('Time', '')
428
                        delivery_date = datestring + timestring
362
                    delivery_date = get_py_datetime(datestring, timestring)
429
                        picked_up_orders[airwaybill_no] = delivery_date
363
                    picked_up_orders[order.airwaybill_no] = str(delivery_date)
430
                        break
364
                    break
431
                break
365
                break
432
            except:
366
        except:
433
                pass
367
            pass
434
        
368
    
435
    print "Picked up Orders:"
369
    print "Picked up Orders:"
436
    print picked_up_orders
370
    print picked_up_orders
437
    return picked_up_orders
371
    return picked_up_orders
438
 
372
 
439
def read_local_connection_orders(orders_tobe_local_connected):
373
def read_local_connection_orders(orders_tobe_local_connected):
440
    local_connected_orders = {}
374
    local_connected_orders = {}
441
    
-
 
442
    awb_number_list =[]
-
 
443
    for order in orders_tobe_local_connected:
375
    for order in orders_tobe_local_connected:
444
        awb_number_list.append(order.airwaybill_no)
-
 
445
    
376
        try:
446
    track_update_list = get_track_updates(awb_number_list)
377
            root =  fromstring(str(get_updates(order.airwaybill_no)))
447
    
-
 
448
    for update in track_update_list:
-
 
449
        if update == 'DUMMY':
378
            children = root.getchildren()
450
            continue
379
            for child in children:
451
        else:
-
 
452
            try:
-
 
453
                airwaybill_no = update['ReferenceNo'] 
-
 
454
                track_list = update['TrackingList']['TrackingList']
380
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
455
                track_list.reverse()
381
                for element in reversed(nodes):
456
                for track_update in track_list:
-
 
457
                    if track_update['TrackingCode'] == 'PRO' :
382
                    if element.findtext('TrackingCode', '') == 'PRO':
458
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
459
                        datestring  = date_obj.strftime("%Y-%m-%d")
383
                        datestring = element.findtext('Date', '')
460
                        timestring = track_update['ExecutionTime']+':00'
384
                        timestring = element.findtext('Time', '')
461
                        delivery_date = datestring + timestring
385
                        delivery_date = get_py_datetime(datestring, timestring)
462
                        local_connected_orders[airwaybill_no] = delivery_date
386
                        local_connected_orders[order.airwaybill_no] = str(delivery_date)
463
                        break
387
                        break
464
                break
388
                break
465
            except:
389
        except:
466
                pass
390
            pass
467
            
391
            
468
    print "Local Connected Orders"
392
    print "Local Connected Orders"
469
    print local_connected_orders
393
    print local_connected_orders
470
    
394
    
471
    return local_connected_orders
395
    return local_connected_orders
472
 
396
 
473
def read_reached_destination_orders(orders_tobe_reached_destination_city):
397
def read_reached_destination_orders(orders_tobe_reached_destination_city):
474
    destination_city_reached_orders = {}
398
    destination_city_reached_orders = {}
475
    
-
 
476
    awb_number_list =[]
-
 
477
    for order in orders_tobe_reached_destination_city:
399
    for order in orders_tobe_reached_destination_city:
478
        awb_number_list.append(order.airwaybill_no)
-
 
479
    
400
        try:
480
    track_update_list = get_track_updates(awb_number_list)
401
            root =  fromstring(str(get_updates(order.airwaybill_no)))
481
    
-
 
482
    for update in track_update_list:
-
 
483
        if update == 'DUMMY':
402
            children = root.getchildren()
484
            continue
403
            child_number = 0
485
        else:
-
 
486
            try:
404
            for child in children:
487
                airwaybill_no = update['ReferenceNo'] 
405
                child_number = child_number + 1
488
                track_list = update['TrackingList']['TrackingList']
406
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
489
                track_list.reverse()
-
 
490
                for track_update in track_list:
407
                for element in nodes:
491
                    if track_update['TrackingCode'] == 'RDB' :
408
                    if element.findtext('TrackingCode', '') == 'RDB':
492
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
493
                        datestring  = date_obj.strftime("%Y-%m-%d")
409
                        datestring = element.findtext('Date', '')
494
                        timestring = track_update['ExecutionTime']+':00'
410
                        timestring = element.findtext('Time', '')
495
                        delivery_date = datestring + timestring
411
                        delivery_date = get_py_datetime(datestring, timestring)
496
                        destination_city_reached_orders[airwaybill_no] = delivery_date
412
                        destination_city_reached_orders[order.airwaybill_no] = str(delivery_date)
497
                        break
413
                        break
498
                break
-
 
499
            except:
414
        except:
500
                pass
415
            pass
501
    
416
    
502
    print "Destination City Reached Orders"
417
    print "Destination City Reached Orders"
503
    print destination_city_reached_orders
418
    print destination_city_reached_orders
504
    
419
    
505
    return destination_city_reached_orders
420
    return destination_city_reached_orders
506
 
421
 
507
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
422
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
508
    first_atdl_orders = {}
423
    first_atdl_orders = {}
509
    
-
 
510
    awb_number_list =[]
-
 
511
    for order in orders_tobe_first_delivery_attempted:
424
    for order in orders_tobe_first_delivery_attempted:
512
        awb_number_list.append(order.airwaybill_no)
-
 
513
    
425
        try:
514
    track_update_list = get_track_updates(awb_number_list)
426
            root =  fromstring(str(get_updates(order.airwaybill_no)))
515
    
-
 
516
    for update in track_update_list:
-
 
517
        if update == 'DUMMY':
427
            children = root.getchildren()
518
            continue
428
            for child in children:
519
        else:
-
 
520
            try:
-
 
521
                airwaybill_no = update['ReferenceNo'] 
-
 
522
                track_list = update['TrackingList']['TrackingList']
429
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
523
                track_list.reverse()
430
                for element in reversed(nodes):
524
                for track_update in track_list:
-
 
525
                    if track_update['TrackingCode'] == 'OFD' :
431
                    if element.findtext('TrackingCode', '') == 'OFD':
526
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
527
                        datestring  = date_obj.strftime("%Y-%m-%d")
432
                        datestring = element.findtext('Date', '')
528
                        timestring = track_update['ExecutionTime']+':00'
433
                        timestring = element.findtext('Time', '')
529
                        delivery_date = datestring + timestring
434
                        delivery_date = get_py_datetime(datestring, timestring)
530
                        first_atdl_orders[airwaybill_no] = delivery_date
435
                        first_atdl_orders[order.airwaybill_no] = str(delivery_date)
531
                        break
436
                        break
532
                break
437
                break
533
            except:
438
        except:
534
                pass
439
            pass
535
        
-
 
536
    
440
    
537
    print "FIRST DELIVERY ATTEMPT MADE Orders"
441
    print "FIRST DELIVERY ATTEMPT MADE Orders"
538
    print first_atdl_orders
442
    print first_atdl_orders
539
    
443
    
540
    return first_atdl_orders
444
    return first_atdl_orders
541
 
445
 
542
def read_delivery_orders(orders_tobe_delivered):
446
def read_delivery_orders(orders_tobe_delivered):
543
    delivered_orders = {}
447
    delivered_orders = {}
544
    returned_orders = {}
448
    returned_orders = {}
545
    undelivered_orders = {}
449
    undelivered_orders = {}
546
    awb_order_map = {}
-
 
547
    
-
 
548
    for order in orders_tobe_delivered:
450
    for order in orders_tobe_delivered:
549
        awb_order_list =[]
-
 
550
        awb_order_list.append(order.id)
-
 
551
        awb_order_list.append(order.shipping_timestamp)
-
 
552
        awb_order_map[order.airwaybill_no]= awb_order_list
-
 
553
    
-
 
554
    track_update_list = get_track_updates(awb_order_map.keys())
-
 
555
    
-
 
556
    for update in track_update_list:
-
 
557
        if update == 'DUMMY':
-
 
558
            continue
-
 
559
        else:
-
 
560
            try:
451
        try:
561
                airwaybill_no = update['ReferenceNo'] 
-
 
562
                track_list = update['TrackingList']['TrackingList']
452
            root =  fromstring(str(get_updates(order.airwaybill_no)))
563
                track_list.reverse()
453
            children = root.getchildren()
564
                reason_for_return = None
454
            child_number = 0
565
                for record in track_list:
455
            for child in children:
566
                    if record['TrackingCode'] == 'UDLD' :
456
                child_number = child_number + 1
567
                        reason_for_return = record['ServiceEvent'].split(" -")[1]
457
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
568
                        break
458
                if len(nodes):
569
                    
459
                    node_number = len(nodes)-1
570
                for track_update in track_list:
460
                    for element in nodes:
571
                    if track_update['TrackingCode'] == 'DLVD' :
461
                        if element.findtext('TrackingCode', '') == 'DLVD':
572
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
573
                        datestring  = date_obj.strftime("%Y-%m-%d")
462
                            datestring = element.findtext('Date', '')
574
                        timestring = track_update['ExecutionTime']+':00'
463
                            timestring = element.findtext('Time', '')
575
                        del_date = datestring + timestring
464
                            delivery_date = get_py_datetime(datestring, timestring)
576
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
465
                            element1 = child.findall('ShipmentInfo/Consignee')[0]
577
                        receiver = track_update['ServiceEvent'].split("[ ")[1].split(" ]")[0]
466
                            receiver = element1.findtext('Name', '')
578
                        if to_py_date(awb_order_map.get(airwaybill_no)[1]) > delivery_date:
467
                            if to_py_date(order.shipping_timestamp) > delivery_date:
579
                            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))
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))
580
                        else:
469
                            else: 
581
                            delivered_orders[airwaybill_no] = str(delivery_date) + "|" +  receiver
470
                                delivered_orders[order.airwaybill_no] = str(delivery_date) + "|" +  receiver
582
                        break
471
                            break
583
                    elif track_update['TrackingCode'] == 'RTO' :
472
                        elif element.findtext('TrackingCode', '') == 'RTO':
584
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
585
                        datestring  = date_obj.strftime("%Y-%m-%d")
473
                            datestring = element.findtext('Date', '')
586
                        timestring = track_update['ExecutionTime']+':00'
474
                            timestring = element.findtext('Time', '')
587
                        del_date = datestring + timestring
475
                            delivery_date = get_py_datetime(datestring, timestring)
588
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
-
 
589
                        if reason_for_return == None:
476
                            if node_number < len(nodes)-1:
590
                            returned_orders[airwaybill_no] = str(delivery_date) + "|"  + " Order Booked for Return"
477
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
591
                        else:
478
                            else:
-
 
479
                                reason_for_return = element.findtext('ServiceEvent', '')
592
                            returned_orders[airwaybill_no] = str(delivery_date) + "|"  + reason_for_return
480
                            returned_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
593
                        break
481
                            break       
594
                    elif track_update['TrackingCode'] == 'UDLD' :
482
                        elif element.findtext('TrackingCode', '') == 'UDLD':
595
                        date_obj = datetime.strptime(track_update['ExecutionDate'].split(' ')[0],"%m/%d/%Y")
-
 
596
                        datestring  = date_obj.strftime("%Y-%m-%d")
483
                            datestring = element.findtext('Date', '')
597
                        timestring = track_update['ExecutionTime']+':00'
484
                            timestring = element.findtext('Time', '')
598
                        del_date = datestring + timestring
485
                            delivery_date = get_py_datetime(datestring, timestring)
599
                        delivery_date = datetime.strptime(del_date,"%Y-%m-%d %H:%M:%S")
-
 
600
                        if reason_for_return == None:
486
                            if node_number < len(nodes)-1:
601
                            undelivered_orders[airwaybill_no] = str(delivery_date) + "|" + track_update['ServiceEvent'].split(" -")[1]
487
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
602
                        else:
488
                            else:
-
 
489
                                reason_for_return = element.findtext('ServiceEvent', '')
603
                            undelivered_orders[airwaybill_no] = str(delivery_date) + "|" + reason_for_return
490
                            undelivered_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
604
                        break
491
                            break
605
                break
492
                        node_number = node_number - 1
606
            except:
493
        except:
607
                pass
494
            pass
608
    
495
    
609
    print "Delivered Orders:"
496
    print "Delivered Orders:"
610
    print delivered_orders
497
    print delivered_orders
611
    
498
    
612
    print "Returned Orders:"
499
    print "Returned Orders:"