Subversion Repositories SmartDukaan

Rev

Rev 2242 | Rev 2536 | 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
2339 chandransh 143
            order.statusDescription = "Payment Failed"
690 chandransh 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>
2050 varun.gupt 224
            <th width="100">Order No.</th>
225
            <th>Product</th>
226
            <th width="100">Quantity</th>
227
            <th width="100">Unit Price</th>
228
            <th width="100">Amount</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:
2050 varun.gupt 242
            lineitem_total_price = round(lineitem.total_price, 2)
243
 
1276 chandransh 244
            html_tr += "<td>" + str(lineitem) + "</td>"
2050 varun.gupt 245
            html_tr += "<td align='center'>" + ("%.0f" % lineitem.quantity) + "</td>"
246
            html_tr += "<td align='center'> Rs. " + ("%.2f" % lineitem.unit_price) + "</td>"
247
            html_tr += "<td align='center'> Rs. " + ("%.2f" % lineitem_total_price) + "</td></tr>"
248
            total_amount += lineitem_total_price
1262 varun.gupt 249
            html_table += html_tr
2050 varun.gupt 250
 
1262 varun.gupt 251
    html_footer = """
252
        <tr><td colspan=5>&nbsp;</td></tr>
1565 varun.gupt 253
        <tr><td colspan=5><hr /></td></tr>
1262 varun.gupt 254
        <tr>
255
            <td colspan=4>Total Amount</td>
2050 varun.gupt 256
            <td> Rs. $total_amount</td>
1262 varun.gupt 257
        </tr>
1569 varun.gupt 258
        <tr><td colspan=5><hr /></td></tr>
1262 varun.gupt 259
        </table>
1569 varun.gupt 260
    </div>
1262 varun.gupt 261
    <p>
262
        Best Wishes,<br />
263
        Saholic Team
264
    </p>
265
</div>
266
</body>
267
</html>
268
    """
1398 varun.gupt 269
 
1569 varun.gupt 270
    dt = datetime.datetime.strptime(str(order_date), "%Y-%m-%d %H:%M:%S")
1565 varun.gupt 271
    formated_order_date = dt.strftime("%A, %d. %B %Y %I:%M%p")
272
 
1262 varun.gupt 273
    email_header = Template(html_header).substitute(dict(order_date = formated_order_date))
2050 varun.gupt 274
    email_footer = Template(html_footer).substitute(dict(total_amount = "%.2f" % total_amount))
1262 varun.gupt 275
 
1351 varun.gupt 276
    try:
277
        helper_client = HelperClient().get_client()
1398 varun.gupt 278
        helper_client.saveUserEmailForSending(user_email, "", "Saholic - Order Details", email_header + html_table + email_footer, str(transaction_id), "TransactionInfo")
1351 varun.gupt 279
        return True
280
    except Exception as e:
281
        print e
282
        return False
1262 varun.gupt 283
 
483 rajveer 284
def get_order(order_id):
285
    order = Order.get_by(id=order_id)
286
    if not order:
287
        raise TransactionServiceException(108, "no such order")
288
 
289
    return order
290
 
291
def get_orders_for_customer(customer_id, from_date, to_date, status):
292
    if not customer_id:
293
        raise TransactionServiceException(101, "bad customer id")
294
    query = Order.query.filter(Order.customer_id == customer_id)
295
    if status:
296
        query = query.filter(Order.status == status)
297
    if from_date:
298
        query = query.filter(Order.created_timestamp >from_date)
299
    if to_date:
300
        query = query.filter(Order.created_timestamp < to_date)
301
    return query.all()
302
 
1528 ankur.sing 303
def get_order_for_customer(order_id, customer_id):
304
    if not customer_id:
305
        raise TransactionServiceException(101, "bad customer id")
306
    order = get_order(order_id)
307
    if order.customer_id != customer_id:
308
        raise TransactionServiceException(108, "order: " + str(order_id) + " does not belong to customer: " + str(customer_id))
309
    return order
310
 
483 rajveer 311
def get_all_orders(status, from_date, to_date, warehouse_id):
312
    if not warehouse_id:
313
        raise TransactionServiceException(101, "bad warehouse id")
314
    query = Order.query.filter(Order.warehouse_id == warehouse_id)
315
    if status:
316
        query = query.filter(Order.status == status)
317
    if from_date:
318
        query = query.filter(Order.created_timestamp >from_date)
319
    if to_date:
320
        query = query.filter(Order.created_timestamp < to_date)
321
    return query.all()
322
 
1382 varun.gupt 323
def get_returnable_orders_for_customer(customer_id, limit = None):
324
    if not customer_id:
325
        raise TransactionServiceException(101, "bad customer id")
326
 
327
    query = Order.query.filter(Order.customer_id == customer_id)
328
    query = query.filter(Order.status != OrderStatus.PAYMENT_FAILED)
329
    query = query.filter(Order.status != OrderStatus.REJECTED)
330
    query = query.filter(Order.status > OrderStatus.SHIPPED_FROM_WH)
331
    query = query.filter(or_(Order.status < OrderStatus.DELIVERY_SUCCESS, Order.delivery_timestamp < datetime.datetime.now() + datetime.timedelta(hours = 48)))
332
    orders = query.all()
333
    order_ids = [order.id for order in orders]
334
    return order_ids
335
 
336
def get_cancellable_orders_for_customer(customer_id, limit = None):
337
    if not customer_id:
338
        raise TransactionServiceException(101, "bad customer id")
339
 
340
    query = Order.query.filter(Order.customer_id == customer_id)
341
    query = query.filter(Order.status != OrderStatus.REJECTED)
1483 varun.gupt 342
    query = query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING)
1382 varun.gupt 343
    query = query.filter(Order.status < OrderStatus.BILLED)
344
    orders = query.all()
345
    return [order.id for order in orders]
346
 
995 varun.gupt 347
def get_orders_by_billing_date(status, start_billing_date, end_billing_date, warehouse_id):
348
    if not warehouse_id:
349
        raise TransactionServiceException(101, "bad warehouse id")
350
 
351
    query = Order.query.filter(Order.warehouse_id == warehouse_id)
352
 
353
    if status:
354
        query = query.filter(Order.status == status)
355
 
356
    if start_billing_date:
357
        query = query.filter(Order.billing_timestamp >= start_billing_date)
358
 
359
    if end_billing_date:
360
        query = query.filter(Order.billing_timestamp <= end_billing_date)
361
 
362
    return query.all()
363
 
1528 ankur.sing 364
def get_orders_for_transaction(transaction_id, customer_id):
365
    orders = Order.query.filter_by(transaction_id=transaction_id, customer_id=customer_id).all()
366
 
1208 chandransh 367
    if not orders:
368
        raise TransactionServiceException(101, "No order for the transaction")
369
    return orders
370
 
1405 ankur.sing 371
def get_undelivered_orders(provider_id, warehouse_id):
372
    query = Order.query
373
    if provider_id != -1:
374
        query = query.filter_by(Order.logistics_provider_id == provider_id)
375
    if warehouse_id != -1:
376
        query = query.filter(Order.warehouse_id == warehouse_id)
377
    query = query.filter(and_(Order.status != OrderStatus.DELIVERY_SUCCESS, Order.status != OrderStatus.FAILED, \
378
                              Order.status > OrderStatus.SHIPPED_FROM_WH))
1479 ankur.sing 379
    #Get last midnight time instead of current time as courier company would have sent the 
380
    #delivery records updated at least till midnight and not by the current time.
381
    time_format = "%Y-%m-%d %H:%M:%S.%f"
382
    t = time.strptime(str(datetime.datetime.now()), time_format)
383
    midnightTime = datetime.datetime(*t[:3])
384
    query = query.filter(Order.expected_delivery_time < midnightTime)
1405 ankur.sing 385
    orders = query.all()
386
    return orders
387
 
1208 chandransh 388
def get_line_items_for_order(order_id):
389
    query = LineItem.query.filter(LineItem.order_id == order_id)
390
    return query.all()
391
 
483 rajveer 392
def change_order_status(self, orderId, status, description):
393
    order = get_order(orderId)
394
    order.status = status
395
    order.statusDescription = description
396
    session.commit()
397
    return True
398
 
921 rajveer 399
def accept_order(self, orderId):
400
    order = get_order(orderId)
401
    order.status = OrderStatus.ACCEPTED
402
    order.statusDescription = "Order Accepted"
403
    order.accepted_timestamp = datetime.datetime.now()
404
    session.commit()
405
    return True
406
 
407
def bill_order(self, orderId):
408
    order = get_order(orderId)
409
    order.status = OrderStatus.BILLED
410
    order.statusDescription = "Order Billed"
411
    order.billing_timestamp = datetime.datetime.now()
412
    session.commit()
1208 chandransh 413
    return True
921 rajveer 414
 
1149 chandransh 415
def add_billing_details(orderId, invoice_number, billed_by):
494 rajveer 416
    order = Order.get_by(id=orderId)
417
    if not order:
418
        raise TransactionServiceException(101, "No order found for the givem orderid")
419
    order.invoice_number = invoice_number
420
    order.billed_by = billed_by
421
    session.commit()
422
    return True
759 chandransh 423
 
1149 chandransh 424
def add_jacket_number(orderId, jacket_number):
425
    order = Order.get_by(id=orderId)
426
    if not order:
427
        raise TransactionServiceException(101, "No order found for the givem orderid")
428
    order.jacket_number = jacket_number 
429
    session.commit()
430
    return True
431
 
1220 chandransh 432
def batch_orders(warehouseId):
433
    if not warehouseId:
434
        raise TransactionServiceException(101, "bad warehouse id")
1225 chandransh 435
 
436
    batchno_generator = BatchNoGenerator()
437
    session.commit()
1220 chandransh 438
    query = Order.query.filter_by(warehouse_id=warehouseId)
439
    query = query.filter_by(status=OrderStatus.SUBMITTED_FOR_PROCESSING)
440
    query = query.order_by(Order.created_timestamp)
441
    pending_orders = query.all()
1225 chandransh 442
 
1220 chandransh 443
    serial_no = 1
444
    for order in pending_orders:
1276 chandransh 445
        order.batchNo = batchno_generator.id
1220 chandransh 446
        order.serialNo = serial_no
447
        serial_no += 1
448
    session.commit() 
449
    pending_orders = query.all()
450
    return pending_orders
451
 
452
def order_outofstock(orderId):
1911 chandransh 453
    '''
454
    Mark order as out of stock
455
    '''
1220 chandransh 456
    order = get_order(orderId)
457
    order.status = OrderStatus.INVENTORY_LOW
458
    order.statusDescription = "Low Inventory"
459
    order.outofstock_timestamp = datetime.datetime.now()
460
    session.commit()
461
    return True
462
 
759 chandransh 463
def mark_orders_as_manifested(warehouse_id, provider_id):
464
    try:
986 chandransh 465
        current_timestamp = datetime.datetime.now()
852 chandransh 466
        orders = Order.query.filter_by(warehouse_id = warehouse_id, logistics_provider_id = provider_id, status = OrderStatus.BILLED).all()
759 chandransh 467
        for order in orders:
468
            order.status = OrderStatus.SHIPPED_FROM_WH
987 chandransh 469
            order.statusDescription = "Order shipped from warehouse"
986 chandransh 470
            order.shipping_timestamp = current_timestamp
759 chandransh 471
        session.commit()
472
        return True
473
    except:
474
        return False
1113 chandransh 475
 
476
def mark_orders_as_picked_up(provider_id, pickup_details):
477
    for awb, pickup_timestamp in pickup_details.iteritems():
1135 chandransh 478
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
1113 chandransh 479
        if order == None:
2220 chandransh 480
            #raise TransactionServiceException(102, "No order found for the awb: " + awb)
481
            continue
1113 chandransh 482
        order.status = OrderStatus.SHIPPED_TO_LOGST
483
        order.statusDescription = "Order picked up by Courier Company"
1246 chandransh 484
        order.pickup_timestamp = pickup_timestamp
1113 chandransh 485
    session.commit()
1217 chandransh 486
 
1132 chandransh 487
    current_time = datetime.datetime.now()
488
    to_datetime = datetime.datetime(current_time.year, current_time.month, current_time.day)
1246 chandransh 489
    from_datetime = to_datetime - datetime.timedelta(2)
1132 chandransh 490
    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 491
    return orders_not_picked_up
492
 
1132 chandransh 493
def mark_orders_as_delivered(provider_id, delivered_orders):
494
    for awb, detail in delivered_orders.iteritems():
1135 chandransh 495
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
1132 chandransh 496
        if order == None:
1911 chandransh 497
            continue
498
            #raise TransactionServiceException(103, "No order found for the awb:" + awb)
1132 chandransh 499
        order.status = OrderStatus.DELIVERY_SUCCESS
500
        order.statusDescription = "Order delivered"
501
        order.delivery_timestamp, order.receiver = detail.split('|')
502
    session.commit()
503
 
1135 chandransh 504
def mark_orders_as_failed(provider_id, returned_orders):
505
    for awb, detail in returned_orders.iteritems():
506
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
507
        if order == None:
508
            raise TransactionServiceException(103, "No order found for the awb:" + awb)
509
        order.status = OrderStatus.FAILED
510
        order.delivery_timestamp, reason = detail.split('|')
511
        order.statusDescription = "Order Returned to Origin:" + reason
1911 chandransh 512
    session.commit()
1135 chandransh 513
 
1246 chandransh 514
def update_non_delivery_reason(provider_id, undelivered_orders):
515
    for awb, reason in undelivered_orders.iteritems():
516
        order = Order.query.filter_by(airwaybill_no=awb, logistics_provider_id = provider_id).first()
517
        if order == None:
518
            raise TransactionServiceException(103, "No order found for the awb:" + awb)
519
        order.statusDescription = reason
520
    session.commit()
521
 
483 rajveer 522
def get_alerts(order_id, all):
523
    query = Alerts.query.filter_by(order_id=order_id)
524
    if not all:
525
        query = query.filter_by(valid=True)
526
    return query.all()
527
 
528
def set_alert(order_id, unset, type, comment):
529
    #get existing alert
530
    if unset:
531
        query = Alerts.query.filter_by(order_id=order_id)
532
        query = query.filter_by(type=type)
533
        alerts = query.all()
534
        for alert in alerts:
535
            if alert.valid:
536
                alert.valid = False
537
                alert.comment = comment
538
                alert.time_unset = datetime.datetime.now()
539
    else:
540
        alert = Alerts()
541
        alert.order_id = order_id
542
        alert.valid = True
543
        alert.type = type
544
        alert.comment = comment
545
        alert.time_set = datetime.datetime.now()
766 rajveer 546
    session.commit()    
547
 
1596 ankur.sing 548
def get_valid_order_count():
549
    return Order.query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING).count()
550
 
1627 ankur.sing 551
def get_cust_count_with_successful_txn():
552
    return session.query(Order.customer_id).filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING).distinct().count()
553
 
1730 ankur.sing 554
def get_valid_orders_amount_range():
1627 ankur.sing 555
    orders = Order.query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING).all()
556
    order_amounts = [o.total_amount for o in orders]
1730 ankur.sing 557
    return [min(order_amounts), max(order_amounts)]
1627 ankur.sing 558
 
1886 ankur.sing 559
def get_valid_orders(limit):
560
    query = Order.query.filter(Order.status >= OrderStatus.SUBMITTED_FOR_PROCESSING)
561
    query = query.order_by(desc(Order.created_timestamp))
562
    if limit > 0:
563
        query = query.limit(limit)
564
    elif limit < 0:
565
        raise TransactionServiceException(101, "Invalid argument limit " + limit)
566
    return query.all()
567
 
766 rajveer 568
def close_session():
569
    if session.is_active:
570
        print "session is active. closing it."
571
        session.close()