Subversion Repositories SmartDukaan

Rev

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