Subversion Repositories SmartDukaan

Rev

Rev 20719 | Rev 22454 | 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', '')
20721 kshitij.so 430
                    delivered_orders[order.airwaybill_no] = str(delivery_date) + "|" +  receiver.decode('utf-8','ignore').encode("utf-8")
4910 phani.kuma 431
                    break
432
                elif element.findtext('Condition', '') == 'RTRN' and (element.findtext('Status', '') == 'SHRH' or element.findtext('Status', '') == 'SHUP'):
433
                    delivery_date = get_py_datetime(element.findtext('ActionDate', ''))
434
                    if node_number < len(nodes)-1:
435
                        reason_for_return = nodes[node_number+1].findtext('CustomerDescription', '')
436
                    else:
437
                        reason_for_return = element.findtext('CustomerDescription', '')
20721 kshitij.so 438
                    returned_orders[order.airwaybill_no] = str(delivery_date) + "|" + reason_for_return.decode('utf-8','ignore').encode("utf-8")
4910 phani.kuma 439
                    break
440
                elif node_number == 0:
441
                    reason = root.findtext('HAWBDetails/CurrentStatus', '')
20721 kshitij.so 442
                    undelivered_orders[order.airwaybill_no] = reason.decode('utf-8','ignore').encode("utf-8")
4910 phani.kuma 443
                    break
444
                node_number = node_number - 1
4506 phani.kuma 445
        except:
446
            pass
447
 
448
    print "Delivered Orders:"
449
    print delivered_orders
450
 
451
    print "Returned Orders:"
452
    print returned_orders
453
 
454
    print "Undelivered Orders"
455
    print undelivered_orders
456
 
4910 phani.kuma 457
    return delivered_orders, returned_orders, undelivered_orders
4506 phani.kuma 458
 
459
def update_picked_orders(provider_id, pickup_details):
460
    txnClient = TransactionClient().get_client()
461
    try:
4910 phani.kuma 462
        txnClient.markOrdersAsPickedUp(provider_id, pickup_details)
4506 phani.kuma 463
    except TransactionServiceException as tex:
464
        print tex.message
465
 
466
def update_picked_doas(provider_id, doa_pickup_details):
467
    txnClient = TransactionClient().get_client()
468
    try:
4910 phani.kuma 469
        txnClient.markDoasAsPickedUp(provider_id, doa_pickup_details)
4506 phani.kuma 470
    except TransactionServiceException as tex:
471
        print tex.message
472
 
4741 phani.kuma 473
def update_picked_returns(provider_id, returns_pickup_details):
474
    txnClient = TransactionClient().get_client()
475
    try:
4910 phani.kuma 476
        txnClient.markReturnOrdersAsPickedUp(provider_id, returns_pickup_details)
4741 phani.kuma 477
    except TransactionServiceException as tex:
478
        print tex.message
479
 
4506 phani.kuma 480
def update_delivered_orders(provider_id, delivered_orders):
481
    txnClient = TransactionClient().get_client()
482
    try:
483
        txnClient.markOrdersAsDelivered(provider_id, delivered_orders)
484
    except TransactionServiceException as tex:
485
        print tex.message
486
 
487
def update_returned_orders(provider_id, returned_orders):
488
    txnClient = TransactionClient().get_client()
489
    try:
4910 phani.kuma 490
        txnClient.markAsRTOrders(provider_id, returned_orders)
4506 phani.kuma 491
    except TransactionServiceException as tex:
492
        print tex.message
493
 
494
def update_reason_of_undelivered_orders(provider_id, undelivered_orders):
495
    txnClient = TransactionClient().get_client()
496
    try:
4910 phani.kuma 497
        txnClient.updateNonDeliveryReason(provider_id, undelivered_orders)
4506 phani.kuma 498
    except TransactionServiceException as tex:
499
        print tex.message
500
 
4910 phani.kuma 501
def update_local_connected_orders(provider_id, local_connected_orders):
502
    txnClient = TransactionClient().get_client()
503
    try:
504
        txnClient.markOrdersAsLocalConnected(provider_id, local_connected_orders)
505
    except TransactionServiceException as tex:
506
        print tex.message
507
 
508
def update_destination_city_reached_orders(provider_id, destination_city_reached_orders):
509
    txnClient = TransactionClient().get_client()
510
    try:
511
        txnClient.markOrdersAsDestinationCityReached(provider_id, destination_city_reached_orders)
512
    except TransactionServiceException as tex:
513
        print tex.message
514
 
515
def update_first_atdl_orders(provider_id, first_atdl_orders):
516
    txnClient = TransactionClient().get_client()
517
    try:
518
        txnClient.markOrdersAsFirstDeliveryAttempted(provider_id, first_atdl_orders)
519
    except TransactionServiceException as tex:
520
        print tex.message
521
 
4506 phani.kuma 522
def print_pickup_mismatch_report(filename, orders):
523
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
524
    writer.writerow(['Order Id', 'AWB No', 'Shipping timestamp'])
525
    for order in orders:
526
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.shipping_timestamp)])
527
 
4783 phani.kuma 528
def print_dao_return_pickup_mismatch_report(filename, orders):
529
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
530
    writer.writerow(['Order Id', 'Pickup Request No', 'Authorization timestamp'])
531
    for order in orders:
532
        writer.writerow([order.id, order.pickupRequestNo, to_py_date(order.doa_auth_timestamp)])
533
 
4910 phani.kuma 534
def print_rto_orders_report(filename, orders):
4506 phani.kuma 535
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
4910 phani.kuma 536
    writer.writerow(['Order Id', 'AWB No', 'Return date', 'Reason'])
537
    for order in orders:
538
        statusDescription = ''
539
        if order.statusDescription is not None:
540
            statusDescription = order.statusDescription.replace(","," ")
541
        writer.writerow([order.id, order.airwaybill_no, to_py_date(order.delivery_timestamp), statusDescription])
4506 phani.kuma 542
 
4581 phani.kuma 543
def print_undelivered_orders_report(filename, orders):
544
    writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_NONE)
4924 phani.kuma 545
    writer.writerow(['Order Id', 'AWB No', 'Status', 'Status Description', 'Shipping timestamp', 'Pickup timestamp', 'Promised delivery date', 'Expected delivery date'])
4581 phani.kuma 546
    for order in orders:
4792 phani.kuma 547
        statusDescription = ''
548
        if order.statusDescription is not None:
549
            statusDescription = order.statusDescription.replace(","," ")
4924 phani.kuma 550
        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 551
 
5007 phani.kuma 552
def auto_close_crm_tickets_created():
4999 phani.kuma 553
    try:
554
        ticket_created_orders = []
555
        tickets_map = {}
556
        crmServiceClient = CRMClient().get_client()
557
        searchFilter = SearchFilter()
558
        searchFilter.ticketCategory = TicketCategory.UNDELIVERED
559
        searchFilter.ticketAssigneeIds = [defaultUndeliveredAsssigneeId]
560
        searchFilter.ticketPriority = TicketPriority.HIGH
561
        searchFilter.ticketStatuses = [TicketStatus.OPEN]
562
        tickets = crmServiceClient.getTickets(searchFilter)
563
        print tickets
564
        for old_ticket in tickets:
565
            ticket_created_orders.append(old_ticket.orderId)
566
            tickets_map[old_ticket.orderId] = old_ticket
567
        print ticket_created_orders
568
        txnClient = TransactionClient().get_client()
569
        orders = txnClient.getOrderList(ticket_created_orders)
570
        for order in orders:
13085 amit.gupta 571
            if order.status not in [OrderStatus.FIRST_DELIVERY_ATTEMPT_MADE, OrderStatus.RTO_IN_TRANSIT]:
4999 phani.kuma 572
                old_ticket = tickets_map.get(order.id)
573
                old_ticket.status = TicketStatus.CLOSED
574
                activity = Activity()
575
                activity.creatorId = 1
576
                activity.ticketAssigneeId = old_ticket.assigneeId
577
                activity.type = ActivityType.OTHER
578
                activity.description = "Ticket Closed bcoz order status changed to:" + order.statusDescription
579
                activity.ticketCategory = old_ticket.category
580
                activity.ticketDescription = old_ticket.description
581
                activity.ticketPriority = old_ticket.priority
582
                activity.ticketStatus = old_ticket.status
583
 
584
                if old_ticket.customerId is None or old_ticket.customerId == -1:
585
                    activity.customerEmailId = old_ticket.customerEmailId
586
                    activity.customerMobileNumber = old_ticket.customerMobileNumber
587
                    activity.customerName = old_ticket.customerName
588
                else:
589
                    activity.customerId = old_ticket.customerId
590
 
591
                crmServiceClient.updateTicket(old_ticket, activity)
592
    except:
593
        print "Some issue while closing crm tickets for orders in DELIVERY_SUCCESS status"
594
        traceback.print_exc()
595
 
4506 phani.kuma 596
def get_py_datetime(time_string):
597
    # This should be a command line argument.
598
    # Refer http://docs.python.org/library/time.html#time.strftime to
599
    # get a complete list of format specifiers available for date time.
600
    time_format = "%m/%d/%Y %I:%M:%S %p"
601
    if time_string == '':
602
        return None
603
    mytime = time.strptime(time_string, time_format)
604
    return datetime.datetime(*mytime[:6])
605
 
4910 phani.kuma 606
def getOriginCityBranchID(originCity):
607
    branchId_OriginCitymap = {'DEL':'7933'}
608
    if originCity is None or originCity == '':
609
        return ''
610
    else:
611
        return branchId_OriginCitymap.get(originCity)
612
 
4506 phani.kuma 613
def main():
614
    parser = optparse.OptionParser()
615
    parser.add_option("-p", "--pickup", dest="pickup_report",
616
                   action="store_true",
617
                   help="Run the pickup reconciliation")
618
    parser.add_option("-d", "--delivery", dest="delivery_report",
619
                   action="store_true",
620
                   help="Run the delivery reconciliation")
4910 phani.kuma 621
    parser.add_option("-r", "--reports", dest="gen_reports",
622
                   action="store_true",
623
                   help="Generate logistic reconciliation reports")
4506 phani.kuma 624
    parser.add_option("-a", "--all", dest="all_reports",
625
                   action="store_true",
626
                   help="Run all reconciliations")
627
    parser.add_option("-P", "--provider", dest="provider",
4508 phani.kuma 628
                   default="Aramex", type="string",
4506 phani.kuma 629
                   help="The PROVIDER this report is for",
630
                   metavar="PROVIDER")
4910 phani.kuma 631
    parser.set_defaults(pickup_report=False, delivery_report=False, gen_reports=False, all_reports=False)
4506 phani.kuma 632
    (options, args) = parser.parse_args()
633
    if len(args) != 0:
634
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
635
 
636
    if options.all_reports:
637
        options.pickup_report = True
638
        options.delivery_report = True
639
 
640
    provider = get_provider_by_name(options.provider)
641
 
642
    if options.pickup_report:
643
        process_pickup_records(provider)
4815 phani.kuma 644
        process_dao_pickup_orders(provider)
645
        process_return_pickup_orders(provider)
4506 phani.kuma 646
    if options.delivery_report:
4910 phani.kuma 647
        process_local_connection_orders(provider)
648
        process_reached_destination_city_orders(provider)
649
        process_first_delivery_attempt_orders(provider)
4506 phani.kuma 650
        process_delivery_report(provider)
4910 phani.kuma 651
        create_crm_tickets_for_delivey_attempted_orders(provider)
5007 phani.kuma 652
        auto_close_crm_tickets_created()
4910 phani.kuma 653
    if options.gen_reports:
654
        generate_reports(provider)
4506 phani.kuma 655
 
656
if __name__ == '__main__':
657
    main()