Subversion Repositories SmartDukaan

Rev

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