Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
5262 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 Delhivery api to know whether they are picked up by Delhivery
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 Delhivery api to know whether they are picked up by Delhivery
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 Delhivery api to know whether they are picked up by Delhivery
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 Delhivery 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
to track DOA orders and for other orders ConfigClient is called to get Delhivery_update_url
24
 
25
@author: Phani Kumar
26
'''
6561 amit.gupta 27
from shop2020.clients import HelperClient
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
33
from LogisticUtils import enqueueMailForFDA
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
5262 phani.kuma 42
import datetime
43
import optparse
44
import sys
6561 amit.gupta 45
import time
5262 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
 
54
try:
55
    config_client = ConfigClient()
56
    Delhivery_URL = config_client.get_property("Delhivery_update_url")
57
except ConfigException as cex:
58
    print cex.message
59
    traceback.print_exc()
60
 
8292 manish.sha 61
defaultUndeliveredAsssigneeId = 47
5262 phani.kuma 62
from_user = 'cnc.center@shop2020.in'
63
from_pwd = '5h0p2o2o'
9173 manish.sha 64
to = ["amit.sirohi@shop2020.in", "sandeep.sachdeva@shop2020.in", "sunil.kumar@shop2020.in"]
5262 phani.kuma 65
 
66
def process_dao_pickup_orders(provider):
67
    try:
68
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
69
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
70
        if doa_pickup_details:
71
            update_picked_doas(provider.id, doa_pickup_details)
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:
78
        returns_tobe_picked_up = fetch_data(provider.id, [OrderStatus.RET_PICKUP_CONFIRMED])
79
        returns_pickup_details = read_dao_return_pickup_orders(returns_tobe_picked_up)
80
        if returns_pickup_details:
81
            update_picked_returns(provider.id, returns_pickup_details)
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:
88
        orders_tobe_picked_up = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH])
89
        pickup_details = read_pickup_orders(orders_tobe_picked_up)
90
        if pickup_details:
91
            update_picked_orders(provider.id, pickup_details)
92
    except:
93
        print "Some issue while processing the orders in SHIPPED_FROM_WH status"
94
        traceback.print_exc()
95
 
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
 
126
def process_delivery_report(provider):
127
    try:
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])
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)
134
        if undelivered_orders:
135
            update_reason_of_undelivered_orders(provider.id, undelivered_orders)
136
    except:
137
        print "Some issue while processing the orders for delivery status"
138
        traceback.print_exc()
139
 
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
159
            mismatch_file = "/tmp/Delhivery_DoaPickupMismatch.csv"
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
182
            mismatch_file = "/tmp/Delhivery_ReturnsPickupMismatch.csv"
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
205
            mismatch_file = "/tmp/Delhivery_PickupMismatch.csv"
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
228
            mismatch_file = "/tmp/Delhivery_LocalConnectionPendingOrders.csv"
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
251
            returned_orders_file = "/tmp/Delhivery_ReturnedOrders.csv"
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
274
            mismatch_file = "/tmp/Delhivery_UndeliveredOrders.csv"
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
 
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
 
298
def fetch_data(provider_id, order_status_list):
299
    txnClient = TransactionClient().get_client()
300
    try:
301
        doas_tobe_picked_up = txnClient.getOrdersForProviderForStatus(provider_id, order_status_list)
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
    picked_up_orders = {}
5325 phani.kuma 308
    list_of_order = []
5262 phani.kuma 309
    for order in orders_tobe_picked_up:
5325 phani.kuma 310
        list_of_order.append(str(order.pickupRequestNo))
12961 manish.sha 311
 
312
    parentAwbList = [list_of_order[x:x+10] for x in xrange(0, len(list_of_order), 10)]
5325 phani.kuma 313
 
12961 manish.sha 314
    for awbList in parentAwbList:     
315
        try:
316
            uri = Delhivery_URL + 'ref_nos=' + ','.join(awbList)
317
            root = parse(urllib2.urlopen(uri)).getroot()
318
            shipments = root.findall('Shipment')
319
            for shipment in shipments:
320
                nodes = shipment.findall('Scans/ScanDetail')
321
                for element in nodes:
322
                    delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
323
                    picked_up_orders[shipment.findtext('ReferenceNo', '')] = str(delivery_date)
324
                    break
325
        except:
326
            pass
5262 phani.kuma 327
 
328
    print "Picked up Orders:"
329
    print picked_up_orders
330
    return picked_up_orders
331
 
332
def read_pickup_orders(orders_tobe_picked_up):
333
    picked_up_orders = {}
5325 phani.kuma 334
    list_of_order = []
5262 phani.kuma 335
    for order in orders_tobe_picked_up:
5325 phani.kuma 336
        list_of_order.append(str(order.airwaybill_no))
12961 manish.sha 337
 
338
    parentAwbList = [list_of_order[x:x+10] for x in xrange(0, len(list_of_order), 10)]
5325 phani.kuma 339
 
12961 manish.sha 340
    for awbList in parentAwbList:    
341
        try:
342
            uri = Delhivery_URL + 'waybill=' + ','.join(awbList)
343
            root = parse(urllib2.urlopen(uri)).getroot()
344
            shipments = root.findall('Shipment')
345
            for shipment in shipments:
346
                nodes = shipment.findall('Scans/ScanDetail')
347
                for element in nodes:
348
                    delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
349
                    picked_up_orders[shipment.findtext('AWB', '')] = str(delivery_date)
350
                    break
351
        except:
352
            pass
5262 phani.kuma 353
 
354
    print "Picked up Orders:"
355
    print picked_up_orders
356
    return picked_up_orders
357
 
358
def read_local_connection_orders(orders_tobe_local_connected):
359
    local_connected_orders = {}
5325 phani.kuma 360
    list_of_order = []
5262 phani.kuma 361
    for order in orders_tobe_local_connected:
5325 phani.kuma 362
        list_of_order.append(str(order.airwaybill_no))
363
 
12961 manish.sha 364
    parentAwbList = [list_of_order[x:x+10] for x in xrange(0, len(list_of_order), 10)]
5262 phani.kuma 365
 
12961 manish.sha 366
    for awbList in parentAwbList:    
367
        try:
368
            uri = Delhivery_URL + 'waybill=' + ','.join(awbList)
369
            root = parse(urllib2.urlopen(uri)).getroot()
370
            shipments = root.findall('Shipment')
371
            for shipment in shipments:
372
                nodes = shipment.findall('Scans/ScanDetail')
373
                for element in nodes:
374
                    if element.findtext('ScanType', '') == 'UD' and getTrimedString(element.findtext('Scan', '')) == getTrimedString('In Transit'):
375
                        delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
376
                        local_connected_orders[shipment.findtext('AWB', '')] = str(delivery_date)
377
                        break
378
        except:
379
            pass
380
 
5262 phani.kuma 381
    print "Local Connected Orders"
382
    print local_connected_orders
383
 
384
    return local_connected_orders
385
 
386
def read_reached_destination_orders(orders_tobe_reached_destination_city):
387
    destination_city_reached_orders = {}
5325 phani.kuma 388
    list_of_order = []
5262 phani.kuma 389
    for order in orders_tobe_reached_destination_city:
5325 phani.kuma 390
        list_of_order.append(str(order.airwaybill_no))
391
 
12961 manish.sha 392
    parentAwbList = [list_of_order[x:x+10] for x in xrange(0, len(list_of_order), 10)]
5262 phani.kuma 393
 
12961 manish.sha 394
    for awbList in parentAwbList:
395
        try:
396
            uri = Delhivery_URL + 'waybill=' + ','.join(awbList)
397
            root = parse(urllib2.urlopen(uri)).getroot()
398
            shipments = root.findall('Shipment')
399
            for shipment in shipments:
400
                nodes = shipment.findall('Scans/ScanDetail')
401
                for element in nodes:
402
                    if element.findtext('ScanType', '') == 'UD' and getTrimedString(element.findtext('Scan', '')) == getTrimedString('Pending'):
403
                        delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
404
                        destination_city_reached_orders[shipment.findtext('AWB', '')] = str(delivery_date)
405
                        break
406
        except:
407
            pass
408
 
5262 phani.kuma 409
    print "Destination City Reached Orders"
410
    print destination_city_reached_orders
411
 
412
    return destination_city_reached_orders
413
 
414
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
415
    first_atdl_orders = {}
5325 phani.kuma 416
    list_of_order = []
5262 phani.kuma 417
    for order in orders_tobe_first_delivery_attempted:
5325 phani.kuma 418
        list_of_order.append(str(order.airwaybill_no))
12961 manish.sha 419
 
420
    parentAwbList = [list_of_order[x:x+10] for x in xrange(0, len(list_of_order), 10)]
5325 phani.kuma 421
 
12961 manish.sha 422
    for awbList in parentAwbList:
423
        try:
424
            uri = Delhivery_URL + 'waybill=' + ','.join(awbList)
425
            root = parse(urllib2.urlopen(uri)).getroot()
426
            shipments = root.findall('Shipment')
427
            for shipment in shipments:
428
                nodes = shipment.findall('Scans/ScanDetail')
429
                node_number = 0
430
                for element in nodes:
431
                    if element.findtext('ScanType', '') == 'UD' and getTrimedString(element.findtext('Scan', '')) == getTrimedString('Dispatched'):
432
                        if node_number != len(nodes)-1 and nodes[node_number+1].findtext('ScanType', '') == 'UD':
433
                            element = nodes[node_number+1]
434
                            delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
435
                            reason_for_nondelivery = element.findtext('Instructions', '')
436
                            first_atdl_orders[shipment.findtext('AWB', '')] = str(delivery_date) + "|" + reason_for_nondelivery
437
                            break
438
                    node_number = node_number + 1
439
        except:
440
            pass
5262 phani.kuma 441
 
442
    print "FIRST DELIVERY ATTEMPT MADE Orders"
443
    print first_atdl_orders
444
 
445
    return first_atdl_orders
446
 
447
def read_delivery_orders(orders_tobe_delivered):
448
    delivered_orders = {}
449
    returned_orders = {}
450
    undelivered_orders = {}
5325 phani.kuma 451
    list_of_order = []
5262 phani.kuma 452
    for order in orders_tobe_delivered:
5325 phani.kuma 453
        list_of_order.append(str(order.airwaybill_no))
454
 
12961 manish.sha 455
    parentAwbList = [list_of_order[x:x+10] for x in xrange(0, len(list_of_order), 10)]
5262 phani.kuma 456
 
12960 manish.sha 457
    for awbList in parentAwbList:        
458
        try:
459
            uri = Delhivery_URL + 'waybill=' + ','.join(awbList)
460
            data = urllib2.urlopen(uri)
461
            root = parse(data).getroot()
462
            shipments = root.findall('Shipment')
463
            for shipment in shipments:
464
                nodes = shipment.findall('Scans/ScanDetail')
465
                node_number = 0
466
                for element in nodes:
467
 
468
                    if element.findtext('ScanType', '') == 'DL' and getTrimedString('Delivered') in getTrimedString(element.findtext('Scan', '')) :
469
                        delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
470
                        receiver = shipment.findtext('Status/RecievedBy', '')
471
                        delivered_orders[shipment.findtext('AWB', '')] = str(delivery_date) + "|" +  receiver
472
                        break
473
                    elif element.findtext('ScanType', '') == 'RT' and getTrimedString(element.findtext('Scan', '')) == getTrimedString('Returned'):
474
                        delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
475
                        reason_for_return = element.findtext('Instructions', '')
476
                        returned_orders[shipment.findtext('AWB', '')] = str(delivery_date) + "|" + reason_for_return
477
                        break
478
                    elif node_number == len(nodes)-1:
479
                        reason = element.findtext('Instructions', '')
480
                        undelivered_orders[shipment.findtext('AWB', '')] = reason
481
                        break
482
                    node_number = node_number + 1
483
        except:
484
            pass
485
 
5262 phani.kuma 486
    print "Delivered Orders:"
487
    print delivered_orders
488
 
489
    print "Returned Orders:"
490
    print returned_orders
491
 
492
    print "Undelivered Orders"
493
    print undelivered_orders
494
 
495
    return delivered_orders, returned_orders, undelivered_orders
496
 
497
def update_picked_orders(provider_id, pickup_details):
498
    txnClient = TransactionClient().get_client()
499
    try:
500
        txnClient.markOrdersAsPickedUp(provider_id, pickup_details)
501
    except TransactionServiceException as tex:
502
        print tex.message
503
 
504
def update_picked_doas(provider_id, doa_pickup_details):
505
    txnClient = TransactionClient().get_client()
506
    try:
507
        txnClient.markDoasAsPickedUp(provider_id, doa_pickup_details)
508
    except TransactionServiceException as tex:
509
        print tex.message
510
 
511
def update_picked_returns(provider_id, returns_pickup_details):
512
    txnClient = TransactionClient().get_client()
513
    try:
514
        txnClient.markReturnOrdersAsPickedUp(provider_id, returns_pickup_details)
515
    except TransactionServiceException as tex:
516
        print tex.message
517
 
518
def update_delivered_orders(provider_id, delivered_orders):
519
    txnClient = TransactionClient().get_client()
520
    try:
521
        txnClient.markOrdersAsDelivered(provider_id, delivered_orders)
522
    except TransactionServiceException as tex:
523
        print tex.message
524
 
525
def update_returned_orders(provider_id, returned_orders):
526
    txnClient = TransactionClient().get_client()
527
    try:
528
        txnClient.markAsRTOrders(provider_id, returned_orders)
529
    except TransactionServiceException as tex:
530
        print tex.message
531
 
532
def update_reason_of_undelivered_orders(provider_id, undelivered_orders):
533
    txnClient = TransactionClient().get_client()
534
    try:
535
        txnClient.updateNonDeliveryReason(provider_id, undelivered_orders)
536
    except TransactionServiceException as tex:
537
        print tex.message
538
 
539
def update_local_connected_orders(provider_id, local_connected_orders):
540
    txnClient = TransactionClient().get_client()
541
    try:
542
        txnClient.markOrdersAsLocalConnected(provider_id, local_connected_orders)
543
    except TransactionServiceException as tex:
544
        print tex.message
545
 
546
def update_destination_city_reached_orders(provider_id, destination_city_reached_orders):
547
    txnClient = TransactionClient().get_client()
548
    try:
549
        txnClient.markOrdersAsDestinationCityReached(provider_id, destination_city_reached_orders)
550
    except TransactionServiceException as tex:
551
        print tex.message
552
 
553
def update_first_atdl_orders(provider_id, first_atdl_orders):
554
    txnClient = TransactionClient().get_client()
555
    try:
556
        txnClient.markOrdersAsFirstDeliveryAttempted(provider_id, first_atdl_orders)
557
    except TransactionServiceException as tex:
558
        print tex.message
559
 
560
def print_pickup_mismatch_report(filename, orders):
561
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
562
    writer.writerow(['Order Id', 'AWB No', 'Shipping timestamp'])
563
    for order in orders:
564
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.shipping_timestamp)])
565
 
566
def print_dao_return_pickup_mismatch_report(filename, orders):
567
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
568
    writer.writerow(['Order Id', 'Pickup Request No', 'Authorization timestamp'])
569
    for order in orders:
570
        writer.writerow([order.id, order.pickupRequestNo, to_py_date(order.doa_auth_timestamp)])
571
 
572
def print_rto_orders_report(filename, orders):
573
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
574
    writer.writerow(['Order Id', 'AWB No', 'Return date', 'Reason'])
575
    for order in orders:
576
        statusDescription = ''
577
        if order.statusDescription is not None:
578
            statusDescription = order.statusDescription.replace(","," ")
579
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.delivery_timestamp), statusDescription])
580
 
581
def print_undelivered_orders_report(filename, orders):
582
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
6703 rajveer 583
    writer.writerow(['Order Id', 'AWB No', 'Status', 'Status Description', 'Shipping timestamp', 'Pickup timestamp', 'Promised delivery date', 'Expected delivery date', 'OTG'])
5262 phani.kuma 584
    for order in orders:
585
        statusDescription = ''
586
        if order.statusDescription is not None:
587
            statusDescription = order.statusDescription.replace(","," ")
6703 rajveer 588
        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'])
5262 phani.kuma 589
 
590
def create_crm_tickets_for_delivey_attempted_orders(provider):
591
    try:
592
        tickets_tobe_created = fetch_data(provider.id, [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE])
593
        userClient = UserClient().get_client()
594
        crmServiceClient = CRMClient().get_client()
595
        for order in tickets_tobe_created:
596
            ticket_created = False
597
            searchFilter = SearchFilter()
598
            user = userClient.getUserByEmail(order.customer_email)
599
            if user is None or user.userId == -1:
600
                searchFilter.customerEmailId = order.customer_email
601
                searchFilter.customerMobileNumber = order.customer_mobilenumber
602
            else:
603
                searchFilter.customerId = user.userId
604
            searchFilter.ticketCategory = TicketCategory.UNDELIVERED
605
            tickets = crmServiceClient.getTickets(searchFilter)
606
            print tickets
607
            for old_ticket in tickets:
608
                if old_ticket.orderId == order.id:
609
                    ticket_created = True
610
                    break
611
            if not ticket_created:
612
                print "creating ticket for orderId:"+str(order.id)
613
                ticket = Ticket()
614
                activity = Activity()
615
                description = order.statusDescription + "\n\nOrder not delivered by courier due to problems at customer end."
616
                ticket.creatorId = 1
617
                ticket.assigneeId = defaultUndeliveredAsssigneeId
618
                ticket.category = TicketCategory.UNDELIVERED
619
                ticket.priority = TicketPriority.HIGH
620
                ticket.status = TicketStatus.OPEN
621
                ticket.description = description
622
                ticket.orderId = order.id
623
                ticket.airwayBillNo = order.airwaybill_no
624
 
625
                activity.creatorId = 1
626
                activity.ticketAssigneeId = ticket.assigneeId
627
                activity.type = ActivityType.OTHER
628
                activity.description = description
629
                activity.ticketCategory = ticket.category
630
                activity.ticketDescription = ticket.description
631
                activity.ticketPriority = ticket.priority
632
                activity.ticketStatus = ticket.status
633
 
634
                if user is None or user.userId == -1:
635
                    ticket.customerEmailId = order.customer_email
636
                    ticket.customerMobileNumber = order.customer_mobilenumber
637
                    ticket.customerName = order.customer_name
638
                    activity.customerEmailId = order.customer_email
639
                    activity.customerMobileNumber = order.customer_mobilenumber
640
                    activity.customerName = order.customer_name
641
                else:
642
                    ticket.customerId = user.userId
643
                    activity.customerId = user.userId
644
 
6618 amit.gupta 645
                crmServiceClient.insertTicket(ticket, activity)
6561 amit.gupta 646
                '''
647
                Inform user about first delivery attempt
648
                '''
649
                enqueueMailForFDA(order)
650
 
5262 phani.kuma 651
    except:
652
        print "Some issue while creating crm tickets for orders in FIRST_DELIVERY_ATTEMPT_MADE status"
653
        traceback.print_exc()
654
 
655
def auto_close_crm_tickets_created():
656
    try:
657
        ticket_created_orders = []
658
        tickets_map = {}
659
        crmServiceClient = CRMClient().get_client()
660
        searchFilter = SearchFilter()
661
        searchFilter.ticketCategory = TicketCategory.UNDELIVERED
662
        searchFilter.ticketAssigneeIds = [defaultUndeliveredAsssigneeId]
663
        searchFilter.ticketPriority = TicketPriority.HIGH
664
        searchFilter.ticketStatuses = [TicketStatus.OPEN]
665
        tickets = crmServiceClient.getTickets(searchFilter)
666
        print tickets
667
        for old_ticket in tickets:
668
            ticket_created_orders.append(old_ticket.orderId)
669
            tickets_map[old_ticket.orderId] = old_ticket
670
        print ticket_created_orders
671
        txnClient = TransactionClient().get_client()
672
        orders = txnClient.getOrderList(ticket_created_orders)
673
        for order in orders:
674
            if order.status not in [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE]:
675
                old_ticket = tickets_map.get(order.id)
676
                old_ticket.status = TicketStatus.CLOSED
677
                activity = Activity()
678
                activity.creatorId = 1
679
                activity.ticketAssigneeId = old_ticket.assigneeId
680
                activity.type = ActivityType.OTHER
681
                activity.description = "Ticket Closed bcoz order status changed to:" + order.statusDescription
682
                activity.ticketCategory = old_ticket.category
683
                activity.ticketDescription = old_ticket.description
684
                activity.ticketPriority = old_ticket.priority
685
                activity.ticketStatus = old_ticket.status
686
 
687
                if old_ticket.customerId is None or old_ticket.customerId == -1:
688
                    activity.customerEmailId = old_ticket.customerEmailId
689
                    activity.customerMobileNumber = old_ticket.customerMobileNumber
690
                    activity.customerName = old_ticket.customerName
691
                else:
692
                    activity.customerId = old_ticket.customerId
693
 
694
                crmServiceClient.updateTicket(old_ticket, activity)
695
    except:
696
        print "Some issue while closing crm tickets for orders in DELIVERY_SUCCESS status"
697
        traceback.print_exc()
698
 
699
def get_py_datetime(time_string):
700
    # This should be a command line argument.
701
    # Refer http://docs.python.org/library/time.html#time.strftime to
702
    # get a complete list of format specifiers available for date time.
703
    time_format = "%Y-%m-%d %H:%M:%S"
704
    if time_string == '':
705
        return None
706
    date_time_array = time_string.split('T')
707
    datestring = date_time_array[0]
708
    timestring = date_time_array[1]
709
    if timestring == '':
710
        timestring = '00:00:00'
711
    else:
712
        timestring = timestring.split('.')[0]
713
    time_string = datestring + ' ' + timestring
714
    mytime = time.strptime(time_string, time_format)
715
    return datetime.datetime(*mytime[:6])
716
 
717
def getTrimedString(text):
718
    if text is None or text == '':
719
        return ''
720
    else:
721
        text = text.strip().lower()
722
        text_list = list(text)
723
        new_text = ''
724
        for letter in text_list:
725
            if letter.isalnum():
726
                new_text = new_text + str(letter)
727
        return new_text
728
 
729
def main():
730
    parser = optparse.OptionParser()
731
    parser.add_option("-p", "--pickup", dest="pickup_report",
732
                   action="store_true",
733
                   help="Run the pickup reconciliation")
734
    parser.add_option("-d", "--delivery", dest="delivery_report",
735
                   action="store_true",
736
                   help="Run the delivery reconciliation")
737
    parser.add_option("-r", "--reports", dest="gen_reports",
738
                   action="store_true",
739
                   help="Generate logistic reconciliation reports")
740
    parser.add_option("-a", "--all", dest="all_reports",
741
                   action="store_true",
742
                   help="Run all reconciliations")
743
    parser.add_option("-P", "--provider", dest="provider",
744
                   default="Delhivery", type="string",
745
                   help="The PROVIDER this report is for",
746
                   metavar="PROVIDER")
747
    parser.set_defaults(pickup_report=False, delivery_report=False, gen_reports=False, all_reports=False)
748
    (options, args) = parser.parse_args()
749
    if len(args) != 0:
750
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
751
 
752
    if options.all_reports:
753
        options.pickup_report = True
754
        options.delivery_report = True
755
 
756
    provider = get_provider_by_name(options.provider)
757
 
758
    if options.pickup_report:
759
        process_pickup_records(provider)
760
        process_dao_pickup_orders(provider)
761
        process_return_pickup_orders(provider)
762
    if options.delivery_report:
763
        process_local_connection_orders(provider)
764
        process_reached_destination_city_orders(provider)
765
        process_first_delivery_attempt_orders(provider)
766
        process_delivery_report(provider)
12961 manish.sha 767
        create_crm_tickets_for_delivey_attempted_orders(provider)
5262 phani.kuma 768
        auto_close_crm_tickets_created()
769
    if options.gen_reports:
770
        generate_reports(provider)
771
 
772
if __name__ == '__main__':
6619 amit.gupta 773
    main()