Subversion Repositories SmartDukaan

Rev

Rev 2261 | Rev 2983 | 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 *
576 chandransh 7
from shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, User
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
21
from shop2020.clients.InventoryClient import InventoryClient
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
 
114
    cart = Cart.get_by(id = cart_id)
557 chandransh 115
    if not cart:
116
        raise ShoppingCartException(101, "no cart attached to this id")
2035 rajveer 117
    inventory_client = InventoryClient().get_client()
118
    if not inventory_client.isActive(item_id):
119
        return inventory_client.getItemStatusDescription(item_id)
557 chandransh 120
 
643 chandransh 121
    current_time = datetime.datetime.now()
122
    cart.updated_on = current_time
123
    line = get_line(item_id, cart_id, None,True)
124
    if line:
125
        #change the quantity only
126
        line.quantity = quantity
685 chandransh 127
        line.updated_on = current_time
643 chandransh 128
    else:
129
        line = Line()
130
        line.cart = cart
131
        line.item_id = item_id
132
        line.quantity = quantity
133
        line.created_on = current_time
134
        line.updated_on = current_time
135
        line.line_status = LineStatus.LINE_ACTIVE
557 chandransh 136
    session.commit()
2100 rajveer 137
    return ""
1621 rajveer 138
    #validate_cart(cart_id)
557 chandransh 139
 
140
def delete_item_from_cart(cart_id, item_id):
141
    if not item_id:
142
        raise ShoppingCartException(101, "item_id cannot be null")
685 chandransh 143
    cart = Cart.get_by(id = cart_id)
144
    if not cart:
145
        raise ShoppingCartException(101, "no cart attached to this id")
643 chandransh 146
    item = get_line(item_id, cart_id, None, True)
557 chandransh 147
    item.delete()
685 chandransh 148
    current_time = datetime.datetime.now()
149
    cart.updated_on = current_time
557 chandransh 150
    session.commit()
151
 
152
def change_item_status(cart_id, item_id, status):
153
    if not status:
154
        raise ShoppingCartException(101, "Status cannot be made null")
685 chandransh 155
    line = get_line(item_id, cart_id, None, True)
156
    if line:
157
        line.line_status = status
158
        current_time = datetime.datetime.now()
159
        line.updated_on = current_time
160
        line.cart.updated_on = current_time
557 chandransh 161
        session.commit()
162
    else:
685 chandransh 163
        raise ShoppingCartException(101, "Unable to probe the line you desired")
557 chandransh 164
 
165
def add_address_to_cart(cart_id, address_id):
166
    if not cart_id:
167
        raise ShoppingCartException(101, "cart id cannot be made null")
168
 
169
    if not address_id:
170
        raise ShoppingCartException(101, "address id cannot be made null")
171
 
172
    cart = get_cart_by_id(cart_id)
173
    if not cart:
174
        raise ShoppingCartException(101, "no cart for this id")
576 chandransh 175
 
176
    address = Address.get_by(id=address_id)
177
    if not address:
178
        raise ShoppingCartException(101, "No address for this id")
179
 
557 chandransh 180
    cart.address_id = address_id
685 chandransh 181
    current_time = datetime.datetime.now()
716 rajveer 182
    #cart.updated_on = current_time
557 chandransh 183
    session.commit()
184
 
1976 varun.gupt 185
def apply_coupon_to_cart(cart_id, coupon_code, total_price, discounted_price):
186
    cart = get_cart_by_id(cart_id)
187
    if not cart:
188
        raise ShoppingCartException(101, "no cart attached to this id")
189
    cart.total_price = total_price
190
    cart.discounted_price = discounted_price
191
    cart.coupon_code = coupon_code
192
    session.commit()
193
 
194
def remove_coupon(cart_id):
195
    cart = get_cart_by_id(cart_id)
196
    if not cart:
197
        raise ShoppingCartException(101, "no cart attached to this id")
2261 varun.gupt 198
 
199
    #Resetting discounted price of each line in cart to Null
200
    for line in cart.lines:
201
        line.discounted_price = None
202
 
1976 varun.gupt 203
    cart.discounted_price = None
204
    cart.coupon_code = None
205
    session.commit()
206
 
2815 vikas 207
def commit_cart(cart_id, sessionSource, sessionTime):   
690 chandransh 208
    cart = get_cart_by_id(cart_id)   
557 chandransh 209
    #now we have a cart. Need to create a transaction with it
576 chandransh 210
    txn = TTransaction()
211
    txn.shoppingCartid = cart_id
212
    txn.customer_id = cart.user_id
213
    txn.createdOn = to_java_date(datetime.datetime.now())
214
    txn.transactionStatus = TTransactionStatus.INIT
215
    txn.statusDescription = "New Order"
2219 varun.gupt 216
    txn.coupon_code = cart.coupon_code
2815 vikas 217
    txn.sessionSource = sessionSource
218
    txn.sessionStartTime = sessionTime
557 chandransh 219
 
576 chandransh 220
    txn.orders = create_orders(cart)
221
 
222
    transaction_client = TransactionClient().get_client()
223
    txn_id = transaction_client.createTransaction(txn)
224
    session.commit()
225
 
685 chandransh 226
    #new_cart = create_cart(cart.user_id)
227
    #user = User.get_by(id=cart.user_id)
228
    #user.active_cart_id = new_cart.id
229
    #session.commit()
576 chandransh 230
    return txn_id
231
 
232
def create_orders(cart):
557 chandransh 233
    cart_lines = cart.lines
576 chandransh 234
    orders = []
235
 
557 chandransh 236
    for line in cart_lines:
576 chandransh 237
        if line.line_status == LineStatus.LINE_ACTIVE:
238
            i = 0
239
            while i< line.quantity:
1976 varun.gupt 240
                t_line_item = create_line_item(line.item_id, line.discounted_price)
576 chandransh 241
                t_order = create_order(cart.user_id, cart.address_id, t_line_item)
242
                orders.append(t_order)
243
                i += 1
244
    return orders
245
 
246
def create_order(user_id, address_id, t_line_item):
247
    user = User.get_by(id=user_id)
248
    address = Address.get_by(id=address_id)
249
    t_order = TOrder()
557 chandransh 250
 
576 chandransh 251
    t_order.customer_id = user.id
252
    t_order.customer_email = user.email
253
 
910 rajveer 254
    t_order.customer_name = address.name
576 chandransh 255
    t_order.customer_pincode = address.pin
738 chandransh 256
    t_order.customer_address1 = address.line_1
257
    t_order.customer_address2 = address.line_2
669 chandransh 258
    t_order.customer_city = address.city
259
    t_order.customer_state = address.state
576 chandransh 260
    t_order.customer_mobilenumber = address.phone
261
 
262
    t_order.total_amount = t_line_item.total_price
1976 varun.gupt 263
 
576 chandransh 264
    t_order.total_weight = t_line_item.total_weight
265
    t_order.lineitems = [t_line_item]
266
 
690 chandransh 267
    t_order.status = OrderStatus.PAYMENT_PENDING
970 chandransh 268
    t_order.statusDescription = "Payment Pending"
576 chandransh 269
    t_order.created_timestamp = to_java_date(datetime.datetime.now())
270
 
743 rajveer 271
    # this code is moved somewhere else, as now order will be created but we dont want to add awb number etc
272
    '''
576 chandransh 273
    logistics_client = LogisticsClient().get_client()
716 rajveer 274
    logistics_info = logistics_client.getLogisticsInfo(t_order.customer_pincode, t_line_item.item_id)
576 chandransh 275
 
716 rajveer 276
    t_order.logistics_provider_id = logistics_info.providerId
576 chandransh 277
    t_order.airwaybill_no = logistics_info.airway_billno
278
    t_order.tracking_id = t_order.airwaybill_no
716 rajveer 279
    t_order.expected_delivery_time = to_java_date(datetime.datetime.now()) + 60*60*1000*logistics_info.deliveryTime
280
    t_order.warehouse_id = logistics_info.warehouseId
743 rajveer 281
    '''
282
 
576 chandransh 283
    return t_order
284
 
1976 varun.gupt 285
def create_line_item(item_id, discounted_price):
576 chandransh 286
    inventory_client = InventoryClient().get_client()
636 rajveer 287
    item = inventory_client.getItem(item_id)
576 chandransh 288
    t_line_item = TLineItem()
963 chandransh 289
    t_line_item.productGroup = item.productGroup
290
    t_line_item.brand = item.brand
636 rajveer 291
    t_line_item.model_number = item.modelNumber
669 chandransh 292
    if item.color is None or item.color == "NA":
293
        t_line_item.color = ""
294
    else:
917 chandransh 295
        t_line_item.color = item.color
963 chandransh 296
    t_line_item.model_name = item.modelName
636 rajveer 297
    t_line_item.extra_info = item.featureDescription
702 chandransh 298
    t_line_item.item_id = item.id
576 chandransh 299
    t_line_item.quantity = 1
1983 varun.gupt 300
 
301
    if discounted_price is None or discounted_price == 0:
302
        t_line_item.unit_price = item.sellingPrice
303
        t_line_item.total_price = item.sellingPrice
304
    else:
305
        t_line_item.unit_price = discounted_price
306
        t_line_item.total_price = discounted_price
307
 
636 rajveer 308
    t_line_item.unit_weight = item.weight
309
    t_line_item.total_weight = item.weight
576 chandransh 310
    return t_line_item
311
 
312
def validate_cart(cartId):
313
    inventory_client = InventoryClient().get_client()
314
    logistics_client = LogisticsClient().get_client()
1976 varun.gupt 315
    promotion_client = PromotionClient().get_client()
1466 ankur.sing 316
    retval = ""
557 chandransh 317
    # No need to validate duplicate items since there are only two ways
318
    # to add items to a cart and both of them check whether the item being
319
    # added is a duplicate of an already existing item.
563 chandransh 320
    cart = Cart.get_by(id=cartId)
321
    cart_lines = cart.lines
776 rajveer 322
    customer_pincode = None
690 chandransh 323
    current_time = datetime.datetime.now()
576 chandransh 324
    if cart.address_id:
325
        address = Address.get_by(id=cart.address_id)
326
        customer_pincode = address.pin
776 rajveer 327
    if not customer_pincode:
785 rajveer 328
        user = User.get_by(active_cart_id = cartId)
329
        default_address_id = user.default_address_id
776 rajveer 330
        if default_address_id:
331
            address = Address.get_by(id = default_address_id)
332
            customer_pincode = address.pin
333
    if not customer_pincode:
334
        #FIXME should not be hard coded. May be we can pick from config server.
335
        customer_pincode = "110001"
1976 varun.gupt 336
    cart.total_price = 0
563 chandransh 337
    for line in cart_lines:
612 chandransh 338
        old_estimate = line.estimate
636 rajveer 339
        item_id = line.item_id
1976 varun.gupt 340
        item = inventory_client.getItem(item_id)
636 rajveer 341
        if inventory_client.isActive(item_id):
2139 chandransh 342
            line.actual_price = item.sellingPrice 
343
            cart.total_price = cart.total_price + (line.actual_price * line.quantity)
776 rajveer 344
            try:
345
                item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode).deliveryTime
844 chandransh 346
            except LogisticsServiceException:
347
                item_delivery_estimate = -1
348
                #TODO Use the exception clause to set the retval appropriately
349
            except :
350
                item_delivery_estimate = -1
776 rajveer 351
            if old_estimate != item_delivery_estimate:
352
                line.estimate = item_delivery_estimate
353
                cart.updated_on = current_time
1466 ankur.sing 354
                if old_estimate != None:
355
                    retval = "Delivery Estimates updated."
576 chandransh 356
        else:
563 chandransh 357
            line.delete()
1466 ankur.sing 358
            retval = "Some items have been removed from the cart."
716 rajveer 359
    if cart.checked_out_on is not None:
360
        if cart.updated_on > cart.checked_out_on:
844 chandransh 361
            cart.checked_out_on = None
1466 ankur.sing 362
            if retval == "":
363
                retval = "Your cart has been updated after the last checkout."
612 chandransh 364
    session.commit()
1976 varun.gupt 365
 
366
    if cart.coupon_code is not None:
2026 varun.gupt 367
        try:
368
            updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
369
            for t_line in updated_cart.lines:
1976 varun.gupt 370
            #Find the line in the database which corresponds to this line
2026 varun.gupt 371
                line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()
1976 varun.gupt 372
            #Update its discounted price.
2026 varun.gupt 373
                line.discounted_price = t_line.discountedPrice
374
            cart.discounted_price = updated_cart.discountedPrice
375
            session.commit()
376
        except PromotionException as ex:
377
            remove_coupon(cart.id)
378
            retval = ex.message
563 chandransh 379
    return retval
576 chandransh 380
 
557 chandransh 381
def merge_cart(fromCartId, toCartId):
382
    fromCart = Cart.get_by(id=fromCartId)
383
    toCart = Cart.get_by(id=toCartId)
384
 
385
    old_lines = fromCart.lines
386
    new_lines = toCart.lines
387
 
388
    for line in old_lines:
389
        flag = True
390
        for new_line in new_lines:
391
            if line.item_id == new_line.item_id:
392
                flag = False
576 chandransh 393
        if flag:
557 chandransh 394
            toCart.lines.append(line)
395
 
2019 varun.gupt 396
    if toCart.coupon_code is None:
397
        toCart.coupon_code = fromCart.coupon_code
398
 
399
    toCart.updated_on = datetime.datetime.now()
557 chandransh 400
    fromCart.expired_on = datetime.datetime.now()
401
    fromCart.cart_status = CartStatus.INACTIVE
643 chandransh 402
    session.commit()
691 chandransh 403
 
404
def check_out(cartId):
405
    if cartId is None:
406
        raise ShoppingCartException(101, "Cart id not specified")
716 rajveer 407
    cart = Cart.get_by(id = cartId)
691 chandransh 408
    if cart is None:
409
        raise ShoppingCartException(102, "The specified cart couldn't be found")
410
    cart.checked_out_on = datetime.datetime.now()
411
    session.commit()
412
    return True
413
 
414
def reset_cart(cartId, items):
415
    if cartId is None:
416
        raise ShoppingCartException(101, "Cart id not specified")
417
    for item_id, quantity in items.iteritems():
418
        line = Line.query.filter_by(cart_id=cartId, item_id=item_id).one()
419
        if line is not None:
2261 varun.gupt 420
            line.discounted_price = None
691 chandransh 421
            line.quantity = line.quantity - quantity
422
            if line.quantity == 0:
423
                line.delete()
717 rajveer 424
    cart = Cart.get_by(id=cartId)
691 chandransh 425
    cart.updated_on = datetime.datetime.now()
1894 vikas 426
    cart.checked_out_on = None
1976 varun.gupt 427
 
428
    # Removing Coupon
429
    cart.total_price = None
430
    cart.discounted_price = None
431
    cart.coupon_code = None
432
 
691 chandransh 433
    session.commit()
766 rajveer 434
    return True
435
 
436
def close_session():
437
    if session.is_active:
438
        print "session is active. closing it."
1621 rajveer 439
        session.close()