Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
17803 amit.gupta 1
    '''
2
    Created on 10-May-2010
557 chandransh 3
 
17803 amit.gupta 4
    @author: ashish
5
    '''
6
    from elixir import *
7
    from shop2020.clients.CatalogClient import CatalogClient
8
    from shop2020.clients.InventoryClient import InventoryClient
9
    from shop2020.clients.LogisticsClient import LogisticsClient
10
    from shop2020.clients.PromotionClient import PromotionClient
11
    from shop2020.clients.TransactionClient import TransactionClient
12
    from shop2020.model.v1 import user
13
    from shop2020.model.v1.user.impl.Converters import to_t_cart, to_t_line
14
    from shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, User, \
15
        Discount, InsuranceDetails, PrivateDealUser
16
    from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException, \
17
        DeliveryType
18
    from shop2020.thriftpy.model.v1.catalog.ttypes import Item, InsurerType
19
    from shop2020.thriftpy.model.v1.order.ttypes import Transaction as TTransaction, \
20
        TransactionStatus as TTransactionStatus, Order as TOrder, LineItem as TLineItem, \
21
        OrderStatus, OrderSource
22
    from shop2020.thriftpy.model.v1.user.ttypes import CartStatus, LineStatus, \
23
        ShoppingCartException, PromotionException, CartPlus
24
    from shop2020.utils.Utils import to_py_date, to_java_date
25
    import datetime
26
    import json
27
    import math
28
    import traceback
557 chandransh 29
 
30
 
31
 
32
 
17803 amit.gupta 33
    def get_cart(userId):
34
        user = User.get_by(id=userId)
35
        return user.active_cart
3554 varun.gupt 36
 
17803 amit.gupta 37
    def get_cart_by_id(id):
38
        cart = Cart.get_by(id=id)
39
        return cart
3554 varun.gupt 40
 
17803 amit.gupta 41
    def create_cart():
42
        cart = Cart()
43
        cart.created_on = datetime.datetime.now()
44
        cart.updated_on = datetime.datetime.now()
45
        cart.cart_status = CartStatus.ACTIVE
46
        return cart
557 chandransh 47
 
17803 amit.gupta 48
    def get_carts_between(start_time, end_time, status):
49
        init_time = to_py_date(start_time)
50
        finish_time = to_py_date(end_time)
5555 rajveer 51
 
17803 amit.gupta 52
        query = Cart.query
53
        if status:
54
            query = query.filter(Cart.cart_status==status)
55
        if init_time:
56
            query = query.filter(Cart.created_on >= init_time)
57
        if finish_time:
58
            query = query.filter(Cart.created_on <= finish_time)
17470 manish.sha 59
 
17803 amit.gupta 60
        carts = query.all()
61
        return carts
576 chandransh 62
 
17803 amit.gupta 63
    def get_line(item_id, cart_id, status, single):
64
        #get cart first 
6318 rajveer 65
        try:
17803 amit.gupta 66
            found_cart = Cart.get_by(id=cart_id)
6318 rajveer 67
        except:
17803 amit.gupta 68
            raise ShoppingCartException(101, "cart not found ")
69
        query = Line.query.filter_by(cart = found_cart, item_id = item_id)
6318 rajveer 70
 
17803 amit.gupta 71
        if status:
72
            query = query.filter_by(line_status = status)
73
        else:
74
            query = query.filter_by(line_status = LineStatus.LINE_ACTIVE)
75
        try:
76
            if single:
77
                return query.one()
78
            else:
79
                return query.all()
80
        except:
81
            return None
6903 anupam.sin 82
 
17803 amit.gupta 83
    def add_item_to_cart(cart_id, item_id, quantity, sourceId):
84
        if not item_id:
85
            raise ShoppingCartException(101, "item_id cannot be null")
3554 varun.gupt 86
 
17803 amit.gupta 87
        if not quantity:
88
            raise ShoppingCartException(101, "quantity cannot be null")    
557 chandransh 89
 
17803 amit.gupta 90
        cart = Cart.get_by(id = cart_id)    
91
        if not cart:
92
            raise ShoppingCartException(101, "no cart attached to this id" + str(cart_id))
93
        retval = ""
94
        catalog_client = CatalogClient().get_client()
95
        item = catalog_client.getItemForSource(item_id, sourceId)
96
        dataProtectionInsurer = catalog_client.getPrefferedInsurerForItem(item_id,InsurerType._NAMES_TO_VALUES.get("DATA"))
97
        item_shipping_info = catalog_client.isActive(item_id)
98
        if not item_shipping_info.isActive:
99
            return catalog_client.getItemStatusDescription(item_id)
100
 
101
        current_time = datetime.datetime.now()
102
        cart.updated_on = current_time
103
        line = get_line(item_id, cart_id, None,True)
104
        if line:
105
            #change the quantity only
106
            line.insuranceAmount = (line.insuranceAmount/line.quantity) * quantity
107
            line.quantity = quantity
108
            line.updated_on = current_time
109
            line.dataProtectionAmount = (line.dataProtectionAmount/line.quantity) * quantity
110
        else:
111
            line = Line()
112
            line.cart = cart
113
            line.item_id = item_id
114
            line.quantity = quantity
115
            line.created_on = current_time
116
            line.updated_on = current_time
117
            line.actual_price = item.sellingPrice
118
            line.line_status = LineStatus.LINE_ACTIVE
119
            line.insurer = 0
120
            line.insuranceAmount = 0
121
            #DATA INSURER IS SET UPON ADD TO CART
122
            line.dataProtectionInsurer = dataProtectionInsurer
123
        session.commit()
124
        return retval
576 chandransh 125
 
17803 amit.gupta 126
    def delete_item_from_cart(cart_id, item_id):
127
        if not item_id:
128
            raise ShoppingCartException(101, "item_id cannot be null")
129
        cart = Cart.get_by(id = cart_id)
130
        if not cart:
131
            raise ShoppingCartException(101, "no cart attached to this id")
132
        item = get_line(item_id, cart_id, None, True)
133
        count_deleted_discounts = delete_discounts_for_line(item)
134
        item.delete()
135
        current_time = datetime.datetime.now()
136
        cart.updated_on = current_time
137
        session.commit()
576 chandransh 138
 
17803 amit.gupta 139
    def delete_discounts_for_line(item_line):
140
        count_deleted = Discount.query.filter_by(line = item_line).delete()
141
        session.commit()
142
        return count_deleted
1976 varun.gupt 143
 
17803 amit.gupta 144
    def delete_discounts_from_cart(cart_id, cart = None):
145
        if cart is None:
146
            if cart_id is None:
147
                raise ShoppingCartException(101, 'cart_id and cart, both cannot be null')
148
            else:
149
                cart = Cart.get_by(id = cart_id)
150
 
151
        if cart.lines:
152
            for line in cart.lines:
153
                delete_discounts_for_line(line)
576 chandransh 154
 
17803 amit.gupta 155
    def save_discounts(discounts):
156
        if not discounts:
157
            raise ShoppingCartException(101, 'discounts be null')
158
 
159
        if len(discounts) > 0:
160
            cart = Cart.get_by(id = discounts[0].cart_id)
161
 
162
            for t_discount in discounts:
163
                line = Line.query.filter_by(cart = cart, item_id = t_discount.item_id).first()
164
                if line is not None:
165
                    discount = Discount()
166
                    discount.line = line
167
                    discount.discount = t_discount.discount
168
                    discount.quantity = t_discount.quantity
169
                    session.commit()
170
 
171
    def add_address_to_cart(cart_id, address_id):
172
        if not cart_id:
173
            raise ShoppingCartException(101, "cart id cannot be made null")
174
 
175
        if not address_id:
176
            raise ShoppingCartException(101, "address id cannot be made null")
177
 
178
        cart = get_cart_by_id(cart_id)
179
        if not cart:
180
            raise ShoppingCartException(101, "no cart for this id")
181
 
182
        address = Address.get_by(id=address_id)
183
        if not address:
184
            raise ShoppingCartException(101, "No address for this id")
185
 
186
        cart.address_id = address_id
187
        current_time = datetime.datetime.now()
188
        #cart.updated_on = current_time
189
        session.commit()
576 chandransh 190
 
17803 amit.gupta 191
    def add_store_to_cart(cartId, storeId):
192
        if not cartId:
193
            raise ShoppingCartException(101, "cart id cannot be made null")
194
 
195
        cart = get_cart_by_id(cartId)
196
        if not cart:
197
            raise ShoppingCartException(101, "no cart for this id")
198
 
199
        if storeId:
200
            cart.pickupStoreId = storeId
201
        else:
202
            cart.pickupStoreId = None
203
 
204
        session.commit()
205
 
206
    def apply_coupon_to_cart(t_cart, coupon_code):
207
        cart = get_cart_by_id(t_cart.id)
208
        if not cart:
209
            raise ShoppingCartException(101, "no cart attached to this id")
210
        pc = PromotionClient().get_client()
211
        for t_line in t_cart.lines:
212
            line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()
213
            line.discounted_price = None
214
            if not pc.isGiftVoucher(coupon_code):
215
                line.discounted_price = t_line.discountedPrice
216
            #line.dealText = t_line.dealText
217
            #line.freebieId = t_line.freebieId
218
 
219
        cart.total_price = t_cart.totalPrice
220
        cart.discounted_price = t_cart.discountedPrice
221
        cart.coupon_code = coupon_code
222
        session.commit()
7190 amar.kumar 223
 
17803 amit.gupta 224
    def remove_coupon(cart_id):
225
        cart = get_cart_by_id(cart_id)
226
        if not cart:
227
            raise ShoppingCartException(101, "no cart attached to this id")
228
 
229
        #Resetting discounted price of each line in cart to Null
230
        for line in cart.lines:
231
            line.discounted_price = None
232
            line.dealText = None
233
            line.freebieId = None
234
 
235
        delete_discounts_from_cart(cart.id, cart=cart)
236
        cart.discounted_price = None
237
        cart.coupon_code = None
238
        session.commit()
239
 
240
    def commit_cart(cart_id, sessionSource, sessionTime, firstSource, firstSourceTime, userId, schemeId, orderSource):   
241
        cart = get_cart_by_id(cart_id)   
242
        #now we have a cart. Need to create a transaction with it
243
        totalCartVal = 0
244
        totalshippingCost = 0
245
        for lineObj in cart.lines:
246
            totalCartVal += lineObj.actual_price * lineObj.quantity
247
        txn = TTransaction()
248
        txn.shoppingCartid = cart_id
249
        txn.customer_id = userId
250
        txn.createdOn = to_java_date(datetime.datetime.now())
251
        txn.transactionStatus = TTransactionStatus.INIT
252
        txn.statusDescription = "New Order"
253
        txn.coupon_code = cart.coupon_code
254
        txn.sessionSource = sessionSource
255
        txn.sessionStartTime = sessionTime
256
        txn.firstSource = firstSource
257
        txn.firstSourceTime = firstSourceTime
258
        txn.emiSchemeId = schemeId
259
        privateDealUser = PrivateDealUser.query.filter(PrivateDealUser.id == userId).filter(PrivateDealUser.isActive==True).first()
260
        if privateDealUser is not None:
261
            if totalCartVal < 500:
262
                totalshippingCost = 100
263
            elif totalCartVal >=500 and totalCartVal<1000:
264
                totalshippingCost = 50
265
        txn.totalShippingCost = totalshippingCost
266
 
267
        txnOrders = create_orders(cart, userId, orderSource, totalshippingCost, totalCartVal)
268
        shippingCostInOrders = 0
269
        for order in txnOrders:
270
            shippingCostInOrders = shippingCostInOrders + order.shippingCost
271
 
272
        diff = totalshippingCost - shippingCostInOrders
273
        if diff > 0:
274
            txnOrders[0].shippingCost = txnOrders[0].shippingCost + diff
275
 
276
 
277
        txn.orders = txnOrders
278
 
279
        transaction_client = TransactionClient().get_client()
280
        txn_id = transaction_client.createTransaction(txn)
281
 
282
        privateDealUser = PrivateDealUser.query.filter(PrivateDealUser.id == userId).filter(PrivateDealUser.isActive==True).first()
283
        if privateDealUser is not None and privateDealUser.counter is not None:
284
            privateDealUser.counter.lastPurchasedOn = datetime.datetime.now()
285
        session.commit()
286
 
287
        return txn_id
11669 amit.gupta 288
 
17803 amit.gupta 289
    def create_orders(cart, userId, orderSource, totalshippingCost, totalCartVal):
290
        cart_lines = cart.lines
291
        orders = []
292
        isGv = False
293
        if cart.coupon_code:
294
            try:
295
                pc = PromotionClient().get_client()
296
                isGv = pc.isGiftVoucher(cart.coupon_code)
297
            except:
298
                isGv = False
299
 
300
        insuranceDetails = InsuranceDetails.get_by(addressId = cart.address_id)
576 chandransh 301
 
17803 amit.gupta 302
        for line in cart_lines:
303
            if line.line_status == LineStatus.LINE_ACTIVE:
304
                quantity_remaining_for_order = line.quantity
305
 
306
                for discount in line.discounts:
307
                    #i = 0
308
                    #while i < discount.quantity:
309
                    t_line_item = create_line_item(line, line.actual_price if isGv else (line.actual_price - discount.discount), line.quantity)
310
                    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, line.freebieId, totalshippingCost, totalCartVal)
311
                    orders.append(t_order)
312
                        #i += 1
313
                    quantity_remaining_for_order -= discount.quantity
314
 
315
                if quantity_remaining_for_order > 0:
316
                    t_line_item = create_line_item(line, line.actual_price, quantity_remaining_for_order)
317
                    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, line.freebieId, totalshippingCost, totalCartVal)
318
                    orders.append(t_order)
319
                '''
320
                i = 0
321
                while i < quantity_remaining_for_order:
322
                    t_line_item = create_line_item(line, line.actual_price)
323
                    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, line.freebieId)
324
                    orders.append(t_order)
325
                    i += 1
326
                '''
327
        return orders
1983 varun.gupt 328
 
17803 amit.gupta 329
    def create_order(userId, address_id, t_line_item, pickupStoreId, gvAmount, insurer, insuranceAmount, insuranceDetails, dataProtectionInsurer, dataProtectionAmount, orderSource, freebieId, totalshippingCost, totalCartVal):
330
        user = User.get_by(id=userId)
331
        address = Address.get_by(id=address_id)
332
        t_order = TOrder()
11915 amit.gupta 333
 
17803 amit.gupta 334
        t_order.customer_id = user.id
335
        t_order.customer_email = user.email
4312 rajveer 336
 
17803 amit.gupta 337
        t_order.customer_name = address.name
338
        t_order.customer_pincode = address.pin
339
        t_order.customer_address1 = address.line_1
340
        t_order.customer_address2 = address.line_2
341
        t_order.customer_city = address.city
342
        t_order.customer_state = address.state
343
        t_order.customer_mobilenumber = address.phone
344
 
345
        t_order.total_amount = t_line_item.total_price + insuranceAmount + dataProtectionAmount
346
        t_order.gvAmount = gvAmount
347
 
348
        t_order.total_weight = t_line_item.total_weight
349
        t_order.lineitems = [t_line_item]
350
 
351
        t_order.status = OrderStatus.PAYMENT_PENDING
352
        t_order.statusDescription = "Payment Pending"
353
        t_order.created_timestamp = to_java_date(datetime.datetime.now())
354
 
355
        t_order.pickupStoreId = pickupStoreId 
356
        t_order.insuranceAmount = insuranceAmount 
357
        t_order.insurer = insurer
358
        if insuranceDetails:
359
            t_order.dob = insuranceDetails.dob
360
            t_order.guardianName = insuranceDetails.guardianName
361
 
362
        catalog_client = CatalogClient().get_client()
363
 
364
        if freebieId is None:
365
            freebie_item_id = catalog_client.getFreebieForItem(t_line_item.item_id)
366
            if freebie_item_id:
367
                t_order.freebieItemId = freebie_item_id
368
        else:
369
            freebie_item_id = None if freebieId == 0 else freebieId  
370
        t_order.source = orderSource
371
        t_order.dataProtectionInsurer = dataProtectionInsurer
372
        t_order.dataProtectionAmount = dataProtectionAmount
373
        t_order.shippingCost = round((t_line_item.total_price*totalshippingCost)/totalCartVal, 0)
374
        return t_order
375
 
376
    def create_line_item(line, final_price, quantity=1):
377
        inventory_client = CatalogClient().get_client()
378
        item = inventory_client.getItem(line.item_id)
379
        t_line_item = TLineItem()
380
        t_line_item.productGroup = item.productGroup
381
        t_line_item.brand = item.brand
382
        t_line_item.model_number = item.modelNumber
383
        if item.color is None or item.color == "NA":
384
            t_line_item.color = ""
385
        else:
386
            t_line_item.color = item.color
387
        t_line_item.model_name = item.modelName
388
        t_line_item.extra_info = item.featureDescription
389
        t_line_item.item_id = item.id
390
        t_line_item.quantity = quantity
391
 
392
        t_line_item.unit_price = final_price
393
        t_line_item.total_price = final_price * quantity
394
 
395
        t_line_item.unit_weight = item.weight
396
        t_line_item.total_weight = item.weight if item.weight is None else item.weight * quantity
397
        if line.dealText is None:
398
            t_line_item.dealText = item.bestDealText
399
        elif line.dealText == '':
400
            t_line_item.dealText = None
401
        else:
402
            t_line_item.dealText = line.dealText
403
 
404
        if item.warrantyPeriod:
405
            #Computing Manufacturer Warranty expiry date
406
            today = datetime.date.today()
407
            expiry_year = today.year + int((today.month + item.warrantyPeriod) / 12)
408
            expiry_month = (today.month + item.warrantyPeriod) % 12
409
 
4295 varun.gupt 410
            try:
17803 amit.gupta 411
                expiry_date = datetime.datetime(expiry_year, expiry_month, today.day, 23, 59, 59, 999999)
4295 varun.gupt 412
            except ValueError:
4312 rajveer 413
                try:
17803 amit.gupta 414
                    expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 1), 23, 59, 59, 999999)
4312 rajveer 415
                except ValueError:
17803 amit.gupta 416
                    try:
417
                        expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 2), 23, 59, 59, 999999)
418
                    except ValueError:
419
                        expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 3), 23, 59, 59, 999999)
420
 
421
            t_line_item.warrantry_expiry_timestamp = to_java_date(expiry_date)
422
 
423
        return t_line_item
4312 rajveer 424
 
17803 amit.gupta 425
    def validate_cart(cartId, sourceId, couponCode):
426
        inventory_client = CatalogClient().get_client()
427
        logistics_client = LogisticsClient().get_client()
428
        promotion_client = PromotionClient().get_client()
429
        retval = ""
430
        emival = ""
431
        # No need to validate duplicate items since there are only two ways
432
        # to add items to a cart and both of them check whether the item being
433
        # added is a duplicate of an already existing item.
434
        cart = Cart.get_by(id=cartId)
435
        cart_lines = cart.lines
436
        customer_pincode = None
437
        current_time = datetime.datetime.now()
438
        if cart.pickupStoreId :
439
            store = logistics_client.getPickupStore(cart.pickupStoreId)
440
            customer_pincode = store.pin
441
        if cart.address_id != None and customer_pincode == None:
442
            address = Address.get_by(id=cart.address_id)
443
            customer_pincode = address.pin
444
 
445
        user = User.get_by(active_cart_id = cartId)
4312 rajveer 446
 
17803 amit.gupta 447
        dealItems = []
448
        privateDealUser = PrivateDealUser.get_by(id=user.id)    
449
        if privateDealUser is not None and privateDealUser.isActive:
450
            itemIds = [cartLine.item_id for cartLine in cart.lines]
451
            deals = inventory_client.getAllActivePrivateDeals(itemIds, 0)
452
            dealItems = deals.keys()
576 chandransh 453
 
17803 amit.gupta 454
        if not customer_pincode:
455
            default_address_id = user.default_address_id
456
            if default_address_id:
457
                address = Address.get_by(id = default_address_id)
458
                customer_pincode = address.pin
459
        if not customer_pincode:
460
            #FIXME should not be hard coded. May be we can pick from config server.
461
            customer_pincode = "110001"
462
        cart.total_price = 0
463
        for line in cart_lines:
464
            old_estimate = line.estimate
465
            item_id = line.item_id
466
            item = inventory_client.getItemForSource(item_id, sourceId)
467
 
468
            item_shipping_info = inventory_client.isActive(item_id) 
469
            if item_shipping_info.isActive:
470
                if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:
471
                    line.quantity = 1
472
                    retval = "Try adding a smaller quantity of " + item.brand + " " + item.modelNumber + " (" + item.color + ")"
473
 
474
                if item_id in dealItems:
475
                    line.actual_price = deals[item_id].dealPrice
476
                    if deals[item_id].dealTextOption==0:
477
                        line.dealText = ''
478
                    if deals[item_id].dealTextOption==2:
479
                        line.dealText =  deals[item_id].dealText
480
 
481
                    if deals[item_id].dealFreebieOption==0:
482
                        line.freebieId = 0
483
                    if deals[item_id].dealFreebieOption==2:
484
                        line.freebieId =  deals[item_id].dealFreebieItemId
13136 amit.gupta 485
 
17803 amit.gupta 486
                else:
487
                    line.actual_price = item.sellingPrice 
488
                    line.dealText = None
489
                    line.freebieId = None
490
                cart.total_price = cart.total_price + (line.actual_price * line.quantity)
491
                try:
492
                    item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTime
493
                except LogisticsServiceException:
494
                    item_delivery_estimate = -1
495
                    #TODO Use the exception clause to set the retval appropriately
496
                except :
497
                    item_delivery_estimate = -1
13136 amit.gupta 498
 
17803 amit.gupta 499
                if item_delivery_estimate !=-1:
500
                    inv_client = InventoryClient().get_client()
501
                    itemAvailability = None
12893 manish.sha 502
                    try:
17803 amit.gupta 503
                        itemAvailability = inv_client.getItemAvailabilityAtLocation(item_id, 1)
12893 manish.sha 504
                    except:
505
                        pass
12904 manish.sha 506
 
17803 amit.gupta 507
                    print 'itemAvailability billling Warehouse ', itemAvailability[2]
508
                    if itemAvailability is not None:
509
                        billingWarehouse = None
12893 manish.sha 510
                        try:
17803 amit.gupta 511
                            billingWarehouse = inv_client.getWarehouse(itemAvailability[2])
12893 manish.sha 512
                        except:
513
                            pass
17803 amit.gupta 514
 
515
                        print 'billingWarehouse Id Location ', billingWarehouse.stateId
516
                        if billingWarehouse is not None:
517
                            estimateVal = None
518
                            if not logistics_client.isAlive() :
519
                                logistics_client = LogisticsClient().get_client()
520
                            try:
521
                                estimateVal = logistics_client.getFirstDeliveryEstimateForWhLocation(customer_pincode, billingWarehouse.stateId)
522
                                if estimateVal ==-1:
523
                                    item_delivery_estimate =-1
524
                            except:
525
                                pass
526
                            print 'estimateVal Value ', estimateVal
527
                if old_estimate != item_delivery_estimate:
528
                    line.estimate = item_delivery_estimate
529
                    cart.updated_on = current_time
530
            else:
531
                Discount.query.filter(Discount.line==line).delete()
532
                line.delete()
533
        if cart.checked_out_on is not None:
534
            if cart.updated_on > cart.checked_out_on:
535
                cart.checked_out_on = None
536
        session.commit()
537
 
538
        if cart.coupon_code is not None:
539
            try:
540
                updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
541
                if updated_cart.message is not None:
542
                    emival = updated_cart.message
543
            except PromotionException as ex:
544
                remove_coupon(cart.id)
545
                #retval = ex.message
546
        session.commit()
547
 
548
        cart = Cart.get_by(id=cartId)
549
        cart_lines = cart.lines
550
        map_lines = {}
551
 
552
        insurerFlag = False
553
        for line in cart_lines:
554
            if line.insurer > 0 or line.dataProtectionInsurer > 0:
555
                line_map = {}
556
                line_map['insurer'] = line.insurer
557
                line_map['dpinsurer'] = line.dataProtectionInsurer
558
                line_map['amount'] = line.discounted_price if line.discounted_price else line.actual_price
559
                line_map['quantity'] = line.quantity
560
                insurerFlag = True
561
                map_lines[line.item_id] = line_map
562
 
563
        if insurerFlag:
564
            map_lines = inventory_client.checkServices(map_lines)
565
            for line in cart_lines :
566
                if map_lines.has_key(line.item_id):
567
                    line_map = map_lines[line.item_id]
568
                    if line_map['insurer'] > 0:
569
                        if cart.discounted_price:
570
                            cart.discounted_price = cart.discounted_price + line_map['insureramount']
571
                        line.insurer = line_map['insurer']
572
                        line.insuranceAmount = line_map['insureramount']
573
                        cart.total_price = cart.total_price + line_map['insureramount']
574
                    if line_map['dpinsurer'] > 0:
575
                        if cart.discounted_price:
576
                            cart.discounted_price = cart.discounted_price + line_map['dpinsureramount']
577
                        line.dataProtectionInsurer = line_map['dpinsurer']
578
                        line.dataProtectionAmount = line_map['dpinsureramount']
579
                        cart.total_price = cart.total_price + line_map['dpinsureramount']
580
                    line.updated_on = datetime.datetime.now()
581
            cart.updated_on = datetime.datetime.now()
582
            session.commit()
583
        session.close()
584
        return [retval, emival]
1976 varun.gupt 585
 
17803 amit.gupta 586
    def merge_cart(fromCartId, toCartId):
587
        fromCart = Cart.get_by(id=fromCartId)
588
        toCart = Cart.get_by(id=toCartId)
589
 
590
        old_lines = fromCart.lines
591
        new_lines = toCart.lines
592
 
593
        for line in old_lines:
594
            for discount in line.discounts:
595
                discount.delete()
596
        session.commit()
597
 
598
        for line in old_lines:
599
            flag = True
600
            for new_line in new_lines:
601
                if line.item_id == new_line.item_id:
602
                    flag = False
603
 
604
            if flag:
605
                line.cart_id = toCartId
606
            else:
607
                line.delete()
608
 
609
        if toCart.coupon_code is None:
610
            toCart.coupon_code = fromCart.coupon_code
611
 
612
        toCart.updated_on = datetime.datetime.now()
613
        fromCart.expired_on = datetime.datetime.now()
614
        fromCart.cart_status = CartStatus.INACTIVE
615
        session.commit()
13136 amit.gupta 616
 
17803 amit.gupta 617
    def check_out(cartId):
618
        if cartId is None:
619
            raise ShoppingCartException(101, "Cart id not specified")
620
        cart = Cart.get_by(id = cartId)
621
        if cart is None:
622
            raise ShoppingCartException(102, "The specified cart couldn't be found")
623
        cart.checked_out_on = datetime.datetime.now()
624
        session.commit()
625
        return True
13136 amit.gupta 626
 
17803 amit.gupta 627
    def reset_cart(cartId, items):
628
        if cartId is None:
629
            raise ShoppingCartException(101, "Cart id not specified")
630
        for item_id, quantity in items.iteritems():
631
            line = Line.query.filter_by(cart_id=cartId, item_id=item_id).one()
632
            if line is not None:
633
                delete_discounts_for_line(line)
634
                line.discounted_price = None
635
                line.quantity = line.quantity - quantity
636
                if line.quantity == 0:
637
                    line.delete()
638
        cart = Cart.get_by(id=cartId)
639
        cart.updated_on = datetime.datetime.now()
640
        cart.checked_out_on = None
13136 amit.gupta 641
 
17803 amit.gupta 642
        # Removing Coupon
643
        cart.total_price = None
644
        cart.discounted_price = None
645
        cart.coupon_code = None
646
 
13142 amit.gupta 647
        session.commit()
17803 amit.gupta 648
        return True
557 chandransh 649
 
17803 amit.gupta 650
    def get_carts_with_coupon_count(coupon_code):
651
        return Cart.query.filter_by(coupon_code = coupon_code).count()
557 chandransh 652
 
17803 amit.gupta 653
    def show_cod_option(cartId, sourceId, pincode):
654
        cart = Cart.get_by(id = cartId)
655
        cod_option = True
656
        logistics_client = LogisticsClient().get_client()
657
        if cart:
658
            if cart.coupon_code:
659
                promotion_client = PromotionClient().get_client()
660
                cod_option = promotion_client.isCodApplicable(to_t_cart(cart))
5345 rajveer 661
 
17803 amit.gupta 662
            if cod_option and cart.lines:
663
                for line in cart.lines:
664
                    logistics_info = logistics_client.getLogisticsEstimation(line.item_id, pincode, DeliveryType.PREPAID)
665
                    if not logistics_info.codAllowed:
666
                        cod_option = False
667
                        break
668
                if cart.total_price > 60000:# or cart.total_price <= 250:
669
                    cod_option = False
670
        return cod_option
2019 varun.gupt 671
 
17803 amit.gupta 672
    def get_products_added_to_cart(startDate, endDate):
673
        lines = session.query(Line.item_id).filter(Line.created_on > to_py_date(startDate)).filter(Line.created_on < to_py_date(endDate)).all()
674
        datas = []
675
        for line in lines:
676
            datas.append(line[0])
677
        return datas
1976 varun.gupt 678
 
17803 amit.gupta 679
    def insure_item(itemId, cartId, toInsure, insurerType):
680
        cart = Cart.get_by(id = cartId)
681
        line = None
682
        for cartLine in cart.lines:
683
            if(cartLine.item_id == itemId):
684
                line = cartLine
685
                break
686
 
687
        if not line:
688
            print("Error : No line found for cartId : " + cartId + " and itemId : " + itemId)
689
            return False
5351 varun.gupt 690
 
17803 amit.gupta 691
        try:
692
            if toInsure:
693
                csc = CatalogClient().get_client()
694
                item = csc.getItem(itemId)
695
                insurerId = csc.getPrefferedInsurerForItem(itemId,insurerType)
696
                insuranceAmount = csc.getInsuranceAmount(itemId, line.discounted_price if line.discounted_price else line.actual_price, insurerId, line.quantity)
697
                if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DEVICE':
698
                    if cart.discounted_price:
699
                        cart.discounted_price = cart.discounted_price - line.insuranceAmount + insuranceAmount
700
                    line.insurer = insurerId
701
                    line.insuranceAmount = insuranceAmount
702
                if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DATA':
703
                    if cart.discounted_price:
704
                        cart.discounted_price = cart.discounted_price - line.dataProtectionAmount + insuranceAmount
705
                    line.dataProtectionInsurer = insurerId
706
                    line.dataProtectionAmount = insuranceAmount
707
                cart.total_price = cart.total_price + insuranceAmount
708
            else:
709
                if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DEVICE':
710
                    cart.total_price = cart.total_price - line.insuranceAmount
711
                    if cart.discounted_price:
712
                        cart.discounted_price = cart.discounted_price - line.insuranceAmount
713
                    line.insurer = 0
714
                    line.insuranceAmount = 0
715
                if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DATA':
716
                    cart.total_price = cart.total_price - line.dataProtectionAmount
717
                    if cart.discounted_price:
718
                        cart.discounted_price = cart.discounted_price - line.dataProtectionAmount
719
                    line.dataProtectionInsurer = 0
720
                    line.dataProtectionAmount = 0
721
            line.updated_on = datetime.datetime.now()
722
            cart.updated_on = datetime.datetime.now()
723
            session.commit()
724
        except:
725
            print("Error : Unable to insure")
726
            print("insurerId : " + str(insurerId) + " ItemId : " + str(itemId) + " CartId : " + str(cartId))
727
            return False
11655 amit.gupta 728
 
17803 amit.gupta 729
        return True
11655 amit.gupta 730
 
17803 amit.gupta 731
    def cancel_insurance(cartId):
732
        try:
733
            cart = Cart.get_by(id = cartId)
734
            for cartLine in cart.lines:
735
                cart.total_price = cart.total_price - cartLine.insuranceAmount
9299 kshitij.so 736
                if cart.discounted_price:
17803 amit.gupta 737
                    cart.discounted_price = cart.discounted_price - cartLine.insuranceAmount
738
                cartLine.insurer = 0
739
                cartLine.insuranceAmount = 0
740
                cartLine.updated_on = datetime.datetime.now()
741
            cart.updated_on = datetime.datetime.now()
742
            session.commit()
743
        except:
744
            print("Error : Unable to cancel insurance for cartId :" + str(cartId))
745
            return False
746
 
747
        return True
6903 anupam.sin 748
 
17803 amit.gupta 749
    def store_insurance_specific_details(addressId, dob, guardianName):
750
        try:
751
            insuranceDetails = InsuranceDetails.get_by(addressId = addressId);
752
            if insuranceDetails is None :
753
                insuranceDetails = InsuranceDetails()
754
            insuranceDetails.addressId = addressId
755
            insuranceDetails.dob = dob
756
            insuranceDetails.guardianName = guardianName
757
            session.commit()
758
        except:
759
            print("Error : Unable to store insurance details for addressId : " + str(addressId))
760
            return False
761
        return True
6903 anupam.sin 762
 
17803 amit.gupta 763
    def is_insurance_detail_present(addressId):
764
        try:
765
            insuranceDetails = InsuranceDetails.get_by(addressId = addressId);
766
            if insuranceDetails is None :
767
                return False
768
        except:
769
            print("Error : Unable to get insurance details for addressId : " + str(addressId))
6903 anupam.sin 770
            return False
17782 amit.gupta 771
        return True
772
 
773
 
17803 amit.gupta 774
    def add_items_to_cart(cartId, itemQty, couponCode=None):
775
        try: 
776
            found_cart = Cart.get_by(id=cartId)
777
            itemQtyMap = {}
778
            current_time = datetime.datetime.now()
779
            for itemqty in itemQty:
780
                itemQtyMap[itemqty.itemId] = itemqty.qty 
17811 amit.gupta 781
            if found_cart.lines:    
782
                for line in found_cart.lines:
783
                    if itemQtyMap.has_key(line.item_id):
784
                        line.delete()
17803 amit.gupta 785
            for itemId,qty in itemQtyMap.iteritems():
786
                #This condition will ensure that cart is only persisted with non-zero quantities.
787
                if qty==0:
788
                    continue
789
                line = Line()
790
                line.cart = found_cart
791
                line.item_id = itemId
792
                line.quantity = qty
793
                line.created_on = current_time
794
                line.updated_on = current_time
795
                line.line_status = LineStatus.LINE_ACTIVE
796
                line.insurer = 0
797
                line.insuranceAmount = 0
798
            if couponCode:
799
                found_cart.coupon_code = couponCode
800
            else:
801
                found_cart.coupon_code = None
802
            session.commit()
803
            return True
804
        except:
805
            traceback.print_exc()
806
            return False
807
 
808
 
809
    def valiate_cart_new(cartId, customer_pincode, sourceId):
810
 
811
        inventory_client = CatalogClient().get_client()
812
        logistics_client = LogisticsClient().get_client()
813
        promotion_client = PromotionClient().get_client()
814
        # No need to validate duplicate items since there are only two ways
815
        # to add items to a cart and both of them check whether the item being
816
        # added is a duplicate of an already existing item.
817
        cart = Cart.get_by(id=cartId)
818
        cart_lines = cart.lines
819
        current_time = datetime.datetime.now()
17782 amit.gupta 820
 
17803 amit.gupta 821
        user = User.get_by(active_cart_id = cartId)
822
        responseMap = {}
823
        totalQty = 0
824
        totalAmount = 0 
825
        shippingCharges=0
826
        cartMessages=[]
827
        cartItems = []
828
        dealItems = []
829
 
830
        responseMap['shippingCharges']= shippingCharges
831
        responseMap['cartMessages']= cartMessages
832
        responseMap['cartItems']= cartItems
833
        responseMap['pincode']= customer_pincode
17789 amit.gupta 834
 
17803 amit.gupta 835
        privateDealUser = PrivateDealUser.get_by(id=user.id)    
836
        itemIds = [cartLine.item_id for cartLine in cart.lines]
837
        if privateDealUser is not None and privateDealUser.isActive:
838
            deals = inventory_client.getAllActivePrivateDeals(itemIds, 0)
839
            dealItems = deals.keys()
17789 amit.gupta 840
 
17803 amit.gupta 841
        cart.total_price = 0
842
        itemsMap = inventory_client.getItems(itemIds)
17782 amit.gupta 843
 
17803 amit.gupta 844
        cartMessageChanged = 0
845
        cartMessageOOS = 0
846
        cartMessageUndeliverable = 0
17782 amit.gupta 847
 
17803 amit.gupta 848
        for line in cart_lines:
849
            cartItem={}
17782 amit.gupta 850
 
17803 amit.gupta 851
            old_estimate = line.estimate
852
            item_id = line.item_id
853
            item = itemsMap.get(item_id)
854
            cartItem['itemId']=line.item_id
855
            cartItem['quantity']=0
856
            cartItem['color'] = item.color
857
            cartItem['catalogItemId'] = item.catalogItemId
17782 amit.gupta 858
 
17803 amit.gupta 859
            item_shipping_info = inventory_client.isActive(item_id) 
860
            if item_shipping_info.isActive:
861
                if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:
862
                    line.quantity = item_shipping_info.quantity
863
                    cartMessageChanged += 1
864
                    cartItemMessages.append({"type":"danger", "messageText":"Only " + str(item_shipping_info.quantity) + " available"})
17782 amit.gupta 865
 
17803 amit.gupta 866
                cartItem['maxQuantity'] = min(item_shipping_info.quantity, 20)
867
 
868
                if item_id in dealItems:
869
                    line.actual_price = deals[item_id].dealPrice
870
                    if deals[item_id].dealTextOption==0:
871
                        line.dealText = ''
872
                    if deals[item_id].dealTextOption==2:
873
                        line.dealText = deals[item_id].dealText
874
 
875
                    if deals[item_id].dealFreebieOption==0:
876
                        line.freebieId = 0
877
                    if deals[item_id].dealFreebieOption==2:
878
                        line.freebieId =  deals[item_id].dealFreebieItemId
879
                    cartItem['dealText'] = line.dealText
880
                else:
881
                    line.actual_price = item.sellingPrice
882
                    if item.bestDealText:
883
                        cartItem['dealText'] = item.bestDealText
884
                    line.dealText = None
885
                    line.freebieId = None
886
                cartItem['sellingPrice'] = line.actual_price
887
                cartItem['quantity'] = line.quantity
888
                cart.total_price = cart.total_price + (line.actual_price * line.quantity)
17782 amit.gupta 889
                try:
17803 amit.gupta 890
                    item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTime
891
                except LogisticsServiceException:
892
                    item_delivery_estimate = -1
893
                    #TODO Use the exception clause to set the retval appropriately
894
                except :
895
                    item_delivery_estimate = -1
896
 
897
                if item_delivery_estimate !=-1:
898
                    inv_client = InventoryClient().get_client()
899
                    itemAvailability = None
17782 amit.gupta 900
                    try:
17803 amit.gupta 901
                        itemAvailability = inv_client.getItemAvailabilityAtLocation(item_id, 1)
17782 amit.gupta 902
                    except:
903
                        pass
904
 
17803 amit.gupta 905
                    print 'itemAvailability billling Warehouse ', itemAvailability[2]
906
                    if itemAvailability is not None:
907
                        billingWarehouse = None
17782 amit.gupta 908
                        try:
17803 amit.gupta 909
                            billingWarehouse = inv_client.getWarehouse(itemAvailability[2])
17782 amit.gupta 910
                        except:
911
                            pass
17803 amit.gupta 912
 
913
                        print 'billingWarehouse Id Location ', billingWarehouse.stateId
914
                        if billingWarehouse is not None:
915
                            estimateVal = None
916
                            if not logistics_client.isAlive() :
917
                                logistics_client = LogisticsClient().get_client()
918
                            try:
919
                                estimateVal = logistics_client.getFirstDeliveryEstimateForWhLocation(customer_pincode, billingWarehouse.stateId)
920
                                if estimateVal ==-1:
921
                                    item_delivery_estimate =-1
922
                            except:
923
                                pass
924
                            print 'estimateVal Value ', estimateVal
925
                cartItem['estimate'] = item_delivery_estimate
926
                if item_delivery_estimate == -1:
927
                    cartItem['quantity'] = 0
928
                    cartMessageUndeliverable += 1
929
                    cartItemMessages.append({"type":"danget", "messageText":"Undeliverable"})
930
                if old_estimate != item_delivery_estimate:
931
                    line.estimate = item_delivery_estimate
932
                    cart.updated_on = current_time
933
            else:
17782 amit.gupta 934
                cartItem['quantity'] = 0
17803 amit.gupta 935
                cartMessageOOS += 1
936
                cartItemMessages.append({"type":"danger", "messageText":"Out of Stock"})
937
                Discount.query.filter(Discount.line==line).delete()
938
                line.delete()
939
            totalQty += cartItem['quantity']
940
            totalAmount += line.actual_price * cartItem['quantity']
941
            if cartItemMessages:
942
                cartItems.insert(0, cartItem)
943
            else:
944
                cartItems.append(cartItem)
945
        if cart.checked_out_on is not None:
946
            if cart.updated_on > cart.checked_out_on:
947
                cart.checked_out_on = None
948
        session.commit()
17782 amit.gupta 949
 
17803 amit.gupta 950
        if cart.coupon_code is not None:
951
            try:
952
                updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
953
                if updated_cart.message is not None:
954
                    emival = updated_cart.message
955
            except PromotionException as ex:
956
                remove_coupon(cart.id)
957
                #retval = ex.message
17782 amit.gupta 958
        session.commit()
11598 amit.gupta 959
 
17803 amit.gupta 960
        cart = Cart.get_by(id=cartId)
961
        cart_lines = cart.lines
962
        insurerFlag = False
963
        for line in cart_lines:
964
            if line.insurer > 0 or line.dataProtectionInsurer > 0:
965
                line.insurer = 0
966
                line.insuranceAmount = 0 
967
                line.dataProtectionInsurer = 0
968
                line.dataProtectionAmount = 0
969
                insurerFlag = True
970
 
971
        if insurerFlag:
972
            cart.updated_on = datetime.datetime.now()
973
            session.commit()
974
        session.close()
975
        responseMap['totalQty']= totalQty
976
        responseMap['totalAmount']= totalAmount
977
        if totalAmount < 500:
978
            shippingCharges = 100
979
        elif totalAmount < 1000:
980
            shippingCharges = 50
981
        responseMap['shippingCharge']=shippingCharges
982
        responseMap['cartMessageChanged'] = cartMessageChanged
983
        responseMap['cartMessageOOS'] = cartMessageOOS
984
        responseMap['cartMessageUndeliverable'] = cartMessageUndeliverable
985
        return json.dumps(responseMap)
11592 amit.gupta 986
 
17803 amit.gupta 987
 
988
    def validate_cart_plus(cart_id, source_id, couponCode):
989
        try:
990
            cart_messages = validate_cart(cart_id, source_id, couponCode)
991
            found_cart = Cart.get_by(id=cart_id)
992
            pincode = "110001"
993
            default_address_id = User.get_by(active_cart_id = cart_id).default_address_id
994
 
995
            default_address = None
996
            if found_cart.address_id is not None and found_cart.address_id > 0:
997
                pincode = Address.get_by(id=found_cart.address_id).pin
998
            elif default_address_id is not None:
999
                default_address = Address.get_by(id = default_address_id) 
1000
                pincode = default_address.pin
1001
 
1002
            needInuranceInfo = False
1003
            if default_address_id is not None:
1004
                for line in found_cart.lines:
1005
                    if line.insurer > 0:
1006
                        needInuranceInfo = not is_insurance_detail_present(default_address_id)
1007
                        break
1008
            cartPlus = CartPlus()
1009
            cartPlus.cart = to_t_cart(found_cart)
1010
            cartPlus.pinCode = pincode
1011
            cartPlus.validateCartMessages = cart_messages
1012
            cartPlus.needInsuranceInfo = needInuranceInfo
1013
            return cartPlus
1014
        finally:
1015
            close_session()
1016
 
1017
    def close_session():
1018
        if session.is_active:
1019
            print "session is active. closing it."
1020
            session.close()