Subversion Repositories SmartDukaan

Rev

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