Subversion Repositories SmartDukaan

Rev

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