Subversion Repositories SmartDukaan

Rev

Rev 9173 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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