Rev 24385 | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 10-May-2010@author: ashish'''from elixir import *from shop2020.clients.CatalogClient import CatalogClientfrom shop2020.clients.InventoryClient import InventoryClientfrom shop2020.clients.LogisticsClient import LogisticsClientfrom shop2020.clients.PromotionClient import PromotionClientfrom shop2020.clients.TransactionClient import TransactionClientfrom shop2020.model.v1 import userfrom shop2020.model.v1.user.impl.Converters import to_t_cart, to_t_linefrom shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, User, \Discount, InsuranceDetails, PrivateDealUserfrom shop2020.thriftpy.logistics.ttypes import LogisticsServiceException, \DeliveryTypefrom shop2020.thriftpy.model.v1.catalog.ttypes import Item, InsurerTypefrom shop2020.thriftpy.model.v1.order.ttypes import Transaction as TTransaction, \TransactionStatus as TTransactionStatus, Order as TOrder, LineItem as TLineItem, \OrderStatus, OrderSourcefrom shop2020.thriftpy.model.v1.user.ttypes import CartStatus, LineStatus, \ShoppingCartException, PromotionException, CartPlusfrom shop2020.utils.Utils import to_py_date, to_java_dateimport datetimeimport jsonimport mathimport tracebackdef get_cart(userId):user = User.get_by(id=userId)return user.active_cartdef get_cart_by_id(id):cart = Cart.get_by(id=id)return cartdef create_cart():cart = Cart()cart.created_on = datetime.datetime.now()cart.updated_on = datetime.datetime.now()cart.cart_status = CartStatus.ACTIVEreturn cartdef get_carts_between(start_time, end_time, status):init_time = to_py_date(start_time)finish_time = to_py_date(end_time)query = Cart.queryif status:query = query.filter(Cart.cart_status==status)if init_time:query = query.filter(Cart.created_on >= init_time)if finish_time:query = query.filter(Cart.created_on <= finish_time)carts = query.all()return cartsdef get_line(item_id, cart_id, status, single):#get cart firsttry:found_cart = Cart.get_by(id=cart_id)except:raise ShoppingCartException(101, "cart not found ")query = Line.query.filter_by(cart = found_cart, item_id = item_id)if status:query = query.filter_by(line_status = status)else:query = query.filter_by(line_status = LineStatus.LINE_ACTIVE)try:if single:return query.one()else:return query.all()except:return Nonedef add_item_to_cart(cart_id, item_id, quantity, sourceId):if not item_id:raise ShoppingCartException(101, "item_id cannot be null")if not quantity:raise ShoppingCartException(101, "quantity cannot be null")cart = Cart.get_by(id = cart_id)if not cart:raise ShoppingCartException(101, "no cart attached to this id" + str(cart_id))retval = ""catalog_client = CatalogClient().get_client()item = catalog_client.getItemForSource(item_id, sourceId)dataProtectionInsurer = catalog_client.getPrefferedInsurerForItem(item_id,InsurerType._NAMES_TO_VALUES.get("DATA"))item_shipping_info = catalog_client.isActive(item_id)if not item_shipping_info.isActive:return catalog_client.getItemStatusDescription(item_id)current_time = datetime.datetime.now()cart.updated_on = current_timeline = get_line(item_id, cart_id, None,True)if line:#change the quantity onlyline.insuranceAmount = (line.insuranceAmount/line.quantity) * quantityline.quantity = quantityline.updated_on = current_timeline.dataProtectionAmount = (line.dataProtectionAmount/line.quantity) * quantityelse:line = Line()line.cart = cartline.item_id = item_idline.quantity = quantityline.created_on = current_timeline.updated_on = current_timeline.actual_price = item.sellingPriceline.line_status = LineStatus.LINE_ACTIVEline.insurer = 0line.insuranceAmount = 0#DATA INSURER IS SET UPON ADD TO CARTline.dataProtectionInsurer = dataProtectionInsurersession.commit()return retvaldef delete_item_from_cart(cart_id, item_id):if not item_id:raise ShoppingCartException(101, "item_id cannot be null")cart = Cart.get_by(id = cart_id)if not cart:raise ShoppingCartException(101, "no cart attached to this id")item = get_line(item_id, cart_id, None, True)count_deleted_discounts = delete_discounts_for_line(item)item.delete()current_time = datetime.datetime.now()cart.updated_on = current_timesession.commit()def delete_discounts_for_line(item_line):count_deleted = Discount.query.filter_by(line = item_line).delete()session.commit()return count_deleteddef delete_discounts_from_cart(cart_id, cart = None):if cart is None:if cart_id is None:raise ShoppingCartException(101, 'cart_id and cart, both cannot be null')else:cart = Cart.get_by(id = cart_id)if cart.lines:for line in cart.lines:delete_discounts_for_line(line)def save_discounts(discounts):if not discounts:raise ShoppingCartException(101, 'discounts be null')if len(discounts) > 0:cart = Cart.get_by(id = discounts[0].cart_id)for t_discount in discounts:line = Line.query.filter_by(cart = cart, item_id = t_discount.item_id).first()if line is not None:discount = Discount()discount.line = linediscount.discount = t_discount.discountdiscount.quantity = t_discount.quantitysession.commit()def add_address_to_cart(cart_id, address_id):if not cart_id:raise ShoppingCartException(101, "cart id cannot be made null")if not address_id:raise ShoppingCartException(101, "address id cannot be made null")cart = get_cart_by_id(cart_id)if not cart:raise ShoppingCartException(101, "no cart for this id")address = Address.get_by(id=address_id)if not address:raise ShoppingCartException(101, "No address for this id")cart.address_id = address_idcurrent_time = datetime.datetime.now()#cart.updated_on = current_timesession.commit()def add_store_to_cart(cartId, storeId):if not cartId:raise ShoppingCartException(101, "cart id cannot be made null")cart = get_cart_by_id(cartId)if not cart:raise ShoppingCartException(101, "no cart for this id")if storeId:cart.pickupStoreId = storeIdelse:cart.pickupStoreId = Nonesession.commit()def apply_coupon_to_cart(t_cart, coupon_code):cart = get_cart_by_id(t_cart.id)if not cart:raise ShoppingCartException(101, "no cart attached to this id")pc = PromotionClient().get_client()for t_line in t_cart.lines:line = Line.query.filter_by(cart = cart).filter_by(item_id = t_line.itemId).one()line.discounted_price = Noneif not pc.isGiftVoucher(coupon_code):line.discounted_price = t_line.discountedPrice#line.dealText = t_line.dealText#line.freebieId = t_line.freebieIdcart.total_price = t_cart.totalPricecart.discounted_price = t_cart.discountedPricecart.coupon_code = coupon_codesession.commit()def remove_coupon(cart_id):cart = get_cart_by_id(cart_id)if not cart:raise ShoppingCartException(101, "no cart attached to this id")#Resetting discounted price of each line in cart to Nullfor line in cart.lines:line.discounted_price = Noneline.dealText = Noneline.freebieId = Nonedelete_discounts_from_cart(cart.id, cart=cart)cart.discounted_price = Nonecart.coupon_code = Nonesession.commit()def commit_cart(cart_id, sessionSource, sessionTime, firstSource, firstSourceTime, userId, schemeId, orderSource, selfPickup):cart = get_cart_by_id(cart_id)#now we have a cart. Need to create a transaction with ittotalCartVal = 0totalshippingCost = 0for lineObj in cart.lines:totalCartVal += lineObj.actual_price * lineObj.quantitytxn = TTransaction()txn.shoppingCartid = cart_idtxn.customer_id = userIdtxn.createdOn = to_java_date(datetime.datetime.now())txn.transactionStatus = TTransactionStatus.INITtxn.statusDescription = "New Order"txn.coupon_code = cart.coupon_codetxn.sessionSource = sessionSourcetxn.sessionStartTime = sessionTimetxn.firstSource = firstSourcetxn.firstSourceTime = firstSourceTimetxn.payment_option = schemeIdtxn.totalShippingCost = 0txnOrders = create_orders(cart, userId, orderSource, totalshippingCost, totalCartVal, selfPickup)shippingCostInOrders = 0for order in txnOrders:shippingCostInOrders = shippingCostInOrders + order.shippingCostdiff = totalshippingCost - shippingCostInOrderstxnOrders[0].shippingCost = txnOrders[0].shippingCost + difftxn.orders = txnOrderstransaction_client = TransactionClient().get_client()txn_id = transaction_client.createTransaction(txn)session.commit()return txn_iddef create_orders(cart, userId, orderSource, totalshippingCost, totalCartVal, selfPickup):cart_lines = cart.linesorders = []isGv = Falseif cart.coupon_code:try:pc = PromotionClient().get_client()isGv = pc.isGiftVoucher(cart.coupon_code)except:isGv = FalseinsuranceDetails = InsuranceDetails.get_by(addressId = cart.address_id)itemIds = []for line in cart_lines:itemIds.append(line.item_id)inventory_client = CatalogClient().get_client()itemsMap = inventory_client.getItems(itemIds)print "cart_lines -", cart_linesfor line in cart_lines:if line.line_status == LineStatus.LINE_ACTIVE:quantity_remaining_for_order = line.quantityfor discount in line.discounts:#i = 0#while i < discount.quantity:t_line_item = create_line_item(line, line.actual_price if isGv else (line.actual_price - discount.discount), line.quantity, itemsMap.get(line.item_id))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, selfPickup)orders.append(t_order)#i += 1quantity_remaining_for_order -= discount.quantityprint "quantity_remaining_for_order ", quantity_remaining_for_orderif quantity_remaining_for_order > 0:t_line_item = create_line_item(line, line.actual_price, quantity_remaining_for_order, itemsMap.get(line.item_id))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, selfPickup)orders.append(t_order)wallet_amount = cart.wallet_amountif wallet_amount is None:wallet_amount = 0print "adjusting wallet_amount ***",wallet_amountfor order in orders:if ((order.total_amount+ order.shippingCost - order.gvAmount) >= wallet_amount):order.wallet_amount = wallet_amountelse:order.wallet_amount = order.total_amount+ order.shippingCost - order.gvAmountorder.net_payable_amount = order.total_amount+ order.shippingCost - order.gvAmount - order.wallet_amountwallet_amount = wallet_amount - order.wallet_amountreturn ordersdef create_order(userId, address_id, t_line_item, pickupStoreId, gvAmount, insurer, insuranceAmount, insuranceDetails, dataProtectionInsurer, dataProtectionAmount, orderSource, freebieId, totalshippingCost, totalCartVal, selfPickup):user = User.get_by(id=userId)address = Address.get_by(id=address_id)t_order = TOrder()t_order.customer_id = user.idt_order.customer_email = user.emailt_order.customer_name = address.namet_order.customer_pincode = address.pint_order.customer_address1 = address.line_1t_order.customer_address2 = address.line_2t_order.customer_city = address.cityt_order.customer_state = address.statet_order.customer_mobilenumber = address.phonet_order.total_amount = t_line_item.total_price + insuranceAmount + dataProtectionAmountt_order.gvAmount = gvAmountt_order.total_weight = t_line_item.total_weightt_order.lineitems = [t_line_item]t_order.status = OrderStatus.PAYMENT_PENDINGt_order.statusDescription = "Payment Pending"t_order.created_timestamp = to_java_date(datetime.datetime.now())t_order.pickupStoreId = pickupStoreIdt_order.insuranceAmount = insuranceAmountt_order.insurer = insurerif insuranceDetails:t_order.dob = insuranceDetails.dobt_order.guardianName = insuranceDetails.guardianNamecatalog_client = CatalogClient().get_client()if freebieId is None:freebie_item_id = catalog_client.getFreebieForItem(t_line_item.item_id)if freebie_item_id:t_order.freebieItemId = freebie_item_idelse:freebie_item_id = None if freebieId == 0 else freebieIdt_order.source = orderSourcet_order.dataProtectionInsurer = dataProtectionInsurert_order.dataProtectionAmount = dataProtectionAmount#if item.category in [10006, 10010]:if selfPickup:t_order.logistics_provider_id = 4t_order.shippingCost = 0else:t_order.shippingCost = round((t_line_item.total_price*totalshippingCost)/totalCartVal, 0)#t_order.shippingCost = perUnitShippingCost*t_line_item.quantity#else:# t_order.shippingCost = 0return t_orderdef create_line_item(line, final_price, quantity=1, item=None):if item is None:inventory_client = CatalogClient().get_client()item = inventory_client.getItem(line.item_id)t_line_item = TLineItem()t_line_item.productGroup = item.productGroupt_line_item.brand = item.brandt_line_item.model_number = item.modelNumberif item.color is None or item.color == "NA":t_line_item.color = ""else:t_line_item.color = item.colort_line_item.model_name = item.modelNamet_line_item.mrp = item.mrpt_line_item.extra_info = item.featureDescriptiont_line_item.item_id = item.idt_line_item.quantity = quantityt_line_item.unit_price = final_pricet_line_item.total_price = final_price * quantityt_line_item.hsnCode = item.hsnCodet_line_item.unit_weight = item.weightt_line_item.total_weight = item.weight if item.weight is None else item.weight * quantityif line.dealText is None:t_line_item.dealText = item.bestDealTextelif line.dealText == '':t_line_item.dealText = Noneelse:t_line_item.dealText = line.dealTextif item.warrantyPeriod:#Computing Manufacturer Warranty expiry datetoday = datetime.date.today()expiry_year = today.year + int((today.month + item.warrantyPeriod) / 12)expiry_month = (today.month + item.warrantyPeriod) % 12try:expiry_date = datetime.datetime(expiry_year, expiry_month, today.day, 23, 59, 59, 999999)except ValueError:try:expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 1), 23, 59, 59, 999999)except ValueError:try:expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 2), 23, 59, 59, 999999)except ValueError:expiry_date = datetime.date(expiry_year, expiry_month, (today.day - 3), 23, 59, 59, 999999)t_line_item.warrantry_expiry_timestamp = to_java_date(expiry_date)return t_line_itemdef validate_cart(cartId, sourceId, couponCode):inventory_client = CatalogClient().get_client()logistics_client = LogisticsClient().get_client()promotion_client = PromotionClient().get_client()retval = ""emival = ""# No need to validate duplicate items since there are only two ways# to add items to a cart and both of them check whether the item being# added is a duplicate of an already existing item.cart = Cart.get_by(id=cartId)cart_lines = cart.linescustomer_pincode = Nonecurrent_time = datetime.datetime.now()if cart.pickupStoreId :store = logistics_client.getPickupStore(cart.pickupStoreId)customer_pincode = store.pinif cart.address_id != None and customer_pincode == None:address = Address.get_by(id=cart.address_id)customer_pincode = address.pinuser = User.get_by(active_cart_id = cartId)dealItems = []bulkPricingMap ={}bulkPricingItems =[]privateDealUser = PrivateDealUser.get_by(id=user.id)if privateDealUser is not None and privateDealUser.isActive:itemIds = [cartLine.item_id for cartLine in cart.lines]deals = inventory_client.getAllActivePrivateDeals(itemIds, 0)dealItems = deals.keys()bulkPricingMap = inventory_client.getBulkPricingForItems(itemIds)bulkPricingItems = bulkPricingMap.keys()if not customer_pincode:default_address_id = user.default_address_idif default_address_id:address = Address.get_by(id = default_address_id)customer_pincode = address.pinif not customer_pincode:#FIXME should not be hard coded. May be we can pick from config server.customer_pincode = "110001"cart.total_price = 0for line in cart_lines:old_estimate = line.estimateitem_id = line.item_iditem = inventory_client.getItemForSource(item_id, sourceId)item_shipping_info = inventory_client.isActive(item_id)if item_shipping_info.isActive:if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:line.quantity = 1retval = "Try adding a smaller quantity of " + item.brand + " " + item.modelNumber + " (" + item.color + ")"bulkPrice = Noneif item_id in bulkPricingItems:#Check quantity qualifies or notbulkPricingList = bulkPricingMap.get(item_id)bulkPricingList = sorted(bulkPricingList, key=lambda x: x.quantity, reverse=False)for pricingItems in bulkPricingList:if pricingItems.quantity <= line.quantity:bulkPrice = pricingItemselse:breakif item_id in dealItems:if bulkPrice is None:line.actual_price = deals[item_id].dealPriceelse:line.actual_price = bulkPrice.priceif deals[item_id].dealTextOption==0:line.dealText = ''if deals[item_id].dealTextOption==2:line.dealText = deals[item_id].dealTextif deals[item_id].dealFreebieOption==0:line.freebieId = 0if deals[item_id].dealFreebieOption==2:line.freebieId = deals[item_id].dealFreebieItemIdelse:if bulkPrice is None:line.actual_price = item.sellingPriceelse:line.actual_price = bulkPrice.priceline.dealText = Noneline.freebieId = Nonecart.total_price = cart.total_price + (line.actual_price * line.quantity)try:item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID).deliveryTimeexcept LogisticsServiceException:item_delivery_estimate = -1#TODO Use the exception clause to set the retval appropriatelyexcept :item_delivery_estimate = -1if item_delivery_estimate !=-1:inv_client = InventoryClient().get_client()itemAvailability = Nonetry:itemAvailability = inv_client.getItemAvailabilityAtLocation(item_id, 1)except:passprint 'itemAvailability billling Warehouse ', itemAvailability[2]if itemAvailability is not None:billingWarehouse = Nonetry:billingWarehouse = inv_client.getWarehouse(itemAvailability[2])except:passprint 'billingWarehouse Id Location ', billingWarehouse.stateIdif billingWarehouse is not None:estimateVal = Noneif not logistics_client.isAlive() :logistics_client = LogisticsClient().get_client()try:estimateVal = logistics_client.getFirstDeliveryEstimateForWhLocation(customer_pincode, billingWarehouse.stateId)if estimateVal ==-1:item_delivery_estimate =-1except:passprint 'estimateVal Value ', estimateValif old_estimate != item_delivery_estimate:line.estimate = item_delivery_estimatecart.updated_on = current_timeelse:Discount.query.filter(Discount.line==line).delete()line.delete()if cart.checked_out_on is not None:if cart.updated_on > cart.checked_out_on:cart.checked_out_on = Nonesession.commit()if cart.coupon_code is not None:try:updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)if updated_cart.message is not None:emival = updated_cart.messageexcept PromotionException as ex:remove_coupon(cart.id)#retval = ex.messagesession.commit()cart = Cart.get_by(id=cartId)cart_lines = cart.linesmap_lines = {}insurerFlag = Falsefor line in cart_lines:if line.insurer > 0 or line.dataProtectionInsurer > 0:line_map = {}line_map['insurer'] = line.insurerline_map['dpinsurer'] = line.dataProtectionInsurerline_map['amount'] = line.discounted_price if line.discounted_price else line.actual_priceline_map['quantity'] = line.quantityinsurerFlag = Truemap_lines[line.item_id] = line_mapif insurerFlag:map_lines = inventory_client.checkServices(map_lines)for line in cart_lines :if map_lines.has_key(line.item_id):line_map = map_lines[line.item_id]if line_map['insurer'] > 0:if cart.discounted_price:cart.discounted_price = cart.discounted_price + line_map['insureramount']line.insurer = line_map['insurer']line.insuranceAmount = line_map['insureramount']cart.total_price = cart.total_price + line_map['insureramount']if line_map['dpinsurer'] > 0:if cart.discounted_price:cart.discounted_price = cart.discounted_price + line_map['dpinsureramount']line.dataProtectionInsurer = line_map['dpinsurer']line.dataProtectionAmount = line_map['dpinsureramount']cart.total_price = cart.total_price + line_map['dpinsureramount']line.updated_on = datetime.datetime.now()cart.updated_on = datetime.datetime.now()session.commit()session.close()return [retval, emival]def merge_cart(fromCartId, toCartId):fromCart = Cart.get_by(id=fromCartId)toCart = Cart.get_by(id=toCartId)old_lines = fromCart.linesnew_lines = toCart.linesfor line in old_lines:for discount in line.discounts:discount.delete()session.commit()for line in old_lines:flag = Truefor new_line in new_lines:if line.item_id == new_line.item_id:flag = Falseif flag:line.cart_id = toCartIdelse:line.delete()if toCart.coupon_code is None:toCart.coupon_code = fromCart.coupon_codetoCart.updated_on = datetime.datetime.now()fromCart.expired_on = datetime.datetime.now()fromCart.cart_status = CartStatus.INACTIVEsession.commit()def check_out(cartId):if cartId is None:raise ShoppingCartException(101, "Cart id not specified")cart = Cart.get_by(id = cartId)if cart is None:raise ShoppingCartException(102, "The specified cart couldn't be found")cart.checked_out_on = datetime.datetime.now()session.commit()return Truedef reset_cart(cartId, items):if cartId is None:raise ShoppingCartException(101, "Cart id not specified")for item_id, quantity in items.iteritems():line = Line.query.filter_by(cart_id=cartId, item_id=item_id).one()if line is not None:delete_discounts_for_line(line)line.discounted_price = Noneline.quantity = line.quantity - quantityif line.quantity == 0:line.delete()cart = Cart.get_by(id=cartId)cart.updated_on = datetime.datetime.now()cart.checked_out_on = None# Removing Couponcart.total_price = Nonecart.discounted_price = Nonecart.coupon_code = Nonecart.wallet_amount = 0.0session.commit()return Truedef get_carts_with_coupon_count(coupon_code):return Cart.query.filter_by(coupon_code = coupon_code).count()def show_cod_option(cartId, sourceId, pincode):cart = Cart.get_by(id = cartId)cod_option = Truelogistics_client = LogisticsClient().get_client()if cart:itemIds = []for line in cart.lines:itemIds.append(line.item_id)# catalog_client = CatalogClient().get_client()# items = catalog_client.getItems(itemIds).values()# for item in items:# if item.category not in [10006, 10010]:# return Falseif cart.coupon_code:promotion_client = PromotionClient().get_client()cod_option = promotion_client.isCodApplicable(to_t_cart(cart))if cod_option and cart.lines:for line in cart.lines:try:logistics_info = logistics_client.getLogisticsEstimation(line.item_id, pincode, DeliveryType.PREPAID)if not logistics_info.codAllowed:cod_option = Falsebreakexcept:passif cart.total_price > 150000:cod_option = Falsereturn cod_optiondef get_products_added_to_cart(startDate, endDate):lines = session.query(Line.item_id).filter(Line.created_on > to_py_date(startDate)).filter(Line.created_on < to_py_date(endDate)).all()datas = []for line in lines:datas.append(line[0])return datasdef insure_item(itemId, cartId, toInsure, insurerType):cart = Cart.get_by(id = cartId)line = Nonefor cartLine in cart.lines:if(cartLine.item_id == itemId):line = cartLinebreakif not line:print("Error : No line found for cartId : " + cartId + " and itemId : " + itemId)return Falsetry:if toInsure:csc = CatalogClient().get_client()item = csc.getItem(itemId)insurerId = csc.getPrefferedInsurerForItem(itemId,insurerType)insuranceAmount = csc.getInsuranceAmount(itemId, line.discounted_price if line.discounted_price else line.actual_price, insurerId, line.quantity)if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DEVICE':if cart.discounted_price:cart.discounted_price = cart.discounted_price - line.insuranceAmount + insuranceAmountline.insurer = insurerIdline.insuranceAmount = insuranceAmountif InsurerType._VALUES_TO_NAMES.get(insurerType)=='DATA':if cart.discounted_price:cart.discounted_price = cart.discounted_price - line.dataProtectionAmount + insuranceAmountline.dataProtectionInsurer = insurerIdline.dataProtectionAmount = insuranceAmountcart.total_price = cart.total_price + insuranceAmountelse:if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DEVICE':cart.total_price = cart.total_price - line.insuranceAmountif cart.discounted_price:cart.discounted_price = cart.discounted_price - line.insuranceAmountline.insurer = 0line.insuranceAmount = 0if InsurerType._VALUES_TO_NAMES.get(insurerType)=='DATA':cart.total_price = cart.total_price - line.dataProtectionAmountif cart.discounted_price:cart.discounted_price = cart.discounted_price - line.dataProtectionAmountline.dataProtectionInsurer = 0line.dataProtectionAmount = 0line.updated_on = datetime.datetime.now()cart.updated_on = datetime.datetime.now()session.commit()except:print("Error : Unable to insure")print("insurerId : " + str(insurerId) + " ItemId : " + str(itemId) + " CartId : " + str(cartId))return Falsereturn Truedef cancel_insurance(cartId):try:cart = Cart.get_by(id = cartId)for cartLine in cart.lines:cart.total_price = cart.total_price - cartLine.insuranceAmountif cart.discounted_price:cart.discounted_price = cart.discounted_price - cartLine.insuranceAmountcartLine.insurer = 0cartLine.insuranceAmount = 0cartLine.updated_on = datetime.datetime.now()cart.updated_on = datetime.datetime.now()session.commit()except:print("Error : Unable to cancel insurance for cartId :" + str(cartId))return Falsereturn Truedef store_insurance_specific_details(addressId, dob, guardianName):try:insuranceDetails = InsuranceDetails.get_by(addressId = addressId);if insuranceDetails is None :insuranceDetails = InsuranceDetails()insuranceDetails.addressId = addressIdinsuranceDetails.dob = dobinsuranceDetails.guardianName = guardianNamesession.commit()except:print("Error : Unable to store insurance details for addressId : " + str(addressId))return Falsereturn Truedef is_insurance_detail_present(addressId):try:insuranceDetails = InsuranceDetails.get_by(addressId = addressId);if insuranceDetails is None :return Falseexcept:print("Error : Unable to get insurance details for addressId : " + str(addressId))return Falsereturn Truedef add_items_to_cart(cartId, itemQty, couponCode=None):try:found_cart = Cart.get_by(id=cartId)itemQtyMap = {}current_time = datetime.datetime.now()for itemqty in itemQty:itemQtyMap[itemqty.itemId] = itemqty.qtyif found_cart.lines:for line in found_cart.lines:Discount.query.filter(Discount.line==line).delete()line.delete()for itemId,qty in itemQtyMap.iteritems():#This condition will ensure that cart is only persisted with non-zero quantities.if qty==0:continueline = Line()line.cart = found_cartline.item_id = itemIdline.quantity = qtyline.created_on = current_timeline.updated_on = current_timeline.line_status = LineStatus.LINE_ACTIVEline.insurer = 0line.insuranceAmount = 0if couponCode:found_cart.coupon_code = couponCodeelse:found_cart.coupon_code = Nonesession.commit()return Trueexcept:traceback.print_exc()return Falsedef validate_fofo_cart(cart, user, privateDealUser, customer_pincode):current_time = datetime.datetime.now()totalQty = 0totalAmount = 0cartMessages = []cartItems = []responseMap = {}cartMessageChanged = 0cartMessageOOS = 0codAllowed = FalsecartMessageUndeliverable = 0itemIds = [cartLine.item_id for cartLine in cart.lines]catalog_client = CatalogClient().get_client()#logistics_client = LogisticsClient().get_client()#promotion_client = PromotionClient().get_client()inv_client = InventoryClient().get_client()fofoDealsMap = catalog_client.getAllFofoDeals(itemIds, [4, 7])fofoDealsAvailability = inv_client.getFofoAvailability(fofoDealsMap.keys())itemsMap = catalog_client.getItems(itemIds)cart_lines = cart.linescart.total_price = 0nonAccessoryQuantity = 0for line in cart_lines:itemQuantityChanged=FalsecartItem={}tempBulkItemList = []old_estimate = line.estimateitem_id = line.item_iditem = itemsMap.get(item_id)#in case item is missing remove that line#lets silently remvoe fofoDealsMap as fofo customer is not allowed to orders with fofoif item is None or item.itemStatus==0 or not fofoDealsMap.has_key(item.id):Discount.query.filter(Discount.line==line).delete()line.delete()continuecartItem['itemId']=line.item_idcartItem['quantity']=0cartItem['cartItemMessages']=[]cartItemMessages = cartItem['cartItemMessages']cartItem['color'] = item.colorcartItem['catalogItemId'] = item.catalogItemIdcartItem['packQuantity'] = item.packQuantitycartItem['minBuyQuantity'] = item.minimumBuyQuantitycartItem['quantityStep'] = item.quantityStepcartItem['bulkPricing'] = tempBulkItemListcartItem['maxQuantity'] =0#This should be removedfofoDealsAvailability[item_id] = 30if not fofoDealsAvailability.has_key(item_id):continueelse:availability = fofoDealsAvailability.get(item_id)if availability < line.quantity:line.quantity = availabilityitemQuantityChanged=TruecartItem['maxQuantity'] = min(availability,100)if item.maximumBuyQuantity is not None and item.maximumBuyQuantity >0:cartItem['maxQuantity'] = min(availability, item.maximumBuyQuantity)if availability < cartItem['minBuyQuantity']:cartItem['minBuyQuantity'] = availabilityif line.quantity < cartItem['minBuyQuantity']:itemQuantityChanged=Trueline.quantity = cartItem['minBuyQuantity']if line.quantity > cartItem['maxQuantity']:itemQuantityChanged=Trueline.quantity = cartItem['maxQuantity']cartItem['quantity'] = line.quantityline.actual_price = fofoDealsMap.get(item_id)if item.category in [10006, 10010]:nonAccessoryQuantity += cartItem['quantity']cartItem['categoryName'] = "mobile"cartItem['sellingPrice'] = line.actual_pricecartItem['bulkPricing'] = []if availability:cart.total_price = cart.total_price + (line.actual_price * line.quantity)##Lets assign hardcoded deliveryestimate for fofoitem_delivery_estimate = 2codAllowed = FalsecartItem['estimate'] = item_delivery_estimateif itemQuantityChanged:cartMessageChanged += 1cartItemMessages.append({"type":"danger", "messageText":"Only " + str(item.maximumBuyQuantity) + " available"})if old_estimate != item_delivery_estimate:line.estimate = item_delivery_estimatecart.updated_on = current_timetotalAmount += line.actual_price * cartItem['quantity']else:cartItem['quantity'] = 0cartMessageOOS += 1cartItemMessages.append({"type":"danger", "messageText":"Out of Stock"})Discount.query.filter(Discount.line==line).delete()line.delete()totalQty += cartItem['quantity']if cartItemMessages:cartItems.insert(0, cartItem)else:cartItems.append(cartItem)if cart.checked_out_on is not None:if cart.updated_on > cart.checked_out_on:cart.checked_out_on = Nonesession.commit()responseMap['totalQty']= totalQtyresponseMap['totalAmount']= totalAmountresponseMap['nonAccessoryQuantity']= nonAccessoryQuantityresponseMap['cartMessages']= cartMessagesresponseMap['cartItems']= cartItemsresponseMap['pincode']= customer_pincoderesponseMap['shippingCharge'] = 0responseMap['cartMessageChanged'] = cartMessageChangedresponseMap['cartMessageOOS'] = cartMessageOOSresponseMap['cartMessageUndeliverable'] = cartMessageUndeliverableresponseMap['codAllowed'] = codAllowedreturn json.dumps(responseMap)def validate_cart_new(cartId, customer_pincode, sourceId):# No need to validate duplicate items since there are only two ways# to add items to a cart and both of them check whether the item being# added is a duplicate of an already existing item.cart = Cart.get_by(id=cartId)cart_lines = cart.linescurrent_time = datetime.datetime.now()#if customer_pincode is 000000 pincode should be considered from address or#is address is not present treat is as customer inputuser = User.get_by(active_cart_id = cartId)privateDealUser = PrivateDealUser.get_by(id=user.id)if customer_pincode == "000000":address = Address.get_by(id=cart.address_id)if address:customer_pincode = address.pincatalog_client = CatalogClient().get_client()itemIds = [cartLine.item_id for cartLine in cart.lines]print " My email is ", user.email, user.idif privateDealUser is not None and privateDealUser.isActive and privateDealUser.isFofo:print " I am a privatedeal user", user.emailfofoDealsMap = catalog_client.getAllFofoDeals(itemIds, [4, 7])print " I have recieved the fofo Deals Map", user.emailif fofoDealsMap:return validate_fofo_cart(cart, user, privateDealUser, customer_pincode)logistics_client = LogisticsClient().get_client()responseMap = {}totalQty = 0nonAccessoryQuantity = 0totalAmount = 0shippingCharges=0cartMessages=[]cartItems = []dealItems = []deals = {}bulkPricingMap ={}bulkPricingItems =[]if privateDealUser is not None and privateDealUser.isActive:deals = catalog_client.getAllActivePrivateDeals(itemIds, 0)bulkPricingMap = catalog_client.getBulkPricingForItems(itemIds)dealItems = deals.keys()bulkPricingItems = bulkPricingMap.keys()cart.total_price = 0itemsMap = catalog_client.getItems(itemIds)cartMessageChanged = 0cartMessageOOS = 0cartMessageUndeliverable = 0codAllowed = Truefor line in cart_lines:itemQuantityChanged=FalsecartItem={}tempBulkItemList = []old_estimate = line.estimateitem_id = line.item_iditem = itemsMap.get(item_id)#in case item is missing remove that lineif item is None or item.itemStatus==0:Discount.query.filter(Discount.line==line).delete()line.delete()continuecartItem['itemId']=line.item_idcartItem['quantity']=0cartItem['cartItemMessages']=[]cartItemMessages = cartItem['cartItemMessages']cartItem['color'] = item.colorcartItem['catalogItemId'] = item.catalogItemIdcartItem['packQuantity'] = item.packQuantitycartItem['minBuyQuantity'] = item.minimumBuyQuantitycartItem['quantityStep'] = item.quantityStepcartItem['bulkPricing'] = tempBulkItemListitem_shipping_info = catalog_client.isActive(item_id)if item_shipping_info.isActive:if item_shipping_info.isRisky and item_shipping_info.quantity < line.quantity:line.quantity = item_shipping_info.quantityitemQuantityChanged=TruecartItem['maxQuantity'] = min(item_shipping_info.quantity,100)if item.maximumBuyQuantity is not None and item.maximumBuyQuantity >0:cartItem['maxQuantity'] = min(item_shipping_info.quantity, item.maximumBuyQuantity)else:cartItem['maxQuantity'] =0if item_shipping_info.quantity < cartItem['minBuyQuantity']:cartItem['minBuyQuantity'] = item_shipping_info.quantityif line.quantity < cartItem['minBuyQuantity']:itemQuantityChanged=Trueline.quantity = cartItem['minBuyQuantity']if line.quantity > cartItem['maxQuantity']:itemQuantityChanged=Trueline.quantity = cartItem['maxQuantity']cartItem['quantity'] = line.quantitybulkPrice = NonesingleUnitPricing = Falseif item_id in bulkPricingItems:#Check quantity qualifies or notbulkPricingList = bulkPricingMap.get(item_id)bulkPricingList = sorted(bulkPricingList, key=lambda x: x.quantity, reverse=False)for pricingItems in bulkPricingList:if pricingItems.quantity ==1:singleUnitPricing = Trueif pricingItems.quantity <= line.quantity:bulkPrice = pricingItemstempBulkItemList.append({'quantity':pricingItems.quantity,'price':pricingItems.price})if item_id in dealItems:if not singleUnitPricing and item_id in bulkPricingItems:tempBulkItemList.append({'quantity':1,'price':deals[item_id].dealPrice})if bulkPrice is None:line.actual_price = deals[item_id].dealPriceelse:line.actual_price = bulkPrice.priceif deals[item_id].dealTextOption==0:line.dealText = ''if deals[item_id].dealTextOption==2:line.dealText = deals[item_id].dealTextif deals[item_id].dealFreebieOption==0:line.freebieId = 0if deals[item_id].dealFreebieOption==2:line.freebieId = deals[item_id].dealFreebieItemIdcartItem['dealText'] = line.dealTextelse:if not singleUnitPricing and item_id in bulkPricingItems:tempBulkItemList.append({'quantity':1,'price':item.sellingPrice})if bulkPrice is None:line.actual_price = item.sellingPriceelse:line.actual_price = bulkPrice.priceif item.bestDealText:cartItem['dealText'] = item.bestDealTextline.dealText = Noneline.freebieId = NonecartItem['sellingPrice'] = line.actual_pricetoRemove = []for dictbulkPricing in cartItem['bulkPricing']:if dictbulkPricing['quantity'] < cartItem['minBuyQuantity'] or dictbulkPricing['quantity'] > cartItem['maxQuantity']:toRemove.append(dictbulkPricing)for removePricing in toRemove:cartItem['bulkPricing'].remove(removePricing)cartItem['bulkPricing'] = sorted(cartItem['bulkPricing'], key=lambda k: k['quantity'],reverse=False)print "item_shipping_info", item_shipping_infoif item_shipping_info.isActive:cart.total_price = cart.total_price + (line.actual_price * line.quantity)try:item_delivery_estimate_tuple = logistics_client.getLogisticsEstimation(item_id, customer_pincode, DeliveryType.PREPAID)item_delivery_estimate = item_delivery_estimate_tuple.deliveryTimeprint "item_delivery_estimate", item_delivery_estimateif item_delivery_estimate:codAllowed = codAllowed and item_delivery_estimate_tuple.codAllowedexcept LogisticsServiceException:traceback.print_exc()item_delivery_estimate = -1#TODO Use the exception clause to set the retval appropriatelyexcept :traceback.print_exc()item_delivery_estimate = -1if item_delivery_estimate !=-1:inv_client = InventoryClient().get_client()itemAvailability = Nonetry:itemAvailability = inv_client.getItemAvailabilityAtLocation(item_id, 1, -1)except:passprint 'itemAvailability billling Warehouse ', itemAvailability[2]if itemAvailability is not None:billingWarehouse = Nonetry:billingWarehouse = inv_client.getWarehouse(itemAvailability[2])except:traceback.print_exc()passprint 'billingWarehouse Id Location ', billingWarehouse.stateIdif billingWarehouse is not None:estimateVal = Noneif not logistics_client.isAlive() :logistics_client = LogisticsClient().get_client()try:estimateVal = logistics_client.getFirstDeliveryEstimateForWhLocation(customer_pincode, billingWarehouse.logisticsLocation)if estimateVal ==-1:item_delivery_estimate =-1except:traceback.print_exc()passprint 'estimateVal Value ', estimateValcartItem['estimate'] = item_delivery_estimateif item_delivery_estimate == -1:Discount.query.filter(Discount.line==line).delete()line.delete()cartItem['quantity'] = 0cartMessageUndeliverable += 1cartItemMessages.append({"type":"danger", "messageText":"Undeliverable"})elif itemQuantityChanged:cartMessageChanged += 1cartItemMessages.append({"type":"danger", "messageText":"Only " + str(item_shipping_info.quantity) + " available"})if old_estimate != item_delivery_estimate:line.estimate = item_delivery_estimatecart.updated_on = current_timetotalAmount += line.actual_price * cartItem['quantity']else:cartItem['quantity'] = 0cartMessageOOS += 1cartItemMessages.append({"type":"danger", "messageText":"Out of Stock"})Discount.query.filter(Discount.line==line).delete()line.delete()totalQty += cartItem['quantity']if item.category in [10006, 10010]:nonAccessoryQuantity += cartItem['quantity']if cartItemMessages:cartItems.insert(0, cartItem)else:cartItems.append(cartItem)if cart.checked_out_on is not None:if cart.updated_on > cart.checked_out_on:cart.checked_out_on = Nonesession.commit()if cart.coupon_code is not None:try:promotion_client = PromotionClient().get_client()updated_cart = promotion_client.applyCoupon(cart.coupon_code, cart.id)if updated_cart.message is not None:emival = updated_cart.messageexcept PromotionException as ex:remove_coupon(cart.id)#retval = ex.messagesession.commit()cart = Cart.get_by(id=cartId)cart_lines = cart.linesinsurerFlag = Falsefor line in cart_lines:if line.insurer > 0 or line.dataProtectionInsurer > 0:line.insurer = 0line.insuranceAmount = 0line.dataProtectionInsurer = 0line.dataProtectionAmount = 0insurerFlag = Trueif insurerFlag:cart.updated_on = datetime.datetime.now()session.commit()session.close()responseMap['totalQty']= totalQtyresponseMap['totalAmount']= totalAmountif totalAmount < 1000:shippingCharges = 100responseMap['cartMessages']= cartMessagesresponseMap['cartItems']= cartItemsresponseMap['pincode']= customer_pincoderesponseMap['shippingCharge']=shippingChargesresponseMap['cartMessageChanged'] = cartMessageChangedresponseMap['cartMessageOOS'] = cartMessageOOSresponseMap['cartMessageUndeliverable'] = cartMessageUndeliverable##As of now no Cod is allowedresponseMap['codAllowed'] = Falseprint "responseMap", responseMapreturn json.dumps(responseMap)def validate_cart_plus(cart_id, source_id, couponCode):try:cart_messages = validate_cart(cart_id, source_id, couponCode)found_cart = Cart.get_by(id=cart_id)pincode = "110001"default_address_id = User.get_by(active_cart_id = cart_id).default_address_iddefault_address = Noneif found_cart.address_id is not None and found_cart.address_id > 0:pincode = Address.get_by(id=found_cart.address_id).pinelif default_address_id is not None:default_address = Address.get_by(id = default_address_id)pincode = default_address.pinneedInsuranceInfo = Falseif default_address_id is not None:for line in found_cart.lines:if line.insurer > 0:needInsuranceInfo = not is_insurance_detail_present(default_address_id)breakcartPlus = CartPlus()cartPlus.cart = to_t_cart(found_cart)cartPlus.pinCode = pincodecartPlus.validateCartMessages = cart_messagescartPlus.needInsuranceInfo = needInsuranceInforeturn cartPlusfinally:close_session()def close_session():if session.is_active:print "session is active. closing it."session.close()def set_wallet_amount_in_cart(cartId, wallet_amount):cart = Cart.get_by(id = cartId)if cart is None:raise ShoppingCartException(102, "The specified cart couldn't be found")if wallet_amount < 0:raise ShoppingCartException(103, "Wallet amount is negative")cart.wallet_amount = wallet_amountsession.commit()return Truedef add_item_pricing_to_cart(cartId, itemQtyPriceList):try:found_cart = Cart.get_by(id=cartId)#Get prices to validate should not be less than mopcurrent_time = datetime.datetime.now()if found_cart.lines:for line in found_cart.lines:Discount.query.filter(Discount.line==line).delete()line.delete()for itemQtyPrice in itemQtyPriceList:#This condition will ensure that cart is only persisted with non-zero quantities.if itemQtyPrice.qty==0:continueline = Line()line.cart = found_cartprint "itemQtyPrice.itemId-------", itemQtyPrice.itemIdline.item_id = itemQtyPrice.itemIdline.quantity = itemQtyPrice.qtyline.created_on = current_timeline.updated_on = current_timeline.line_status = LineStatus.LINE_ACTIVEline.insurer = 0line.insuranceAmount = 0line.actual_price = itemQtyPrice.pricefound_cart.coupon_code = Nonesession.commit()return Trueexcept:traceback.print_exc()return False