private OrderDetailsModel.OrderItemModel PrepareOrderItemModel(Order order, OrderItem orderItem) { orderItem.Product.MergeWithCombination(orderItem.AttributesXml); var model = new OrderDetailsModel.OrderItemModel() { Id = orderItem.Id, Sku = orderItem.Product.Sku, ProductId = orderItem.Product.Id, ProductName = orderItem.Product.GetLocalized(x => x.Name), ProductSeName = orderItem.Product.GetSeName(), ProductType = orderItem.Product.ProductType, Quantity = orderItem.Quantity, AttributeInfo = orderItem.AttributeDescription }; var quantityUnit = _quantityUnitService.GetQuantityUnitById(orderItem.Product.QuantityUnitId); model.QuantityUnit = quantityUnit == null ? "" : quantityUnit.GetLocalized(x => x.Name); if (orderItem.Product.ProductType == ProductType.BundledProduct && orderItem.BundleData.HasValue()) { var bundleData = orderItem.GetBundleData(); model.BundlePerItemPricing = orderItem.Product.BundlePerItemPricing; model.BundlePerItemShoppingCart = bundleData.Any(x => x.PerItemShoppingCart); foreach (var bundleItem in bundleData) { var bundleItemModel = new OrderDetailsModel.BundleItemModel() { Sku = bundleItem.Sku, ProductName = bundleItem.ProductName, ProductSeName = bundleItem.ProductSeName, VisibleIndividually = bundleItem.VisibleIndividually, Quantity = bundleItem.Quantity, DisplayOrder = bundleItem.DisplayOrder, AttributeInfo = bundleItem.AttributesInfo }; if (model.BundlePerItemShoppingCart) { decimal priceWithDiscount = _currencyService.ConvertCurrency(bundleItem.PriceWithDiscount, order.CurrencyRate); bundleItemModel.PriceWithDiscount = _priceFormatter.FormatPrice(priceWithDiscount, true, order.CustomerCurrencyCode, _services.WorkContext.WorkingLanguage, false, false); } model.BundleItems.Add(bundleItemModel); } } //unit price, subtotal switch (order.CustomerTaxDisplayType) { case TaxDisplayType.ExcludingTax: { var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate); model.UnitPrice = _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _services.WorkContext.WorkingLanguage, false, false); var priceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.PriceExclTax, order.CurrencyRate); model.SubTotal = _priceFormatter.FormatPrice(priceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _services.WorkContext.WorkingLanguage, false, false); } break; case TaxDisplayType.IncludingTax: { var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate); model.UnitPrice = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _services.WorkContext.WorkingLanguage, true, false); var priceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.PriceInclTax, order.CurrencyRate); model.SubTotal = _priceFormatter.FormatPrice(priceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _services.WorkContext.WorkingLanguage, true, false); } break; } return model; }
/// <summary> /// Adjusts inventory /// </summary> /// <param name="orderItem">Order item</param> /// <param name="decrease">A value indicating whether to increase or descrease product stock quantity</param> /// <param name="quantity">Quantity</param> /// <returns>Adjust inventory result</returns> public virtual AdjustInventoryResult AdjustInventory(OrderItem orderItem, bool decrease, int quantity) { if (orderItem == null) throw new ArgumentNullException("orderItem"); if (orderItem.Product.ProductType == ProductType.BundledProduct && orderItem.Product.BundlePerItemShoppingCart) { if (orderItem.BundleData.HasValue()) { var bundleData = orderItem.GetBundleData(); if (bundleData.Count > 0) { var products = GetProductsByIds(bundleData.Select(x => x.ProductId).ToArray()); foreach (var item in bundleData) { var product = products.FirstOrDefault(x => x.Id == item.ProductId); if (product != null) AdjustInventory(product, decrease, quantity * item.Quantity, item.AttributesXml); } } } return new AdjustInventoryResult(); } else { return AdjustInventory(orderItem.Product, decrease, quantity, orderItem.AttributesXml); } }