Subversion Repositories SmartDukaan

Rev

Rev 2220 | Rev 2339 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
104 ashish 1
'''
2
Created on 29-Mar-2010
3
 
4
@author: ashish
5
'''
1262 varun.gupt 6
from string import Template
7
from shop2020.thriftpy.utils.ttypes import HelperServiceException, Mail
8
 
104 ashish 9
from shop2020.model.v1.order.impl.DataService import Transaction, LineItem,\
1225 chandransh 10
    Alerts, Order, BatchNoGenerator
104 ashish 11
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as T_Transaction,\
690 chandransh 12
    TransactionServiceException, TransactionStatus, OrderStatus
1565 varun.gupt 13
import datetime 
1479 ankur.sing 14
import time
122 ashish 15
from elixir import *
855 rajveer 16
from shop2020.utils.Utils import to_py_date, to_java_date
1886 ankur.sing 17
from sqlalchemy.sql.expression import and_, or_, desc
1627 ankur.sing 18
from sqlalchemy.sql import func
483 rajveer 19
from shop2020.model.v1 import order
743 rajveer 20
from shop2020.clients.LogisticsClient import LogisticsClient
871 chandransh 21
from shop2020.clients.InventoryClient import InventoryClient
1262 varun.gupt 22
from shop2020.clients.UserClient import UserClient
1351 varun.gupt 23
from shop2020.clients.HelperClient import HelperClient
104 ashish 24
 
25
def get_new_transaction():
26
    transaction = Transaction()
27
    transaction.createdOn = datetime.datetime.now()
738 chandransh 28
    transaction.status = TransactionStatus.INIT
104 ashish 29
    transaction.status_message = "New transaction"
483 rajveer 30
    return transaction
31
 
32
def create_order(t_order):
33
    order = Order()
34
    if t_order.warehouse_id:
35
        order.warehouse_id = t_order.warehouse_id
509 rajveer 36
    if t_order.logistics_provider_id:    
483 rajveer 37
        order.logistics_provider_id = t_order.logistics_provider_id
38
        order.airwaybill_no = t_order.airwaybill_no
39
        order.tracking_id = t_order.tracking_id
40
    if t_order.expected_delivery_time:    
41
        order.expected_delivery_time = to_py_date(t_order.expected_delivery_time)
42
    if t_order.customer_id:    
43
        order.customer_id = t_order.customer_id
44
        order.customer_name = t_order.customer_name
860 rajveer 45
        order.customer_city = t_order.customer_city
46
        order.customer_state = t_order.customer_state
483 rajveer 47
        order.customer_mobilenumber = t_order.customer_mobilenumber
48
        order.customer_pincode = t_order.customer_pincode
738 chandransh 49
        order.customer_address1 = t_order.customer_address1
50
        order.customer_address2 = t_order.customer_address2
483 rajveer 51
        order.customer_email = t_order.customer_email
52
    #new status and status description to be added    
716 rajveer 53
    order.status = t_order.status  
483 rajveer 54
    order.statusDescription = t_order.statusDescription
55
    order.total_amount = t_order.total_amount
56
    order.total_weight = t_order.total_weight
57
    if t_order.created_timestamp:
58
        order.created_timestamp = to_py_date(t_order.created_timestamp)
59
    else:
685 chandransh 60
        order.created_timestamp = datetime.datetime.now()
483 rajveer 61
    return order
62
 
63
def create_transaction(t_transaction):
64
    t_orders = t_transaction.orders
65
    if not t_orders:
66
        raise TransactionServiceException(101, "Orders missing from the transaction")
67
    transaction = get_new_transaction()
68
    transaction.customer_id = t_transaction.customer_id 
69
    transaction.shopping_cart_id = t_transaction.shoppingCartid
2219 varun.gupt 70
    transaction.coupon_code = t_transaction.coupon_code
483 rajveer 71
 
72
    for t_order in t_orders:
73
        order = create_order(t_order)
74
        order.transaction = transaction 
75
        for line_item in t_order.lineitems:
76
            litem = LineItem()
716 rajveer 77
            litem.item_id = line_item.item_id
963 chandransh 78
            litem.productGroup = line_item.productGroup
483 rajveer 79
            litem.brand = line_item.brand
80
            if line_item.model_number:
81
                litem.model_number = line_item.model_number
82
            if line_item.model_name:    
83
                litem.model_name = line_item.model_name
908 chandransh 84
            if line_item.color:
85
                litem.color = line_item.color
483 rajveer 86
            if line_item.extra_info:
87
                litem.extra_info = line_item.extra_info
88
            litem.quantity = line_item.quantity
89
            litem.unit_price = line_item.unit_price
90
            litem.unit_weight = line_item.unit_weight
91
            litem.total_price = line_item.total_price
92
            litem.total_weight = line_item.total_weight
1262 varun.gupt 93
            litem.transfer_price = line_item.transfer_price
1976 varun.gupt 94
 
483 rajveer 95
            """
96
            if line_item.addedOn:
97
                litem.added_on = to_py_date(line_item.addedOn)
98
            else:
99
                litem.added_on = datetime.datetime.now()
100
            """
101
            litem.order = order
102
    session.commit()
103
    return transaction.id
104
 
105
def get_transaction(transaction_id):
106
    transaction = Transaction.get_by(id=transaction_id)
107
    if not transaction:
108
        raise TransactionServiceException(108, "no such transaction")
109
 
110
    return transaction
111
 
112
def get_transactions_for_customer(customer_id, from_date, to_date, status):
113
    if not customer_id:
114
        raise TransactionServiceException(101, "bad customer id")
115
    query = Transaction.query.filter(Transaction.customer_id == customer_id)
1493 vikas 116
    if status is not None:
483 rajveer 117
        query = query.filter(Transaction.status == status)
118
    if from_date:
119
        query = query.filter(Transaction.createdOn >from_date)
120
    if to_date:
121
        query = query.filter(Transaction.createdOn < to_date)
122
    return query.all()
123
 
124
def get_transactions_for_shopping_cart_id(shopping_cart_id):
125
    transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()
126
    return transactions
127
 
128
def get_transaction_status(transaction_id):
129
    if not transaction_id:
130
        raise TransactionServiceException(101, "bad transaction id")
131
 
132
    transaction = get_transaction(transaction_id)
133
 
134
    return transaction.status
135
 
136
def change_transaction_status(transaction_id, new_status, description):
137
    transaction = get_transaction(transaction_id)
138
    transaction.status = new_status
139
    transaction.status_message = description
690 chandransh 140
    if new_status == TransactionStatus.FAILED:
141
        for order in transaction.orders:
142
            order.status = OrderStatus.PAYMENT_FAILED
143
    elif new_status == TransactionStatus.IN_PROCESS:
144
        for order in transaction.orders:
145
            order.status = OrderStatus.SUBMITTED_FOR_PROCESSING
1219 chandransh 146
            order.statusDescription = "Submitted to warehouse"
743 rajveer 147
            #After we got payment success, we will set logistics info also 
148
            logistics_client = LogisticsClient().get_client()
149
            #FIXME line item is only one now. If multiple will come, need to fix.
871 chandransh 150
            item_id = order.lineitems[0].item_id
151
            logistics_info = logistics_client.getLogisticsInfo(order.customer_pincode, item_id)
743 rajveer 152
 
1730 ankur.sing 153
            current_time = datetime.datetime.now()
154
            logistics_info.deliveryTime = adjust_delivery_time(current_time, logistics_info.deliveryTime)
155
 
743 rajveer 156
            order.warehouse_id = logistics_info.warehouseId
157
            order.logistics_provider_id = logistics_info.providerId
158
            order.airwaybill_no = logistics_info.airway_billno
159
            order.tracking_id = order.airwaybill_no
1730 ankur.sing 160
            order.expected_delivery_time = current_time + datetime.timedelta(days=logistics_info.deliveryTime)
871 chandransh 161
 
162
            catalog_client = InventoryClient().get_client()
163
            catalog_client.reserveItemInWarehouse(item_id, logistics_info.warehouseId, order.lineitems[0].quantity)
1351 varun.gupt 164
 
1341 chandransh 165
            item_pricing = catalog_client.getItemPricing(item_id, order.warehouse_id)
166
            order.lineitems[0].transfer_price = item_pricing.transferPrice
1262 varun.gupt 167
 
483 rajveer 168
    session.commit()
169
    return True
170
 
1730 ankur.sing 171
def adjust_delivery_time(order_time, delivery_days):
172
    order_date = order_time.date()
173
 
174
    delivery_date = order_date + datetime.timedelta(days = delivery_days)
175
    final_delivery_date = delivery_date
176
 
177
    time_format = "%Y-%m-%d %H:%M:%S.%f"
178
    t = time.strptime(str(order_time), time_format)
179
    midnightTime = datetime.datetime(*t[:3])
180
    fromDate = to_java_date(midnightTime)
181
    toDate = -1L
182
 
183
    logistics_client = LogisticsClient().get_client()
184
    holiday_dates = logistics_client.getHolidays(fromDate, toDate)
185
    holiday_dates = [(to_py_date(h_date)).date() for h_date in holiday_dates]
186
 
187
    while order_date <= final_delivery_date:
188
        if order_date.weekday() == 6 or is_holiday(holiday_dates, order_date):
189
            delivery_days = delivery_days + 1
190
            final_delivery_date = final_delivery_date + datetime.timedelta(days = 1)
191
        order_date = order_date + datetime.timedelta(days = 1)
192
    return delivery_days
193
 
194
 
195
 
196
def is_holiday(holidays, date):
197
    try:
198
        holidays.index(date)
199
        return 1
200
    except:
201
        return 0
202
 
1398 varun.gupt 203
def enqueue_transaction_info_email(transaction_id):
1262 varun.gupt 204
    transaction = get_transaction(transaction_id)
205
 
206
    html_header = """
207
<html>
208
<body>
209
<div>
210
    <p>
211
        Hello,<br /><br />
1742 rajveer 212
        Thanks for placing order with us. Following are the details of your order:
1262 varun.gupt 213
    </p>
214
    <div>
215
        Order Date: $order_date
1569 varun.gupt 216
    </div>
1262 varun.gupt 217
    <div>
218
        <table>
1569 varun.gupt 219
        <tr><td colspan="5"><hr /></td></tr>
220
        <tr><td colspan="5" align="left"><b>Order Details</b></td></tr>
221
        <tr><td colspan="5"><hr /></td></tr>
1262 varun.gupt 222
        <tr>
2050 varun.gupt 223
            <th width="100">Order No.</th>
224
            <th>Product</th>
225
            <th width="100">Quantity</th>
226
            <th width="100">Unit Price</th>
227
            <th width="100">Amount</th>
1262 varun.gupt 228
        </tr>
229
    """
1398 varun.gupt 230
    user_email = ""
1262 varun.gupt 231
    total_amount = 0.0
232
    html_table = ""
1569 varun.gupt 233
    order_date = datetime.datetime.now()
1262 varun.gupt 234
 
235
    for order in transaction.orders:
236
        order_date = order.created_timestamp
1398 varun.gupt 237
        user_email = order.customer_email
1569 varun.gupt 238
        html_tr = "<tr><td align='center'>" + str(order.id) + "</td>"
1262 varun.gupt 239
 
240
        for lineitem in order.lineitems:
2050 varun.gupt 241
            lineitem_total_price = round(lineitem.total_price, 2)
242
 
1276 chandransh 243
            html_tr += "<td>" + str(lineitem) + "</td>"
2050 varun.gupt 244
            html_tr += "<td align='center'>" + ("%.0f" % lineitem.quantity) + "</td>"
245
            html_tr += "<td align='center'> Rs. " + ("%.2f" % lineitem.unit_price) + "</td>"
246
            html_tr += "<td align='center'> Rs. " + ("%.2f" % lineitem_total_price) + "</td></tr>"
247
            total_amount += lineitem_total_price
1262 varun.gupt 248
            html_table += html_tr
2050 varun.gupt 249
 
1262 varun.gupt 250
    html_footer = """
251
        <tr><td colspan=5>&nbsp;</td></tr>
1565 varun.gupt 252
        <tr><td colspan=5><hr /></td></tr>
1262 varun.gupt 253
        <tr>
254
            <td colspan=4>Total Amount</td>
2050 varun.gupt 255
            <td> Rs. $total_amount</td>
1262 varun.gupt 256
        </tr>
1569 varun.gupt 257
        <tr><td colspan=5><hr /></td></tr>
1262 varun.gupt 258
        </table>
1569 varun.gupt 259
    </div>
1262 varun.gupt 260
    <p>
261
        Best Wishes,<br />
262
        Saholic Team
263
    </p>
264
</div>
265
</body>
266
</html>
267
    """
1398 varun.gupt 268
 
1569 varun.gupt 269
    dt = datetime.datetime.strptime(str(order_date), "%Y-%m-%d %H:%M:%S")
1565 varun.gupt 270
    formated_order_date = dt.strftime("%A, %d. %B %Y %I:%M%p")
271
 
1262 varun.gupt 272
    email_header = Template(html_header).substitute(dict(order_date = formated_order_date))
2050 varun.gupt 273
    email_footer = Template(html_footer).substitute(dict(total_amount = "%.2f" % total_amount))
1262 varun.gupt 274
 
1351 varun.gupt 275
    try:
276
        helper_client = HelperClient().get_client()
1398 varun.gupt 277
        helper_client.saveUserEmailForSending(user_email, "", "Saholic - Order Details", email_header + html_table + email_footer, str(transaction_id), "TransactionInfo")
1351 varun.gupt 278
        return True
279
    except Exception as e:
280
        print e
281
        return False
1262 varun.gupt 282
 
483 rajveer 283
def get_order(order_id):
284
    order = Order.get_by(id=order_id)
285
    if not order:
286
        raise TransactionServiceException(108, "no such order")
287
 
288
    return order
289
 
290
def get_orders_for_customer(customer_id, from_date, to_date, status):
291
    if not customer_id:
292
        raise TransactionServiceException(101, "bad customer id")
293
    query = Order.query.filter(Order.customer_id == customer_id)
294
    if status:
295
        query = query.filter(Order.status == status)
296
    if from_date:
297
        query = query.filter(Order.created_timestamp >from_date)
298
    if to_date:
299
        query = query.filter(Order.created_timestamp < to_date)
300
    return query.all()
301
 
1528 ankur.sing 302
def get_order_for_customer(order_id, customer_id):
303
    if not customer_id:
304
        raise TransactionServiceException(101, "bad customer id")
305
    order = get_order(order_id)
306
    if order.customer_id != customer_id:
307
        raise TransactionServiceException(108, "order: " + str(order_id) + " does not belong to customer: " + str(customer_id))
308
    return order
309
 
483 rajveer 310
def get_all_orders(status, from_date, to_date, warehouse_id):
311
    if not warehouse_id:
312
        raise TransactionServiceException(101, "bad warehouse id")
313
    query = Order.query.filter(Order.warehouse_id == warehouse_id)
314
    if status:
315
        query = query.filter(Order.status == status)
316
    if from_date:
317
        query = query.filter(Order.created_timestamp >from_date)
318
    if to_date:
319
        query = query.filter(Order.created_timestamp < to_date)
320
    return query.all()
321
 
1382 varun.gupt 322
def get_returnable_orders_for_customer(customer_id, limit = None):
323
    if not customer_id:
324
        raise TransactionServiceException(101, "bad customer id")
325
 
326
    query = Order.query.filter(Order.customer_id == customer_id)
327
    query = query.filter(Order.status != OrderStatus.PAYMENT_FAILED)
328
    query = query.filter(Order.status != OrderStatus.REJECTED)
329
    query = query.filter(Order.status > OrderStatus.SHIPPED_FROM_WH)
330
    query = query.filter(or_(Order.status < OrderStatus.DELIVERY_SUCCESS, Order.delivery_timestamp < datetime.datetime.now() + datetime.timedelta(hours = 48)))
331
    orders = query.all()
332
    order_ids = [order.id for order in orders]
333
    return order_ids
334
 
335
def get_cancellable_orders_for_customer(customer_id, limit = None):
336
    if not customer_id:
337
        raise TransactionServiceException(101, "bad customer id")
338
 
339
    query = Order.query.filter(Order.customer_id == customer_id)
340
    query = query.filter(Order.status != OrderStatus.REJECTED)
1483 varun.gupt 341
    query = query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING)
1382 varun.gupt 342
    query = query.filter(Order.status < OrderStatus.BILLED)
343
    orders = query.all()
344
    return [order.id for order in orders]
345
 
995 varun.gupt 346
def get_orders_by_billing_date(status, start_billing_date, end_billing_date, warehouse_id):
347
    if not warehouse_id:
348
        raise TransactionServiceException(101, "bad warehouse id")
349
 
350
    query = Order.query.filter(Order.warehouse_id == warehouse_id)
351
 
352
    if status:
353
        query = query.filter(Order.status == status)
354
 
355
    if start_billing_date:
356
        query = query.filter(Order.billing_timestamp >= start_billing_date)
357
 
358
    if end_billing_date:
359
        query = query.filter(Order.billing_timestamp <= end_billing_date)
360
 
361
    return query.all()
362
 
1528 ankur.sing 363
def get_orders_for_transaction(transaction_id, customer_id):
364
    orders = Order.query.filter_by(transaction_id=transaction_id, customer_id=customer_id).all()
365
 
1208 chandransh 366
    if not orders:
367
        raise TransactionServiceException(101, "No order for the transaction")
368
    return orders
369
 
1405 ankur.sing 370
def get_undelivered_orders(provider_id, warehouse_id):
371
    query = Order.query
372
    if provider_id != -1:
373
        query = query.filter_by(Order.logistics_provider_id == provider_id)
374
    if warehouse_id != -1:
375
        query = query.filter(Order.warehouse_id == warehouse_id)
376
    query = query.filter(and_(Order.status != OrderStatus.DELIVERY_SUCCESS, Order.status != OrderStatus.FAILED, \
377
                              Order.status > OrderStatus.SHIPPED_FROM_WH))
1479 ankur.sing 378
    #Get last midnight time instead of current time as courier company would have sent the 
379
    #delivery records updated at least till midnight and not by the current time.
380
    time_format = "%Y-%m-%d %H:%M:%S.%f"
381
    t = time.strptime(str(datetime.datetime.now()), time_format)
382
    midnightTime = datetime.datetime(*t[:3])
383
    query = query.filter(Order.expected_delivery_time < midnightTime)
1405 ankur.sing 384
    orders = query.all()
385
    return orders
386
 
1208 chandransh 387
def get_line_items_for_order(order_id):
388
    query = LineItem.query.filter(LineItem.order_id == order_id)
389
    return query.all()
390
 
483 rajveer 391
def change_order_status(self, orderId, status, description):
392
    order = get_order(orderId)
393
    order.status = status
394
    order.statusDescription = description
395
    session.commit()
396
    return True
397
 
921 rajveer 398
def accept_order(self, orderId):
399
    order = get_order(orderId)
400
    order.status = OrderStatus.ACCEPTED
401
    order.statusDescription = "Order Accepted"
402
    order.accepted_timestamp = datetime.datetime.now()
403
    session.commit()
404
    return True
405
 
406
def bill_order(self, orderId):
407
    order = get_order(orderId)
408
    order.status = OrderStatus.BILLED
409
    order.statusDescription = "Order Billed"
410
    order.billing_timestamp = datetime.datetime.now()
411
    session.commit()
1208 chandransh 412
    return True
921 rajveer 413
 
1149 chandransh 414
def add_billing_details(orderId, invoice_number, billed_by):
494 rajveer 415
    order = Order.get_by(id=orderId)
416
    if not order:
417
        raise TransactionServiceException(101, "No order found for the givem orderid")
418
    order.invoice_number = invoice_number
419
    order.billed_by = billed_by
420
    session.commit()
421
    return True
759 chandransh 422
 
1149 chandransh 423
def add_jacket_number(orderId, jacket_number):
424
    order = Order.get_by(id=orderId)
425
    if not order:
426
        raise TransactionServiceException(101, "No order found for the givem orderid")
427
    order.jacket_number = jacket_number 
428
    session.commit()
429
    return True
430
 
1220 chandransh 431
def batch_orders(warehouseId):
432
    if not warehouseId:
433
        raise TransactionServiceException(101, "bad warehouse id")
1225 chandransh 434
 
435
    batchno_generator = BatchNoGenerator()
436
    session.commit()
1220 chandransh 437
    query = Order.query.filter_by(warehouse_id=warehouseId)
438
    query = query.filter_by(status=OrderStatus.SUBMITTED_FOR_PROCESSING)
439
    query = query.order_by(Order.created_timestamp)
440
    pending_orders = query.all()
1225 chandransh 441
 
1220 chandransh 442
    serial_no = 1
443
    for order in pending_orders:
1276 chandransh 444
        order.batchNo = batchno_generator.id
1220 chandransh 445
        order.serialNo = serial_no
446
        serial_no += 1
447
    session.commit() 
448
    pending_orders = query.all()
449
    return pending_orders
450
 
451
def order_outofstock(orderId):
1911 chandransh 452
    '''
453
    Mark order as out of stock
454
    '''
1220 chandransh 455
    order = get_order(orderId)
456
    order.status = OrderStatus.INVENTORY_LOW
457
    order.statusDescription = "Low Inventory"
458
    order.outofstock_timestamp = datetime.datetime.now()
459
    session.commit()
460
    return True
461
 
759 chandransh 462
def mark_orders_as_manifested(warehouse_id, provider_id):
463
    try:
986 chandransh 464
        current_timestamp = datetime.datetime.now()
852 chandransh 465
        orders = Order.query.filter_by(warehouse_id = warehouse_id, logistics_provider_id = provider_id, status = OrderStatus.BILLED).all()
759 chandransh 466
        for order in orders:
467
            order.status = OrderStatus.SHIPPED_FROM_WH
987 chandransh 468
            order.statusDescription = "Order shipped from warehouse"
986 chandransh 469
            order.shipping_timestamp = current_timestamp
759 chandransh 470
        session.commit()
471
        return True
472
    except:
473
        return False
1113 chandransh 474
 
475
def mark_orders_as_picked_up(provider_id, pickup_details):
476
    for awb, pickup_timestamp in pickup_details.iteritems():
1135 chandransh 477
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
1113 chandransh 478
        if order == None:
2220 chandransh 479
            #raise TransactionServiceException(102, "No order found for the awb: " + awb)
480
            continue
1113 chandransh 481
        order.status = OrderStatus.SHIPPED_TO_LOGST
482
        order.statusDescription = "Order picked up by Courier Company"
1246 chandransh 483
        order.pickup_timestamp = pickup_timestamp
1113 chandransh 484
    session.commit()
1217 chandransh 485
 
1132 chandransh 486
    current_time = datetime.datetime.now()
487
    to_datetime = datetime.datetime(current_time.year, current_time.month, current_time.day)
1246 chandransh 488
    from_datetime = to_datetime - datetime.timedelta(2)
1132 chandransh 489
    orders_not_picked_up = Order.query.filter_by(logistics_provider_id = provider_id).filter_by(status=OrderStatus.SHIPPED_FROM_WH).filter(Order.shipping_timestamp >= from_datetime).filter(Order.shipping_timestamp <= to_datetime).all()
1113 chandransh 490
    return orders_not_picked_up
491
 
1132 chandransh 492
def mark_orders_as_delivered(provider_id, delivered_orders):
493
    for awb, detail in delivered_orders.iteritems():
1135 chandransh 494
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
1132 chandransh 495
        if order == None:
1911 chandransh 496
            continue
497
            #raise TransactionServiceException(103, "No order found for the awb:" + awb)
1132 chandransh 498
        order.status = OrderStatus.DELIVERY_SUCCESS
499
        order.statusDescription = "Order delivered"
500
        order.delivery_timestamp, order.receiver = detail.split('|')
501
    session.commit()
502
 
1135 chandransh 503
def mark_orders_as_failed(provider_id, returned_orders):
504
    for awb, detail in returned_orders.iteritems():
505
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
506
        if order == None:
507
            raise TransactionServiceException(103, "No order found for the awb:" + awb)
508
        order.status = OrderStatus.FAILED
509
        order.delivery_timestamp, reason = detail.split('|')
510
        order.statusDescription = "Order Returned to Origin:" + reason
1911 chandransh 511
    session.commit()
1135 chandransh 512
 
1246 chandransh 513
def update_non_delivery_reason(provider_id, undelivered_orders):
514
    for awb, reason in undelivered_orders.iteritems():
515
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
516
        if order == None:
517
            raise TransactionServiceException(103, "No order found for the awb:" + awb)
518
        order.statusDescription = reason
519
    session.commit()
520
 
483 rajveer 521
def get_alerts(order_id, all):
522
    query = Alerts.query.filter_by(order_id=order_id)
523
    if not all:
524
        query = query.filter_by(valid=True)
525
    return query.all()
526
 
527
def set_alert(order_id, unset, type, comment):
528
    #get existing alert
529
    if unset:
530
        query = Alerts.query.filter_by(order_id=order_id)
531
        query = query.filter_by(type=type)
532
        alerts = query.all()
533
        for alert in alerts:
534
            if alert.valid:
535
                alert.valid = False
536
                alert.comment = comment
537
                alert.time_unset = datetime.datetime.now()
538
    else:
539
        alert = Alerts()
540
        alert.order_id = order_id
541
        alert.valid = True
542
        alert.type = type
543
        alert.comment = comment
544
        alert.time_set = datetime.datetime.now()
766 rajveer 545
    session.commit()    
546
 
1596 ankur.sing 547
def get_valid_order_count():
548
    return Order.query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING).count()
549
 
1627 ankur.sing 550
def get_cust_count_with_successful_txn():
551
    return session.query(Order.customer_id).filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING).distinct().count()
552
 
1730 ankur.sing 553
def get_valid_orders_amount_range():
1627 ankur.sing 554
    orders = Order.query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING).all()
555
    order_amounts = [o.total_amount for o in orders]
1730 ankur.sing 556
    return [min(order_amounts), max(order_amounts)]
1627 ankur.sing 557
 
1886 ankur.sing 558
def get_valid_orders(limit):
559
    query = Order.query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING)
560
    query = query.order_by(desc(Order.created_timestamp))
561
    if limit > 0:
562
        query = query.limit(limit)
563
    elif limit < 0:
564
        raise TransactionServiceException(101, "Invalid argument limit " + limit)
565
    return query.all()
566
 
766 rajveer 567
def close_session():
568
    if session.is_active:
569
        print "session is active. closing it."
570
        session.close()