public ActionResult UpdateProductDetails(int productId, string itemType, int bundleItemId, FormCollection form) { int quantity = 1; int galleryStartIndex = -1; string galleryHtml = null; string dynamicThumbUrl = null; bool isAssociated = itemType.IsCaseInsensitiveEqual("associateditem"); var pictureModel = new ProductDetailsPictureModel(); var m = new ProductDetailsModel(); var product = _productService.GetProductById(productId); var bItem = _productService.GetBundleItemById(bundleItemId); IList<ProductBundleItemData> bundleItems = null; ProductBundleItemData bundleItem = (bItem == null ? null : new ProductBundleItemData(bItem)); var warnings = new List<string>(); var attributes = _productAttributeService.GetProductVariantAttributesByProductId(productId); string attributeXml = form.CreateSelectedAttributesXml(productId, attributes, _productAttributeParser, _localizationService, _downloadService, _catalogSettings, this.Request, warnings, true); var areAllAttributesForCombinationSelected = _shoppingCartService.AreAllAttributesForCombinationSelected(attributeXml, product); // quantity required for tier prices string quantityKey = form.AllKeys.FirstOrDefault(k => k.EndsWith("EnteredQuantity")); if (quantityKey.HasValue()) int.TryParse(form[quantityKey], out quantity); if (product.ProductType == ProductType.BundledProduct && product.BundlePerItemPricing) { bundleItems = _productService.GetBundleItems(product.Id); if (form.Count > 0) { foreach (var itemData in bundleItems) { var tempModel = _helper.PrepareProductDetailsPageModel(itemData.Item.Product, false, itemData, null, form); } } } // get merged model data _helper.PrepareProductDetailModel(m, product, isAssociated, bundleItem, bundleItems, form, quantity); if (bundleItem != null) // update bundle item thumbnail { if (!bundleItem.Item.HideThumbnail) { var picture = m.GetAssignedPicture(_pictureService, null, bundleItem.Item.ProductId); dynamicThumbUrl = _pictureService.GetPictureUrl(picture, _mediaSettings.BundledProductPictureSize, false); } } else if (isAssociated) // update associated product thumbnail { var picture = m.GetAssignedPicture(_pictureService, null, productId); dynamicThumbUrl = _pictureService.GetPictureUrl(picture, _mediaSettings.AssociatedProductPictureSize, false); } else if (product.ProductType != ProductType.BundledProduct) // update image gallery { var pictures = _pictureService.GetPicturesByProductId(productId); if (pictures.Count <= _catalogSettings.DisplayAllImagesNumber) // all pictures rendered... only index is required { var picture = m.GetAssignedPicture(_pictureService, pictures); galleryStartIndex = (picture == null ? 0 : pictures.IndexOf(picture)); } else { var allCombinationImageIds = new List<int>(); _productAttributeService .GetAllProductVariantAttributeCombinations(product.Id) .GetAllCombinationImageIds(allCombinationImageIds); _helper.PrepareProductDetailsPictureModel(pictureModel, pictures, product.GetLocalized(x => x.Name), allCombinationImageIds, false, bundleItem, m.CombinationSelected); galleryStartIndex = pictureModel.GalleryStartIndex; galleryHtml = this.RenderPartialViewToString("_PictureGallery", pictureModel); } } #region data object object data = new { Delivery = new { Id = 0, Name = m.DeliveryTimeName, Color = m.DeliveryTimeHexValue, DisplayAccordingToStock = m.DisplayDeliveryTimeAccordingToStock }, Measure = new { Weight = new { Value = m.WeightValue, Text = m.Weight }, Height = new { Value = product.Height, Text = m.Height }, Width = new { Value = product.Width, Text = m.Width }, Length = new { Value = product.Length, Text = m.Length } }, Number = new { Sku = new { Value = m.Sku, Show = m.ShowSku }, Gtin = new { Value = m.Gtin, Show = m.ShowGtin }, Mpn = new { Value = m.ManufacturerPartNumber, Show = m.ShowManufacturerPartNumber } }, Price = new { Base = new { Enabled = m.IsBasePriceEnabled, Info = m.BasePriceInfo }, Old = new { Value = decimal.Zero, Text = m.ProductPrice.OldPrice }, WithoutDiscount = new { Value = m.ProductPrice.PriceValue, Text = m.ProductPrice.Price }, WithDiscount = new { Value = m.ProductPrice.PriceWithDiscountValue, Text = m.ProductPrice.PriceWithDiscount } }, Stock = new { Quantity = new { Value = product.StockQuantity, Show = areAllAttributesForCombinationSelected ? product.DisplayStockQuantity : false }, Availability = new { Text = m.StockAvailability, Show = areAllAttributesForCombinationSelected ? product.DisplayStockAvailability : false, Available = m.IsAvailable } }, DynamicThumblUrl = dynamicThumbUrl, GalleryStartIndex = galleryStartIndex, GalleryHtml = galleryHtml }; #endregion return new JsonResult { Data = data }; }
public ActionResult AddProductToOrderDetails(int orderId, int productId, bool adjustInventory, bool? updateTotals, FormCollection form) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) return AccessDeniedView(); var order = _orderService.GetOrderById(orderId); var product = _productService.GetProductById(productId); //save order item //basic properties var unitPriceInclTax = decimal.Zero; decimal.TryParse(form["UnitPriceInclTax"], out unitPriceInclTax); var unitPriceExclTax = decimal.Zero; decimal.TryParse(form["UnitPriceExclTax"], out unitPriceExclTax); var quantity = 1; int.TryParse(form["Quantity"], out quantity); var priceInclTax = decimal.Zero; decimal.TryParse(form["SubTotalInclTax"], out priceInclTax); var priceExclTax = decimal.Zero; decimal.TryParse(form["SubTotalExclTax"], out priceExclTax); var warnings = new List<string>(); string attributes = ""; if (product.ProductType != ProductType.BundledProduct) { var variantAttributes = _productAttributeService.GetProductVariantAttributesByProductId(product.Id); attributes = form.CreateSelectedAttributesXml(product.Id, variantAttributes, _productAttributeParser, _localizationService, _downloadService, _catalogSettings, this.Request, warnings, false); } #region Gift cards string recipientName = ""; string recipientEmail = ""; string senderName = ""; string senderEmail = ""; string giftCardMessage = ""; if (product.IsGiftCard) { foreach (string formKey in form.AllKeys) { if (formKey.Equals("giftcard.RecipientName", StringComparison.InvariantCultureIgnoreCase)) { recipientName = form[formKey]; continue; } if (formKey.Equals("giftcard.RecipientEmail", StringComparison.InvariantCultureIgnoreCase)) { recipientEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderName", StringComparison.InvariantCultureIgnoreCase)) { senderName = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderEmail", StringComparison.InvariantCultureIgnoreCase)) { senderEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.Message", StringComparison.InvariantCultureIgnoreCase)) { giftCardMessage = form[formKey]; continue; } } attributes = _productAttributeParser.AddGiftCardAttribute(attributes, recipientName, recipientEmail, senderName, senderEmail, giftCardMessage); } #endregion //warnings warnings.AddRange(_shoppingCartService.GetShoppingCartItemAttributeWarnings(order.Customer, ShoppingCartType.ShoppingCart, product, attributes, quantity)); warnings.AddRange(_shoppingCartService.GetShoppingCartItemGiftCardWarnings(ShoppingCartType.ShoppingCart, product, attributes)); if (warnings.Count == 0) { //attributes string attributeDescription = _productAttributeFormatter.FormatAttributes(product, attributes, order.Customer); //save item var orderItem = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = product.Id, UnitPriceInclTax = unitPriceInclTax, UnitPriceExclTax = unitPriceExclTax, PriceInclTax = priceInclTax, PriceExclTax = priceExclTax, AttributeDescription = attributeDescription, AttributesXml = attributes, Quantity = quantity, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ProductCost = _priceCalculationService.GetProductCost(product, attributes) }; if (product.ProductType == ProductType.BundledProduct) { var listBundleData = new List<ProductBundleItemOrderData>(); var bundleItems = _productService.GetBundleItems(product.Id); foreach (var bundleItem in bundleItems) { decimal taxRate; decimal finalPrice = _priceCalculationService.GetFinalPrice(bundleItem.Item.Product, bundleItems, order.Customer, decimal.Zero, true, bundleItem.Item.Quantity); decimal bundleItemSubTotalWithDiscountBase = _taxService.GetProductPrice(bundleItem.Item.Product, finalPrice, out taxRate); bundleItem.ToOrderData(listBundleData, bundleItemSubTotalWithDiscountBase); } orderItem.SetBundleData(listBundleData); } order.OrderItems.Add(orderItem); _orderService.UpdateOrder(order); //gift cards if (product.IsGiftCard) { for (int i = 0; i < orderItem.Quantity; i++) { var gc = new GiftCard() { GiftCardType = product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = unitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = recipientName, RecipientEmail = recipientEmail, SenderName = senderName, SenderEmail = senderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardService.InsertGiftCard(gc); } } if (adjustInventory || (updateTotals ?? false)) { var context = new AutoUpdateOrderItemContext() { IsNewOrderItem = true, OrderItem = orderItem, QuantityOld = 0, QuantityNew = orderItem.Quantity, AdjustInventory = adjustInventory, UpdateTotals = (updateTotals ?? false) }; _orderProcessingService.AutoUpdateOrderDetails(context); TempData[AutoUpdateOrderItemContext.InfoKey] = context.ToString(_localizationService); } //redirect to order details page return RedirectToAction("Edit", "Order", new { id = order.Id }); } else { //errors var model = PrepareAddProductToOrderModel(order.Id, product.Id); model.Warnings.AddRange(warnings); return View(model); } }