Subversion Repositories SmartDukaan

Rev

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

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