Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
557 chandransh 1
'''
2
Created on 10-May-2010
3
 
4
@author: ashish
5
'''
6
from elixir import *
3554 varun.gupt 7
from shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, User, Discount
2026 varun.gupt 8
from shop2020.thriftpy.model.v1.user.ttypes import CartStatus, LineStatus, ShoppingCartException,\
9
    PromotionException
557 chandransh 10
import datetime
576 chandransh 11
from shop2020.utils.Utils import to_py_date, to_java_date
557 chandransh 12
 
576 chandransh 13
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as TTransaction,\
685 chandransh 14
    TransactionStatus as TTransactionStatus, Order as TOrder, LineItem as TLineItem, OrderStatus 
557 chandransh 15
 
576 chandransh 16
from shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItem
844 chandransh 17
from shop2020.thriftpy.logistics.ttypes import LogisticsInfo as TLogisticsInfo,\
18
    LogisticsServiceException
576 chandransh 19
 
20
from shop2020.clients.TransactionClient import TransactionClient
3133 rajveer 21
from shop2020.clients.CatalogClient import CatalogClient
576 chandransh 22
from shop2020.clients.LogisticsClient import LogisticsClient
23
from shop2020.model.v1 import user
1976 varun.gupt 24
from shop2020.clients.PromotionClient import PromotionClient
2026 varun.gupt 25
from shop2020.model.v1.user.impl import UserDataAccessors
576 chandransh 26
 
557 chandransh 27
def get_cart(user_id):
28
    query = Cart.query.filter_by(user_id=user_id)      
29
    query = query.filter_by(cart_status = CartStatus.ACTIVE)
30
    try:
31
        cart = query.one()
32
        session.commit()
33
    except:
34
        return None
35
#        raise ShoppingCartException(101, "Cart does not exist")
36
    return cart
37
 
38
def get_cart_by_id(id):
39
    cart = Cart.get_by(id=id)
40
    return cart
41
 
42
def create_cart(user_id):
43
    cart = get_cart(user_id)
44
    if not cart: 
45
        cart = Cart()
46
        cart.user_id = user_id
47
        cart.created_on = datetime.datetime.now()
48
        cart.updated_on = datetime.datetime.now()
49
        cart.cart_status = CartStatus.ACTIVE
50
        session.commit()
51
    return cart
52
 
53
def get_cart_by_user_id_and_status(user_id, status):
54
    query = Cart.query.filter_by(user_id=user_id)
55
    if status:
56
        query = query.filter_by(cart_status=status)
57
    carts = query.all()
58
    return carts
59
 
60
def get_carts_by_status(status):
61
    return Cart.query.filter_by(cart_status=status).all()
62
 
63
def get_carts_between(start_time, end_time, status):
64
    init_time = to_py_date(start_time)
65
    finish_time = to_py_date(end_time)
66
 
67
    query = Cart.query
68
    if status:
69
        query = query.filter(Cart.cart_status==status)
70
    if init_time:
71
        query = query.filter(Cart.created_on >= init_time)
72
    if finish_time:
73
        query = query.filter(Cart.created_on <= finish_time)
74
 
75
    carts = query.all()
76
    return carts
77
 
643 chandransh 78
def get_line(item_id, cart_id, status, single):
557 chandransh 79
    #get cart first 
80
    try:
81
        found_cart = Cart.get_by(id=cart_id)
82
    except:
83
        raise ShoppingCartException(101, "cart not found ")
643 chandransh 84
    query = Line.query.filter_by(cart = found_cart, item_id = item_id)
557 chandransh 85
 
86
    if status:
87
        query = query.filter_by(line_status = status)
88
    else:
89
        query = query.filter_by(line_status = LineStatus.LINE_ACTIVE)
90
    try:
91
        if single:
92
            return query.one()
93
        else:
94
            return query.all()
95
    except:
96
        return None
97
 
98
def change_cart_status(cart_id, status):
99
    cart = get_cart_by_id(id)
100
    if not cart:
101
        raise ShoppingCartException(101, "no cart attached to this id")
102
    if not status:
103
        raise ShoppingCartException(101, "invalid status")
690 chandransh 104
    cart.cart_status = status
557 chandransh 105
    session.commit()
106
 
107
def add_item_to_cart(cart_id, item_id, quantity):
108
    if not item_id:
109
        raise ShoppingCartException(101, "item_id cannot be null")
110
 
111
    if not quantity:
112
        raise ShoppingCartException(101, "quantity cannot be null")    
643 chandransh 113
 
2983 chandransh 114
    cart = Cart.get_by(id = cart_id)    
557 chandransh 115
    if not cart:
116
        raise ShoppingCartException(101, "no cart attached to this id")
2983 chandransh 117
    retval = ""
3133 rajveer 118
    inventory_client = CatalogClient().get_client()
2983 chandransh 119
    item = inventory_client.getItem(item_id)
120
    item_shipping_info = inventory_client.isActive(item_id)
121
    if not item_shipping_info.isActive:
2035 rajveer 122
        return inventory_client.getItemStatusDescription(item_id)
557 chandransh 123
 
643 chandransh 124
    current_time = datetime.datetime.now()
125
    cart.updated_on = current_time
126
    line = get_line(item_id, cart_id, None,True)
127
    if line:
128
        #change the quantity only
129
        line.quantity = quantity
685 chandransh 130
        line.updated_on = current_time
643 chandransh 131
    else:
132
        line = Line()
133
        line.cart = cart
134
        line.item_id = item_id
135
        line.quantity = quantity
136
        line.created_on = current_time
137
        line.updated_on = current_time
138
        line.line_status = LineStatus.LINE_ACTIVE
557 chandransh 139
    session.commit()
2983 chandransh 140
    return retval
557 chandransh 141
 
142
def delete_item_from_cart(cart_id, item_id):
143
    if not item_id:
144
        raise ShoppingCartException(101, "item_id cannot be null")
685 chandransh 145
    cart = Cart.get_by(id = cart_id)
146
    if not cart:
147
        raise ShoppingCartException(101, "no cart attached to this id")
643 chandransh 148
    item = get_line(item_id, cart_id, None, True)
3554 varun.gupt 149
    count_deleted_discounts = delete_discounts_for_line(item)
557 chandransh 150
    item.delete()
685 chandransh 151
    current_time = datetime.datetime.now()
152
    cart.updated_on = current_time
557 chandransh 153
    session.commit()
154
 
3554 varun.gupt 155
def delete_discounts_for_line(item_line):
156
    count_deleted = Discount.query.filter_by(line = item_line).delete()
157
    session.commit()
158
    return count_deleted
159
 
160
def delete_discounts_from_cart(cart_id, cart = None):
161
    if cart is None:
162
        if cart_id is None:
163
            raise ShoppingCartException(101, 'cart_id and cart, both cannot be null')
164
        else:
165
            cart = Cart.get_by(id = cart_id)
166
 
167
    if cart.lines:
168
        for line in cart.lines:
169
            delete_discounts_for_line(line)
170
 
171
def save_discounts(discounts):
172
    if not discounts:
173
        raise ShoppingCartException(101, 'discounts be null')
174
 
175
    if len(discounts) > 0:
176
        cart = Cart.get_by(id = discounts[0].cart_id)
177
 
178
        for t_discount in discounts:
179
            line = Line.query.filter_by(cart = cart, item_id = t_discount.item_id).first()
180
            if line is not None:
181
                discount = Discount()
182
                discount.line = line
183
                discount.discount = t_discount.discount
184
                discount.quantity = t_discount.quantity
185
                session.commit()
186
 
557 chandransh 187
def change_item_status(cart_id, item_id, status):
188
    if not status:
189
        raise ShoppingCartException(101, "Status cannot be made null")
685 chandransh 190
    line = get_line(item_id, cart_id, None, True)
191
    if line:
192
        line.line_status = status
193
        current_time = datetime.datetime.now()
194
        line.updated_on = current_time
195
        line.cart.updated_on = current_time
557 chandransh 196
        session.commit()
197
    else:
685 chandransh 198
        raise ShoppingCartException(101, "Unable to probe the line you desired")
557 chandransh 199
 
200
def add_address_to_cart(cart_id, address_id):
201
    if not cart_id:
202
        raise ShoppingCartException(101, "cart id cannot be made null")
203
 
204
    if not address_id:
205
        raise ShoppingCartException(101, "address id cannot be made null")
206
 
207
    cart = get_cart_by_id(cart_id)
208
    if not cart:
209
        raise ShoppingCartException(101, "no cart for this id")
576 chandransh 210
 
211
    address = Address.get_by(id=address_id)
212
    if not address:
213
        raise ShoppingCartException(101, "No address for this id")
214
 
557 chandransh 215
    cart.address_id = address_id
685 chandransh 216
    current_time = datetime.datetime.now()
716 rajveer 217
    #cart.updated_on = current_time
557 chandransh 218
    session.commit()
219
 
1976 varun.gupt 220
def apply_coupon_to_cart(cart_id, coupon_code, total_price, discounted_price):
221
    cart = get_cart_by_id(cart_id)
222
    if not cart:
223
        raise ShoppingCartException(101, "no cart attached to this id")
224
    cart.total_price = total_price
225
    cart.discounted_price = discounted_price
226
    cart.coupon_code = coupon_code
227
    session.commit()
228
 
229
def remove_coupon(cart_id):
230
    cart = get_cart_by_id(cart_id)
231
    if not cart:
232
        raise ShoppingCartException(101, "no cart attached to this id")
2261 varun.gupt 233
 
234
    #Resetting discounted price of each line in cart to Null
235
    for line in cart.lines:
236
        line.discounted_price = None
237
 
3554 varun.gupt 238
    delete_discounts_from_cart(cart = cart)
1976 varun.gupt 239
    cart.discounted_price = None
240
    cart.coupon_code = None
241
    session.commit()
242
 
2815 vikas 243
def commit_cart(cart_id, sessionSource, sessionTime):   
690 chandransh 244
    cart = get_cart_by_id(cart_id)   
557 chandransh 245
    #now we have a cart. Need to create a transaction with it
576 chandransh 246
    txn = TTransaction()
247
    txn.shoppingCartid = cart_id
248
    txn.customer_id = cart.user_id
249
    txn.createdOn = to_java_date(datetime.datetime.now())
250
    txn.transactionStatus = TTransactionStatus.INIT
251
    txn.statusDescription = "New Order"
2219 varun.gupt 252
    txn.coupon_code = cart.coupon_code
2815 vikas 253
    txn.sessionSource = sessionSource
254
    txn.sessionStartTime = sessionTime
557 chandransh 255
 
576 chandransh 256
    txn.orders = create_orders(cart)
257
 
258
    transaction_client = TransactionClient().get_client()
259
    txn_id = transaction_client.createTransaction(txn)
260
    session.commit()
261
 
685 chandransh 262
    #new_cart = create_cart(cart.user_id)
263
    #user = User.get_by(id=cart.user_id)
264
    #user.active_cart_id = new_cart.id
265
    #session.commit()
576 chandransh 266
    return txn_id
267
 
268
def create_orders(cart):
557 chandransh 269
    cart_lines = cart.lines
576 chandransh 270
    orders = []
271
 
557 chandransh 272
    for line in cart_lines:
576 chandransh 273
        if line.line_status == LineStatus.LINE_ACTIVE:
3554 varun.gupt 274
            quantity_remaining_for_order = line.quantity
275
 
276
            for discount in line.discounts:
277
                i = 0
278
                while i < discount.quantity:
279
                    t_line_item = create_line_item(line.item_id, line.actual_price - discount.discount)
280
                    t_order = create_order(cart.user_id, cart.address_id, t_line_item)
281
                    orders.append(t_order)
282
                    i += 1
283
                quantity_remaining_for_order -= discount.quantity
284
 
576 chandransh 285
            i = 0
3554 varun.gupt 286
            while i < quantity_remaining_for_order:
287
                t_line_item = create_line_item(line.item_id, line.actual_price)
576 chandransh 288
                t_order = create_order(cart.user_id, cart.address_id, t_line_item)
289
                orders.append(t_order)
290
                i += 1
291
    return orders
292
 
293
def create_order(user_id, address_id, t_line_item):
294
    user = User.get_by(id=user_id)
295
    address = Address.get_by(id=address_id)
296
    t_order = TOrder()
557 chandransh 297
 
576 chandransh 298
    t_order.customer_id = user.id
299
    t_order.customer_email = user.email
300
 
910 rajveer 301
    t_order.customer_name = address.name
576 chandransh 302
    t_order.customer_pincode = address.pin
738 chandransh 303
    t_order.customer_address1 = address.line_1
304
    t_order.customer_address2 = address.line_2
669 chandransh 305
    t_order.customer_city = address.city
306
    t_order.customer_state = address.state
576 chandransh 307
    t_order.customer_mobilenumber = address.phone
308
 
309
    t_order.total_amount = t_line_item.total_price
1976 varun.gupt 310
 
576 chandransh 311
    t_order.total_weight = t_line_item.total_weight
312
    t_order.lineitems = [t_line_item]
313
 
690 chandransh 314
    t_order.status = OrderStatus.PAYMENT_PENDING
970 chandransh 315
    t_order.statusDescription = "Payment Pending"
576 chandransh 316
    t_order.created_timestamp = to_java_date(datetime.datetime.now())
317
 
318
    return t_order
319
 
3554 varun.gupt 320
def create_line_item(item_id, final_price):
3133 rajveer 321
    inventory_client = CatalogClient().get_client()
636 rajveer 322
    item = inventory_client.getItem(item_id)
576 chandransh 323
    t_line_item = TLineItem()
963 chandransh 324
    t_line_item.productGroup = item.productGroup
325
    t_line_item.brand = item.brand
636 rajveer 326
    t_line_item.model_number = item.modelNumber
669 chandransh 327
    if item.color is None or item.color == "NA":
328
        t_line_item.color = ""
329
    else:
917 chandransh 330
        t_line_item.color = item.color
963 chandransh 331
    t_line_item.model_name = item.modelName
636 rajveer 332
    t_line_item.extra_info = item.featureDescription
702 chandransh 333
    t_line_item.item_id = item.id
576 chandransh 334
    t_line_item.quantity = 1
1983 varun.gupt 335
 
3554 varun.gupt 336
    t_line_item.unit_price = final_price
337
    t_line_item.total_price = final_price
1983 varun.gupt 338
 
636 rajveer 339
    t_line_item.unit_weight = item.weight
340
    t_line_item.total_weight = item.weight
576 chandransh 341
    return t_line_item
342
 
343
def validate_cart(cartId):
3133 rajveer 344
    inventory_client = CatalogClient().get_client()
576 chandransh 345
    logistics_client = LogisticsClient().get_client()
1976 varun.gupt 346
    promotion_client = PromotionClient().get_client()
1466 ankur.sing 347
    retval = ""
557 chandransh 348
    # No need to validate duplicate items since there are only two ways
349
    # to add items to a cart and both of them check whether the item being
350
    # added is a duplicate of an already existing item.
563 chandransh 351
    cart = Cart.get_by(id=cartId)
352
    cart_lines = cart.lines
776 rajveer 353
    customer_pincode = None
690 chandransh 354
    current_time = datetime.datetime.now()
576 chandransh 355
    if cart.address_id:
356
        address = Address.get_by(id=cart.address_id)
357
        customer_pincode = address.pin
776 rajveer 358
    if not customer_pincode:
785 rajveer 359
        user = User.get_by(active_cart_id = cartId)
360
        default_address_id = user.default_address_id
776 rajveer 361
        if default_address_id:
362
            address = Address.get_by(id = default_address_id)
363
            customer_pincode = address.pin
364
    if not customer_pincode:
365
        #FIXME should not be hard coded. May be we can pick from config server.
366
        customer_pincode = "110001"
1976 varun.gupt 367
    cart.total_price = 0
563 chandransh 368
    for line in cart_lines:
612 chandransh 369
        old_estimate = line.estimate
636 rajveer 370
        item_id = line.item_id
1976 varun.gupt 371
        item = inventory_client.getItem(item_id)
2983 chandransh 372
        item_shipping_info = inventory_client.isActive(item_id) 
373
        if item_shipping_info.isActive:
374
            if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:
375
                line.quantity = 1
376
                retval = "Try adding a smaller quantity of " + item.brand + " " + item.modelNumber + " (" + item.color + ")"
377
 
2139 chandransh 378
            line.actual_price = item.sellingPrice 
379
            cart.total_price = cart.total_price + (line.actual_price * line.quantity)
776 rajveer 380
            try:
381
                item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode).deliveryTime
844 chandransh 382
            except LogisticsServiceException:
383
                item_delivery_estimate = -1
384
                #TODO Use the exception clause to set the retval appropriately
385
            except :
386
                item_delivery_estimate = -1
776 rajveer 387
            if old_estimate != item_delivery_estimate:
388
                line.estimate = item_delivery_estimate
389
                cart.updated_on = current_time
1466 ankur.sing 390
                if old_estimate != None:
391
                    retval = "Delivery Estimates updated."
576 chandransh 392
        else:
563 chandransh 393
            line.delete()
1466 ankur.sing 394
            retval = "Some items have been removed from the cart."
716 rajveer 395
    if cart.checked_out_on is not None:
396
        if cart.updated_on > cart.checked_out_on:
844 chandransh 397
            cart.checked_out_on = None
1466 ankur.sing 398
            if retval == "":
399
                retval = "Your cart has been updated after the last checkout."
612 chandransh 400
    session.commit()
1976 varun.gupt 401
 
402
    if cart.coupon_code is not None:
2026 varun.gupt 403
        try:
404
            updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
405
            for t_line in updated_cart.lines:
1976 varun.gupt 406
            #Find the line in the database which corresponds to this line
2026 varun.gupt 407
                line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()
1976 varun.gupt 408
            #Update its discounted price.
2026 varun.gupt 409
                line.discounted_price = t_line.discountedPrice
410
            cart.discounted_price = updated_cart.discountedPrice
411
            session.commit()
412
        except PromotionException as ex:
413
            remove_coupon(cart.id)
414
            retval = ex.message
563 chandransh 415
    return retval
576 chandransh 416
 
557 chandransh 417
def merge_cart(fromCartId, toCartId):
418
    fromCart = Cart.get_by(id=fromCartId)
419
    toCart = Cart.get_by(id=toCartId)
420
 
421
    old_lines = fromCart.lines
422
    new_lines = toCart.lines
423
 
424
    for line in old_lines:
425
        flag = True
426
        for new_line in new_lines:
427
            if line.item_id == new_line.item_id:
428
                flag = False
576 chandransh 429
        if flag:
557 chandransh 430
            toCart.lines.append(line)
431
 
2019 varun.gupt 432
    if toCart.coupon_code is None:
433
        toCart.coupon_code = fromCart.coupon_code
434
 
435
    toCart.updated_on = datetime.datetime.now()
557 chandransh 436
    fromCart.expired_on = datetime.datetime.now()
437
    fromCart.cart_status = CartStatus.INACTIVE
643 chandransh 438
    session.commit()
691 chandransh 439
 
440
def check_out(cartId):
441
    if cartId is None:
442
        raise ShoppingCartException(101, "Cart id not specified")
716 rajveer 443
    cart = Cart.get_by(id = cartId)
691 chandransh 444
    if cart is None:
445
        raise ShoppingCartException(102, "The specified cart couldn't be found")
446
    cart.checked_out_on = datetime.datetime.now()
447
    session.commit()
448
    return True
449
 
450
def reset_cart(cartId, items):
451
    if cartId is None:
452
        raise ShoppingCartException(101, "Cart id not specified")
453
    for item_id, quantity in items.iteritems():
454
        line = Line.query.filter_by(cart_id=cartId, item_id=item_id).one()
455
        if line is not None:
2261 varun.gupt 456
            line.discounted_price = None
691 chandransh 457
            line.quantity = line.quantity - quantity
458
            if line.quantity == 0:
459
                line.delete()
717 rajveer 460
    cart = Cart.get_by(id=cartId)
691 chandransh 461
    cart.updated_on = datetime.datetime.now()
1894 vikas 462
    cart.checked_out_on = None
1976 varun.gupt 463
 
464
    # Removing Coupon
465
    cart.total_price = None
466
    cart.discounted_price = None
467
    cart.coupon_code = None
468
 
691 chandransh 469
    session.commit()
766 rajveer 470
    return True
471
 
3386 varun.gupt 472
def get_carts_with_coupon_count(coupon_code):
473
    return Cart.query.filter_by(coupon_code = coupon_code).count()
474
 
766 rajveer 475
def close_session():
476
    if session.is_active:
477
        print "session is active. closing it."
1621 rajveer 478
        session.close()