Subversion Repositories SmartDukaan

Rev

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