Subversion Repositories SmartDukaan

Rev

Rev 17782 | Rev 17789 | 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
13136 amit.gupta 8
from shop2020.clients.InventoryClient import InventoryClient
6921 anupam.sin 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
13136 amit.gupta 13
from shop2020.model.v1.user.impl.Converters import to_t_cart, to_t_line
6921 anupam.sin 14
from shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, User, \
11980 amit.gupta 15
    Discount, InsuranceDetails, PrivateDealUser
6921 anupam.sin 16
from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException, \
17
    DeliveryType
9299 kshitij.so 18
from shop2020.thriftpy.model.v1.catalog.ttypes import Item, InsurerType
6921 anupam.sin 19
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as TTransaction, \
20
    TransactionStatus as TTransactionStatus, Order as TOrder, LineItem as TLineItem, \
7504 rajveer 21
    OrderStatus, OrderSource
6921 anupam.sin 22
from shop2020.thriftpy.model.v1.user.ttypes import CartStatus, LineStatus, \
11592 amit.gupta 23
    ShoppingCartException, PromotionException, CartPlus
6921 anupam.sin 24
from shop2020.utils.Utils import to_py_date, to_java_date
557 chandransh 25
import datetime
17782 amit.gupta 26
import json
17470 manish.sha 27
import math
17782 amit.gupta 28
import traceback
557 chandransh 29
 
30
 
576 chandransh 31
 
32
 
5326 rajveer 33
def get_cart(userId):
34
    user = User.get_by(id=userId)
35
    return user.active_cart
557 chandransh 36
 
37
def get_cart_by_id(id):
38
    cart = Cart.get_by(id=id)
39
    return cart
40
 
5326 rajveer 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
557 chandransh 46
    return cart
47
 
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)
51
 
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)
59
 
60
    carts = query.all()
61
    return carts
62
 
643 chandransh 63
def get_line(item_id, cart_id, status, single):
557 chandransh 64
    #get cart first 
65
    try:
66
        found_cart = Cart.get_by(id=cart_id)
67
    except:
68
        raise ShoppingCartException(101, "cart not found ")
643 chandransh 69
    query = Line.query.filter_by(cart = found_cart, item_id = item_id)
557 chandransh 70
 
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
82
 
3557 rajveer 83
def add_item_to_cart(cart_id, item_id, quantity, sourceId):
557 chandransh 84
    if not item_id:
85
        raise ShoppingCartException(101, "item_id cannot be null")
86
 
87
    if not quantity:
88
        raise ShoppingCartException(101, "quantity cannot be null")    
643 chandransh 89
 
2983 chandransh 90
    cart = Cart.get_by(id = cart_id)    
557 chandransh 91
    if not cart:
6502 rajveer 92
        raise ShoppingCartException(101, "no cart attached to this id" + str(cart_id))
2983 chandransh 93
    retval = ""
6550 rajveer 94
    catalog_client = CatalogClient().get_client()
95
    item = catalog_client.getItemForSource(item_id, sourceId)
9299 kshitij.so 96
    dataProtectionInsurer = catalog_client.getPrefferedInsurerForItem(item_id,InsurerType._NAMES_TO_VALUES.get("DATA"))
6550 rajveer 97
    item_shipping_info = catalog_client.isActive(item_id)
2983 chandransh 98
    if not item_shipping_info.isActive:
6550 rajveer 99
        return catalog_client.getItemStatusDescription(item_id)
557 chandransh 100
 
643 chandransh 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
6903 anupam.sin 106
        line.insuranceAmount = (line.insuranceAmount/line.quantity) * quantity
643 chandransh 107
        line.quantity = quantity
685 chandransh 108
        line.updated_on = current_time
9299 kshitij.so 109
        line.dataProtectionAmount = (line.dataProtectionAmount/line.quantity) * quantity
643 chandransh 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
3557 rajveer 117
        line.actual_price = item.sellingPrice
643 chandransh 118
        line.line_status = LineStatus.LINE_ACTIVE
6903 anupam.sin 119
        line.insurer = 0
120
        line.insuranceAmount = 0
9299 kshitij.so 121
        #DATA INSURER IS SET UPON ADD TO CART
122
        line.dataProtectionInsurer = dataProtectionInsurer
557 chandransh 123
    session.commit()
2983 chandransh 124
    return retval
557 chandransh 125
 
126
def delete_item_from_cart(cart_id, item_id):
127
    if not item_id:
128
        raise ShoppingCartException(101, "item_id cannot be null")
685 chandransh 129
    cart = Cart.get_by(id = cart_id)
130
    if not cart:
131
        raise ShoppingCartException(101, "no cart attached to this id")
643 chandransh 132
    item = get_line(item_id, cart_id, None, True)
3554 varun.gupt 133
    count_deleted_discounts = delete_discounts_for_line(item)
557 chandransh 134
    item.delete()
685 chandransh 135
    current_time = datetime.datetime.now()
136
    cart.updated_on = current_time
557 chandransh 137
    session.commit()
138
 
3554 varun.gupt 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
143
 
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)
154
 
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
 
557 chandransh 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")
576 chandransh 181
 
182
    address = Address.get_by(id=address_id)
183
    if not address:
184
        raise ShoppingCartException(101, "No address for this id")
185
 
557 chandransh 186
    cart.address_id = address_id
685 chandransh 187
    current_time = datetime.datetime.now()
716 rajveer 188
    #cart.updated_on = current_time
557 chandransh 189
    session.commit()
5555 rajveer 190
 
191
def add_store_to_cart(cartId, storeId):
192
    if not cartId:
193
        raise ShoppingCartException(101, "cart id cannot be made null")
557 chandransh 194
 
5555 rajveer 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
 
6922 anupam.sin 206
def apply_coupon_to_cart(t_cart, coupon_code):
207
    cart = get_cart_by_id(t_cart.id)
1976 varun.gupt 208
    if not cart:
209
        raise ShoppingCartException(101, "no cart attached to this id")
6922 anupam.sin 210
    pc = PromotionClient().get_client()
11853 amit.gupta 211
    for t_line in t_cart.lines:
212
        line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()
13136 amit.gupta 213
        line.discounted_price = None
11853 amit.gupta 214
        if not pc.isGiftVoucher(coupon_code):
6922 anupam.sin 215
            line.discounted_price = t_line.discountedPrice
13136 amit.gupta 216
        #line.dealText = t_line.dealText
217
        #line.freebieId = t_line.freebieId
6922 anupam.sin 218
 
219
    cart.total_price = t_cart.totalPrice
220
    cart.discounted_price = t_cart.discountedPrice
12055 amit.gupta 221
    cart.coupon_code = coupon_code
1976 varun.gupt 222
    session.commit()
223
 
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")
2261 varun.gupt 228
 
229
    #Resetting discounted price of each line in cart to Null
230
    for line in cart.lines:
231
        line.discounted_price = None
11653 amit.gupta 232
        line.dealText = None
233
        line.freebieId = None
2261 varun.gupt 234
 
3619 chandransh 235
    delete_discounts_from_cart(cart.id, cart=cart)
1976 varun.gupt 236
    cart.discounted_price = None
237
    cart.coupon_code = None
238
    session.commit()
239
 
11526 amit.gupta 240
def commit_cart(cart_id, sessionSource, sessionTime, firstSource, firstSourceTime, userId, schemeId, orderSource):   
690 chandransh 241
    cart = get_cart_by_id(cart_id)   
557 chandransh 242
    #now we have a cart. Need to create a transaction with it
17470 manish.sha 243
    totalCartVal = 0
244
    totalshippingCost = 0
245
    for lineObj in cart.lines:
246
        totalCartVal += lineObj.actual_price * lineObj.quantity
576 chandransh 247
    txn = TTransaction()
248
    txn.shoppingCartid = cart_id
5326 rajveer 249
    txn.customer_id = userId
576 chandransh 250
    txn.createdOn = to_java_date(datetime.datetime.now())
251
    txn.transactionStatus = TTransactionStatus.INIT
252
    txn.statusDescription = "New Order"
2219 varun.gupt 253
    txn.coupon_code = cart.coupon_code
2815 vikas 254
    txn.sessionSource = sessionSource
255
    txn.sessionStartTime = sessionTime
3858 vikas 256
    txn.firstSource = firstSource
257
    txn.firstSourceTime = firstSourceTime
6389 rajveer 258
    txn.emiSchemeId = schemeId
17470 manish.sha 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
576 chandransh 271
 
17470 manish.sha 272
    diff = totalshippingCost - shippingCostInOrders
273
    if diff > 0:
274
        txnOrders[0].shippingCost = txnOrders[0].shippingCost + diff
275
 
276
 
277
    txn.orders = txnOrders
278
 
576 chandransh 279
    transaction_client = TransactionClient().get_client()
280
    txn_id = transaction_client.createTransaction(txn)
12743 amit.gupta 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()
576 chandransh 285
    session.commit()
286
 
287
    return txn_id
288
 
17470 manish.sha 289
def create_orders(cart, userId, orderSource, totalshippingCost, totalCartVal):
557 chandransh 290
    cart_lines = cart.lines
576 chandransh 291
    orders = []
6318 rajveer 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
 
6903 anupam.sin 300
    insuranceDetails = InsuranceDetails.get_by(addressId = cart.address_id)
301
 
557 chandransh 302
    for line in cart_lines:
576 chandransh 303
        if line.line_status == LineStatus.LINE_ACTIVE:
3554 varun.gupt 304
            quantity_remaining_for_order = line.quantity
305
 
306
            for discount in line.discounts:
17470 manish.sha 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
3554 varun.gupt 313
                quantity_remaining_for_order -= discount.quantity
314
 
17470 manish.sha 315
            if quantity_remaining_for_order > 0:
316
                t_line_item = create_line_item(line, line.actual_price, quantity_remaining_for_order)
17484 manish.sha 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)
17470 manish.sha 318
                orders.append(t_order)
319
            '''
576 chandransh 320
            i = 0
3554 varun.gupt 321
            while i < quantity_remaining_for_order:
11915 amit.gupta 322
                t_line_item = create_line_item(line, line.actual_price)
11669 amit.gupta 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)
576 chandransh 324
                orders.append(t_order)
325
                i += 1
17470 manish.sha 326
            '''
576 chandransh 327
    return orders
328
 
17470 manish.sha 329
def create_order(userId, address_id, t_line_item, pickupStoreId, gvAmount, insurer, insuranceAmount, insuranceDetails, dataProtectionInsurer, dataProtectionAmount, orderSource, freebieId, totalshippingCost, totalCartVal):
5326 rajveer 330
    user = User.get_by(id=userId)
576 chandransh 331
    address = Address.get_by(id=address_id)
332
    t_order = TOrder()
557 chandransh 333
 
576 chandransh 334
    t_order.customer_id = user.id
335
    t_order.customer_email = user.email
336
 
910 rajveer 337
    t_order.customer_name = address.name
576 chandransh 338
    t_order.customer_pincode = address.pin
738 chandransh 339
    t_order.customer_address1 = address.line_1
340
    t_order.customer_address2 = address.line_2
669 chandransh 341
    t_order.customer_city = address.city
342
    t_order.customer_state = address.state
576 chandransh 343
    t_order.customer_mobilenumber = address.phone
344
 
9299 kshitij.so 345
    t_order.total_amount = t_line_item.total_price + insuranceAmount + dataProtectionAmount
6318 rajveer 346
    t_order.gvAmount = gvAmount
1976 varun.gupt 347
 
576 chandransh 348
    t_order.total_weight = t_line_item.total_weight
349
    t_order.lineitems = [t_line_item]
350
 
690 chandransh 351
    t_order.status = OrderStatus.PAYMENT_PENDING
970 chandransh 352
    t_order.statusDescription = "Payment Pending"
576 chandransh 353
    t_order.created_timestamp = to_java_date(datetime.datetime.now())
354
 
5555 rajveer 355
    t_order.pickupStoreId = pickupStoreId 
6903 anupam.sin 356
    t_order.insuranceAmount = insuranceAmount 
357
    t_order.insurer = insurer
6935 anupam.sin 358
    if insuranceDetails:
359
        t_order.dob = insuranceDetails.dob
360
        t_order.guardianName = insuranceDetails.guardianName
7190 amar.kumar 361
 
362
    catalog_client = CatalogClient().get_client()
11669 amit.gupta 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  
11526 amit.gupta 370
    t_order.source = orderSource
9299 kshitij.so 371
    t_order.dataProtectionInsurer = dataProtectionInsurer
372
    t_order.dataProtectionAmount = dataProtectionAmount
17486 manish.sha 373
    t_order.shippingCost = round((t_line_item.total_price*totalshippingCost)/totalCartVal, 0)
576 chandransh 374
    return t_order
375
 
11915 amit.gupta 376
def create_line_item(line, final_price, quantity=1):
3133 rajveer 377
    inventory_client = CatalogClient().get_client()
11915 amit.gupta 378
    item = inventory_client.getItem(line.item_id)
576 chandransh 379
    t_line_item = TLineItem()
963 chandransh 380
    t_line_item.productGroup = item.productGroup
381
    t_line_item.brand = item.brand
636 rajveer 382
    t_line_item.model_number = item.modelNumber
669 chandransh 383
    if item.color is None or item.color == "NA":
384
        t_line_item.color = ""
385
    else:
917 chandransh 386
        t_line_item.color = item.color
963 chandransh 387
    t_line_item.model_name = item.modelName
636 rajveer 388
    t_line_item.extra_info = item.featureDescription
702 chandransh 389
    t_line_item.item_id = item.id
3768 vikas 390
    t_line_item.quantity = quantity
1983 varun.gupt 391
 
3554 varun.gupt 392
    t_line_item.unit_price = final_price
3768 vikas 393
    t_line_item.total_price = final_price * quantity
1983 varun.gupt 394
 
636 rajveer 395
    t_line_item.unit_weight = item.weight
4172 rajveer 396
    t_line_item.total_weight = item.weight if item.weight is None else item.weight * quantity
11915 amit.gupta 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
 
4312 rajveer 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:
4312 rajveer 411
            expiry_date = datetime.datetime(expiry_year, expiry_month, today.day, 23, 59, 59, 999999)
4295 varun.gupt 412
        except ValueError:
413
            try:
4312 rajveer 414
                expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 1), 23, 59, 59, 999999)
4295 varun.gupt 415
            except ValueError:
4312 rajveer 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
 
576 chandransh 423
    return t_line_item
424
 
11980 amit.gupta 425
def validate_cart(cartId, sourceId, couponCode):
3133 rajveer 426
    inventory_client = CatalogClient().get_client()
576 chandransh 427
    logistics_client = LogisticsClient().get_client()
1976 varun.gupt 428
    promotion_client = PromotionClient().get_client()
1466 ankur.sing 429
    retval = ""
6736 amit.gupta 430
    emival = ""
557 chandransh 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.
563 chandransh 434
    cart = Cart.get_by(id=cartId)
435
    cart_lines = cart.lines
776 rajveer 436
    customer_pincode = None
690 chandransh 437
    current_time = datetime.datetime.now()
5929 anupam.sin 438
    if cart.pickupStoreId :
5782 rajveer 439
        store = logistics_client.getPickupStore(cart.pickupStoreId)
440
        customer_pincode = store.pin
5572 anupam.sin 441
    if cart.address_id != None and customer_pincode == None:
576 chandransh 442
        address = Address.get_by(id=cart.address_id)
443
        customer_pincode = address.pin
13136 amit.gupta 444
 
445
    user = User.get_by(active_cart_id = cartId)
446
 
447
    dealItems = []
13141 amit.gupta 448
    privateDealUser = PrivateDealUser.get_by(id=user.id)    
13136 amit.gupta 449
    if privateDealUser is not None and privateDealUser.isActive:
13142 amit.gupta 450
        itemIds = [cartLine.item_id for cartLine in cart.lines]
13136 amit.gupta 451
        deals = inventory_client.getAllActivePrivateDeals(itemIds, 0)
452
        dealItems = deals.keys()
453
 
776 rajveer 454
    if not customer_pincode:
785 rajveer 455
        default_address_id = user.default_address_id
776 rajveer 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"
1976 varun.gupt 462
    cart.total_price = 0
563 chandransh 463
    for line in cart_lines:
612 chandransh 464
        old_estimate = line.estimate
636 rajveer 465
        item_id = line.item_id
3557 rajveer 466
        item = inventory_client.getItemForSource(item_id, sourceId)
13136 amit.gupta 467
 
2983 chandransh 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 + ")"
13136 amit.gupta 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
485
 
486
            else:
487
                line.actual_price = item.sellingPrice 
488
                line.dealText = None
489
                line.freebieId = None
6921 anupam.sin 490
            cart.total_price = cart.total_price + (line.actual_price * line.quantity)
776 rajveer 491
            try:
4642 mandeep.dh 492
                item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTime
844 chandransh 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
12893 manish.sha 498
 
499
            if item_delivery_estimate !=-1:
500
                inv_client = InventoryClient().get_client()
501
                itemAvailability = None
502
                try:
12898 manish.sha 503
                    itemAvailability = inv_client.getItemAvailabilityAtLocation(item_id, 1)
12893 manish.sha 504
                except:
505
                    pass
12904 manish.sha 506
 
507
                print 'itemAvailability billling Warehouse ', itemAvailability[2]
12893 manish.sha 508
                if itemAvailability is not None:
509
                    billingWarehouse = None
510
                    try:
12904 manish.sha 511
                        billingWarehouse = inv_client.getWarehouse(itemAvailability[2])
12893 manish.sha 512
                    except:
513
                        pass
12904 manish.sha 514
 
515
                    print 'billingWarehouse Id Location ', billingWarehouse.stateId
12893 manish.sha 516
                    if billingWarehouse is not None:
12904 manish.sha 517
                        estimateVal = None
12893 manish.sha 518
                        if not logistics_client.isAlive() :
519
                            logistics_client = LogisticsClient().get_client()
520
                        try:
12904 manish.sha 521
                            estimateVal = logistics_client.getFirstDeliveryEstimateForWhLocation(customer_pincode, billingWarehouse.stateId)
12893 manish.sha 522
                            if estimateVal ==-1:
523
                                item_delivery_estimate =-1
524
                        except:
525
                            pass
12904 manish.sha 526
                        print 'estimateVal Value ', estimateVal
776 rajveer 527
            if old_estimate != item_delivery_estimate:
528
                line.estimate = item_delivery_estimate
529
                cart.updated_on = current_time
576 chandransh 530
        else:
11877 amit.gupta 531
            Discount.query.filter(Discount.line==line).delete()
563 chandransh 532
            line.delete()
716 rajveer 533
    if cart.checked_out_on is not None:
534
        if cart.updated_on > cart.checked_out_on:
844 chandransh 535
            cart.checked_out_on = None
612 chandransh 536
    session.commit()
1976 varun.gupt 537
 
538
    if cart.coupon_code is not None:
2026 varun.gupt 539
        try:
540
            updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
6740 amit.gupta 541
            if updated_cart.message is not None:
6739 amit.gupta 542
                emival = updated_cart.message
2026 varun.gupt 543
        except PromotionException as ex:
544
            remove_coupon(cart.id)
12020 amit.gupta 545
            #retval = ex.message
13155 amit.gupta 546
    session.commit()
13136 amit.gupta 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:
13142 amit.gupta 564
        map_lines = inventory_client.checkServices(map_lines)
13136 amit.gupta 565
        for line in cart_lines :
13142 amit.gupta 566
            if map_lines.has_key(line.item_id):
567
                line_map = map_lines[line.item_id]
568
                if line_map['insurer'] > 0:
13136 amit.gupta 569
                    if cart.discounted_price:
13142 amit.gupta 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:
13136 amit.gupta 575
                    if cart.discounted_price:
13142 amit.gupta 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']
13136 amit.gupta 580
                line.updated_on = datetime.datetime.now()
581
        cart.updated_on = datetime.datetime.now()
13142 amit.gupta 582
        session.commit()
11860 amit.gupta 583
    session.close()
6736 amit.gupta 584
    return [retval, emival]
576 chandransh 585
 
557 chandransh 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:
5345 rajveer 594
        for discount in line.discounts:
595
            discount.delete()
596
    session.commit()
597
 
598
    for line in old_lines:
557 chandransh 599
        flag = True
600
        for new_line in new_lines:
601
            if line.item_id == new_line.item_id:
602
                flag = False
5345 rajveer 603
 
576 chandransh 604
        if flag:
5345 rajveer 605
            line.cart_id = toCartId
606
        else:
607
            line.delete()
608
 
2019 varun.gupt 609
    if toCart.coupon_code is None:
610
        toCart.coupon_code = fromCart.coupon_code
611
 
612
    toCart.updated_on = datetime.datetime.now()
557 chandransh 613
    fromCart.expired_on = datetime.datetime.now()
614
    fromCart.cart_status = CartStatus.INACTIVE
643 chandransh 615
    session.commit()
691 chandransh 616
 
617
def check_out(cartId):
618
    if cartId is None:
619
        raise ShoppingCartException(101, "Cart id not specified")
716 rajveer 620
    cart = Cart.get_by(id = cartId)
691 chandransh 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
626
 
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:
3566 rajveer 633
            delete_discounts_for_line(line)
2261 varun.gupt 634
            line.discounted_price = None
691 chandransh 635
            line.quantity = line.quantity - quantity
636
            if line.quantity == 0:
637
                line.delete()
717 rajveer 638
    cart = Cart.get_by(id=cartId)
691 chandransh 639
    cart.updated_on = datetime.datetime.now()
1894 vikas 640
    cart.checked_out_on = None
1976 varun.gupt 641
 
642
    # Removing Coupon
643
    cart.total_price = None
644
    cart.discounted_price = None
645
    cart.coupon_code = None
646
 
691 chandransh 647
    session.commit()
766 rajveer 648
    return True
649
 
3386 varun.gupt 650
def get_carts_with_coupon_count(coupon_code):
651
    return Cart.query.filter_by(coupon_code = coupon_code).count()
4668 varun.gupt 652
 
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:
6355 amit.gupta 658
        if cart.coupon_code:
659
            promotion_client = PromotionClient().get_client()
11819 amit.gupta 660
            cod_option = promotion_client.isCodApplicable(to_t_cart(cart))
5351 varun.gupt 661
 
6355 amit.gupta 662
        if cod_option and cart.lines:
4668 varun.gupt 663
            for line in cart.lines:
4866 rajveer 664
                logistics_info = logistics_client.getLogisticsEstimation(line.item_id, pincode, DeliveryType.PREPAID)
4871 rajveer 665
                if not logistics_info.codAllowed:
4668 varun.gupt 666
                    cod_option = False
667
                    break
17648 manish.sha 668
            if cart.total_price > 60000:# or cart.total_price <= 250:
5430 rajveer 669
                cod_option = False
4668 varun.gupt 670
    return cod_option
6821 amar.kumar 671
 
9791 rajveer 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()
9804 rajveer 674
    datas = []
675
    for line in lines:
676
        datas.append(line[0])
677
    return datas
6903 anupam.sin 678
 
11655 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
690
 
6903 anupam.sin 691
    try:
692
        if toInsure:
6921 anupam.sin 693
            csc = CatalogClient().get_client()
694
            item = csc.getItem(itemId)
9299 kshitij.so 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
6903 anupam.sin 707
            cart.total_price = cart.total_price + insuranceAmount
708
        else:
9299 kshitij.so 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
6903 anupam.sin 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")
9299 kshitij.so 726
        print("insurerId : " + str(insurerId) + " ItemId : " + str(itemId) + " CartId : " + str(cartId))
6903 anupam.sin 727
        return False
728
 
729
    return True
730
 
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
736
            if cart.discounted_price:
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
748
 
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
762
 
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))
770
        return False
771
    return True
772
 
17782 amit.gupta 773
 
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 
781
 
782
        for line in found_cart.lines:
783
            if itemQtyMap.has_key(line.item_id):
784
                line.delete()
785
        for itemId,qty in itemQtyMap.iteritems():
786
            line = Line()
787
            line.cart = found_cart
788
            line.item_id = itemId
789
            line.quantity = qty
790
            line.created_on = current_time
791
            line.updated_on = current_time
792
            line.line_status = LineStatus.LINE_ACTIVE
793
            line.insurer = 0
794
            line.insuranceAmount = 0
795
        if couponCode:
796
            found_cart.coupon_code = couponCode
797
        else:
798
            found_cart.coupon_code = None
799
        session.commit()
800
        return True
801
    except:
802
        traceback.print_exc()
803
        return False
804
 
805
 
806
def valiate_cart_new(cartId, customer_pincode, sourceId):
807
 
808
    inventory_client = CatalogClient().get_client()
809
    logistics_client = LogisticsClient().get_client()
810
    promotion_client = PromotionClient().get_client()
811
    # No need to validate duplicate items since there are only two ways
812
    # to add items to a cart and both of them check whether the item being
813
    # added is a duplicate of an already existing item.
814
    cart = Cart.get_by(id=cartId)
815
    cart_lines = cart.lines
816
    current_time = datetime.datetime.now()
817
 
818
    user = User.get_by(active_cart_id = cartId)
819
    responseMap = {}
820
    totalQty = 0
821
    totalAmount = 0 
822
    shippingCharges=0
823
    cartMessages=[]
824
    cartItems = []
825
    dealItems = []
826
 
827
    responseMap['shippingCharges']= shippingCharges
828
    responseMap['cartMessages']= cartMessages
829
    responseMap['cartItems']= cartItems
830
    responseMap['pincode']= customer_pincode
831
 
832
    privateDealUser = PrivateDealUser.get_by(id=user.id)    
833
    itemIds = [cartLine.item_id for cartLine in cart.lines]
834
    if privateDealUser is not None and privateDealUser.isActive:
835
        deals = inventory_client.getAllActivePrivateDeals(itemIds, 0)
836
        dealItems = deals.keys()
837
 
838
    cart.total_price = 0
839
    itemsMap = inventory_client.getItems(itemIds)
840
    for line in cart_lines:
841
        cartItem={}
842
 
843
        old_estimate = line.estimate
844
        item_id = line.item_id
845
        item = itemsMap.get(item_id)
846
        cartItem['itemId']=line.item_id
847
        cartItem['quantity']=0
848
        cartItem['messages']=[]
849
        cartItemMessages = cartItem['messages']
850
        cartItem['color'] = item.color
851
        cartItem['catalogItemId'] = item.catalogItemId
852
 
853
        item_shipping_info = inventory_client.isActive(item_id) 
854
        if item_shipping_info.isActive:
855
            if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:
856
                line.quantity = item_shipping_info.quantity
857
                cartMessages.append({"type":"failed", "messageText":"Qty for few items have changed"})
858
                cartItemMessages.append({"type":"failed", "messageText":"Only " + str(item_shipping_info.quantity) + " available"})
859
 
860
            cartItem['maxQuantity'] = min(item_shipping_info.quantity, 20)
861
 
862
            if item_id in dealItems:
863
                line.actual_price = deals[item_id].dealPrice
864
                if deals[item_id].dealTextOption==0:
865
                    line.dealText = ''
866
                if deals[item_id].dealTextOption==2:
867
                    line.dealText = deals[item_id].dealText
868
 
869
                if deals[item_id].dealFreebieOption==0:
870
                    line.freebieId = 0
871
                if deals[item_id].dealFreebieOption==2:
872
                    line.freebieId =  deals[item_id].dealFreebieItemId
873
                cartItem['dealText'] = line.dealText
874
            else:
875
                line.actual_price = item.sellingPrice
17787 amit.gupta 876
                if item.bestDealText
877
                    cartItem['dealText'] = item.bestDealText
17782 amit.gupta 878
                line.dealText = None
879
                line.freebieId = None
880
            cartItem['sellingPrice'] = line.actual_price
881
            cartItem['quantity'] = line.quantity
882
            cart.total_price = cart.total_price + (line.actual_price * line.quantity)
883
            try:
884
                item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTime
885
            except LogisticsServiceException:
886
                item_delivery_estimate = -1
887
                #TODO Use the exception clause to set the retval appropriately
888
            except :
889
                item_delivery_estimate = -1
890
 
891
            if item_delivery_estimate !=-1:
892
                inv_client = InventoryClient().get_client()
893
                itemAvailability = None
894
                try:
895
                    itemAvailability = inv_client.getItemAvailabilityAtLocation(item_id, 1)
896
                except:
897
                    pass
898
 
899
                print 'itemAvailability billling Warehouse ', itemAvailability[2]
900
                if itemAvailability is not None:
901
                    billingWarehouse = None
902
                    try:
903
                        billingWarehouse = inv_client.getWarehouse(itemAvailability[2])
904
                    except:
905
                        pass
906
 
907
                    print 'billingWarehouse Id Location ', billingWarehouse.stateId
908
                    if billingWarehouse is not None:
909
                        estimateVal = None
910
                        if not logistics_client.isAlive() :
911
                            logistics_client = LogisticsClient().get_client()
912
                        try:
913
                            estimateVal = logistics_client.getFirstDeliveryEstimateForWhLocation(customer_pincode, billingWarehouse.stateId)
914
                            if estimateVal ==-1:
915
                                item_delivery_estimate =-1
916
                        except:
917
                            pass
918
                        print 'estimateVal Value ', estimateVal
919
            cartItem['estimate'] = item_delivery_estimate
920
            if item_delivery_estimate == -1:
921
                cartItem['quantity'] = 0
922
                cartMessages.append({"type":"failed", "messageText":"Few items are undeliverable to your pincode"})
923
                cartItemMessages.append({"type":"failed", "messageText":"Undeliverable"})
924
            if old_estimate != item_delivery_estimate:
925
                line.estimate = item_delivery_estimate
926
                cart.updated_on = current_time
927
        else:
928
            cartItem['quantity'] = 0
929
            cartMessages.append({"type":"failed", "messageText":"Few items are out of Stock"})
930
            cartItemMessages.append({"type":"failed", "messageText":"Out of Stock"})
931
            Discount.query.filter(Discount.line==line).delete()
932
            line.delete()
933
        totalQty += cartItem['quantity']
934
        totalAmount += line.actual_price * cartItem['quantity']
935
        cartItems.append(cartItem)
936
    if cart.checked_out_on is not None:
937
        if cart.updated_on > cart.checked_out_on:
938
            cart.checked_out_on = None
939
    session.commit()
940
 
941
    if cart.coupon_code is not None:
942
        try:
943
            updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)
944
            if updated_cart.message is not None:
945
                emival = updated_cart.message
946
        except PromotionException as ex:
947
            remove_coupon(cart.id)
948
            #retval = ex.message
949
    session.commit()
950
 
951
    cart = Cart.get_by(id=cartId)
952
    cart_lines = cart.lines
953
    insurerFlag = False
954
    for line in cart_lines:
955
        if line.insurer > 0 or line.dataProtectionInsurer > 0:
956
            line.insurer = 0
957
            line.insuranceAmount = 0 
958
            line.dataProtectionInsurer = 0
959
            line.dataProtectionAmount = 0
960
            insurerFlag = True
961
 
962
    if insurerFlag:
963
        cart.updated_on = datetime.datetime.now()
964
        session.commit()
965
    session.close()
966
    responseMap['totalQty']= totalQty
967
    responseMap['totalAmount']= totalAmount
968
    if totalAmount < 500:
969
        shippingCharges = 100
970
    elif totalAmount < 1000:
971
        shippingCharges = 50
17787 amit.gupta 972
    responseMap['shippingCharge']=shippingCharges
17782 amit.gupta 973
    return json.dumps(responseMap)
974
 
975
 
11980 amit.gupta 976
def validate_cart_plus(cart_id, source_id, couponCode):
11655 amit.gupta 977
    try:
11980 amit.gupta 978
        cart_messages = validate_cart(cart_id, source_id, couponCode)
11655 amit.gupta 979
        found_cart = Cart.get_by(id=cart_id)
11592 amit.gupta 980
        pincode = "110001"
11599 amit.gupta 981
        default_address_id = User.get_by(active_cart_id = cart_id).default_address_id
11598 amit.gupta 982
 
11592 amit.gupta 983
        default_address = None
984
        if found_cart.address_id is not None and found_cart.address_id > 0:
985
            pincode = Address.get_by(id=found_cart.address_id).pin
11600 amit.gupta 986
        elif default_address_id is not None:
11592 amit.gupta 987
            default_address = Address.get_by(id = default_address_id) 
988
            pincode = default_address.pin
989
 
11612 amit.gupta 990
        needInuranceInfo = False
11600 amit.gupta 991
        if default_address_id is not None:
992
            for line in found_cart.lines:
993
                if line.insurer > 0:
11611 amit.gupta 994
                    needInuranceInfo = not is_insurance_detail_present(default_address_id)
11600 amit.gupta 995
                    break
11592 amit.gupta 996
        cartPlus = CartPlus()
997
        cartPlus.cart = to_t_cart(found_cart)
998
        cartPlus.pinCode = pincode
999
        cartPlus.validateCartMessages = cart_messages
1000
        cartPlus.needInsuranceInfo = needInuranceInfo
1001
        return cartPlus
1002
    finally:
1003
        close_session()
1004
 
766 rajveer 1005
def close_session():
1006
    if session.is_active:
1007
        print "session is active. closing it."
17782 amit.gupta 1008
        session.close()
1009