Subversion Repositories SmartDukaan

Rev

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