Subversion Repositories SmartDukaan

Rev

Rev 11612 | Rev 11655 | 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 *
6921 anupam.sin 7
from shop2020.clients.CatalogClient import CatalogClient
8
from shop2020.clients.LogisticsClient import LogisticsClient
9
from shop2020.clients.PromotionClient import PromotionClient
10
from shop2020.clients.TransactionClient import TransactionClient
11
from shop2020.model.v1 import user
12
from shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, User, \
13
    Discount, InsuranceDetails
14
from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException, \
15
    DeliveryType
9299 kshitij.so 16
from shop2020.thriftpy.model.v1.catalog.ttypes import Item, InsurerType
6921 anupam.sin 17
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as TTransaction, \
18
    TransactionStatus as TTransactionStatus, Order as TOrder, LineItem as TLineItem, \
7504 rajveer 19
    OrderStatus, OrderSource
6921 anupam.sin 20
from shop2020.thriftpy.model.v1.user.ttypes import CartStatus, LineStatus, \
11592 amit.gupta 21
    ShoppingCartException, PromotionException, CartPlus
6921 anupam.sin 22
from shop2020.utils.Utils import to_py_date, to_java_date
557 chandransh 23
import datetime
11592 amit.gupta 24
from shop2020.model.v1.user.impl.Converters import to_t_cart
557 chandransh 25
 
26
 
576 chandransh 27
 
28
 
5326 rajveer 29
def get_cart(userId):
30
    user = User.get_by(id=userId)
31
    return user.active_cart
557 chandransh 32
 
33
def get_cart_by_id(id):
34
    cart = Cart.get_by(id=id)
35
    return cart
36
 
5326 rajveer 37
def create_cart():
38
    cart = Cart()
39
    cart.created_on = datetime.datetime.now()
40
    cart.updated_on = datetime.datetime.now()
41
    cart.cart_status = CartStatus.ACTIVE
557 chandransh 42
    return cart
43
 
44
def get_carts_between(start_time, end_time, status):
45
    init_time = to_py_date(start_time)
46
    finish_time = to_py_date(end_time)
47
 
48
    query = Cart.query
49
    if status:
50
        query = query.filter(Cart.cart_status==status)
51
    if init_time:
52
        query = query.filter(Cart.created_on >= init_time)
53
    if finish_time:
54
        query = query.filter(Cart.created_on <= finish_time)
55
 
56
    carts = query.all()
57
    return carts
58
 
643 chandransh 59
def get_line(item_id, cart_id, status, single):
557 chandransh 60
    #get cart first 
61
    try:
62
        found_cart = Cart.get_by(id=cart_id)
63
    except:
64
        raise ShoppingCartException(101, "cart not found ")
643 chandransh 65
    query = Line.query.filter_by(cart = found_cart, item_id = item_id)
557 chandransh 66
 
67
    if status:
68
        query = query.filter_by(line_status = status)
69
    else:
70
        query = query.filter_by(line_status = LineStatus.LINE_ACTIVE)
71
    try:
72
        if single:
73
            return query.one()
74
        else:
75
            return query.all()
76
    except:
77
        return None
78
 
3557 rajveer 79
def add_item_to_cart(cart_id, item_id, quantity, sourceId):
557 chandransh 80
    if not item_id:
81
        raise ShoppingCartException(101, "item_id cannot be null")
82
 
83
    if not quantity:
84
        raise ShoppingCartException(101, "quantity cannot be null")    
643 chandransh 85
 
2983 chandransh 86
    cart = Cart.get_by(id = cart_id)    
557 chandransh 87
    if not cart:
6502 rajveer 88
        raise ShoppingCartException(101, "no cart attached to this id" + str(cart_id))
2983 chandransh 89
    retval = ""
6550 rajveer 90
    catalog_client = CatalogClient().get_client()
91
    item = catalog_client.getItemForSource(item_id, sourceId)
9299 kshitij.so 92
    dataProtectionInsurer = catalog_client.getPrefferedInsurerForItem(item_id,InsurerType._NAMES_TO_VALUES.get("DATA"))
6550 rajveer 93
    item_shipping_info = catalog_client.isActive(item_id)
2983 chandransh 94
    if not item_shipping_info.isActive:
6550 rajveer 95
        return catalog_client.getItemStatusDescription(item_id)
557 chandransh 96
 
643 chandransh 97
    current_time = datetime.datetime.now()
98
    cart.updated_on = current_time
99
    line = get_line(item_id, cart_id, None,True)
100
    if line:
101
        #change the quantity only
6903 anupam.sin 102
        line.insuranceAmount = (line.insuranceAmount/line.quantity) * quantity
643 chandransh 103
        line.quantity = quantity
685 chandransh 104
        line.updated_on = current_time
9299 kshitij.so 105
        line.dataProtectionAmount = (line.dataProtectionAmount/line.quantity) * quantity
643 chandransh 106
    else:
107
        line = Line()
108
        line.cart = cart
109
        line.item_id = item_id
110
        line.quantity = quantity
111
        line.created_on = current_time
112
        line.updated_on = current_time
3557 rajveer 113
        line.actual_price = item.sellingPrice
643 chandransh 114
        line.line_status = LineStatus.LINE_ACTIVE
6903 anupam.sin 115
        line.insurer = 0
116
        line.insuranceAmount = 0
9299 kshitij.so 117
        #DATA INSURER IS SET UPON ADD TO CART
118
        line.dataProtectionInsurer = dataProtectionInsurer
557 chandransh 119
    session.commit()
2983 chandransh 120
    return retval
557 chandransh 121
 
122
def delete_item_from_cart(cart_id, item_id):
123
    if not item_id:
124
        raise ShoppingCartException(101, "item_id cannot be null")
685 chandransh 125
    cart = Cart.get_by(id = cart_id)
126
    if not cart:
127
        raise ShoppingCartException(101, "no cart attached to this id")
643 chandransh 128
    item = get_line(item_id, cart_id, None, True)
3554 varun.gupt 129
    count_deleted_discounts = delete_discounts_for_line(item)
557 chandransh 130
    item.delete()
685 chandransh 131
    current_time = datetime.datetime.now()
132
    cart.updated_on = current_time
557 chandransh 133
    session.commit()
134
 
3554 varun.gupt 135
def delete_discounts_for_line(item_line):
136
    count_deleted = Discount.query.filter_by(line = item_line).delete()
137
    session.commit()
138
    return count_deleted
139
 
140
def delete_discounts_from_cart(cart_id, cart = None):
141
    if cart is None:
142
        if cart_id is None:
143
            raise ShoppingCartException(101, 'cart_id and cart, both cannot be null')
144
        else:
145
            cart = Cart.get_by(id = cart_id)
146
 
147
    if cart.lines:
148
        for line in cart.lines:
149
            delete_discounts_for_line(line)
150
 
151
def save_discounts(discounts):
152
    if not discounts:
153
        raise ShoppingCartException(101, 'discounts be null')
154
 
155
    if len(discounts) > 0:
156
        cart = Cart.get_by(id = discounts[0].cart_id)
157
 
158
        for t_discount in discounts:
159
            line = Line.query.filter_by(cart = cart, item_id = t_discount.item_id).first()
160
            if line is not None:
161
                discount = Discount()
162
                discount.line = line
163
                discount.discount = t_discount.discount
164
                discount.quantity = t_discount.quantity
165
                session.commit()
166
 
557 chandransh 167
def add_address_to_cart(cart_id, address_id):
168
    if not cart_id:
169
        raise ShoppingCartException(101, "cart id cannot be made null")
170
 
171
    if not address_id:
172
        raise ShoppingCartException(101, "address id cannot be made null")
173
 
174
    cart = get_cart_by_id(cart_id)
175
    if not cart:
176
        raise ShoppingCartException(101, "no cart for this id")
576 chandransh 177
 
178
    address = Address.get_by(id=address_id)
179
    if not address:
180
        raise ShoppingCartException(101, "No address for this id")
181
 
557 chandransh 182
    cart.address_id = address_id
685 chandransh 183
    current_time = datetime.datetime.now()
716 rajveer 184
    #cart.updated_on = current_time
557 chandransh 185
    session.commit()
5555 rajveer 186
 
187
def add_store_to_cart(cartId, storeId):
188
    if not cartId:
189
        raise ShoppingCartException(101, "cart id cannot be made null")
557 chandransh 190
 
5555 rajveer 191
    cart = get_cart_by_id(cartId)
192
    if not cart:
193
        raise ShoppingCartException(101, "no cart for this id")
194
 
195
    if storeId:
196
        cart.pickupStoreId = storeId
197
    else:
198
        cart.pickupStoreId = None
199
 
200
    session.commit()
201
 
6922 anupam.sin 202
def apply_coupon_to_cart(t_cart, coupon_code):
203
    cart = get_cart_by_id(t_cart.id)
1976 varun.gupt 204
    if not cart:
205
        raise ShoppingCartException(101, "no cart attached to this id")
6922 anupam.sin 206
    pc = PromotionClient().get_client()
207
    if not pc.isGiftVoucher(coupon_code):
208
        for t_line in t_cart.lines:
209
            line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()
210
        #Update its discounted price.
211
            line.discounted_price = t_line.discountedPrice
212
 
213
    cart.total_price = t_cart.totalPrice
214
    cart.discounted_price = t_cart.discountedPrice
1976 varun.gupt 215
    cart.coupon_code = coupon_code
216
    session.commit()
217
 
218
def remove_coupon(cart_id):
219
    cart = get_cart_by_id(cart_id)
220
    if not cart:
221
        raise ShoppingCartException(101, "no cart attached to this id")
2261 varun.gupt 222
 
223
    #Resetting discounted price of each line in cart to Null
224
    for line in cart.lines:
225
        line.discounted_price = None
11653 amit.gupta 226
        line.dealText = None
227
        line.freebieId = None
2261 varun.gupt 228
 
3619 chandransh 229
    delete_discounts_from_cart(cart.id, cart=cart)
1976 varun.gupt 230
    cart.discounted_price = None
231
    cart.coupon_code = None
232
    session.commit()
233
 
11526 amit.gupta 234
def commit_cart(cart_id, sessionSource, sessionTime, firstSource, firstSourceTime, userId, schemeId, orderSource):   
690 chandransh 235
    cart = get_cart_by_id(cart_id)   
557 chandransh 236
    #now we have a cart. Need to create a transaction with it
576 chandransh 237
    txn = TTransaction()
238
    txn.shoppingCartid = cart_id
5326 rajveer 239
    txn.customer_id = userId
576 chandransh 240
    txn.createdOn = to_java_date(datetime.datetime.now())
241
    txn.transactionStatus = TTransactionStatus.INIT
242
    txn.statusDescription = "New Order"
2219 varun.gupt 243
    txn.coupon_code = cart.coupon_code
2815 vikas 244
    txn.sessionSource = sessionSource
245
    txn.sessionStartTime = sessionTime
3858 vikas 246
    txn.firstSource = firstSource
247
    txn.firstSourceTime = firstSourceTime
6389 rajveer 248
    txn.emiSchemeId = schemeId
11526 amit.gupta 249
    txn.orders = create_orders(cart, userId, orderSource)
576 chandransh 250
 
251
    transaction_client = TransactionClient().get_client()
252
    txn_id = transaction_client.createTransaction(txn)
253
    session.commit()
254
 
255
    return txn_id
256
 
11526 amit.gupta 257
def create_orders(cart, userId, orderSource):
557 chandransh 258
    cart_lines = cart.lines
576 chandransh 259
    orders = []
6318 rajveer 260
    isGv = False
261
    if cart.coupon_code:
262
        try:
263
            pc = PromotionClient().get_client()
264
            isGv = pc.isGiftVoucher(cart.coupon_code)
265
        except:
266
            isGv = False
267
 
6903 anupam.sin 268
    insuranceDetails = InsuranceDetails.get_by(addressId = cart.address_id)
269
 
557 chandransh 270
    for line in cart_lines:
576 chandransh 271
        if line.line_status == LineStatus.LINE_ACTIVE:
3554 varun.gupt 272
            quantity_remaining_for_order = line.quantity
273
 
274
            for discount in line.discounts:
275
                i = 0
276
                while i < discount.quantity:
6330 rajveer 277
                    t_line_item = create_line_item(line.item_id, line.actual_price if isGv else (line.actual_price - discount.discount))
11553 amit.gupta 278
                    t_order = create_order(userId, cart.address_id, t_line_item, cart.pickupStoreId, discount.discount if isGv else 0, line.insurer, (line.insuranceAmount/line.quantity), insuranceDetails,line.dataProtectionInsurer,(line.dataProtectionAmount)/line.quantity, orderSource)
3554 varun.gupt 279
                    orders.append(t_order)
280
                    i += 1
281
                quantity_remaining_for_order -= discount.quantity
282
 
576 chandransh 283
            i = 0
3554 varun.gupt 284
            while i < quantity_remaining_for_order:
285
                t_line_item = create_line_item(line.item_id, line.actual_price)
11526 amit.gupta 286
                t_order = create_order(userId, cart.address_id, t_line_item, cart.pickupStoreId, 0, line.insurer, (line.insuranceAmount/line.quantity), insuranceDetails, line.dataProtectionInsurer,(line.dataProtectionAmount)/line.quantity, orderSource)
576 chandransh 287
                orders.append(t_order)
288
                i += 1
289
    return orders
290
 
11526 amit.gupta 291
def create_order(userId, address_id, t_line_item, pickupStoreId, gvAmount, insurer, insuranceAmount, insuranceDetails, dataProtectionInsurer, dataProtectionAmount, orderSource):
5326 rajveer 292
    user = User.get_by(id=userId)
576 chandransh 293
    address = Address.get_by(id=address_id)
294
    t_order = TOrder()
557 chandransh 295
 
576 chandransh 296
    t_order.customer_id = user.id
297
    t_order.customer_email = user.email
298
 
910 rajveer 299
    t_order.customer_name = address.name
576 chandransh 300
    t_order.customer_pincode = address.pin
738 chandransh 301
    t_order.customer_address1 = address.line_1
302
    t_order.customer_address2 = address.line_2
669 chandransh 303
    t_order.customer_city = address.city
304
    t_order.customer_state = address.state
576 chandransh 305
    t_order.customer_mobilenumber = address.phone
306
 
9299 kshitij.so 307
    t_order.total_amount = t_line_item.total_price + insuranceAmount + dataProtectionAmount
6318 rajveer 308
    t_order.gvAmount = gvAmount
1976 varun.gupt 309
 
576 chandransh 310
    t_order.total_weight = t_line_item.total_weight
311
    t_order.lineitems = [t_line_item]
312
 
690 chandransh 313
    t_order.status = OrderStatus.PAYMENT_PENDING
970 chandransh 314
    t_order.statusDescription = "Payment Pending"
576 chandransh 315
    t_order.created_timestamp = to_java_date(datetime.datetime.now())
316
 
5555 rajveer 317
    t_order.pickupStoreId = pickupStoreId 
6903 anupam.sin 318
    t_order.insuranceAmount = insuranceAmount 
319
    t_order.insurer = insurer
6935 anupam.sin 320
    if insuranceDetails:
321
        t_order.dob = insuranceDetails.dob
322
        t_order.guardianName = insuranceDetails.guardianName
7190 amar.kumar 323
 
324
    catalog_client = CatalogClient().get_client()
325
    freebie_item_id = catalog_client.getFreebieForItem(t_line_item.item_id)
326
    if freebie_item_id:
327
        t_order.freebieItemId = freebie_item_id
11526 amit.gupta 328
    t_order.source = orderSource
9299 kshitij.so 329
    t_order.dataProtectionInsurer = dataProtectionInsurer
330
    t_order.dataProtectionAmount = dataProtectionAmount
576 chandransh 331
    return t_order
332
 
3768 vikas 333
def create_line_item(item_id, final_price, quantity=1):
3133 rajveer 334
    inventory_client = CatalogClient().get_client()
636 rajveer 335
    item = inventory_client.getItem(item_id)
576 chandransh 336
    t_line_item = TLineItem()
963 chandransh 337
    t_line_item.productGroup = item.productGroup
338
    t_line_item.brand = item.brand
636 rajveer 339
    t_line_item.model_number = item.modelNumber
669 chandransh 340
    if item.color is None or item.color == "NA":
341
        t_line_item.color = ""
342
    else:
917 chandransh 343
        t_line_item.color = item.color
963 chandransh 344
    t_line_item.model_name = item.modelName
636 rajveer 345
    t_line_item.extra_info = item.featureDescription
702 chandransh 346
    t_line_item.item_id = item.id
3768 vikas 347
    t_line_item.quantity = quantity
1983 varun.gupt 348
 
3554 varun.gupt 349
    t_line_item.unit_price = final_price
3768 vikas 350
    t_line_item.total_price = final_price * quantity
1983 varun.gupt 351
 
636 rajveer 352
    t_line_item.unit_weight = item.weight
4172 rajveer 353
    t_line_item.total_weight = item.weight if item.weight is None else item.weight * quantity
354
    t_line_item.dealText = item.bestDealText
4295 varun.gupt 355
 
4312 rajveer 356
    if item.warrantyPeriod:
357
        #Computing Manufacturer Warranty expiry date
358
        today = datetime.date.today()
359
        expiry_year = today.year + int((today.month + item.warrantyPeriod) / 12)
360
        expiry_month = (today.month + item.warrantyPeriod) % 12
361
 
4295 varun.gupt 362
        try:
4312 rajveer 363
            expiry_date = datetime.datetime(expiry_year, expiry_month, today.day, 23, 59, 59, 999999)
4295 varun.gupt 364
        except ValueError:
365
            try:
4312 rajveer 366
                expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 1), 23, 59, 59, 999999)
4295 varun.gupt 367
            except ValueError:
4312 rajveer 368
                try:
369
                    expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 2), 23, 59, 59, 999999)
370
                except ValueError:
371
                    expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 3), 23, 59, 59, 999999)
372
 
373
        t_line_item.warrantry_expiry_timestamp = to_java_date(expiry_date)
374
 
576 chandransh 375
    return t_line_item
376
 
3557 rajveer 377
def validate_cart(cartId, sourceId):
3133 rajveer 378
    inventory_client = CatalogClient().get_client()
576 chandransh 379
    logistics_client = LogisticsClient().get_client()
1976 varun.gupt 380
    promotion_client = PromotionClient().get_client()
1466 ankur.sing 381
    retval = ""
6736 amit.gupta 382
    emival = ""
557 chandransh 383
    # No need to validate duplicate items since there are only two ways
384
    # to add items to a cart and both of them check whether the item being
385
    # added is a duplicate of an already existing item.
563 chandransh 386
    cart = Cart.get_by(id=cartId)
387
    cart_lines = cart.lines
776 rajveer 388
    customer_pincode = None
690 chandransh 389
    current_time = datetime.datetime.now()
5929 anupam.sin 390
    if cart.pickupStoreId :
5782 rajveer 391
        store = logistics_client.getPickupStore(cart.pickupStoreId)
392
        customer_pincode = store.pin
5572 anupam.sin 393
    if cart.address_id != None and customer_pincode == None:
576 chandransh 394
        address = Address.get_by(id=cart.address_id)
395
        customer_pincode = address.pin
776 rajveer 396
    if not customer_pincode:
785 rajveer 397
        user = User.get_by(active_cart_id = cartId)
398
        default_address_id = user.default_address_id
776 rajveer 399
        if default_address_id:
400
            address = Address.get_by(id = default_address_id)
401
            customer_pincode = address.pin
402
    if not customer_pincode:
403
        #FIXME should not be hard coded. May be we can pick from config server.
404
        customer_pincode = "110001"
1976 varun.gupt 405
    cart.total_price = 0
563 chandransh 406
    for line in cart_lines:
612 chandransh 407
        old_estimate = line.estimate
636 rajveer 408
        item_id = line.item_id
3557 rajveer 409
        item = inventory_client.getItemForSource(item_id, sourceId)
2983 chandransh 410
        item_shipping_info = inventory_client.isActive(item_id) 
411
        if item_shipping_info.isActive:
412
            if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:
413
                line.quantity = 1
414
                retval = "Try adding a smaller quantity of " + item.brand + " " + item.modelNumber + " (" + item.color + ")"
415
 
2139 chandransh 416
            line.actual_price = item.sellingPrice 
6921 anupam.sin 417
            cart.total_price = cart.total_price + (line.actual_price * line.quantity)
776 rajveer 418
            try:
4642 mandeep.dh 419
                item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTime
844 chandransh 420
            except LogisticsServiceException:
421
                item_delivery_estimate = -1
422
                #TODO Use the exception clause to set the retval appropriately
423
            except :
424
                item_delivery_estimate = -1
776 rajveer 425
            if old_estimate != item_delivery_estimate:
426
                line.estimate = item_delivery_estimate
427
                cart.updated_on = current_time
576 chandransh 428
        else:
563 chandransh 429
            line.delete()
716 rajveer 430
    if cart.checked_out_on is not None:
431
        if cart.updated_on > cart.checked_out_on:
844 chandransh 432
            cart.checked_out_on = None
612 chandransh 433
    session.commit()
1976 varun.gupt 434
 
6921 anupam.sin 435
    cart = Cart.get_by(id=cartId)
436
    cart_lines = cart.lines
437
    for line in cart_lines :
438
        if line.insurer > 0 :
9299 kshitij.so 439
            insure_item(line.item_id, cartId, True, InsurerType._NAMES_TO_VALUES.get("DEVICE"))
440
        if line.dataProtectionInsurer > 0:
441
            insure_item(line.item_id, cartId, True, InsurerType._NAMES_TO_VALUES.get("DATA"))
1976 varun.gupt 442
    if cart.coupon_code is not None:
2026 varun.gupt 443
        try:
444
            updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
6922 anupam.sin 445
#            totalInsuranceAmt = 0
446
#            for t_line in updated_cart.lines:
447
#            #Find the line in the database which corresponds to this line
448
#                line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()
449
#            #Update its discounted price.
450
#                line.discounted_price = t_line.discountedPrice
451
#            #If discounted price of line is set and this coupon is not a gift voucher that means
452
#            # we will need to correct the insurance price accordingly.
453
##                if line.insurer > 0 and line.discounted_price and not promotion_client.isGiftVoucher(cart.coupon_code) :
454
##                    cc = CatalogClient().get_client()
455
##                    insuranceAmt = cc.getInsuranceAmount(line.item_id, line.discounted_price, line.insurer, line.quantity)
456
##                    line.insuranceAmount = insuranceAmt
457
##                    totalInsuranceAmt += insuranceAmt
458
#            cart.total_price = updated_cart.totalPrice
459
#            cart.discounted_price = updated_cart.discountedPrice
460
#            session.commit()
6740 amit.gupta 461
            if updated_cart.message is not None:
6739 amit.gupta 462
                emival = updated_cart.message
2026 varun.gupt 463
        except PromotionException as ex:
464
            remove_coupon(cart.id)
465
            retval = ex.message
6740 amit.gupta 466
 
6736 amit.gupta 467
    return [retval, emival]
576 chandransh 468
 
557 chandransh 469
def merge_cart(fromCartId, toCartId):
470
    fromCart = Cart.get_by(id=fromCartId)
471
    toCart = Cart.get_by(id=toCartId)
472
 
473
    old_lines = fromCart.lines
474
    new_lines = toCart.lines
475
 
476
    for line in old_lines:
5345 rajveer 477
        for discount in line.discounts:
478
            discount.delete()
479
    session.commit()
480
 
481
    for line in old_lines:
557 chandransh 482
        flag = True
483
        for new_line in new_lines:
484
            if line.item_id == new_line.item_id:
485
                flag = False
5345 rajveer 486
 
576 chandransh 487
        if flag:
5345 rajveer 488
            line.cart_id = toCartId
489
        else:
490
            line.delete()
491
 
2019 varun.gupt 492
    if toCart.coupon_code is None:
493
        toCart.coupon_code = fromCart.coupon_code
494
 
495
    toCart.updated_on = datetime.datetime.now()
557 chandransh 496
    fromCart.expired_on = datetime.datetime.now()
497
    fromCart.cart_status = CartStatus.INACTIVE
643 chandransh 498
    session.commit()
691 chandransh 499
 
500
def check_out(cartId):
501
    if cartId is None:
502
        raise ShoppingCartException(101, "Cart id not specified")
716 rajveer 503
    cart = Cart.get_by(id = cartId)
691 chandransh 504
    if cart is None:
505
        raise ShoppingCartException(102, "The specified cart couldn't be found")
506
    cart.checked_out_on = datetime.datetime.now()
507
    session.commit()
508
    return True
509
 
510
def reset_cart(cartId, items):
511
    if cartId is None:
512
        raise ShoppingCartException(101, "Cart id not specified")
513
    for item_id, quantity in items.iteritems():
514
        line = Line.query.filter_by(cart_id=cartId, item_id=item_id).one()
515
        if line is not None:
3566 rajveer 516
            delete_discounts_for_line(line)
2261 varun.gupt 517
            line.discounted_price = None
691 chandransh 518
            line.quantity = line.quantity - quantity
519
            if line.quantity == 0:
520
                line.delete()
717 rajveer 521
    cart = Cart.get_by(id=cartId)
691 chandransh 522
    cart.updated_on = datetime.datetime.now()
1894 vikas 523
    cart.checked_out_on = None
1976 varun.gupt 524
 
525
    # Removing Coupon
526
    cart.total_price = None
527
    cart.discounted_price = None
528
    cart.coupon_code = None
529
 
691 chandransh 530
    session.commit()
766 rajveer 531
    return True
532
 
3386 varun.gupt 533
def get_carts_with_coupon_count(coupon_code):
534
    return Cart.query.filter_by(coupon_code = coupon_code).count()
4668 varun.gupt 535
 
536
def show_cod_option(cartId, sourceId, pincode):
537
    cart = Cart.get_by(id = cartId)
538
    cod_option = True
539
    logistics_client = LogisticsClient().get_client()
540
    if cart:
6355 amit.gupta 541
        if cart.coupon_code:
542
            promotion_client = PromotionClient().get_client()
543
            cod_option = promotion_client.isCodApplicable(cart.coupon_code)
5351 varun.gupt 544
 
6355 amit.gupta 545
        if cod_option and cart.lines:
4668 varun.gupt 546
            for line in cart.lines:
4866 rajveer 547
                logistics_info = logistics_client.getLogisticsEstimation(line.item_id, pincode, DeliveryType.PREPAID)
4871 rajveer 548
                if not logistics_info.codAllowed:
4668 varun.gupt 549
                    cod_option = False
550
                    break
7492 rajveer 551
            if cart.total_price > 60000 or cart.total_price <= 250:
5430 rajveer 552
                cod_option = False
4668 varun.gupt 553
    return cod_option
6821 amar.kumar 554
 
9791 rajveer 555
def get_products_added_to_cart(startDate, endDate):
556
    lines = session.query(Line.item_id).filter(Line.created_on > to_py_date(startDate)).filter(Line.created_on < to_py_date(endDate)).all()
9804 rajveer 557
    datas = []
558
    for line in lines:
559
        datas.append(line[0])
560
    return datas
6903 anupam.sin 561
 
11653 amit.gupta 562
def insure_item_common(cart, line, toInsure, insurerType):
6903 anupam.sin 563
    try:
564
        if toInsure:
6921 anupam.sin 565
            csc = CatalogClient().get_client()
566
            item = csc.getItem(itemId)
9299 kshitij.so 567
            insurerId = csc.getPrefferedInsurerForItem(itemId,insurerType)
568
            insuranceAmount = csc.getInsuranceAmount(itemId, line.discounted_price if line.discounted_price else line.actual_price, insurerId, line.quantity)
569
            if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DEVICE':
570
                if cart.discounted_price:
571
                    cart.discounted_price = cart.discounted_price - line.insuranceAmount + insuranceAmount
572
                line.insurer = insurerId
573
                line.insuranceAmount = insuranceAmount
574
            if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DATA':
575
                if cart.discounted_price:
576
                    cart.discounted_price = cart.discounted_price - line.dataProtectionAmount + insuranceAmount
577
                line.dataProtectionInsurer = insurerId
578
                line.dataProtectionAmount = insuranceAmount
6903 anupam.sin 579
            cart.total_price = cart.total_price + insuranceAmount
580
        else:
9299 kshitij.so 581
            if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DEVICE':
582
                cart.total_price = cart.total_price - line.insuranceAmount
583
                if cart.discounted_price:
584
                    cart.discounted_price = cart.discounted_price - line.insuranceAmount
585
                line.insurer = 0
586
                line.insuranceAmount = 0
587
            if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DATA':
588
                cart.total_price = cart.total_price - line.dataProtectionAmount
589
                if cart.discounted_price:
590
                    cart.discounted_price = cart.discounted_price - line.dataProtectionAmount
591
                line.dataProtectionInsurer = 0
592
                line.dataProtectionAmount = 0
6903 anupam.sin 593
        line.updated_on = datetime.datetime.now()
594
        cart.updated_on = datetime.datetime.now()
595
        session.commit()
596
    except:
597
        print("Error : Unable to insure")
9299 kshitij.so 598
        print("insurerId : " + str(insurerId) + " ItemId : " + str(itemId) + " CartId : " + str(cartId))
6903 anupam.sin 599
        return False
600
 
601
    return True
11653 amit.gupta 602
 
603
def insure_item(itemId, cartId, toInsure, insurerType):
604
    cart = Cart.get_by(id = cartId)
605
    line = None
606
    for cartLine in cart.lines:
607
        if(cartLine.item_id == itemId):
608
            line = cartLine
609
            break
610
 
611
    if not line:
612
        print("Error : No line found for cartId : " + cartId + " and itemId : " + itemId)
613
        return False
614
 
6903 anupam.sin 615
 
616
def cancel_insurance(cartId):
617
    try:
618
        cart = Cart.get_by(id = cartId)
619
        for cartLine in cart.lines:
620
            cart.total_price = cart.total_price - cartLine.insuranceAmount
621
            if cart.discounted_price:
622
                cart.discounted_price = cart.discounted_price - cartLine.insuranceAmount
623
            cartLine.insurer = 0
624
            cartLine.insuranceAmount = 0
625
            cartLine.updated_on = datetime.datetime.now()
626
        cart.updated_on = datetime.datetime.now()
627
        session.commit()
628
    except:
629
        print("Error : Unable to cancel insurance for cartId :" + str(cartId))
630
        return False
631
 
632
    return True
633
 
634
def store_insurance_specific_details(addressId, dob, guardianName):
635
    try:
636
        insuranceDetails = InsuranceDetails.get_by(addressId = addressId);
637
        if insuranceDetails is None :
638
            insuranceDetails = InsuranceDetails()
639
        insuranceDetails.addressId = addressId
640
        insuranceDetails.dob = dob
641
        insuranceDetails.guardianName = guardianName
642
        session.commit()
643
    except:
644
        print("Error : Unable to store insurance details for addressId : " + str(addressId))
645
        return False
646
    return True
647
 
648
def is_insurance_detail_present(addressId):
649
    try:
650
        insuranceDetails = InsuranceDetails.get_by(addressId = addressId);
651
        if insuranceDetails is None :
652
            return False
653
    except:
654
        print("Error : Unable to get insurance details for addressId : " + str(addressId))
655
        return False
656
    return True
657
 
11653 amit.gupta 658
def validate_cart_plus(cartId, source_id):
659
    inventory_client = CatalogClient().get_client()
660
    logistics_client = LogisticsClient().get_client()
661
    promotion_client = PromotionClient().get_client()
662
    retval = ""
663
    emival = ""
664
    # No need to validate duplicate items since there are only two ways
665
    # to add items to a cart and both of them check whether the item being
666
    # added is a duplicate of an already existing item.
667
    found_cart = cart = Cart.get_by(id=cartId)
668
    cart_lines = cart.lines
669
    customer_pincode = None
670
    current_time = datetime.datetime.now()
671
    if cart.pickupStoreId :
672
        store = logistics_client.getPickupStore(cart.pickupStoreId)
673
        customer_pincode = store.pin
674
    if cart.address_id != None and customer_pincode == None:
675
        address = Address.get_by(id=cart.address_id)
676
        customer_pincode = address.pin
677
    if not customer_pincode:
678
        user = User.get_by(active_cart_id = cartId)
679
        default_address_id = user.default_address_id
680
        if default_address_id:
681
            address = Address.get_by(id = default_address_id)
682
            customer_pincode = address.pin
683
    if not customer_pincode:
684
        #FIXME should not be hard coded. May be we can pick from config server.
685
        customer_pincode = "110001"
686
    cart.total_price = 0
687
    for line in cart_lines:
688
        old_estimate = line.estimate
689
        item_id = line.item_id
690
        item = inventory_client.getItemForSource(item_id, source_id)
691
        item_shipping_info = inventory_client.isActive(item_id) 
692
        if item_shipping_info.isActive:
693
            if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:
694
                line.quantity = 1
695
                retval = "Try adding a smaller quantity of " + item.brand + " " + item.modelNumber + " (" + item.color + ")"
696
 
697
            line.actual_price = item.sellingPrice 
698
            cart.total_price = cart.total_price + (line.actual_price * line.quantity)
699
            try:
700
                item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTime
701
            except LogisticsServiceException:
702
                item_delivery_estimate = -1
703
                #TODO Use the exception clause to set the retval appropriately
704
            except :
705
                item_delivery_estimate = -1
706
            if old_estimate != item_delivery_estimate:
707
                line.estimate = item_delivery_estimate
708
                cart.updated_on = current_time
709
        else:
710
            line.delete()
711
    if cart.checked_out_on is not None:
712
        if cart.updated_on > cart.checked_out_on:
713
            cart.checked_out_on = None
714
    session.commit()
715
 
716
    cart = Cart.get_by(id=cartId)
717
    cart_lines = cart.lines
718
    for line in cart_lines :
719
        if line.insurer > 0 :
720
            insure_item(line.item_id, cartId, True, InsurerType._NAMES_TO_VALUES.get("DEVICE"))
721
        if line.dataProtectionInsurer > 0:
722
            insure_item(line.item_id, cartId, True, InsurerType._NAMES_TO_VALUES.get("DATA"))
723
    if cart.coupon_code is not None:
724
        try:
725
            updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
726
            if updated_cart.message is not None:
727
                emival = updated_cart.message
728
        except PromotionException as ex:
729
            remove_coupon(cart.id)
730
            retval = ex.message
731
 
732
    return [retval, emival]
733
        found_cart = Cart.get_by(id=cartId)
11592 amit.gupta 734
        pincode = "110001"
11599 amit.gupta 735
        default_address_id = User.get_by(active_cart_id = cart_id).default_address_id
11598 amit.gupta 736
 
11592 amit.gupta 737
        default_address = None
738
        if found_cart.address_id is not None and found_cart.address_id > 0:
739
            pincode = Address.get_by(id=found_cart.address_id).pin
11600 amit.gupta 740
        elif default_address_id is not None:
11592 amit.gupta 741
            default_address = Address.get_by(id = default_address_id) 
742
            pincode = default_address.pin
743
 
11612 amit.gupta 744
        needInuranceInfo = False
11600 amit.gupta 745
        if default_address_id is not None:
746
            for line in found_cart.lines:
747
                if line.insurer > 0:
11611 amit.gupta 748
                    needInuranceInfo = not is_insurance_detail_present(default_address_id)
11600 amit.gupta 749
                    break
11592 amit.gupta 750
        cartPlus = CartPlus()
751
        cartPlus.cart = to_t_cart(found_cart)
752
        cartPlus.pinCode = pincode
753
        cartPlus.validateCartMessages = cart_messages
754
        cartPlus.needInsuranceInfo = needInuranceInfo
755
        return cartPlus
756
    finally:
757
        close_session()
758
 
766 rajveer 759
def close_session():
760
    if session.is_active:
761
        print "session is active. closing it."
6903 anupam.sin 762
        session.close()