Subversion Repositories SmartDukaan

Rev

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