Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4506 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 
5152 phani.kuma 6
     calls aramex api to know whether they are picked up by aramex
4506 phani.kuma 7
     and changes the status to DOA_RETURN_IN_TRANSIT if it is done.
4741 phani.kuma 8
 2. Orders in RET_PICKUP_CONFIRMED status : get details of orders that 
9
     were in RET_PICKUP_CONFIRMED status from database and 
5152 phani.kuma 10
     calls aramex api to know whether they are picked up by aramex
4741 phani.kuma 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
4506 phani.kuma 13
     were in SHIPPED_FROM_WH status from database and 
5152 phani.kuma 14
     calls aramex api to know whether they are picked up by aramex
4506 phani.kuma 15
     and changes the status to SHIPPED_TO_LOGST if it is done.
4741 phani.kuma 16
 4. Orders in SHIPPED_TO_LOGST status: get details of orders that
4506 phani.kuma 17
     were in SHIPPED_TO_LOGST status from database and 
18
     calls aramex api to know their status and changes the status accordingly.
19
 
4741 phani.kuma 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
4506 phani.kuma 22
 
23
http://www.aramex.com/track_xml.asp?ShipperRef={variable1}&OrgCntry=In&FromDate={variable2}&ToDate={variable3} is hard coded
24
to track DOA orders and for other orders ConfigClient is called to get aramex_update_url
25
 
26
@author: Phani Kumar
27
'''
6561 amit.gupta 28
from shop2020.clients.CRMClient import CRMClient
29
from shop2020.clients.LogisticsClient import LogisticsClient
30
from shop2020.clients.TransactionClient import TransactionClient
31
from shop2020.clients.UserClient import UserClient
32
from shop2020.config.client.ConfigClient import ConfigClient
33
from shop2020.model.v1.order.script.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
4506 phani.kuma 42
import datetime
43
import optparse
44
import sys
6561 amit.gupta 45
import time
4506 phani.kuma 46
import traceback
47
import urllib2
48
 
49
if __name__ == '__main__' and __package__ is None:
50
    import os
51
    sys.path.insert(0, os.getcwd())
52
 
53
 
4910 phani.kuma 54
try:
55
    config_client = ConfigClient()
56
    ARAMEX_URL = config_client.get_property("aramex_update_url")
57
except ConfigException as cex:
58
    print cex.message
59
    traceback.print_exc()
60
 
8292 manish.sha 61
defaultUndeliveredAsssigneeId = 47
4506 phani.kuma 62
from_user = 'cnc.center@shop2020.in'
63
from_pwd = '5h0p2o2o'
7331 amit.gupta 64
to = ['cnc.center@shop2020.in', "amit.sirohi@shop2020.in", "sandeep.sachdeva@shop2020.in", "manoj.kumar@shop2020.in"]
4506 phani.kuma 65
 
66
def process_dao_pickup_orders(provider):
67
    try:
4910 phani.kuma 68
        doas_tobe_picked_up = fetch_data(provider.id, [OrderStatus.DOA_PICKUP_CONFIRMED])
4741 phani.kuma 69
        doa_pickup_details = read_dao_return_pickup_orders(doas_tobe_picked_up)
4910 phani.kuma 70
        if doa_pickup_details:
71
            update_picked_doas(provider.id, doa_pickup_details)
4559 phani.kuma 72
    except:
73
        print "Some issue while processing the orders in DOA_PICKUP_CONFIRMED status"
4506 phani.kuma 74
        traceback.print_exc()
75
 
4741 phani.kuma 76
def process_return_pickup_orders(provider):
77
    try:
4910 phani.kuma 78
        returns_tobe_picked_up = fetch_data(provider.id, [OrderStatus.RET_PICKUP_CONFIRMED])
4741 phani.kuma 79
        returns_pickup_details = read_dao_return_pickup_orders(returns_tobe_picked_up)
4910 phani.kuma 80
        if returns_pickup_details:
81
            update_picked_returns(provider.id, returns_pickup_details)
4741 phani.kuma 82
    except:
83
        print "Some issue while processing the orders in RET_PICKUP_CONFIRMED status"
84
        traceback.print_exc()
85
 
4506 phani.kuma 86
def process_pickup_records(provider):
87
    try:
4910 phani.kuma 88
        orders_tobe_picked_up = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH])
4559 phani.kuma 89
        pickup_details = read_pickup_orders(orders_tobe_picked_up)
4910 phani.kuma 90
        if pickup_details:
91
            update_picked_orders(provider.id, pickup_details)
4559 phani.kuma 92
    except:
93
        print "Some issue while processing the orders in SHIPPED_FROM_WH status"
4506 phani.kuma 94
        traceback.print_exc()
95
 
4910 phani.kuma 96
def process_local_connection_orders(provider):
97
    try:
98
        orders_tobe_local_connected = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST])
99
        local_connected_orders = read_local_connection_orders(orders_tobe_local_connected)
100
        if local_connected_orders:
101
            update_local_connected_orders(provider.id, local_connected_orders)
102
    except:
103
        print "Some issue while processing the orders for local connection status"
104
        traceback.print_exc()
105
 
106
def process_reached_destination_city_orders(provider):
107
    try:
108
        orders_tobe_reached_destination_city = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_TO_DESTINATION_CITY])
109
        destination_city_reached_orders = read_reached_destination_orders(orders_tobe_reached_destination_city)
110
        if destination_city_reached_orders:
111
            update_destination_city_reached_orders(provider.id, destination_city_reached_orders)
112
    except:
113
        print "Some issue while processing the orders for Reached Destination City status"
114
        traceback.print_exc()
115
 
116
def process_first_delivery_attempt_orders(provider):
117
    try:
118
        orders_tobe_first_delivery_attempted = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_TO_DESTINATION_CITY, OrderStatus.REACHED_DESTINATION_CITY])
119
        first_atdl_orders = read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted)
120
        if first_atdl_orders:
121
            update_first_atdl_orders(provider.id, first_atdl_orders)
122
    except:
123
        print "Some issue while processing the orders for First delivery attempt status"
124
        traceback.print_exc()
125
 
4506 phani.kuma 126
def process_delivery_report(provider):
127
    try:
4910 phani.kuma 128
        orders_tobe_delivered = fetch_data(provider.id, [OrderStatus.SHIPPED_FROM_WH, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_TO_DESTINATION_CITY, OrderStatus.REACHED_DESTINATION_CITY, OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE])
129
        delivered_orders, returned_orders, undelivered_orders = read_delivery_orders(orders_tobe_delivered)
4506 phani.kuma 130
        if delivered_orders:
131
            update_delivered_orders(provider.id, delivered_orders)
132
        if returned_orders:
133
            update_returned_orders(provider.id, returned_orders)
4910 phani.kuma 134
        if undelivered_orders:
135
            update_reason_of_undelivered_orders(provider.id, undelivered_orders)
4506 phani.kuma 136
    except:
4910 phani.kuma 137
        print "Some issue while processing the orders for delivery status"
4506 phani.kuma 138
        traceback.print_exc()
139
 
4910 phani.kuma 140
def generate_reports(provider):
141
    get_doas_not_picked_up(provider)
142
    get_returns_not_picked_up(provider)
143
    get_orders_not_picked_up(provider)
144
    get_orders_pending_local_connection(provider)
145
    get_returned_orders(provider)
146
    get_orders_not_delivered(provider)
147
 
148
def get_doas_not_picked_up(provider):
149
    txnClient = TransactionClient().get_client()
150
    try:
151
        doas_not_picked_up = txnClient.getDoasNotPickedUp(provider.id)
152
    except TransactionServiceException as tex:
153
        print tex.message
154
 
155
    try:
156
        if doas_not_picked_up:
157
            print "DOAs not Picked up:"
158
            print doas_not_picked_up
5152 phani.kuma 159
            mismatch_file = "/tmp/Aramex_DoaPickupMismatch.csv"
4910 phani.kuma 160
            print "Some of our DOA orders were not picked up. Printing report to:" + mismatch_file
161
            print_dao_return_pickup_mismatch_report(mismatch_file, doas_not_picked_up)
162
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
163
            mail(from_user, from_pwd, to,\
164
                 "DOA Pickup Mismatch for " + provider.name,\
165
                 "This is a system generated email.Please don't reply to it.",\
166
                 pickup_mismatch_part)
167
    except Exception:
168
        print "Some issue sending the DOA mismatch report"
169
        traceback.print_exc()
170
 
171
def get_returns_not_picked_up(provider):
172
    txnClient = TransactionClient().get_client()
173
    try:
174
        returns_not_picked_up = txnClient.getReturnOrdersNotPickedUp(provider.id)
175
    except TransactionServiceException as tex:
176
        print tex.message
177
 
178
    try:
179
        if returns_not_picked_up:
180
            print "Return Orders not Picked up:"
181
            print returns_not_picked_up
5152 phani.kuma 182
            mismatch_file = "/tmp/Aramex_ReturnsPickupMismatch.csv"
4910 phani.kuma 183
            print "Some of our Return orders were not picked up. Printing report to:" + mismatch_file
184
            print_dao_return_pickup_mismatch_report(mismatch_file, returns_not_picked_up)
185
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
186
            mail(from_user, from_pwd, to,\
187
                 "Return orders Pickup Mismatch for " + provider.name,\
188
                 "This is a system generated email.Please don't reply to it.",\
189
                 pickup_mismatch_part)
190
    except Exception:
191
        print "Some issue sending the Return orders mismatch report"
192
        traceback.print_exc()
193
 
194
def get_orders_not_picked_up(provider):
195
    txnClient = TransactionClient().get_client()
196
    try:
197
        orders_not_picked_up = txnClient.getOrdersNotPickedUp(provider.id)
198
    except TransactionServiceException as tex:
199
        print tex.message
200
 
201
    try:
202
        if orders_not_picked_up:
203
            print "Orders not Picked up:"
204
            print orders_not_picked_up
5152 phani.kuma 205
            mismatch_file = "/tmp/Aramex_PickupMismatch.csv"
4910 phani.kuma 206
            print "Some of our orders were not picked up. Printing report to:" + mismatch_file
207
            print_pickup_mismatch_report(mismatch_file, orders_not_picked_up)
208
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
209
            mail(from_user, from_pwd, to,\
210
                 "Order Pickup Mismatch for " + provider.name,\
211
                 "This is a system generated email.Please don't reply to it.",\
212
                 pickup_mismatch_part)
213
    except Exception:
214
        print "Some issue sending the pickup mismatch report"
215
        traceback.print_exc()
216
 
217
def get_orders_pending_local_connection(provider):
218
    txnClient = TransactionClient().get_client()
219
    try:
220
        orders_pending_local_connection = txnClient.getOrdersNotLocalConnected(provider.id)
221
    except TransactionServiceException as tex:
222
        print tex.message
223
 
224
    try:
225
        if orders_pending_local_connection:
226
            print "Local Connection Pending Orders:"
227
            print orders_pending_local_connection
5152 phani.kuma 228
            mismatch_file = "/tmp/Aramex_LocalConnectionPendingOrders.csv"
4910 phani.kuma 229
            print "Some of our Orders were not Shipped to Destination yet. Printing report to:" + mismatch_file
230
            print_undelivered_orders_report(mismatch_file, orders_pending_local_connection)
231
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
232
            mail(from_user, from_pwd, to,\
233
                 "Orders that are not Shipped to Destination yet for " + provider.name,\
234
                 "This is a system generated email.Please don't reply to it.",\
235
                 pickup_mismatch_part)
236
    except Exception:
237
        print "Some issue updating and sending the Local Connection orders report"
238
        traceback.print_exc()
239
 
240
def get_returned_orders(provider):
241
    txnClient = TransactionClient().get_client()
242
    try:
243
        returned_orders = txnClient.getRTOrders(provider.id)
244
    except TransactionServiceException as tex:
245
        print tex.message
246
 
247
    try:
248
        if returned_orders:
249
            print "Returned Orders:"
250
            print returned_orders
5152 phani.kuma 251
            returned_orders_file = "/tmp/Aramex_ReturnedOrders.csv"
4910 phani.kuma 252
            print "Some of our Orders were returned by logistics provider. Printing report to:" + returned_orders_file
253
            print_rto_orders_report(returned_orders_file, returned_orders)
254
            returned_orders_report = [get_attachment_part(returned_orders_file)]
255
            mail(from_user, from_pwd, to,\
256
                 "Returned Orders Report for " + provider.name,\
257
                 "This is a system generated email.Please don't reply to it.",\
258
                 returned_orders_report)
259
    except:
260
        print "Some issue sending the returned orders report"
261
        traceback.print_exc()
262
 
263
def get_orders_not_delivered(provider):
264
    txnClient = TransactionClient().get_client()
265
    try:
266
        orders_not_delivered = txnClient.getNonDeliveredOrdersbyCourier(provider.id)
267
    except TransactionServiceException as tex:
268
        print tex.message
269
 
270
    try:
271
        if orders_not_delivered:
272
            print "Undelivered Orders:"
273
            print orders_not_delivered
5152 phani.kuma 274
            mismatch_file = "/tmp/Aramex_UndeliveredOrders.csv"
4910 phani.kuma 275
            print "Some of our Orders were not delivered. Printing report to:" + mismatch_file
276
            print_undelivered_orders_report(mismatch_file, orders_not_delivered)
277
            pickup_mismatch_part = [get_attachment_part(mismatch_file)]
278
            mail(from_user, from_pwd, to,\
279
                 "Orders that are undelivered but picked up or shipped four days ago for " + provider.name,\
280
                 "This is a system generated email.Please don't reply to it.",\
281
                 pickup_mismatch_part)
282
    except Exception:
283
        print "Some issue updating and sending the undelivered orders report"
284
        traceback.print_exc()
285
 
4506 phani.kuma 286
def get_provider_by_name(provider_name):
287
    logistics_client = LogisticsClient().get_client()
288
    provider = None
289
    providers = logistics_client.getAllProviders()
290
    for p in providers:
291
        if p.name == provider_name:
292
            provider=p
293
            break
294
    if provider == None:
295
        sys.exit("Can't continue execution: No such provider")
296
    return provider
297
 
4910 phani.kuma 298
def fetch_data(provider_id, order_status_list):
4506 phani.kuma 299
    txnClient = TransactionClient().get_client()
300
    try:
4910 phani.kuma 301
        doas_tobe_picked_up = txnClient.getOrdersForProviderForStatus(provider_id, order_status_list)
4506 phani.kuma 302
        return doas_tobe_picked_up
303
    except TransactionServiceException as tex:
304
        print tex.message
305
 
4741 phani.kuma 306
def read_dao_return_pickup_orders(orders_tobe_picked_up):
4506 phani.kuma 307
    #uri=http://www.aramex.com/track_xml.asp?ShipperRef=61582&OrgCntry=In&FromDate=2-6-2012&ToDate=2-6-2012
4741 phani.kuma 308
    picked_up_orders = {}
309
    for order in orders_tobe_picked_up:
4506 phani.kuma 310
        try:
4741 phani.kuma 311
            uri = 'http://www.aramex.com/track_xml.asp?ShipperRef=' + str(order.pickupRequestNo) + '&OrgCntry=In&FromDate=' + to_py_date(order.doa_auth_timestamp).strftime("%m-%d-%Y") +'&ToDate=' + datetime.date.today().strftime("%m-%d-%Y")
312
            root = parse(urllib2.urlopen(uri)).getroot()
4506 phani.kuma 313
            nodes = root.findall('HAWBDetails/HAWBHistory/HAWBUpdate')
4910 phani.kuma 314
            for element in reversed(nodes):
315
                delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
316
                picked_up_orders[order.pickupRequestNo] = str(delivery_date)
317
                break
4506 phani.kuma 318
        except:
319
            pass
320
 
4741 phani.kuma 321
    print "Picked up Orders:"
322
    print picked_up_orders
323
    return picked_up_orders
4506 phani.kuma 324
 
325
def read_pickup_orders(orders_tobe_picked_up):
326
    picked_up_orders = {}
327
    for order in orders_tobe_picked_up:
328
        try:
4741 phani.kuma 329
            uri = ARAMEX_URL + order.airwaybill_no
330
            root = parse(urllib2.urlopen(uri)).getroot()
4506 phani.kuma 331
            nodes = root.findall('HAWBDetails/HAWBHistory/HAWBUpdate')
4910 phani.kuma 332
            for element in reversed(nodes):
333
                delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
334
                picked_up_orders[order.airwaybill_no] = str(delivery_date)
335
                break
4506 phani.kuma 336
        except:
337
            pass
338
 
339
    print "Picked up Orders:"
340
    print picked_up_orders
341
    return picked_up_orders
342
 
4910 phani.kuma 343
def read_local_connection_orders(orders_tobe_local_connected):
344
    local_connected_orders = {}
345
    for order in orders_tobe_local_connected:
346
        try:
347
            uri = ARAMEX_URL + order.airwaybill_no
348
            root = parse(urllib2.urlopen(uri)).getroot()
349
            nodes = root.findall('HAWBDetails/HAWBHistory/HAWBUpdate')
350
            for element in reversed(nodes):
351
                # For local delivery source city and destination city will be same
352
                if root.findtext('HAWBDetails/HAWBOriginEntity', '') == root.findtext('HAWBDetails/HAWBDestEntity', '') and element.findtext('Status', '') == 'SHMF' and element.findtext('Condition', '') == 'MNOB':
353
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
354
                    local_connected_orders[order.airwaybill_no] = str(delivery_date)
355
                    break
356
                # For outside delivery source city and destination city will be different, so checking for last scan at source city branch.
357
                elif root.findtext('HAWBDetails/HAWBOriginEntity', '') != root.findtext('HAWBDetails/HAWBDestEntity', '') and element.findtext('BranchID', '') == getOriginCityBranchID(root.findtext('HAWBDetails/HAWBOriginEntity', '')) and element.findtext('Status', '') == 'SHMF' and element.findtext('Condition', '') == 'MNOB':
358
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
359
                    local_connected_orders[order.airwaybill_no] = str(delivery_date)
360
                    break
361
        except:
362
            pass
363
 
364
    print "Local Connected Orders"
365
    print local_connected_orders
366
 
367
    return local_connected_orders
368
 
369
def read_reached_destination_orders(orders_tobe_reached_destination_city):
370
    destination_city_reached_orders = {}
371
    for order in orders_tobe_reached_destination_city:
372
        try:
373
            uri = ARAMEX_URL + order.airwaybill_no
374
            root = parse(urllib2.urlopen(uri)).getroot()
375
            nodes = root.findall('HAWBDetails/HAWBHistory/HAWBUpdate')
376
            for element in reversed(nodes):
377
                if root.findtext('HAWBDetails/HAWBOriginEntity', '') == root.findtext('HAWBDetails/HAWBDestEntity', '') and element.findtext('UpdateEntity', '') == root.findtext('HAWBDetails/HAWBDestEntity', ''):
378
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
379
                    destination_city_reached_orders[order.airwaybill_no] = str(delivery_date)
380
                    break
381
                elif root.findtext('HAWBDetails/HAWBOriginEntity', '') != root.findtext('HAWBDetails/HAWBDestEntity', '') and element.findtext('UpdateEntity', '') == root.findtext('HAWBDetails/HAWBDestEntity', '') and element.findtext('Status', '') == 'SHIB' and element.findtext('Condition', '') == 'SHSC':
382
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
383
                    destination_city_reached_orders[order.airwaybill_no] = str(delivery_date)
384
                    break
385
        except:
386
            pass
387
 
388
    print "Destination City Reached Orders"
389
    print destination_city_reached_orders
390
 
391
    return destination_city_reached_orders
392
 
393
def read_first_delivery_attempt_orders(orders_tobe_first_delivery_attempted):
394
    first_atdl_orders = {}
395
    for order in orders_tobe_first_delivery_attempted:
396
        try:
397
            uri = ARAMEX_URL + order.airwaybill_no
398
            root = parse(urllib2.urlopen(uri)).getroot()
399
            nodes = root.findall('HAWBDetails/HAWBHistory/HAWBUpdate')
400
            for element in reversed(nodes):
401
                if element.findtext('Status', '') == 'SHUD' and (element.findtext('Condition', '') == 'ATDL' or element.findtext('Condition', '') == 'CSCN'):
402
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
403
                    reason_for_nondelivery = element.findtext('CustomerDescription', '')
404
                    first_atdl_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_nondelivery
405
                    break
406
        except:
407
            pass
408
 
409
    print "FIRST DELIVERY ATTEMPT MADE Orders"
410
    print first_atdl_orders
411
 
412
    return first_atdl_orders
413
 
4506 phani.kuma 414
def read_delivery_orders(orders_tobe_delivered):
415
    delivered_orders = {}
416
    returned_orders = {}
417
    undelivered_orders = {}
418
    for order in orders_tobe_delivered:
419
        try:
4741 phani.kuma 420
            uri = ARAMEX_URL + order.airwaybill_no
421
            root = parse(urllib2.urlopen(uri)).getroot()
4506 phani.kuma 422
            nodes = root.findall('HAWBDetails/HAWBHistory/HAWBUpdate')
4910 phani.kuma 423
            node_number = len(nodes)-1
424
            for element in reversed(nodes):
425
                if element.findtext('Status', '') == 'SHDL' and (element.findtext('Condition', '') == 'DLVD' or element.findtext('Condition', '') == 'DPTT' or element.findtext('Condition', '') == 'DLPT' or element.findtext('Condition', '') == 'LTRB'):
426
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
427
                    receiver = root.findtext('HAWBDetails/DeliveredTo', '')
428
                    delivered_orders[order.airwaybill_no] = str(delivery_date) + "|" +  receiver
429
                    break
430
                elif element.findtext('Condition', '') == 'RTRN' and (element.findtext('Status', '') == 'SHRH' or element.findtext('Status', '') == 'SHUP'):
431
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
432
                    if node_number < len(nodes)-1:
433
                        reason_for_return = nodes[node_number+1].findtext('CustomerDescription', '')
434
                    else:
435
                        reason_for_return = element.findtext('CustomerDescription', '')
436
                    returned_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return
437
                    break
438
                elif node_number == 0:
439
                    reason = root.findtext('HAWBDetails/CurrentStatus', '')
440
                    undelivered_orders[order.airwaybill_no] = reason
441
                    break
442
                node_number = node_number - 1
4506 phani.kuma 443
        except:
444
            pass
445
 
446
    print "Delivered Orders:"
447
    print delivered_orders
448
 
449
    print "Returned Orders:"
450
    print returned_orders
451
 
452
    print "Undelivered Orders"
453
    print undelivered_orders
454
 
4910 phani.kuma 455
    return delivered_orders, returned_orders, undelivered_orders
4506 phani.kuma 456
 
457
def update_picked_orders(provider_id, pickup_details):
458
    txnClient = TransactionClient().get_client()
459
    try:
4910 phani.kuma 460
        txnClient.markOrdersAsPickedUp(provider_id, pickup_details)
4506 phani.kuma 461
    except TransactionServiceException as tex:
462
        print tex.message
463
 
464
def update_picked_doas(provider_id, doa_pickup_details):
465
    txnClient = TransactionClient().get_client()
466
    try:
4910 phani.kuma 467
        txnClient.markDoasAsPickedUp(provider_id, doa_pickup_details)
4506 phani.kuma 468
    except TransactionServiceException as tex:
469
        print tex.message
470
 
4741 phani.kuma 471
def update_picked_returns(provider_id, returns_pickup_details):
472
    txnClient = TransactionClient().get_client()
473
    try:
4910 phani.kuma 474
        txnClient.markReturnOrdersAsPickedUp(provider_id, returns_pickup_details)
4741 phani.kuma 475
    except TransactionServiceException as tex:
476
        print tex.message
477
 
4506 phani.kuma 478
def update_delivered_orders(provider_id, delivered_orders):
479
    txnClient = TransactionClient().get_client()
480
    try:
481
        txnClient.markOrdersAsDelivered(provider_id, delivered_orders)
482
    except TransactionServiceException as tex:
483
        print tex.message
484
 
485
def update_returned_orders(provider_id, returned_orders):
486
    txnClient = TransactionClient().get_client()
487
    try:
4910 phani.kuma 488
        txnClient.markAsRTOrders(provider_id, returned_orders)
4506 phani.kuma 489
    except TransactionServiceException as tex:
490
        print tex.message
491
 
492
def update_reason_of_undelivered_orders(provider_id, undelivered_orders):
493
    txnClient = TransactionClient().get_client()
494
    try:
4910 phani.kuma 495
        txnClient.updateNonDeliveryReason(provider_id, undelivered_orders)
4506 phani.kuma 496
    except TransactionServiceException as tex:
497
        print tex.message
498
 
4910 phani.kuma 499
def update_local_connected_orders(provider_id, local_connected_orders):
500
    txnClient = TransactionClient().get_client()
501
    try:
502
        txnClient.markOrdersAsLocalConnected(provider_id, local_connected_orders)
503
    except TransactionServiceException as tex:
504
        print tex.message
505
 
506
def update_destination_city_reached_orders(provider_id, destination_city_reached_orders):
507
    txnClient = TransactionClient().get_client()
508
    try:
509
        txnClient.markOrdersAsDestinationCityReached(provider_id, destination_city_reached_orders)
510
    except TransactionServiceException as tex:
511
        print tex.message
512
 
513
def update_first_atdl_orders(provider_id, first_atdl_orders):
514
    txnClient = TransactionClient().get_client()
515
    try:
516
        txnClient.markOrdersAsFirstDeliveryAttempted(provider_id, first_atdl_orders)
517
    except TransactionServiceException as tex:
518
        print tex.message
519
 
4506 phani.kuma 520
def print_pickup_mismatch_report(filename, orders):
521
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
522
    writer.writerow(['Order Id', 'AWB No', 'Shipping timestamp'])
523
    for order in orders:
524
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.shipping_timestamp)])
525
 
4783 phani.kuma 526
def print_dao_return_pickup_mismatch_report(filename, orders):
527
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
528
    writer.writerow(['Order Id', 'Pickup Request No', 'Authorization timestamp'])
529
    for order in orders:
530
        writer.writerow([order.id, order.pickupRequestNo, to_py_date(order.doa_auth_timestamp)])
531
 
4910 phani.kuma 532
def print_rto_orders_report(filename, orders):
4506 phani.kuma 533
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
4910 phani.kuma 534
    writer.writerow(['Order Id', 'AWB No', 'Return date', 'Reason'])
535
    for order in orders:
536
        statusDescription = ''
537
        if order.statusDescription is not None:
538
            statusDescription = order.statusDescription.replace(","," ")
539
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.delivery_timestamp), statusDescription])
4506 phani.kuma 540
 
4581 phani.kuma 541
def print_undelivered_orders_report(filename, orders):
542
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
4924 phani.kuma 543
    writer.writerow(['Order Id', 'AWB No', 'Status', 'Status Description', 'Shipping timestamp', 'Pickup timestamp', 'Promised delivery date', 'Expected delivery date'])
4581 phani.kuma 544
    for order in orders:
4792 phani.kuma 545
        statusDescription = ''
546
        if order.statusDescription is not None:
547
            statusDescription = order.statusDescription.replace(","," ")
4924 phani.kuma 548
        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)])
4581 phani.kuma 549
 
4910 phani.kuma 550
def create_crm_tickets_for_delivey_attempted_orders(provider):
551
    try:
552
        tickets_tobe_created = fetch_data(provider.id, [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE])
553
        userClient = UserClient().get_client()
554
        crmServiceClient = CRMClient().get_client()
555
        for order in tickets_tobe_created:
556
            ticket_created = False
557
            searchFilter = SearchFilter()
558
            user = userClient.getUserByEmail(order.customer_email)
559
            if user is None or user.userId == -1:
560
                searchFilter.customerEmailId = order.customer_email
561
                searchFilter.customerMobileNumber = order.customer_mobilenumber
562
            else:
563
                searchFilter.customerId = user.userId
4999 phani.kuma 564
            searchFilter.ticketCategory = TicketCategory.UNDELIVERED
4910 phani.kuma 565
            tickets = crmServiceClient.getTickets(searchFilter)
566
            print tickets
567
            for old_ticket in tickets:
568
                if old_ticket.orderId == order.id:
569
                    ticket_created = True
570
                    break
571
            if not ticket_created:
572
                print "creating ticket for orderId:"+str(order.id)
573
                ticket = Ticket()
574
                activity = Activity()
575
                description = order.statusDescription + "\n\nOrder not delivered by courier due to problems at customer end."
576
                ticket.creatorId = 1
4948 phani.kuma 577
                ticket.assigneeId = defaultUndeliveredAsssigneeId
578
                ticket.category = TicketCategory.UNDELIVERED
4910 phani.kuma 579
                ticket.priority = TicketPriority.HIGH
580
                ticket.status = TicketStatus.OPEN
581
                ticket.description = description
582
                ticket.orderId = order.id
583
                ticket.airwayBillNo = order.airwaybill_no
584
 
585
                activity.creatorId = 1
4948 phani.kuma 586
                activity.ticketAssigneeId = ticket.assigneeId
4910 phani.kuma 587
                activity.type = ActivityType.OTHER
588
                activity.description = description
589
                activity.ticketCategory = ticket.category
590
                activity.ticketDescription = ticket.description
591
                activity.ticketPriority = ticket.priority
592
                activity.ticketStatus = ticket.status
593
 
594
                if user is None or user.userId == -1:
595
                    ticket.customerEmailId = order.customer_email
596
                    ticket.customerMobileNumber = order.customer_mobilenumber
597
                    ticket.customerName = order.customer_name
598
                    activity.customerEmailId = order.customer_email
599
                    activity.customerMobileNumber = order.customer_mobilenumber
600
                    activity.customerName = order.customer_name
601
                else:
602
                    ticket.customerId = user.userId
603
                    activity.customerId = user.userId
604
 
605
                crmServiceClient.insertTicket(ticket, activity)
6561 amit.gupta 606
                '''
607
                Inform user about first delivery attempt
608
                '''
609
                enqueueMailForFDA(order)
4910 phani.kuma 610
    except:
611
        print "Some issue while creating crm tickets for orders in FIRST_DELIVERY_ATTEMPT_MADE status"
612
        traceback.print_exc()
613
 
5007 phani.kuma 614
def auto_close_crm_tickets_created():
4999 phani.kuma 615
    try:
616
        ticket_created_orders = []
617
        tickets_map = {}
618
        crmServiceClient = CRMClient().get_client()
619
        searchFilter = SearchFilter()
620
        searchFilter.ticketCategory = TicketCategory.UNDELIVERED
621
        searchFilter.ticketAssigneeIds = [defaultUndeliveredAsssigneeId]
622
        searchFilter.ticketPriority = TicketPriority.HIGH
623
        searchFilter.ticketStatuses = [TicketStatus.OPEN]
624
        tickets = crmServiceClient.getTickets(searchFilter)
625
        print tickets
626
        for old_ticket in tickets:
627
            ticket_created_orders.append(old_ticket.orderId)
628
            tickets_map[old_ticket.orderId] = old_ticket
629
        print ticket_created_orders
630
        txnClient = TransactionClient().get_client()
631
        orders = txnClient.getOrderList(ticket_created_orders)
632
        for order in orders:
633
            if order.status not in [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE]:
634
                old_ticket = tickets_map.get(order.id)
635
                old_ticket.status = TicketStatus.CLOSED
636
                activity = Activity()
637
                activity.creatorId = 1
638
                activity.ticketAssigneeId = old_ticket.assigneeId
639
                activity.type = ActivityType.OTHER
640
                activity.description = "Ticket Closed bcoz order status changed to:" + order.statusDescription
641
                activity.ticketCategory = old_ticket.category
642
                activity.ticketDescription = old_ticket.description
643
                activity.ticketPriority = old_ticket.priority
644
                activity.ticketStatus = old_ticket.status
645
 
646
                if old_ticket.customerId is None or old_ticket.customerId == -1:
647
                    activity.customerEmailId = old_ticket.customerEmailId
648
                    activity.customerMobileNumber = old_ticket.customerMobileNumber
649
                    activity.customerName = old_ticket.customerName
650
                else:
651
                    activity.customerId = old_ticket.customerId
652
 
653
                crmServiceClient.updateTicket(old_ticket, activity)
654
    except:
655
        print "Some issue while closing crm tickets for orders in DELIVERY_SUCCESS status"
656
        traceback.print_exc()
657
 
4506 phani.kuma 658
def get_py_datetime(time_string):
659
    # This should be a command line argument.
660
    # Refer http://docs.python.org/library/time.html#time.strftime to
661
    # get a complete list of format specifiers available for date time.
662
    time_format = "%m/%d/%Y %I:%M:%S %p"
663
    if time_string == '':
664
        return None
665
    mytime = time.strptime(time_string, time_format)
666
    return datetime.datetime(*mytime[:6])
667
 
4910 phani.kuma 668
def getOriginCityBranchID(originCity):
669
    branchId_OriginCitymap = {'DEL':'7933'}
670
    if originCity is None or originCity == '':
671
        return ''
672
    else:
673
        return branchId_OriginCitymap.get(originCity)
674
 
4506 phani.kuma 675
def main():
676
    parser = optparse.OptionParser()
677
    parser.add_option("-p", "--pickup", dest="pickup_report",
678
                   action="store_true",
679
                   help="Run the pickup reconciliation")
680
    parser.add_option("-d", "--delivery", dest="delivery_report",
681
                   action="store_true",
682
                   help="Run the delivery reconciliation")
4910 phani.kuma 683
    parser.add_option("-r", "--reports", dest="gen_reports",
684
                   action="store_true",
685
                   help="Generate logistic reconciliation reports")
4506 phani.kuma 686
    parser.add_option("-a", "--all", dest="all_reports",
687
                   action="store_true",
688
                   help="Run all reconciliations")
689
    parser.add_option("-P", "--provider", dest="provider",
4508 phani.kuma 690
                   default="Aramex", type="string",
4506 phani.kuma 691
                   help="The PROVIDER this report is for",
692
                   metavar="PROVIDER")
4910 phani.kuma 693
    parser.set_defaults(pickup_report=False, delivery_report=False, gen_reports=False, all_reports=False)
4506 phani.kuma 694
    (options, args) = parser.parse_args()
695
    if len(args) != 0:
696
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
697
 
698
    if options.all_reports:
699
        options.pickup_report = True
700
        options.delivery_report = True
701
 
702
    provider = get_provider_by_name(options.provider)
703
 
704
    if options.pickup_report:
705
        process_pickup_records(provider)
4815 phani.kuma 706
        process_dao_pickup_orders(provider)
707
        process_return_pickup_orders(provider)
4506 phani.kuma 708
    if options.delivery_report:
4910 phani.kuma 709
        process_local_connection_orders(provider)
710
        process_reached_destination_city_orders(provider)
711
        process_first_delivery_attempt_orders(provider)
4506 phani.kuma 712
        process_delivery_report(provider)
4910 phani.kuma 713
        create_crm_tickets_for_delivey_attempted_orders(provider)
5007 phani.kuma 714
        auto_close_crm_tickets_created()
4910 phani.kuma 715
    if options.gen_reports:
716
        generate_reports(provider)
4506 phani.kuma 717
 
718
if __name__ == '__main__':
719
    main()