Subversion Repositories SmartDukaan

Rev

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