Subversion Repositories SmartDukaan

Rev

Rev 7025 | Rev 7378 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6952 rajveer 1
#!/usr/bin/python
2
'''
3
It processes the following orders:
4
 1. Orders in DOA_PICKUP_CONFIRMED status : get details of orders that 
5
     were in DOA_PICKUP_CONFIRMED status from database and 
6
     calls BlueDart api to know whether they are picked up by BlueDart
7
     and changes the status to DOA_RETURN_IN_TRANSIT if it is done.
8
 2. Orders in RET_PICKUP_CONFIRMED status : get details of orders that 
9
     were in RET_PICKUP_CONFIRMED status from database and 
10
     calls BlueDart api to know whether they are picked up by BlueDart
11
     and changes the status to RET_RETURN_IN_TRANSIT if it is done.
12
 3. Orders in SHIPPED_FROM_WH status: get details of orders that
13
     were in SHIPPED_FROM_WH status from database and 
14
     calls BlueDart api to know whether they are picked up by BlueDart
15
     and changes the status to SHIPPED_TO_LOGST if it is done.
16
 4. Orders in SHIPPED_TO_LOGST status: get details of orders that
17
     were in SHIPPED_TO_LOGST status from database and 
18
     calls BlueDart api to know their status and changes the status accordingly.
19
 
20
It sends out a Pickup mismatch report, Return orders Pickup Mismatch report, Doa Pickup mismatch report,
21
Undelivered orders report and Returned Orders report to cnc.center@shop2020.in
22
 
23
http://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=DEL24119&awb=ref&format=XML&lickey=6265d61bafa6292c5ddfdb1ee335ca80&verno=1.3&scan=1&numbers={variable1} is hard coded
24
to track DOA orders and for other orders ConfigClient is called to get bluedart_update_url
25
 
26
@author: Phani Kumar
27
'''
28
from shop2020.clients.CRMClient import CRMClient
29
from shop2020.clients.LogisticsClient import LogisticsClient
30
from shop2020.clients.TransactionClient import TransactionClient
31
from shop2020.clients.UserClient import UserClient
32
from LogisticUtils import enqueueMailForFDA
33
from shop2020.thriftpy.crm.ttypes import *
34
from shop2020.thriftpy.model.v1.order.ttypes import TransactionServiceException, \
35
    OrderStatus
36
from shop2020.utils.EmailAttachmentSender import get_attachment_part, mail
37
from shop2020.utils.Utils import to_py_date
38
from xml.etree.ElementTree import parse, XML, fromstring
39
import csv
40
import datetime
41
import optparse
42
import sys
43
import time
44
import traceback
45
import urllib2
46
from suds.client import Client
47
if __name__ == '__main__' and __package__ is None:
48
    import os
49
    sys.path.insert(0, os.getcwd())
50
 
51
 
52
RED_EXPRESS_URL = "http://tracking.getsetred.net/TrackingService.svc?wsdl"
53
username = 'C00086721141'
54
password = 'SANDEEP.SACHDEVA@SHOP2020.IN'
55
 
56
client = None
57
def getClient():
58
    global client
59
    if client is None:
60
        client = Client(RED_EXPRESS_URL, timeout=70)
61
    return client
62
 
63
defaultUndeliveredAsssigneeId = 19
64
from_user = 'cnc.center@shop2020.in'
65
from_pwd = '5h0p2o2o'
66
to = ['cnc.center@shop2020.in', "amit.sirohi@shop2020.in", "sandeep.sachdeva@shop2020.in", "manoj.kumar@shop2020.in", "rajveer.singh@shop2020.in"]
67
 
68
 
69
def get_updates(awb_number): 
70
    str = getClient().service.ProcessTrackingRequest('<TrackingRequest><Request><UserID>' + username + '</UserID><Password>' + password + '</Password><TrackingID>' + awb_number + '</TrackingID><TrackingLevel>ALL_DETAILS</TrackingLevel></Request></TrackingRequest>')
71
    print str
72
    return str
73
 
7026 rajveer 74
def get_updates_for_user(awb_number):
75
    root =  fromstring(str(get_updates(awb_number)))
76
    children = root.getchildren()
77
    results = []
78
    for child in children:
79
        nodes = child.findall('ShipmentInfo/ShipmentEvent')
80
        for element in reversed(nodes):
81
            datestring = element.findtext('Date', '')
82
            timestring = element.findtext('Time', '')
83
            description = element.findtext('ServiceEvent', '')
84
            results.append(datestring+"~!~"+timestring+"~!~"+description)
85
    return results
6952 rajveer 86
 
87
def process_dao_pickup_orders(provider):
88
    try:
89
        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)
91
        if doa_pickup_details:
92
            update_picked_doas(provider.id, doa_pickup_details)
93
    except:
94
        print "Some issue while processing the orders in DOA_PICKUP_CONFIRMED status"
95
        traceback.print_exc()
96
 
97
def process_return_pickup_orders(provider):
98
    try:
99
        returns_tobe_picked_up = fetch_data(provider.id, [OrderStatus.RET_PICKUP_CONFIRMED])
100
        returns_pickup_details = read_dao_return_pickup_orders(returns_tobe_picked_up)
101
        if returns_pickup_details:
102
            update_picked_returns(provider.id, returns_pickup_details)
103
    except:
104
        print "Some issue while processing the orders in RET_PICKUP_CONFIRMED status"
105
        traceback.print_exc()
106
 
107
def process_pickup_records(provider):
108
    try:
109
        orders_tobe_picked_up = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH])
110
        pickup_details = read_pickup_orders(orders_tobe_picked_up)
111
        if pickup_details:
112
            update_picked_orders(provider.id, pickup_details)
113
    except:
114
        print "Some issue while processing the orders in SHIPPED_FROM_WH status"
115
        traceback.print_exc()
116
 
117
def process_local_connection_orders(provider):
118
    try:
119
        orders_tobe_local_connected = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST])
120
        local_connected_orders = read_local_connection_orders(orders_tobe_local_connected)
121
        if local_connected_orders:
122
            update_local_connected_orders(provider.id, local_connected_orders)
123
    except:
124
        print "Some issue while processing the orders for local connection status"
125
        traceback.print_exc()
126
 
7025 rajveer 127
def process_first_delivery_attempt_orders(provider):
128
    try:
129
        orders_tobe_first_delivery_attempted = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_TO_DESTINATION_CITY, OrderStatus.REACHED_DESTINATION_CITY])
130
        first_atdl_orders = read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted)
131
        if first_atdl_orders:
132
            update_first_atdl_orders(provider.id, first_atdl_orders)
133
    except:
134
        print "Some issue while processing the orders for First delivery attempt status"
135
        traceback.print_exc()
136
 
6952 rajveer 137
def process_reached_destination_city_orders(provider):
138
    try:
139
        orders_tobe_reached_destination_city = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_TO_DESTINATION_CITY])
140
        destination_city_reached_orders = read_reached_destination_orders(orders_tobe_reached_destination_city)
141
        if destination_city_reached_orders:
142
            update_destination_city_reached_orders(provider.id, destination_city_reached_orders)
143
    except:
144
        print "Some issue while processing the orders for Reached Destination City status"
145
        traceback.print_exc()
146
 
147
def process_delivery_report(provider):
148
    try:
149
        orders_tobe_delivered = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_TO_DESTINATION_CITY, OrderStatus.REACHED_DESTINATION_CITY, OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE])
150
        delivered_orders, returned_orders, undelivered_orders = read_delivery_orders(orders_tobe_delivered)
151
        if delivered_orders:
152
            update_delivered_orders(provider.id, delivered_orders)
153
        if returned_orders:
154
            update_returned_orders(provider.id, returned_orders)
155
        if undelivered_orders:
156
            update_reason_of_undelivered_orders(provider.id, undelivered_orders)
157
    except:
158
        print "Some issue while processing the orders for delivery status"
159
        traceback.print_exc()
160
 
161
def generate_reports(provider):
162
    get_doas_not_picked_up(provider)
163
    get_returns_not_picked_up(provider)
164
    get_orders_not_picked_up(provider)
165
    get_orders_pending_local_connection(provider)
166
    get_returned_orders(provider)
167
    get_orders_not_delivered(provider)
168
 
169
def get_doas_not_picked_up(provider):
170
    txnClient = TransactionClient().get_client()
171
    try:
172
        doas_not_picked_up = txnClient.getDoasNotPickedUp(provider.id)
173
    except TransactionServiceException as tex:
174
        print tex.message
175
 
176
    try:
177
        if doas_not_picked_up:
178
            print "DOAs not Picked up:"
179
            print doas_not_picked_up
180
            mismatch_file = "/tmp/BlueDart_DoaPickupMismatch.csv"
181
            print "Some of our DOA orders were not picked up. Printing report to:" + mismatch_file
182
            print_dao_return_pickup_mismatch_report(mismatch_file, doas_not_picked_up)
183
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
184
            mail(from_user, from_pwd, to,\
185
                 "DOA Pickup Mismatch for " + provider.name,\
186
                 "This is a system generated email.Please don't reply to it.",\
187
                 pickup_mismatch_part)
188
    except Exception:
189
        print "Some issue sending the DOA mismatch report"
190
        traceback.print_exc()
191
 
192
def get_returns_not_picked_up(provider):
193
    txnClient = TransactionClient().get_client()
194
    try:
195
        returns_not_picked_up = txnClient.getReturnOrdersNotPickedUp(provider.id)
196
    except TransactionServiceException as tex:
197
        print tex.message
198
 
199
    try:
200
        if returns_not_picked_up:
201
            print "Return Orders not Picked up:"
202
            print returns_not_picked_up
203
            mismatch_file = "/tmp/BlueDart_ReturnsPickupMismatch.csv"
204
            print "Some of our Return orders were not picked up. Printing report to:" + mismatch_file
205
            print_dao_return_pickup_mismatch_report(mismatch_file, returns_not_picked_up)
206
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
207
            mail(from_user, from_pwd, to,\
208
                 "Return orders Pickup Mismatch for " + provider.name,\
209
                 "This is a system generated email.Please don't reply to it.",\
210
                 pickup_mismatch_part)
211
    except Exception:
212
        print "Some issue sending the Return orders mismatch report"
213
        traceback.print_exc()
214
 
215
def get_orders_not_picked_up(provider):
216
    txnClient = TransactionClient().get_client()
217
    try:
218
        orders_not_picked_up = txnClient.getOrdersNotPickedUp(provider.id)
219
    except TransactionServiceException as tex:
220
        print tex.message
221
 
222
    try:
223
        if orders_not_picked_up:
224
            print "Orders not Picked up:"
225
            print orders_not_picked_up
226
            mismatch_file = "/tmp/BlueDart_PickupMismatch.csv"
227
            print "Some of our orders were not picked up. Printing report to:" + mismatch_file
228
            print_pickup_mismatch_report(mismatch_file, orders_not_picked_up)
229
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
230
            mail(from_user, from_pwd, to,\
231
                 "Order Pickup Mismatch for " + provider.name,\
232
                 "This is a system generated email.Please don't reply to it.",\
233
                 pickup_mismatch_part)
234
    except Exception:
235
        print "Some issue sending the pickup mismatch report"
236
        traceback.print_exc()
237
 
238
def get_orders_pending_local_connection(provider):
239
    txnClient = TransactionClient().get_client()
240
    try:
241
        orders_pending_local_connection = txnClient.getOrdersNotLocalConnected(provider.id)
242
    except TransactionServiceException as tex:
243
        print tex.message
244
 
245
    try:
246
        if orders_pending_local_connection:
247
            print "Local Connection Pending Orders:"
248
            print orders_pending_local_connection
249
            mismatch_file = "/tmp/BlueDart_LocalConnectionPendingOrders.csv"
250
            print "Some of our Orders were not Shipped to Destination yet. Printing report to:" + mismatch_file
251
            print_undelivered_orders_report(mismatch_file, orders_pending_local_connection)
252
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
253
            mail(from_user, from_pwd, to,\
254
                 "Orders that are not Shipped to Destination yet for " + provider.name,\
255
                 "This is a system generated email.Please don't reply to it.",\
256
                 pickup_mismatch_part)
257
    except Exception:
258
        print "Some issue updating and sending the Local Connection orders report"
259
        traceback.print_exc()
260
 
261
def get_returned_orders(provider):
262
    txnClient = TransactionClient().get_client()
263
    try:
264
        returned_orders = txnClient.getRTOrders(provider.id)
265
    except TransactionServiceException as tex:
266
        print tex.message
267
 
268
    try:
269
        if returned_orders:
270
            print "Returned Orders:"
271
            print returned_orders
272
            returned_orders_file = "/tmp/BlueDart_ReturnedOrders.csv"
273
            print "Some of our Orders were returned by logistics provider. Printing report to:" + returned_orders_file
274
            print_rto_orders_report(returned_orders_file, returned_orders)
275
            returned_orders_report = [get_attachment_part(returned_orders_file)]
276
            mail(from_user, from_pwd, to,\
277
                 "Returned Orders Report for " + provider.name,\
278
                 "This is a system generated email.Please don't reply to it.",\
279
                 returned_orders_report)
280
    except:
281
        print "Some issue sending the returned orders report"
282
        traceback.print_exc()
283
 
284
def get_orders_not_delivered(provider):
285
    txnClient = TransactionClient().get_client()
286
    try:
287
        orders_not_delivered = txnClient.getNonDeliveredOrdersbyCourier(provider.id)
288
    except TransactionServiceException as tex:
289
        print tex.message
290
 
291
    try:
292
        if orders_not_delivered:
293
            print "Undelivered Orders:"
294
            print orders_not_delivered
295
            mismatch_file = "/tmp/BlueDart_UndeliveredOrders.csv"
296
            print "Some of our Orders were not delivered. Printing report to:" + mismatch_file
297
            print_undelivered_orders_report(mismatch_file, orders_not_delivered)
298
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
299
            mail(from_user, from_pwd, to,\
300
                 "Orders that are undelivered but picked up or shipped four days ago for " + provider.name,\
301
                 "This is a system generated email.Please don't reply to it.",\
302
                 pickup_mismatch_part)
303
    except Exception:
304
        print "Some issue updating and sending the undelivered orders report"
305
        traceback.print_exc()
306
 
307
def get_provider_by_name(provider_name):
308
    logistics_client = LogisticsClient().get_client()
309
    provider = None
310
    providers = logistics_client.getAllProviders()
311
    for p in providers:
312
        if p.name == provider_name:
313
            provider=p
314
            break
315
    if provider == None:
316
        sys.exit("Can't continue execution: No such provider")
317
    return provider
318
 
319
def fetch_data(provider_id, order_status_list):
320
    txnClient = TransactionClient().get_client()
321
    try:
322
        doas_tobe_picked_up = txnClient.getOrdersForProviderForStatus(provider_id, order_status_list)
323
        return doas_tobe_picked_up
324
    except TransactionServiceException as tex:
325
        print tex.message
326
 
327
def read_dao_return_pickup_orders(orders_tobe_picked_up):
328
    #uri=http://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=DEL24119&awb=ref&format=XML&lickey=6265d61bafa6292c5ddfdb1ee335ca80&verno=1.3&scan=1&numbers=82390
329
    picked_up_orders = {}
330
    for order in orders_tobe_picked_up:
331
        try:
332
            uri = 'http://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=DEL24119&awb=ref&format=XML&lickey=6265d61bafa6292c5ddfdb1ee335ca80&verno=1.3&scan=1&numbers=' + str(order.pickupRequestNo)
333
            root = parse(urllib2.urlopen(uri)).getroot()
334
            children = root.getchildren()
335
            for child in children:
336
                nodes = child.findall('Scans/ScanDetail')
337
                for element in reversed(nodes):
338
                    datestring = element.findtext('ScanDate', '')
339
                    timestring = element.findtext('ScanTime', '')
340
                    delivery_date = get_py_datetime(datestring, timestring)
341
                    picked_up_orders[order.pickupRequestNo] = str(delivery_date)
342
                    break
343
                break
344
        except:
345
            pass
346
 
347
    print "Picked up Orders:"
348
    print picked_up_orders
349
    return picked_up_orders
350
 
351
def read_pickup_orders(orders_tobe_picked_up):
352
    picked_up_orders = {}
353
    for order in orders_tobe_picked_up:
354
        try:
355
            root =  fromstring(str(get_updates(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:
367
            pass
368
 
369
    print "Picked up Orders:"
370
    print picked_up_orders
371
    return picked_up_orders
372
 
373
def read_local_connection_orders(orders_tobe_local_connected):
374
    local_connected_orders = {}
375
    for order in orders_tobe_local_connected:
376
        try:
377
            root =  fromstring(str(get_updates(order.airwaybill_no)))
378
            children = root.getchildren()
379
            for child in children:
380
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
381
                for element in reversed(nodes):
7025 rajveer 382
                    if element.findtext('TrackingCode', '') == 'PRO':
6952 rajveer 383
                        datestring = element.findtext('Date', '')
384
                        timestring = element.findtext('Time', '')
385
                        delivery_date = get_py_datetime(datestring, timestring)
386
                        local_connected_orders[order.airwaybill_no] = str(delivery_date)
387
                        break
388
                break
389
        except:
390
            pass
7025 rajveer 391
 
6952 rajveer 392
    print "Local Connected Orders"
393
    print local_connected_orders
394
 
395
    return local_connected_orders
396
 
397
def read_reached_destination_orders(orders_tobe_reached_destination_city):
398
    destination_city_reached_orders = {}
399
    for order in orders_tobe_reached_destination_city:
400
        try:
401
            root =  fromstring(str(get_updates(order.airwaybill_no)))
402
            children = root.getchildren()
403
            child_number = 0
404
            for child in children:
405
                child_number = child_number + 1
406
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
407
                for element in nodes:
7025 rajveer 408
                    if element.findtext('TrackingCode', '') == 'RDB':
6952 rajveer 409
                        datestring = element.findtext('Date', '')
410
                        timestring = element.findtext('Time', '')
411
                        delivery_date = get_py_datetime(datestring, timestring)
412
                        destination_city_reached_orders[order.airwaybill_no] = str(delivery_date)
413
                        break
414
        except:
415
            pass
416
 
417
    print "Destination City Reached Orders"
418
    print destination_city_reached_orders
419
 
420
    return destination_city_reached_orders
421
 
422
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
423
    first_atdl_orders = {}
424
    for order in orders_tobe_first_delivery_attempted:
425
        try:
426
            root =  fromstring(str(get_updates(order.airwaybill_no)))
427
            children = root.getchildren()
428
            for child in children:
429
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
430
                for element in reversed(nodes):
7025 rajveer 431
                    if element.findtext('TrackingCode', '') == 'OFD':
432
                        datestring = element.findtext('Date', '')
433
                        timestring = element.findtext('Time', '')
6952 rajveer 434
                        delivery_date = get_py_datetime(datestring, timestring)
7025 rajveer 435
                        first_atdl_orders[order.airwaybill_no] = str(delivery_date)
6952 rajveer 436
                        break
7025 rajveer 437
                break
6952 rajveer 438
        except:
439
            pass
440
 
441
    print "FIRST DELIVERY ATTEMPT MADE Orders"
442
    print first_atdl_orders
443
 
444
    return first_atdl_orders
445
 
446
def read_delivery_orders(orders_tobe_delivered):
447
    delivered_orders = {}
448
    returned_orders = {}
449
    undelivered_orders = {}
450
    for order in orders_tobe_delivered:
451
        try:
452
            root =  fromstring(str(get_updates(order.airwaybill_no)))
453
            children = root.getchildren()
454
            child_number = 0
455
            for child in children:
456
                child_number = child_number + 1
457
                nodes = child.findall('ShipmentInfo/ShipmentEvent')
458
                if len(nodes):
459
                    node_number = len(nodes)-1
460
                    for element in reversed(nodes):
7025 rajveer 461
                        if element.findtext('TrackingCode', '') == 'DLVD':
6952 rajveer 462
                            datestring = element.findtext('Date', '')
463
                            timestring = element.findtext('Time', '')
464
                            delivery_date = get_py_datetime(datestring, timestring)
7025 rajveer 465
                            element1 = child.findall('ShipmentInfo/Consignee')[0]
466
                            receiver = element1.findtext('Name', '')
6952 rajveer 467
                            delivered_orders[order.airwaybill_no] = str(delivery_date) + "|" +  receiver
468
                            break
7025 rajveer 469
                        elif element.findtext('TrackingCode', '') == 'RTO':
6952 rajveer 470
                            datestring = element.findtext('Date', '')
471
                            timestring = element.findtext('Time', '')
472
                            delivery_date = get_py_datetime(datestring, timestring)
473
                            if node_number < len(nodes)-1:
474
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
475
                            else:
476
                                reason_for_return = element.findtext('ServiceEvent', '')
477
                            returned_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
478
                            break       
7025 rajveer 479
                        elif element.findtext('TrackingCode', '') == 'UDLD':
480
                            datestring = element.findtext('Date', '')
481
                            timestring = element.findtext('Time', '')
482
                            delivery_date = get_py_datetime(datestring, timestring)
483
                            if node_number < len(nodes)-1:
484
                                reason_for_return = nodes[node_number+1].findtext('ServiceEvent', '')
485
                            else:
486
                                reason_for_return = element.findtext('ServiceEvent', '')
487
                            undelivered_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
488
                            break
6952 rajveer 489
                        node_number = node_number - 1
490
        except:
491
            pass
492
 
493
    print "Delivered Orders:"
494
    print delivered_orders
495
 
496
    print "Returned Orders:"
497
    print returned_orders
498
 
499
    print "Undelivered Orders"
500
    print undelivered_orders
501
 
502
    return delivered_orders, returned_orders, undelivered_orders
503
 
504
def update_picked_orders(provider_id, pickup_details):
505
    txnClient = TransactionClient().get_client()
506
    try:
507
        txnClient.markOrdersAsPickedUp(provider_id, pickup_details)
508
    except TransactionServiceException as tex:
509
        print tex.message
510
 
511
def update_picked_doas(provider_id, doa_pickup_details):
512
    txnClient = TransactionClient().get_client()
513
    try:
514
        txnClient.markDoasAsPickedUp(provider_id, doa_pickup_details)
515
    except TransactionServiceException as tex:
516
        print tex.message
517
 
518
def update_picked_returns(provider_id, returns_pickup_details):
519
    txnClient = TransactionClient().get_client()
520
    try:
521
        txnClient.markReturnOrdersAsPickedUp(provider_id, returns_pickup_details)
522
    except TransactionServiceException as tex:
523
        print tex.message
524
 
525
def update_delivered_orders(provider_id, delivered_orders):
526
    txnClient = TransactionClient().get_client()
527
    try:
528
        txnClient.markOrdersAsDelivered(provider_id, delivered_orders)
529
    except TransactionServiceException as tex:
530
        print tex.message
531
 
532
def update_returned_orders(provider_id, returned_orders):
533
    txnClient = TransactionClient().get_client()
534
    try:
535
        txnClient.markAsRTOrders(provider_id, returned_orders)
536
    except TransactionServiceException as tex:
537
        print tex.message
538
 
539
def update_reason_of_undelivered_orders(provider_id, undelivered_orders):
540
    txnClient = TransactionClient().get_client()
541
    try:
542
        txnClient.updateNonDeliveryReason(provider_id, undelivered_orders)
543
    except TransactionServiceException as tex:
544
        print tex.message
545
 
546
def update_local_connected_orders(provider_id, local_connected_orders):
547
    txnClient = TransactionClient().get_client()
548
    try:
549
        txnClient.markOrdersAsLocalConnected(provider_id, local_connected_orders)
550
    except TransactionServiceException as tex:
551
        print tex.message
552
 
553
def update_destination_city_reached_orders(provider_id, destination_city_reached_orders):
554
    txnClient = TransactionClient().get_client()
555
    try:
556
        txnClient.markOrdersAsDestinationCityReached(provider_id, destination_city_reached_orders)
557
    except TransactionServiceException as tex:
558
        print tex.message
559
 
560
def update_first_atdl_orders(provider_id, first_atdl_orders):
561
    txnClient = TransactionClient().get_client()
562
    try:
563
        txnClient.markOrdersAsFirstDeliveryAttempted(provider_id, first_atdl_orders)
564
    except TransactionServiceException as tex:
565
        print tex.message
566
 
567
def print_pickup_mismatch_report(filename, orders):
568
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
569
    writer.writerow(['Order Id', 'AWB No', 'Shipping timestamp'])
570
    for order in orders:
571
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.shipping_timestamp)])
572
 
573
def print_dao_return_pickup_mismatch_report(filename, orders):
574
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
575
    writer.writerow(['Order Id', 'Pickup Request No', 'Authorization timestamp'])
576
    for order in orders:
577
        writer.writerow([order.id, order.pickupRequestNo, to_py_date(order.doa_auth_timestamp)])
578
 
579
def print_rto_orders_report(filename, orders):
580
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
581
    writer.writerow(['Order Id', 'AWB No', 'Return date', 'Reason'])
582
    for order in orders:
583
        statusDescription = ''
584
        if order.statusDescription is not None:
585
            statusDescription = order.statusDescription.replace(","," ")
586
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.delivery_timestamp), statusDescription])
587
 
588
def print_undelivered_orders_report(filename, orders):
589
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
590
    writer.writerow(['Order Id', 'AWB No', 'Status', 'Status Description', 'Shipping timestamp', 'Pickup timestamp', 'Promised delivery date', 'Expected delivery date', 'OTG'])
591
    for order in orders:
592
        statusDescription = ''
593
        if order.statusDescription is not None:
594
            statusDescription = order.statusDescription.replace(","," ")
595
        writer.writerow([order.id, order.airwaybill_no, order.status, statusDescription, to_py_date(order.shipping_timestamp), to_py_date(order.pickup_timestamp), to_py_date(order.promised_delivery_time), to_py_date(order.expected_delivery_time), 'True'  if order.otg else 'False'])
596
 
597
def create_crm_tickets_for_delivey_attempted_orders(provider):
598
    try:
599
        tickets_tobe_created = fetch_data(provider.id, [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE])
600
        userClient = UserClient().get_client()
601
        crmServiceClient = CRMClient().get_client()
602
        for order in tickets_tobe_created:
603
            ticket_created = False
604
            searchFilter = SearchFilter()
605
            user = userClient.getUserByEmail(order.customer_email)
606
            if user is None or user.userId == -1:
607
                searchFilter.customerEmailId = order.customer_email
608
                searchFilter.customerMobileNumber = order.customer_mobilenumber
609
            else:
610
                searchFilter.customerId = user.userId
611
            searchFilter.ticketCategory = TicketCategory.UNDELIVERED
612
            tickets = crmServiceClient.getTickets(searchFilter)
613
            print tickets
614
            for old_ticket in tickets:
615
                if old_ticket.orderId == order.id:
616
                    ticket_created = True
617
                    break
618
            if not ticket_created:
619
                print "creating ticket for orderId:"+str(order.id)
620
                ticket = Ticket()
621
                activity = Activity()
622
                description = order.statusDescription + "\n\nOrder not delivered by courier due to problems at customer end."
623
                ticket.creatorId = 1
624
                ticket.assigneeId = defaultUndeliveredAsssigneeId
625
                ticket.category = TicketCategory.UNDELIVERED
626
                ticket.priority = TicketPriority.HIGH
627
                ticket.status = TicketStatus.OPEN
628
                ticket.description = description
629
                ticket.orderId = order.id
630
                ticket.airwayBillNo = order.airwaybill_no
631
 
632
                activity.creatorId = 1
633
                activity.ticketAssigneeId = ticket.assigneeId
634
                activity.type = ActivityType.OTHER
635
                activity.description = description
636
                activity.ticketCategory = ticket.category
637
                activity.ticketDescription = ticket.description
638
                activity.ticketPriority = ticket.priority
639
                activity.ticketStatus = ticket.status
640
 
641
                if user is None or user.userId == -1:
642
                    ticket.customerEmailId = order.customer_email
643
                    ticket.customerMobileNumber = order.customer_mobilenumber
644
                    ticket.customerName = order.customer_name
645
                    activity.customerEmailId = order.customer_email
646
                    activity.customerMobileNumber = order.customer_mobilenumber
647
                    activity.customerName = order.customer_name
648
                else:
649
                    ticket.customerId = user.userId
650
                    activity.customerId = user.userId
651
 
652
                crmServiceClient.insertTicket(ticket, activity)
653
                '''
654
                Inform user about first delivery attempt
655
                '''
656
                enqueueMailForFDA(order)
657
    except:
658
        print "Some issue while creating crm tickets for orders in FIRST_DELIVERY_ATTEMPT_MADE status"
659
        traceback.print_exc()
660
 
661
def auto_close_crm_tickets_created():
662
    try:
663
        ticket_created_orders = []
664
        tickets_map = {}
665
        crmServiceClient = CRMClient().get_client()
666
        searchFilter = SearchFilter()
667
        searchFilter.ticketCategory = TicketCategory.UNDELIVERED
668
        searchFilter.ticketAssigneeIds = [defaultUndeliveredAsssigneeId]
669
        searchFilter.ticketPriority = TicketPriority.HIGH
670
        searchFilter.ticketStatuses = [TicketStatus.OPEN]
671
        tickets = crmServiceClient.getTickets(searchFilter)
672
        print tickets
673
        for old_ticket in tickets:
674
            ticket_created_orders.append(old_ticket.orderId)
675
            tickets_map[old_ticket.orderId] = old_ticket
676
        print ticket_created_orders
677
        txnClient = TransactionClient().get_client()
678
        orders = txnClient.getOrderList(ticket_created_orders)
679
        for order in orders:
680
            if order.status not in [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE]:
681
                old_ticket = tickets_map.get(order.id)
682
                old_ticket.status = TicketStatus.CLOSED
683
                activity = Activity()
684
                activity.creatorId = 1
685
                activity.ticketAssigneeId = old_ticket.assigneeId
686
                activity.type = ActivityType.OTHER
687
                activity.description = "Ticket Closed bcoz order status changed to:" + order.statusDescription
688
                activity.ticketCategory = old_ticket.category
689
                activity.ticketDescription = old_ticket.description
690
                activity.ticketPriority = old_ticket.priority
691
                activity.ticketStatus = old_ticket.status
692
 
693
                if old_ticket.customerId is None or old_ticket.customerId == -1:
694
                    activity.customerEmailId = old_ticket.customerEmailId
695
                    activity.customerMobileNumber = old_ticket.customerMobileNumber
696
                    activity.customerName = old_ticket.customerName
697
                else:
698
                    activity.customerId = old_ticket.customerId
699
 
700
                crmServiceClient.updateTicket(old_ticket, activity)
701
    except:
702
        print "Some issue while closing crm tickets for orders in DELIVERY_SUCCESS status"
703
        traceback.print_exc()
704
 
705
def get_py_datetime(datestring, timestring):
706
    # This should be a command line argument.
707
    # Refer http://docs.python.org/library/time.html#time.strftime to
708
    # get a complete list of format specifiers available for date time.
709
    if datestring == '':
710
        return None
711
    if datestring.find('-') == -1:
712
        time_format = "%A,%d %B, %Y %H:%M:%S"
713
    else:
714
        time_format = "%d-%b-%Y %H:%M:%S"
715
    if timestring == '':
716
        timestring = '00:00:00'
717
    time_array = timestring.split(':')
718
    if len(time_array) < 3:
719
        timestring = timestring + ':00'
720
    time_string = datestring + ' ' + timestring[0:8]
721
    mytime = time.strptime(time_string, time_format)
722
    return datetime.datetime(*mytime[:6])
723
 
724
 
725
def getTrimedString(text):
726
    if text is None or text == '':
727
        return ''
728
    else:
729
        text = text.strip().lower()
730
        text_list = list(text)
731
        new_text = ''
732
        for letter in text_list:
733
            if letter.isalnum():
734
                new_text = new_text + str(letter)
735
        return new_text
736
 
737
def main():
738
    parser = optparse.OptionParser()
739
    parser.add_option("-p", "--pickup", dest="pickup_report",
740
                   action="store_true",
741
                   help="Run the pickup reconciliation")
742
    parser.add_option("-d", "--delivery", dest="delivery_report",
743
                   action="store_true",
744
                   help="Run the delivery reconciliation")
745
    parser.add_option("-r", "--reports", dest="gen_reports",
746
                   action="store_true",
747
                   help="Generate logistic reconciliation reports")
748
    parser.add_option("-a", "--all", dest="all_reports",
749
                   action="store_true",
750
                   help="Run all reconciliations")
751
    parser.add_option("-P", "--provider", dest="provider",
6966 rajveer 752
                   default="RedExpress", type="string",
6952 rajveer 753
                   help="The PROVIDER this report is for",
754
                   metavar="PROVIDER")
755
    parser.set_defaults(pickup_report=False, delivery_report=False, gen_reports=False, all_reports=False)
756
    (options, args) = parser.parse_args()
757
    if len(args) != 0:
758
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
759
 
760
    if options.all_reports:
761
        options.pickup_report = True
762
        options.delivery_report = True
763
 
764
    provider = get_provider_by_name(options.provider)
765
 
766
    if options.pickup_report:
767
        process_pickup_records(provider)
768
        #process_dao_pickup_orders(provider)
769
        #process_return_pickup_orders(provider)
770
    if options.delivery_report:
771
        process_local_connection_orders(provider)
7025 rajveer 772
        process_reached_destination_city_orders(provider)
773
        process_first_delivery_attempt_orders(provider)
6952 rajveer 774
        process_delivery_report(provider)
7025 rajveer 775
        create_crm_tickets_for_delivey_attempted_orders(provider)
776
        auto_close_crm_tickets_created()
6952 rajveer 777
    if options.gen_reports:
778
        generate_reports(provider)
779
 
780
if __name__ == '__main__':
781
    main()