Subversion Repositories SmartDukaan

Rev

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