/// <summary> /// Calculates gift wrap charges for the given basket /// </summary> /// <param name="basket">The basket for which to perform calculations</param> public static void Calculate(Basket basket) { //DELETE ANY GIFTWRAP ITEMS CURRENTLY IN THE BASKET Database database = Token.Instance.Database; DbCommand command = database.GetSqlStringCommand("DELETE FROM ac_BasketItems WHERE BasketId = @basketId AND OrderItemTypeId = @orderItemType"); database.AddInParameter(command, "@basketId", System.Data.DbType.Int32, basket.BasketId); database.AddInParameter(command, "@orderItemType", System.Data.DbType.Int16, OrderItemType.GiftWrap); database.ExecuteNonQuery(command); //LOOP BASKET ITEMS IN REVERSE, REMOVING ANY THAT MATCH GIFTWRAP TYPE for (int i = (basket.Items.Count - 1); i >= 0; i--) { if (basket.Items[i].OrderItemType == OrderItemType.GiftWrap) { basket.Items.RemoveAt(i); } } //LOOP BASKET ITEMS AND ADD GIFTWRAP ITEMS AS NEEDED List <BasketItem> wrapItemList = new List <BasketItem>(); foreach (BasketItem parentItem in basket.Items) { //CHECK WHETHER THIS ITEM HAS GIFTWRAP if (parentItem.WrapStyle != null) { //ADD A NEW ITEM FOR GIFTWRAP BasketItem wrapItem = new BasketItem(); wrapItem.BasketId = basket.BasketId; wrapItem.ParentItemId = parentItem.BasketItemId; wrapItem.BasketShipmentId = parentItem.BasketShipmentId; wrapItem.OrderItemType = OrderItemType.GiftWrap; wrapItem.Name = parentItem.WrapStyle.Name; wrapItem.Quantity = parentItem.Quantity; wrapItem.Price = parentItem.WrapStyle.Price; wrapItem.TaxCodeId = parentItem.WrapStyle.TaxCodeId; wrapItem.Shippable = parentItem.Shippable; wrapItem.Save(); wrapItemList.Add(wrapItem); } } //NOW ADD NEW ITEMS TO BASKET basket.Items.AddRange(wrapItemList); }
/// <summary> /// Recalculates all items in the basket, for example price and kit member products /// </summary> internal void Recalculate() { // BUILD A LIST OF ANY CHILD (GENERATED) PRODUCTS List <int> childItemIds = new List <int>(); List <BasketItem> childProducts = new List <BasketItem>(); foreach (BasketItem item in this) { if (item.OrderItemType == OrderItemType.Product && item.IsChildItem) { childItemIds.Add(item.BasketItemId); childProducts.Add(item); } } // MOVE THROUGH THE COLLECTION AND REMOVE ANY ITEMS ASSOCIATED WITH A CHILD ITEM for (int i = this.Count - 1; i >= 0; i--) { BasketItem item = this[i]; List <int> childPath = item.GetPath(); if (IsChildItemInPath(childItemIds, childPath)) { if (item.OrderItemType == OrderItemType.Product) { this.RemoveAt(i); } else { this.DeleteAt(i); } } } // LOOP EACH REMAINING ITEM AND RECALCULATE int currentCount = this.Count; for (int i = 0; i < currentCount; i++) { BasketItem basketItem = this[i]; Basket basket = basketItem.Basket; int userId = (basket == null ? Token.Instance.UserId : basket.UserId); // WE ONLY NEED TO CHECK PRODUCTS, NON-PRODUCT ITEMS HAVE NO RECALCULATION TASKS if (basketItem.OrderItemType == OrderItemType.Product) { // IF WE HAVE A KIT, WE MUST REFRESH ANY CONFIGURED KIT OPTIONS bool isKit = (basketItem.Product.KitStatus == KitStatus.Master); if (isKit) { basketItem.KitList = basketItem.Product.Kit.RefreshKitProducts(basketItem.KitList); } // RECALCULATE THE STARTING SKU/PRICE/WEIGHT FOR THIS ITEM ProductCalculator pcalc = ProductCalculator.LoadForProduct(basketItem.ProductId, basketItem.Quantity, basketItem.OptionList, basketItem.KitList, userId); basketItem.Sku = pcalc.Sku; basketItem.Weight = pcalc.Weight; if (isKit || !basketItem.Product.UseVariablePrice) { // KITS AND NONVARIABLE PRICED PRODUCTS MUST HAVE PRICE RECALCULATED basketItem.Price = pcalc.Price; } basketItem.Save(); // REGENERATE THE KIT ITEMS FOR THIS ITEM if (basket != null && isKit) { // OBTAIN THE KIT PRODUCTS THAT ARE SELECTED RATHER THAN INCLUDED int[] kitProductIds = AlwaysConvert.ToIntArray(basketItem.KitList); if (kitProductIds != null && kitProductIds.Length > 0) { //keep track of the price/weight of the master line item //decrement these values for each line item registered LSDecimal masterPrice = basketItem.Price; LSDecimal masterWeight = basketItem.Weight; foreach (int kitProductId in kitProductIds) { KitProduct kitProduct = KitProductDataSource.Load(kitProductId); if (kitProduct != null && kitProduct.KitComponent.InputType != KitInputType.IncludedHidden) { // WE WANT TO GENERATE BASKET RECORDS FOR ALL ITEMS *EXCEPT* INCLUDED HIDDEN ITEMS // INCLUDED HIDDEN ITEMS ARE TREATED AS PART OF THE MAIN PRODUCT AND ARE NOT GENERATED // UNTIL THE ORDER IS FINALIZED Product product = kitProduct.Product; BasketItem searchItem = new BasketItem(); searchItem.BasketId = basket.BasketId; searchItem.OrderItemType = OrderItemType.Product; searchItem.ParentItemId = basketItem.BasketItemId; searchItem.ProductId = product.ProductId; searchItem.OptionList = kitProduct.OptionList; searchItem.BasketShipmentId = basketItem.BasketShipmentId; // LOOK FOR ITEM BasketItem childItem = FindChildProduct(childProducts, searchItem); // UPDATE CALCULATED PROPERTIES childItem.Name = kitProduct.DisplayName; childItem.Quantity = (short)(kitProduct.Quantity * basketItem.Quantity); childItem.TaxCodeId = product.TaxCodeId; childItem.Shippable = product.Shippable; childItem.Price = kitProduct.CalculatedPrice / kitProduct.Quantity;; childItem.Weight = kitProduct.CalculatedWeight / kitProduct.Quantity; // CALCULATE SKU ProductCalculator childCalc = ProductCalculator.LoadForProduct(childItem.ProductId, childItem.Quantity, childItem.OptionList, childItem.KitList, basket.UserId); childItem.Sku = childCalc.Sku; basket.Items.Add(childItem); childItem.Save(); masterPrice -= kitProduct.CalculatedPrice; masterWeight -= kitProduct.CalculatedWeight; } } // UPDATE MASTER PRICE, FACTORING IN CHILD ITEMS basketItem.Price = masterPrice; basketItem.Weight = masterWeight; basketItem.Save(); } } } } // DELETE ANY CHILD PRODUCTS THAT WERE NOT PRESERVED foreach (BasketItem bi in childProducts) { bi.Delete(); } }