Subversion Repositories SmartDukaan

Rev

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