Subversion Repositories SmartDukaan

Rev

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