Subversion Repositories SmartDukaan

Rev

Rev 12956 | Rev 12958 | 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
 
440
    try:
441
        uri = Delhivery_URL + 'waybill=' + ','.join(list_of_order)
5520 phani.kuma 442
        data = urllib2.urlopen(uri)
443
        print data
444
        root = parse(data).getroot()
5325 phani.kuma 445
        shipments = root.findall('Shipment')
446
        for shipment in shipments:
447
            nodes = shipment.findall('Scans/ScanDetail')
5262 phani.kuma 448
            node_number = 0
449
            for element in nodes:
12957 manish.sha 450
                print getTrimedString(element.findtext('Scan', ''))
451
                print shipment.findtext('Status/RecievedBy', '')
452
 
12956 manish.sha 453
                if element.findtext('ScanType', '') == 'DL' and getTrimedString('Delivered') in getTrimedString(element.findtext('Scan', '')) :
5262 phani.kuma 454
                    delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
5325 phani.kuma 455
                    receiver = shipment.findtext('Status/RecievedBy', '')
456
                    delivered_orders[shipment.findtext('AWB', '')] = str(delivery_date) + "|" +  receiver
5262 phani.kuma 457
                    break
458
                elif element.findtext('ScanType', '') == 'RT' and getTrimedString(element.findtext('Scan', '')) == getTrimedString('Returned'):
459
                    delivery_date = get_py_datetime(element.findtext('ScanDateTime', ''))
460
                    reason_for_return = element.findtext('Instructions', '')
5325 phani.kuma 461
                    returned_orders[shipment.findtext('AWB', '')] = str(delivery_date) + "|" + reason_for_return
5262 phani.kuma 462
                    break
463
                elif node_number == len(nodes)-1:
464
                    reason = element.findtext('Instructions', '')
5325 phani.kuma 465
                    undelivered_orders[shipment.findtext('AWB', '')] = reason
5262 phani.kuma 466
                    break
467
                node_number = node_number + 1
5325 phani.kuma 468
    except:
469
        pass
5262 phani.kuma 470
 
471
    print "Delivered Orders:"
472
    print delivered_orders
473
 
474
    print "Returned Orders:"
475
    print returned_orders
476
 
477
    print "Undelivered Orders"
478
    print undelivered_orders
479
 
480
    return delivered_orders, returned_orders, undelivered_orders
481
 
482
def update_picked_orders(provider_id, pickup_details):
483
    txnClient = TransactionClient().get_client()
484
    try:
485
        txnClient.markOrdersAsPickedUp(provider_id, pickup_details)
486
    except TransactionServiceException as tex:
487
        print tex.message
488
 
489
def update_picked_doas(provider_id, doa_pickup_details):
490
    txnClient = TransactionClient().get_client()
491
    try:
492
        txnClient.markDoasAsPickedUp(provider_id, doa_pickup_details)
493
    except TransactionServiceException as tex:
494
        print tex.message
495
 
496
def update_picked_returns(provider_id, returns_pickup_details):
497
    txnClient = TransactionClient().get_client()
498
    try:
499
        txnClient.markReturnOrdersAsPickedUp(provider_id, returns_pickup_details)
500
    except TransactionServiceException as tex:
501
        print tex.message
502
 
503
def update_delivered_orders(provider_id, delivered_orders):
504
    txnClient = TransactionClient().get_client()
505
    try:
506
        txnClient.markOrdersAsDelivered(provider_id, delivered_orders)
507
    except TransactionServiceException as tex:
508
        print tex.message
509
 
510
def update_returned_orders(provider_id, returned_orders):
511
    txnClient = TransactionClient().get_client()
512
    try:
513
        txnClient.markAsRTOrders(provider_id, returned_orders)
514
    except TransactionServiceException as tex:
515
        print tex.message
516
 
517
def update_reason_of_undelivered_orders(provider_id, undelivered_orders):
518
    txnClient = TransactionClient().get_client()
519
    try:
520
        txnClient.updateNonDeliveryReason(provider_id, undelivered_orders)
521
    except TransactionServiceException as tex:
522
        print tex.message
523
 
524
def update_local_connected_orders(provider_id, local_connected_orders):
525
    txnClient = TransactionClient().get_client()
526
    try:
527
        txnClient.markOrdersAsLocalConnected(provider_id, local_connected_orders)
528
    except TransactionServiceException as tex:
529
        print tex.message
530
 
531
def update_destination_city_reached_orders(provider_id, destination_city_reached_orders):
532
    txnClient = TransactionClient().get_client()
533
    try:
534
        txnClient.markOrdersAsDestinationCityReached(provider_id, destination_city_reached_orders)
535
    except TransactionServiceException as tex:
536
        print tex.message
537
 
538
def update_first_atdl_orders(provider_id, first_atdl_orders):
539
    txnClient = TransactionClient().get_client()
540
    try:
541
        txnClient.markOrdersAsFirstDeliveryAttempted(provider_id, first_atdl_orders)
542
    except TransactionServiceException as tex:
543
        print tex.message
544
 
545
def print_pickup_mismatch_report(filename, orders):
546
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
547
    writer.writerow(['Order Id', 'AWB No', 'Shipping timestamp'])
548
    for order in orders:
549
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.shipping_timestamp)])
550
 
551
def print_dao_return_pickup_mismatch_report(filename, orders):
552
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
553
    writer.writerow(['Order Id', 'Pickup Request No', 'Authorization timestamp'])
554
    for order in orders:
555
        writer.writerow([order.id, order.pickupRequestNo, to_py_date(order.doa_auth_timestamp)])
556
 
557
def print_rto_orders_report(filename, orders):
558
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
559
    writer.writerow(['Order Id', 'AWB No', 'Return date', 'Reason'])
560
    for order in orders:
561
        statusDescription = ''
562
        if order.statusDescription is not None:
563
            statusDescription = order.statusDescription.replace(","," ")
564
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.delivery_timestamp), statusDescription])
565
 
566
def print_undelivered_orders_report(filename, orders):
567
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
6703 rajveer 568
    writer.writerow(['Order Id', 'AWB No', 'Status', 'Status Description', 'Shipping timestamp', 'Pickup timestamp', 'Promised delivery date', 'Expected delivery date', 'OTG'])
5262 phani.kuma 569
    for order in orders:
570
        statusDescription = ''
571
        if order.statusDescription is not None:
572
            statusDescription = order.statusDescription.replace(","," ")
6703 rajveer 573
        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 574
 
575
def create_crm_tickets_for_delivey_attempted_orders(provider):
576
    try:
577
        tickets_tobe_created = fetch_data(provider.id, [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE])
578
        userClient = UserClient().get_client()
579
        crmServiceClient = CRMClient().get_client()
580
        for order in tickets_tobe_created:
581
            ticket_created = False
582
            searchFilter = SearchFilter()
583
            user = userClient.getUserByEmail(order.customer_email)
584
            if user is None or user.userId == -1:
585
                searchFilter.customerEmailId = order.customer_email
586
                searchFilter.customerMobileNumber = order.customer_mobilenumber
587
            else:
588
                searchFilter.customerId = user.userId
589
            searchFilter.ticketCategory = TicketCategory.UNDELIVERED
590
            tickets = crmServiceClient.getTickets(searchFilter)
591
            print tickets
592
            for old_ticket in tickets:
593
                if old_ticket.orderId == order.id:
594
                    ticket_created = True
595
                    break
596
            if not ticket_created:
597
                print "creating ticket for orderId:"+str(order.id)
598
                ticket = Ticket()
599
                activity = Activity()
600
                description = order.statusDescription + "\n\nOrder not delivered by courier due to problems at customer end."
601
                ticket.creatorId = 1
602
                ticket.assigneeId = defaultUndeliveredAsssigneeId
603
                ticket.category = TicketCategory.UNDELIVERED
604
                ticket.priority = TicketPriority.HIGH
605
                ticket.status = TicketStatus.OPEN
606
                ticket.description = description
607
                ticket.orderId = order.id
608
                ticket.airwayBillNo = order.airwaybill_no
609
 
610
                activity.creatorId = 1
611
                activity.ticketAssigneeId = ticket.assigneeId
612
                activity.type = ActivityType.OTHER
613
                activity.description = description
614
                activity.ticketCategory = ticket.category
615
                activity.ticketDescription = ticket.description
616
                activity.ticketPriority = ticket.priority
617
                activity.ticketStatus = ticket.status
618
 
619
                if user is None or user.userId == -1:
620
                    ticket.customerEmailId = order.customer_email
621
                    ticket.customerMobileNumber = order.customer_mobilenumber
622
                    ticket.customerName = order.customer_name
623
                    activity.customerEmailId = order.customer_email
624
                    activity.customerMobileNumber = order.customer_mobilenumber
625
                    activity.customerName = order.customer_name
626
                else:
627
                    ticket.customerId = user.userId
628
                    activity.customerId = user.userId
629
 
6618 amit.gupta 630
                crmServiceClient.insertTicket(ticket, activity)
6561 amit.gupta 631
                '''
632
                Inform user about first delivery attempt
633
                '''
634
                enqueueMailForFDA(order)
635
 
5262 phani.kuma 636
    except:
637
        print "Some issue while creating crm tickets for orders in FIRST_DELIVERY_ATTEMPT_MADE status"
638
        traceback.print_exc()
639
 
640
def auto_close_crm_tickets_created():
641
    try:
642
        ticket_created_orders = []
643
        tickets_map = {}
644
        crmServiceClient = CRMClient().get_client()
645
        searchFilter = SearchFilter()
646
        searchFilter.ticketCategory = TicketCategory.UNDELIVERED
647
        searchFilter.ticketAssigneeIds = [defaultUndeliveredAsssigneeId]
648
        searchFilter.ticketPriority = TicketPriority.HIGH
649
        searchFilter.ticketStatuses = [TicketStatus.OPEN]
650
        tickets = crmServiceClient.getTickets(searchFilter)
651
        print tickets
652
        for old_ticket in tickets:
653
            ticket_created_orders.append(old_ticket.orderId)
654
            tickets_map[old_ticket.orderId] = old_ticket
655
        print ticket_created_orders
656
        txnClient = TransactionClient().get_client()
657
        orders = txnClient.getOrderList(ticket_created_orders)
658
        for order in orders:
659
            if order.status not in [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE]:
660
                old_ticket = tickets_map.get(order.id)
661
                old_ticket.status = TicketStatus.CLOSED
662
                activity = Activity()
663
                activity.creatorId = 1
664
                activity.ticketAssigneeId = old_ticket.assigneeId
665
                activity.type = ActivityType.OTHER
666
                activity.description = "Ticket Closed bcoz order status changed to:" + order.statusDescription
667
                activity.ticketCategory = old_ticket.category
668
                activity.ticketDescription = old_ticket.description
669
                activity.ticketPriority = old_ticket.priority
670
                activity.ticketStatus = old_ticket.status
671
 
672
                if old_ticket.customerId is None or old_ticket.customerId == -1:
673
                    activity.customerEmailId = old_ticket.customerEmailId
674
                    activity.customerMobileNumber = old_ticket.customerMobileNumber
675
                    activity.customerName = old_ticket.customerName
676
                else:
677
                    activity.customerId = old_ticket.customerId
678
 
679
                crmServiceClient.updateTicket(old_ticket, activity)
680
    except:
681
        print "Some issue while closing crm tickets for orders in DELIVERY_SUCCESS status"
682
        traceback.print_exc()
683
 
684
def get_py_datetime(time_string):
685
    # This should be a command line argument.
686
    # Refer http://docs.python.org/library/time.html#time.strftime to
687
    # get a complete list of format specifiers available for date time.
688
    time_format = "%Y-%m-%d %H:%M:%S"
689
    if time_string == '':
690
        return None
691
    date_time_array = time_string.split('T')
692
    datestring = date_time_array[0]
693
    timestring = date_time_array[1]
694
    if timestring == '':
695
        timestring = '00:00:00'
696
    else:
697
        timestring = timestring.split('.')[0]
698
    time_string = datestring + ' ' + timestring
699
    mytime = time.strptime(time_string, time_format)
700
    return datetime.datetime(*mytime[:6])
701
 
702
def getTrimedString(text):
703
    if text is None or text == '':
704
        return ''
705
    else:
706
        text = text.strip().lower()
707
        text_list = list(text)
708
        new_text = ''
709
        for letter in text_list:
710
            if letter.isalnum():
711
                new_text = new_text + str(letter)
712
        return new_text
713
 
714
def main():
715
    parser = optparse.OptionParser()
716
    parser.add_option("-p", "--pickup", dest="pickup_report",
717
                   action="store_true",
718
                   help="Run the pickup reconciliation")
719
    parser.add_option("-d", "--delivery", dest="delivery_report",
720
                   action="store_true",
721
                   help="Run the delivery reconciliation")
722
    parser.add_option("-r", "--reports", dest="gen_reports",
723
                   action="store_true",
724
                   help="Generate logistic reconciliation reports")
725
    parser.add_option("-a", "--all", dest="all_reports",
726
                   action="store_true",
727
                   help="Run all reconciliations")
728
    parser.add_option("-P", "--provider", dest="provider",
729
                   default="Delhivery", type="string",
730
                   help="The PROVIDER this report is for",
731
                   metavar="PROVIDER")
732
    parser.set_defaults(pickup_report=False, delivery_report=False, gen_reports=False, all_reports=False)
733
    (options, args) = parser.parse_args()
734
    if len(args) != 0:
735
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
736
 
737
    if options.all_reports:
738
        options.pickup_report = True
739
        options.delivery_report = True
740
 
741
    provider = get_provider_by_name(options.provider)
742
 
743
    if options.pickup_report:
744
        process_pickup_records(provider)
745
        process_dao_pickup_orders(provider)
746
        process_return_pickup_orders(provider)
747
    if options.delivery_report:
748
        process_local_connection_orders(provider)
749
        process_reached_destination_city_orders(provider)
750
        process_first_delivery_attempt_orders(provider)
751
        process_delivery_report(provider)
752
        create_crm_tickets_for_delivey_attempted_orders(provider)
753
        auto_close_crm_tickets_created()
754
    if options.gen_reports:
755
        generate_reports(provider)
756
 
757
if __name__ == '__main__':
6619 amit.gupta 758
    main()