protected void Page_PreRender(object sender, EventArgs e)
        {
            foreach (RepeaterItem ri in SelectedProductRepeater.Items)
            {
                HiddenField pid       = (HiddenField)ri.FindControl("PID");
                int         productId = AlwaysConvert.ToInt(pid.Value);
                Product     p         = ProductDataSource.Load(productId);
                if (p != null && p.ProductOptions.Count > 0)
                {
                    Dictionary <int, int> selectedOptions = GetSelectedOptions(ri.ItemIndex);
                    bool              allOptionsSelected  = (selectedOptions.Count == p.ProductOptions.Count);
                    string            optionList          = ProductVariantDataSource.GetOptionList(p.Id, selectedOptions, true);
                    ProductCalculator pcalc        = ProductCalculator.LoadForProduct(p.Id, 1, optionList, string.Empty);
                    Literal           productPrice = (Literal)ri.FindControl("ProductPrice");
                    productPrice.Text = pcalc.Price.LSCurrencyFormat("lc");
                    if (allOptionsSelected)
                    {
                        ProductVariant pv = ProductVariantDataSource.LoadForOptionList(p.Id, optionList);
                        if (pv != null && !pv.Available)
                        {
                            HtmlTableRow trInvalidVariant = (HtmlTableRow)ri.FindControl("trInvalidVariant");
                            if (trInvalidVariant != null)
                            {
                                trInvalidVariant.Visible = true;
                            }
                        }
                    }
                }
            }

            // SAVE THE CUSTOM VIEWSTATE
            SaveCustomViewState();
        }
Beispiel #2
0
            private string GetInventoryMessage(string optionlist)
            {
                string message = string.Empty;
                Label  label   = new Label();

                if (!string.IsNullOrEmpty(optionlist) && showInventoryMessage)
                {
                    ProductVariant variant          = ProductVariantDataSource.LoadForOptionList(productId, optionlist);
                    Product        _Product         = ProductDataSource.Load(productId);
                    bool           inventoryEnabled = _Product.InventoryMode == InventoryMode.Variant && !_Product.AllowBackorder;
                    if (inventoryEnabled)
                    {
                        if (variant.InStock > 0)
                        {
                            string inStockformat  = AbleContext.Current.Store.Settings.InventoryInStockMessage;
                            string inStockMessage = string.Format(inStockformat, variant.InStock);
                            message = inStockMessage;
                        }
                        else if (!variant.Available || variant.InStock <= 0)
                        {
                            string outOfStockformat  = AbleContext.Current.Store.Settings.InventoryOutOfStockMessage;
                            string outOfStockMessage = string.Format(outOfStockformat, variant.InStock);
                            message = outOfStockMessage;

                            if (variant != null && variant.AvailabilityDate.HasValue && variant.AvailabilityDate >= LocaleHelper.LocalNow)
                            {
                                string availabilityMessageFormat = AbleContext.Current.Store.Settings.InventoryAvailabilityMessage;
                                string availabilityMessage       = string.Format(availabilityMessageFormat, variant.AvailabilityDate.Value.ToShortDateString());
                                message += availabilityMessage;
                            }
                        }
                    }
                }
                return(string.Format("<span class='errorCondition'>{0}</span>", message));
            }
        protected void SaveButton_Click(object sender, EventArgs e)
        {
            short quantity = AlwaysConvert.ToInt16(KitQuantity.Text);

            if (quantity > 0)
            {
                ProductVariant productVariant = null;
                if (_KitProduct.Product.ProductOptions.Count > 0)
                {
                    productVariant = ProductVariantDataSource.LoadForOptionList(_KitProduct.Product.Id, selectedOptions);
                }
                if (productVariant != null)
                {
                    _KitProduct.OptionList = productVariant.OptionList;
                }
                _KitProduct.Name         = DisplayName.Text;
                _KitProduct.Quantity     = quantity;
                _KitProduct.PriceModeId  = AlwaysConvert.ToByte(PriceMode.SelectedIndex);
                _KitProduct.Price        = AlwaysConvert.ToDecimal(Price.Text);
                _KitProduct.WeightModeId = AlwaysConvert.ToByte(WeightMode.SelectedIndex);
                _KitProduct.Weight       = AlwaysConvert.ToDecimal(Weight.Text);
                _KitProduct.IsSelected   = IsSelected.Checked;
                _KitProduct.Save();
            }
            Response.Redirect(string.Format("EditKit.aspx?CategoryId={0}&ProductId={1}", _CategoryId, _ProductId));
        }
Beispiel #4
0
        private bool isVariantInvalid(WishlistItem item)
        {
            if (item.Product.ProductOptions.Count > 0)
            {
                ProductVariant v = ProductVariantDataSource.LoadForOptionList(item.Product.Id, item.OptionList);
                if (v == null || !v.Available)
                {
                    return(true);
                }
            }

            return(false);
        }
        protected void ShowProductForm(Product product)
        {
            if (product.IsSubscription)
            {
                if (product.SubscriptionPlan.IsRecurring && product.SubscriptionPlan.PaymentFrequencyType == PaymentFrequencyType.Optional)
                {
                    string value = Request.Form[AutoDeliveryInterval.UniqueID];
                    BindAutoDelieveryOptions(product);

                    if (!string.IsNullOrEmpty(value))
                    {
                        ListItem item = AutoDeliveryInterval.Items.FindByValue(value);
                        if (item != null)
                        {
                            item.Selected = true;
                        }
                    }
                }
                else
                {
                    AutoDeliveryPH.Visible = false;
                }

                OptionalSubscription.Visible = product.SubscriptionPlan.IsOptional;
            }
            else
            {
                trSubscriptionRow.Visible = false;
            }

            AddPopup.Show();
            //SET NAME AND PRICE
            AddProductName.Text = product.Name;
            // SET QUANTITY TO ONE IF NOT SPECIFIED
            if (string.IsNullOrEmpty(AddProductQuantity.Text) || AddProductQuantity.Text == "0")
            {
                AddProductQuantity.Text = "1";
            }
            AddProductId.Value = product.Id.ToString();
            //BUILD PRODUCT ATTRIBUTES
            _SelectedOptions = AbleCommerce.Code.ProductHelper.BuildProductOptions(product, phOptions, true);
            //BUILD PRODUCT CHOICES
            AbleCommerce.Code.ProductHelper.BuildProductChoices(product, phOptions);
            //BUILD KIT OPTIONS, IGNORING INVENTORY
            _SelectedKitProducts = AbleCommerce.Code.ProductHelper.BuildKitOptions(product, phOptions, true);
            //SET PRICE
            string optionList = ProductVariantDataSource.GetOptionList(product.Id, _SelectedOptions, true);

            // IF ALL OPTIONS HAVE A VALUE SELECTED, SHOW THE BASKET CONTROLS
            AddProductSaveButton.Visible = (_SelectedOptions.Count == product.ProductOptions.Count);
        }
        /// <summary>
        /// Triggers the low inventory item purchased event.
        /// </summary>
        /// <param name="products">dctionary of product ids and respective variants</param>
        public static void LowInventoryItemPurchased(Dictionary <int, string> products)
        {
            if (products != null && products.Count > 0)
            {
                List <Product>           productCollection = new List <Product>();
                List <ProductVariant>    variantCollection = new List <ProductVariant>();
                List <Vendor>            vendorsCollection = new List <Vendor>();
                Dictionary <int, Vendor> vendors           = new Dictionary <int, Vendor>();

                foreach (int productId in products.Keys)
                {
                    if (String.IsNullOrEmpty(products[productId]))
                    {
                        // ONLY INCLUDE PRODUCTS WITHOUT VARIANT INFORMATION
                        Product p = ProductDataSource.Load(productId);
                        if (p != null)
                        {
                            productCollection.Add(p);
                            if (p.Vendor != null && !vendors.ContainsKey(p.Vendor.VendorId))
                            {
                                vendors.Add(p.Vendor.VendorId, p.Vendor);
                            }
                        }
                    }
                    else
                    {
                        ProductVariant v = ProductVariantDataSource.LoadForOptionList(productId, products[productId]);
                        if (v != null)
                        {
                            variantCollection.Add(v);
                            if (v.Product.Vendor != null && !vendors.ContainsKey(v.Product.Vendor.VendorId))
                            {
                                vendors.Add(v.Product.Vendor.VendorId, v.Product.Vendor);
                            }
                        }
                    }
                }

                foreach (Vendor vendor in vendors.Values)
                {
                    vendorsCollection.Add(vendor);
                }

                Hashtable parameters = new Hashtable();
                parameters["products"] = productCollection.ToArray();
                parameters["variants"] = variantCollection.ToArray();
                parameters["vendors"]  = vendorsCollection.ToArray();
                ProcessEmails(StoreEvent.LowInventoryItemPurchased, parameters);
            }
        }
Beispiel #7
0
        private void UpdateInventory(bool sendEmails)
        {
            foreach (GridViewRow row in InventoryGrid.Rows)
            {
                int dataItemIndex = row.DataItemIndex;
                dataItemIndex = (dataItemIndex - (InventoryGrid.PageSize * InventoryGrid.PageIndex));
                int     productId        = (int)InventoryGrid.DataKeys[dataItemIndex].Values[0];
                int     productVariantId = AlwaysConvert.ToInt(InventoryGrid.DataKeys[dataItemIndex].Values[1].ToString());
                int     inStock          = GetControlValue(row, "InStock");
                int     lowStock         = GetControlValue(row, "LowStock");
                TextBox availDate        = (TextBox)row.FindControl("AvailabilityDate");
                Product product          = ProductDataSource.Load(productId);

                if (productVariantId.Equals(0))
                {
                    product.InStock             = inStock;
                    product.InStockWarningLevel = lowStock;
                    product.AvailabilityDate    = LocaleHelper.ToLocalTime(AlwaysConvert.ToDateTime(availDate.Text, DateTime.MinValue));
                    product.Save();

                    if (sendEmails && product.InStock > 0)
                    {
                        RestockNotify(sendEmails, product, null);
                    }
                }
                else
                {
                    ProductVariant variant = ProductVariantDataSource.Load(productVariantId);
                    variant.InStock             = inStock;
                    variant.InStockWarningLevel = lowStock;
                    variant.AvailabilityDate    = LocaleHelper.ToLocalTime(AlwaysConvert.ToDateTime(availDate.Text, DateTime.MinValue));
                    variant.Save();

                    if (sendEmails && variant.InStock > 0)
                    {
                        RestockNotify(sendEmails, product, variant);
                    }
                }
            }
            SavedMessage.Text    = string.Format(SavedMessage.Text, DateTime.Now);
            SavedMessage.Visible = true;
            InventoryGrid.DataBind();
        }
        protected IList <OrderItem> GetOrderItems()
        {
            //GET THE PRODUCT ID
            int     productId = AlwaysConvert.ToInt(HiddenProductId.Value);
            Product product   = ProductDataSource.Load(productId);

            if (product == null)
            {
                return(null);
            }
            //GET THE QUANTITY
            short tempQuantity = AlwaysConvert.ToInt16(Quantity.Text);

            if (tempQuantity < 1)
            {
                return(null);
            }
            if (tempQuantity > System.Int16.MaxValue)
            {
                tempQuantity = System.Int16.MaxValue;
            }

            //RECALCULATE SELECTED KIT OPTIONS
            GetSelectedKitOptions(product);
            // DETERMINE THE OPTION LIST
            string optionList = ProductVariantDataSource.GetOptionList(productId, _SelectedOptions, false);
            //CREATE THE BASKET ITEM WITH GIVEN OPTIONS

            IList <OrderItem> orderItems = OrderItemDataSource.CreateForProduct(productId, tempQuantity, optionList, AlwaysConvert.ToList(",", _SelectedKitProducts));

            if (orderItems.Count > 0)
            {
                // COLLECT ANY ADDITIONAL INPUTS FOR BASE ITEM
                AbleCommerce.Code.ProductHelper.CollectProductTemplateInput(orderItems[0], phOptions);

                // UPADATE THE PRICE OF BASE ITEM IF NEEDED ( KIT PRICE WILL NOT BE MODIFIED)
                if (orderItems[0].Price != AlwaysConvert.ToDecimal(Price.Text) && (product.KitStatus != KitStatus.Master))
                {
                    orderItems[0].Price = AlwaysConvert.ToDecimal(Price.Text);
                }
            }
            return(orderItems);
        }
        protected void Price_PreRender(object sender, EventArgs e)
        {
            int     productId = AlwaysConvert.ToInt(HiddenProductId.Value);
            Product product   = ProductDataSource.Load(productId);

            if (product != null)
            {
                //GET THE SELECTED KIT OPTIONS
                GetSelectedKitOptions(product);
            }
            //SET THE CURRENT CALCULATED PRICE
            string            optionList = ProductVariantDataSource.GetOptionList(productId, _SelectedOptions, true);
            ProductCalculator pcalc      = ProductCalculator.LoadForProduct(productId, 1, optionList, AlwaysConvert.ToList(",", _SelectedKitProducts));

            Price.Text = string.Format("{0:F2}", pcalc.Price);

            if (product.UseVariablePrice)
            {
                string varPriceText = string.Empty;
                if (product.MinimumPrice > 0)
                {
                    if (product.MaximumPrice > 0)
                    {
                        varPriceText = string.Format("(between {0} and {1})", product.MinimumPrice.LSCurrencyFormat("lcf"), product.MaximumPrice.LSCurrencyFormat("lcf"));
                    }
                    else
                    {
                        varPriceText = string.Format("(at least {0})", product.MinimumPrice.LSCurrencyFormat("lcf"));
                    }
                }
                else if (product.MaximumPrice > 0)
                {
                    varPriceText = string.Format("({0} maximum)", product.MaximumPrice.LSCurrencyFormat("lcf"));
                }
                phVariablePrice.Controls.Add(new LiteralControl(varPriceText));
            }

            // CHANGING PRODUCT PRICE OPTION SHOULD NOT AVAILABLE FOR KIT PRODUCTS
            Price.Enabled = (product.KitStatus != KitStatus.Master);

            InventoryAlertUpdate();
        }
Beispiel #10
0
        protected void VariantGrid_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                bool           inventoryEnabled  = _Product.InventoryMode == InventoryMode.Variant && !_Product.AllowBackorder;
                string         optionList        = DataBinder.Eval(e.Row.DataItem, "OptionList").ToString();
                ProductVariant variant           = ProductVariantDataSource.LoadForOptionList(_ProductId, optionList);
                Control        addToBasketButton = e.Row.FindControl("AddToBasketButton");
                Control        notificationLink  = e.Row.FindControl("NotificationLink");

                if (inventoryEnabled && (!variant.Available || (variant.InStock <= 0)) &&
                    ShowInventoryMessage && addToBasketButton != null)
                {
                    addToBasketButton.Visible = false;
                }

                bool isAvailabilityDateSpecified = (variant.AvailabilityDate.HasValue && variant.AvailabilityDate >= LocaleHelper.LocalNow);
                if (notificationLink != null)
                {
                    notificationLink.Visible = !addToBasketButton.Visible && isAvailabilityDateSpecified && variant.Product.EnableRestockNotifications;
                }
            }
        }
Beispiel #11
0
        /// <summary>
        /// Creates a basket item for a product
        /// </summary>
        /// <param name="productId">Id of the product for which to create the basket item</param>
        /// <param name="quantity">The quantity of basket item</param>
        /// <param name="optionList">List of option ids for the variant</param>
        /// <param name="kitList">List of product Ids of the kit items</param>
        /// <param name="userId">The user Id</param>
        /// <returns>The BasketItem created</returns>
        public static BasketItem CreateForProduct(int productId, short quantity, string optionList, string kitList, int userId)
        {
            // vALIDATE PARAMETERS
            Product product = ProductDataSource.Load(productId);

            if (product == null)
            {
                throw new ArgumentException("invalid product specified", "product");
            }
            if (quantity < 1)
            {
                throw new ArgumentException("quantity must be greater than 0", "quantity");
            }
            if (!string.IsNullOrEmpty(optionList))
            {
                ProductVariant v = ProductVariantDataSource.LoadForOptionList(productId, optionList);
                if (v == null)
                {
                    throw new ArgumentException("specified product options are invalid", "optionList");
                }
            }
            if (product.KitStatus == KitStatus.Master)
            {
                Kit kit = product.Kit;
                if (!kit.ValidateChoices(kitList))
                {
                    throw new ArgumentException("specified kit configuration is invalid", "kitProductIds");
                }
            }

            //GET THE QUANTITY
            short tempQuantity   = quantity;
            short basketQuantity = GetExistingBasketCount(product);

            if ((product.MinQuantity > 0) && ((tempQuantity + basketQuantity) < product.MinQuantity))
            {
                tempQuantity = (short)(product.MinQuantity - basketQuantity);
            }


            if ((product.MaxQuantity > 0) && ((tempQuantity + basketQuantity) > product.MaxQuantity))
            {
                tempQuantity = (short)(product.MaxQuantity - basketQuantity);
            }


            if (tempQuantity < 1)
            {
                return(null);
            }
            quantity = tempQuantity;

            BasketItem item = new BasketItem();
            //CALCULATE THE PRICE OF THE PRODUCT
            ProductCalculator pcalc = ProductCalculator.LoadForProduct(productId, quantity, optionList, kitList, userId);

            item.Sku    = pcalc.Sku;
            item.Price  = pcalc.Price;
            item.Weight = pcalc.Weight;
            //SET VALUES COMMON TO ALL BASKET ITEMS
            item.TaxCodeId     = product.TaxCodeId;
            item.Name          = product.Name;
            item.Quantity      = quantity;
            item.OrderItemType = CommerceBuilder.Orders.OrderItemType.Product;
            item.Shippable     = product.Shippable;
            item.ProductId     = productId;
            item.OptionList    = optionList;
            item.KitList       = kitList;

            // COPY MERCHANT INPUT FIELDS, PRODUCT TEMPLATE FIELDS
            foreach (ProductTemplateField tf in product.TemplateFields)
            {
                if (!string.IsNullOrEmpty(tf.InputValue))
                {
                    InputField field = tf.InputField;
                    if (field.IsMerchantField && field.PersistWithOrder)
                    {
                        BasketItemInput itemInput = new BasketItemInput();
                        itemInput.BasketItemId = item.BasketItemId;
                        itemInput.InputFieldId = tf.InputFieldId;
                        itemInput.InputValue   = tf.InputValue;
                        item.Inputs.Add(itemInput);
                    }
                }
            }


            return(item);
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Product != null)
            {
                string checkImage         = this.ShowImage.ToLowerInvariant();
                string calculatedImageUrl = string.Empty;
                string imageAltText       = string.Empty;
                string optionList         = Request.QueryString["Options"];

                ProductVariant variant = null;
                if (!string.IsNullOrEmpty(optionList))
                {
                    variant = ProductVariantDataSource.LoadForOptionList(Product.Id, optionList);
                }

                if (checkImage == "icon")
                {
                    if (variant != null && !string.IsNullOrEmpty(variant.IconUrl))
                    {
                        calculatedImageUrl = variant.IconUrl;
                        imageAltText       = Product.IconAltText;
                    }
                    else if (!string.IsNullOrEmpty(Product.IconUrl))
                    {
                        calculatedImageUrl = Product.IconUrl;
                        imageAltText       = Product.IconAltText;
                    }
                    else
                    {
                        NoIcon.Visible = true;
                    }
                }
                else if (checkImage == "thumbnail")
                {
                    if (variant != null && !string.IsNullOrEmpty(variant.ThumbnailUrl))
                    {
                        calculatedImageUrl = variant.ThumbnailUrl;
                        imageAltText       = Product.ThumbnailAltText;
                    }
                    else if (!string.IsNullOrEmpty(Product.ThumbnailUrl))
                    {
                        calculatedImageUrl = Product.ThumbnailUrl;
                        imageAltText       = Product.ThumbnailAltText;
                    }
                    else
                    {
                        NoThumbnail.Visible = true;
                    }
                }
                else
                {
                    if (variant != null && !string.IsNullOrEmpty(variant.ImageUrl))
                    {
                        calculatedImageUrl = variant.ImageUrl;
                        imageAltText       = Product.ImageAltText;
                    }
                    else if (!string.IsNullOrEmpty(Product.ImageUrl))
                    {
                        calculatedImageUrl = Product.ImageUrl;
                        imageAltText       = Product.ImageAltText;
                    }
                    else
                    {
                        NoImage.Visible = true;
                    }
                }
                if (!string.IsNullOrEmpty(calculatedImageUrl))
                {
                    // check if it is an absolute URL, then do not try to resize
                    if (calculatedImageUrl.ToLowerInvariant().StartsWith("http"))
                    {
                        this.ProductImage.ImageUrl = calculatedImageUrl;
                    }
                    else
                    {
                        this.ProductImage.ImageUrl = string.Format("~/GetImage.ashx?Path={0}&maintainAspectRatio=true", Server.UrlEncode(calculatedImageUrl));
                    }
                    this.ProductImage.AlternateText = Server.HtmlEncode(imageAltText);
                    ProductImageUrl.Attributes.Add("rel", "gallery");
                    this.ProductImageUrl.HRef    = GetLargeImageUrl(calculatedImageUrl);
                    this.ProductImageUrl.Title   = Server.HtmlEncode(imageAltText);
                    this.ProductImageUrl.Visible = true;
                }
                else
                {
                    this.ProductImage.Visible    = false;
                    this.ProductImageUrl.Visible = false;
                }
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered("JQUERY_FANCY_BOX_JS_CSS"))
            {
                this.Page.Header.Controls.Add(new LiteralControl("<link href='" + Page.ResolveUrl("~/scripts/fancybox/") + "jquery.fancybox.css' rel='stylesheet' type='text/css' />"));
                string scriptText = "<script src='" + ResolveUrl("~/scripts/fancybox/") + "jquery.fancybox.js' language='javascript'/>";
                ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "JQUERY_FANCY_BOX_JS_CSS", scriptText, false);
            }
        }
        public void Page_Init(object sender, EventArgs e)
        {
            if (_Order == null)
            {
                OrderId = AbleCommerce.Code.PageHelper.GetOrderId();
            }
            if (_OrderShipment == null)
            {
                OrderShipmentId = AlwaysConvert.ToInt(Request.QueryString["OrderShipmentId"]);
            }
            if (_Order == null)
            {
                Response.Redirect("~/Admin/Orders/Default.aspx");
            }
            _ProductId = AlwaysConvert.ToInt(Request.QueryString["ProductId"]);
            _Product   = ProductDataSource.Load(_ProductId);


            if (_Product == null)
            {
                if (_OrderShipment == null)
                {
                    Response.Redirect("~/Admin/Orders/Edit/FindProduct.aspx?OrderNumber=" + _Order.OrderNumber.ToString());
                }
                else
                {
                    Response.Redirect("~/Admin/Orders/Shipments/FindProduct.aspx?OrderShipmentId=" + _OrderShipmentId.ToString());
                }
            }

            if (_OrderShipment == null)
            {
                BackButton.NavigateUrl = "~/Admin/Orders/Edit/EditOrderItems.aspx?OrderNumber=" + _Order.OrderNumber.ToString();
            }
            else
            {
                BackButton.NavigateUrl = "~/Admin/Orders/Shipments/EditShipment.aspx?OrderShipmentId=" + _OrderShipmentId.ToString();
            }

            // update instruction text
            GiftCertMessage.Visible     = _Product.IsGiftCertificate;
            DigitalGoodsMessage.Visible = _Product.IsDigitalGood;
            SubscriptionMessage.Visible = _Product.IsSubscription;

            //SET NAME AND PRICE
            Name.Text             = _Product.Name;
            HiddenProductId.Value = _Product.Id.ToString();
            //BUILD PRODUCT ATTRIBUTES
            _SelectedOptions = AbleCommerce.Code.ProductHelper.BuildProductOptions(_Product, phOptions, true);
            //BUILD PRODUCT CHOICES
            AbleCommerce.Code.ProductHelper.BuildProductChoices(_Product, phOptions);
            //BUILD KIT OPTIONS
            _SelectedKitProducts = AbleCommerce.Code.ProductHelper.BuildKitOptions(_Product, phOptions);
            //SET PRICE
            string            optionList = ProductVariantDataSource.GetOptionList(_Product.Id, _SelectedOptions, true);
            ProductCalculator pcalc      = ProductCalculator.LoadForProduct(_Product.Id, 1, optionList, AlwaysConvert.ToList(",", _SelectedKitProducts), _Order.UserId);

            Price.Text = string.Format("{0:F2}", pcalc.Price);
            // IF ALL OPTIONS HAVE A VALUE SELECTED, SHOW THE BASKET CONTROLS
            SaveButton.Visible = (_SelectedOptions.Count >= _Product.ProductOptions.Count);
            //BackButton.NavigateUrl += "?OrderNumber=" + _Order.OrderNumber.ToString();


            //CHECK IF SHIPMENTS NEED TO BE DISPLAYED
            trShipment.Visible = (_OrderShipment == null && _Product.Shippable != Shippable.No);
            if (trShipment.Visible)
            {
                //BIND SHIPMENT LIST
                foreach (OrderShipment shipment in _Order.Shipments)
                {
                    string address = string.Format("{0} {1} {2} {3}", shipment.ShipToFirstName, shipment.ShipToLastName, shipment.ShipToAddress1, shipment.ShipToCity);
                    if (address.Length > 50)
                    {
                        address = address.Substring(0, 47) + "...";
                    }
                    string name = "Shipment #" + shipment.ShipmentNumber + " to " + address;
                    ShipmentsList.Items.Add(new ListItem(name, shipment.Id.ToString()));
                }

                if (_Order.Shipments != null && _Order.Shipments.Count == 1)
                {
                    // IF THERE IS JUST ONLY ONE SHIPMENT THEN SELECT IT
                    ShipmentsList.SelectedIndex = 2;
                }
            }

            // if a new shipment option is selected then initialize the related fields
            DisplayOrderShipmentFields(ShipmentsList.SelectedValue == "-1"); ShipFrom.DataSource = AbleContext.Current.Store.Warehouses;
            ShipFrom.DataBind();
            if (AddressList.Items.Count <= 1)
            {
                BindShippingAddresses(this.AddressList);
            }
        }
        protected void InventoryAlertUpdate()
        {
            if (_Product != null)
            {
                // WE HAVE A VALID PRODUCT, ARE ANY AVAILABLE OPTIONS SELECTED?
                bool allProductOptionsSelected = (_SelectedOptions.Count == _Product.ProductOptions.Count);
                if (allProductOptionsSelected)
                {
                    // OPTIONS ARE GOOD, VERIFY ANY REQUIRED KIT OPTIONS ARE SELECTED
                    GetSelectedKitOptions(_Product);
                    bool requiredKitOptionsSelected = AbleCommerce.Code.ProductHelper.RequiredKitOptionsSelected(_Product, _SelectedKitProducts);
                    if (requiredKitOptionsSelected)
                    {
                        // KIT OPTIONS ARE ALSO VALID, DETERMINE APPROPRIATE WARNINGS
                        Store         store           = AbleContext.Current.Store;
                        List <string> warningMessages = new List <string>();

                        string optionList = string.Empty;
                        if (_Product.ProductOptions.Count > 0)
                        {
                            // OPTIONS ARE PRESENT, CHECK AVAILABLILITY
                            optionList = ProductVariantDataSource.GetOptionList(_ProductId, _SelectedOptions, true);
                            ProductVariant variant = ProductVariantDataSource.LoadForOptionList(_Product.Id, optionList);
                            if (!variant.Available)
                            {
                                warningMessages.Add("The selected variant is marked as unavailable.");
                            }

                            // WE ALSO NEED TO ALERT INVENTORY IF ENABLED AT VARIANT LEVEL AND THIS IS NOT A KIT
                            if (store.Settings.EnableInventory &&
                                _Product.KitStatus != KitStatus.Master &&
                                _Product.InventoryMode == InventoryMode.Variant)
                            {
                                warningMessages.Add("The selected variant has a current stock level of " + variant.InStock + ".");
                            }
                        }

                        // CHECK STOCK QUANTITY FOR PRODUCT, IF STORE INVENTORY IS ENABLED
                        // AND THE STOCK IS MANAGED AT THE PRODUCT LEVEL OR THIS IS A KIT
                        if (store.Settings.EnableInventory && (_Product.InventoryMode == InventoryMode.Product || _Product.KitStatus == KitStatus.Master))
                        {
                            IInventoryManager    inventoryManager = AbleContext.Resolve <IInventoryManager>();
                            InventoryManagerData inv = inventoryManager.CheckStock(_ProductId, optionList, _SelectedKitProducts);
                            if (!inv.AllowBackorder)
                            {
                                if (_Product.KitStatus == KitStatus.Master)
                                {
                                    // INVENTORY MESSAGE FOR KIT PRODUCTS
                                    warningMessages.Add("The selected configuration has a current stock level of " + inv.InStock + ".");
                                }
                                else
                                {
                                    // NOT KIT OR VARIANT
                                    warningMessages.Add("This product has a current stock level of " + inv.InStock + ".");
                                }
                            }
                        }

                        // SHOW ANY WARNING MESSAGES
                        if (warningMessages.Count > 0)
                        {
                            InventoryWarningMessage.Text = "Note: " + string.Join(" ", warningMessages.ToArray());
                            trInventoryWarning.Visible   = true;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Gets the order items that would result from the addition of the given product to an order.
        /// </summary>
        /// <param name="productId">The id of the product to add.</param>
        /// <param name="quantity">The quantity of the product to add.</param>
        /// <param name="optionList">List of option choice ids if this is a variant</param>
        /// <param name="kitList">List of kit products if it is a Kit</param>
        /// <returns>The order items that would result from the addition of the given product to an order</returns>
        public static List <OrderItem> CreateForProduct(int productId, short quantity, string optionList, string kitList)
        {
            List <OrderItem> orderItems = new List <OrderItem>();
            Product          product    = ProductDataSource.Load(productId);

            if (product != null)
            {
                //CREATE THE BASE ORDER ITEM
                OrderItem baseItem = new OrderItem();
                baseItem.Name          = product.Name;
                baseItem.OrderItemType = OrderItemType.Product;
                baseItem.ProductId     = productId;
                baseItem.TaxCodeId     = product.TaxCodeId;
                baseItem.Quantity      = quantity;
                baseItem.ShippableId   = product.ShippableId;
                //CALCULATE THE PRICE OF THE PRODUCT
                ProductCalculator pcalc = ProductCalculator.LoadForProduct(productId, quantity, optionList, kitList);
                baseItem.Sku    = pcalc.Sku;
                baseItem.Price  = pcalc.Price;
                baseItem.Weight = pcalc.Weight;
                //CHECK PRODUCT VARIANT
                ProductVariant variant = ProductVariantDataSource.LoadForOptionList(productId, optionList);
                if (variant != null)
                {
                    baseItem.OptionList  = optionList;
                    baseItem.VariantName = variant.VariantName;
                }
                //CHECK FOR DIGITAL GOODS
                foreach (ProductDigitalGood dg in product.DigitalGoods)
                {
                    if (dg.DigitalGood != null && (String.IsNullOrEmpty(baseItem.OptionList) || baseItem.OptionList == dg.OptionList))
                    {
                        OrderItemDigitalGood oidg = new OrderItemDigitalGood();
                        oidg.OrderItemId   = baseItem.OrderItemId;
                        oidg.DigitalGoodId = dg.DigitalGoodId;
                        oidg.Name          = dg.DigitalGood.Name;
                        baseItem.DigitalGoods.Add(oidg);
                    }
                }
                orderItems.Add(baseItem);

                //CHECK FOR KIT ITEMS
                int[] kitProductIds = AlwaysConvert.ToIntArray(kitList);
                if (kitProductIds != null && kitProductIds.Length > 0)
                {
                    LSDecimal baseItemPrice  = baseItem.Price;
                    LSDecimal baseItemWeight = baseItem.Weight;
                    foreach (int kitProductId in kitProductIds)
                    {
                        KitProduct kitProduct = KitProductDataSource.Load(kitProductId);
                        if (kitProduct != null)
                        {
                            OrderItem kitItem = new OrderItem();
                            kitItem.Name          = kitProduct.DisplayName;
                            kitItem.OrderItemType = OrderItemType.Product;
                            kitItem.ParentItemId  = baseItem.OrderItemId;
                            kitItem.ProductId     = kitProduct.ProductId;
                            kitItem.OptionList    = kitProduct.OptionList;
                            kitItem.Quantity      = (short)(kitProduct.Quantity * baseItem.Quantity);
                            kitItem.Sku           = kitProduct.Product.Sku;
                            kitItem.TaxCodeId     = kitProduct.Product.TaxCodeId;
                            kitItem.Price         = kitProduct.CalculatedPrice / kitProduct.Quantity;
                            kitItem.Weight        = kitProduct.CalculatedWeight / kitProduct.Quantity;
                            //CHECK FOR DIGITAL GOODS
                            foreach (DigitalGood dg in kitItem.Product.DigitalGoods)
                            {
                                OrderItemDigitalGood oidg = new OrderItemDigitalGood();
                                oidg.OrderItemId   = kitItem.OrderItemId;
                                oidg.DigitalGoodId = dg.DigitalGoodId;
                                kitItem.DigitalGoods.Add(oidg);
                            }
                            baseItemPrice  -= kitProduct.CalculatedPrice;
                            baseItemWeight -= kitProduct.CalculatedWeight;
                            orderItems.Add(kitItem);
                        }
                    }
                    baseItem.Price  = baseItemPrice;
                    baseItem.Weight = baseItemWeight;
                }
            }
            return(orderItems);
        }
        protected void AddProductPrice_PreRender(object sender, EventArgs e)
        {
            int     productId = AlwaysConvert.ToInt(AddProductId.Value);
            Product product   = ProductDataSource.Load(productId);

            if (product != null)
            {
                //GET THE SELECTED KIT OPTIONS
                GetSelectedKitOptions(product);
                //SET THE CURRENT CALCULATED PRICE
                string            optionList            = ProductVariantDataSource.GetOptionList(productId, _SelectedOptions, true);
                bool              calculateOneTimePrice = AlwaysConvert.ToBool(OptionalSubscription.SelectedValue, false);
                ProductCalculator pcalc = ProductCalculator.LoadForProduct(productId, 1, optionList, AlwaysConvert.ToList(",", _SelectedKitProducts), _UserId, false, calculateOneTimePrice);
                AddProductPrice.Text = string.Format("{0:F2}", pcalc.Price);

                if (product.IsSubscription)
                {
                    if (product.SubscriptionPlan.IsRecurring)
                    {
                        if (!calculateOneTimePrice)
                        {
                            short frequency = product.SubscriptionPlan.PaymentFrequencyType == PaymentFrequencyType.Optional ? AlwaysConvert.ToInt16(AutoDeliveryInterval.SelectedValue) : product.SubscriptionPlan.PaymentFrequency;
                            SubscriptionMessage.Text    = ProductHelper.GetRecurringPaymentMessage(product.Price, 0, product.SubscriptionPlan, frequency);
                            SubscriptionMessage.Visible = true;
                        }
                        else
                        {
                            SubscriptionMessage.Visible = false;
                        }
                    }
                    else
                    {
                        trSubscriptionRow.Visible = product.SubscriptionPlan.IsOptional;
                    }
                }
                else
                {
                    trSubscriptionRow.Visible = false;
                }

                if (product.UseVariablePrice && !product.IsSubscription && !product.IsKit)
                {
                    AddProductVariablePrice.Text    = string.Format("{0:F2}", pcalc.Price);
                    AddProductVariablePrice.Visible = true;
                    string varPriceText = string.Empty;
                    if (product.MinimumPrice > 0)
                    {
                        if (product.MaximumPrice > 0)
                        {
                            varPriceText = string.Format("(between {0} and {1})", product.MinimumPrice.LSCurrencyFormat("lcf"), product.MaximumPrice.LSCurrencyFormat("lcf"));
                        }
                        else
                        {
                            varPriceText = string.Format("(at least {0})", product.MinimumPrice.LSCurrencyFormat("lcf"));
                        }
                    }
                    else if (product.MaximumPrice > 0)
                    {
                        varPriceText = string.Format("({0} maximum)", product.MaximumPrice.LSCurrencyFormat("lcf"));
                    }
                    phVariablePrice.Controls.Add(new LiteralControl(varPriceText));
                }
                AddProductPrice.Visible = !AddProductVariablePrice.Visible;
                if ((AddProductPrice.Visible && _Basket.UserId == AbleContext.Current.UserId) || (product.IsKit))
                {
                    AddProductPrice.Enabled = false;
                }
            }
        }
Beispiel #17
0
        protected void DoAdjustVariants()
        {
            IList <ProductOption>  productOptions = ProductOptionDataSource.LoadForProduct(_ProductId);
            List <Option>          options        = (from o in productOptions orderby o.OrderBy select o.Option).ToList <Option>();
            IList <ProductVariant> variants       = ProductVariantDataSource.LoadForProduct(_ProductId);

            foreach (ProductVariant variant in variants)
            {
                Option o1 = FindOptionWithChoice(options, variant.Option1);
                Option o2 = FindOptionWithChoice(options, variant.Option2);
                Option o3 = FindOptionWithChoice(options, variant.Option3);
                Option o4 = FindOptionWithChoice(options, variant.Option4);
                Option o5 = FindOptionWithChoice(options, variant.Option5);
                Option o6 = FindOptionWithChoice(options, variant.Option6);
                Option o7 = FindOptionWithChoice(options, variant.Option7);
                Option o8 = FindOptionWithChoice(options, variant.Option8);

                Dictionary <int, int> map = new Dictionary <int, int>();
                if (o1 != null)
                {
                    map.Add(o1.Id, variant.Option1);
                }
                if (o2 != null)
                {
                    map.Add(o2.Id, variant.Option2);
                }
                if (o3 != null)
                {
                    map.Add(o3.Id, variant.Option3);
                }
                if (o4 != null)
                {
                    map.Add(o4.Id, variant.Option4);
                }
                if (o5 != null)
                {
                    map.Add(o5.Id, variant.Option5);
                }
                if (o6 != null)
                {
                    map.Add(o6.Id, variant.Option6);
                }
                if (o7 != null)
                {
                    map.Add(o7.Id, variant.Option7);
                }
                if (o8 != null)
                {
                    map.Add(o8.Id, variant.Option8);
                }

                if (variant.Option1 > 0)
                {
                    variant.Option1 = map[options[0].Id];
                }
                if (variant.Option2 > 0)
                {
                    variant.Option2 = map[options[1].Id];
                }
                if (variant.Option3 > 0)
                {
                    variant.Option3 = map[options[2].Id];
                }
                if (variant.Option4 > 0)
                {
                    variant.Option4 = map[options[3].Id];
                }
                if (variant.Option5 > 0)
                {
                    variant.Option5 = map[options[4].Id];
                }
                if (variant.Option6 > 0)
                {
                    variant.Option6 = map[options[5].Id];
                }
                if (variant.Option7 > 0)
                {
                    variant.Option7 = map[options[6].Id];
                }
                if (variant.Option8 > 0)
                {
                    variant.Option8 = map[options[7].Id];
                }
                variant.Save();
            }
        }
        protected BasketItem CreateBasketItem()
        {
            //GET THE PRODUCT ID
            int     productId = AlwaysConvert.ToInt(AddProductId.Value);
            Product product   = ProductDataSource.Load(productId);

            if (product == null)
            {
                return(null);
            }
            //GET THE QUANTITY
            short tempQuantity = AlwaysConvert.ToInt16(AddProductQuantity.Text);

            if (tempQuantity < 1)
            {
                return(null);
            }
            //RECALCULATE SELECTED KIT OPTIONS
            GetSelectedKitOptions(product);
            // DETERMINE THE OPTION LIST
            string optionList = ProductVariantDataSource.GetOptionList(productId, _SelectedOptions, false);

            //CREATE THE BASKET ITEM WITH GIVEN OPTIONS
            bool       calculateOneTimePrice = AlwaysConvert.ToBool(OptionalSubscription.SelectedValue, false);
            BasketItem basketItem            = BasketItemDataSource.CreateForProduct(productId, tempQuantity, optionList, AlwaysConvert.ToList(",", _SelectedKitProducts), _UserId, calculateOneTimePrice);

            if (basketItem != null)
            {
                //BASKET ID
                basketItem.BasketId = _Basket.Id;

                // PRODUCT PRICE FOR VARIABLE PRICE PRODUCT
                if (product.UseVariablePrice && !product.IsSubscription && !product.IsKit)
                {
                    basketItem.Price = AlwaysConvert.ToDecimal(AddProductVariablePrice.Text);
                }
                else
                {
                    basketItem.Price = AlwaysConvert.ToDecimal(AddProductPrice.Text);
                }

                if (product.IsSubscription)
                {
                    if (product.SubscriptionPlan.IsOptional)
                    {
                        basketItem.IsSubscription = !calculateOneTimePrice;
                    }
                    else
                    {
                        basketItem.IsSubscription = true;
                    }

                    if (basketItem.IsSubscription && product.SubscriptionPlan.IsRecurring)
                    {
                        basketItem.Frequency     = product.SubscriptionPlan.PaymentFrequencyType == PaymentFrequencyType.Optional ? AlwaysConvert.ToInt16(AutoDeliveryInterval.SelectedValue) : product.SubscriptionPlan.PaymentFrequency;
                        basketItem.FrequencyUnit = product.SubscriptionPlan.PaymentFrequencyUnit;
                    }
                    else if (basketItem.IsSubscription)
                    {
                        basketItem.Frequency     = product.SubscriptionPlan.PaymentFrequency;
                        basketItem.FrequencyUnit = product.SubscriptionPlan.PaymentFrequencyUnit;
                    }
                }


                // COLLECT ANY ADDITIONAL INPUTS
                AbleCommerce.Code.ProductHelper.CollectProductTemplateInput(basketItem, this);
            }
            return(basketItem);
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Product != null)
            {
                string checkImage         = this.ShowImage.ToLowerInvariant();
                string calculatedImageUrl = string.Empty;
                string imageAltText       = string.Empty;
                string optionList         = Request.QueryString["Options"];

                ProductVariant variant = null;
                if (!string.IsNullOrEmpty(optionList))
                {
                    variant = ProductVariantDataSource.LoadForOptionList(Product.Id, optionList);
                }

                if (checkImage == "icon")
                {
                    if (variant != null && !string.IsNullOrEmpty(variant.IconUrl))
                    {
                        calculatedImageUrl = variant.IconUrl;
                        imageAltText       = Product.IconAltText;
                    }
                    else if (!string.IsNullOrEmpty(Product.IconUrl))
                    {
                        calculatedImageUrl = Product.IconUrl;
                        imageAltText       = Product.IconAltText;
                    }
                    else
                    {
                        NoIcon.Visible = true;
                    }
                }
                else if (checkImage == "thumbnail")
                {
                    if (variant != null && !string.IsNullOrEmpty(variant.ThumbnailUrl))
                    {
                        calculatedImageUrl = variant.ThumbnailUrl;
                        imageAltText       = Product.ThumbnailAltText;
                    }
                    else if (!string.IsNullOrEmpty(Product.ThumbnailUrl))
                    {
                        calculatedImageUrl = Product.ThumbnailUrl;
                        imageAltText       = Product.ThumbnailAltText;
                    }
                    else
                    {
                        NoThumbnail.Visible = true;
                    }
                }
                else
                {
                    if (variant != null && !string.IsNullOrEmpty(variant.ImageUrl))
                    {
                        calculatedImageUrl = variant.ImageUrl;
                        imageAltText       = Product.ImageAltText;
                    }
                    else if (!string.IsNullOrEmpty(Product.ImageUrl))
                    {
                        calculatedImageUrl = Product.ImageUrl;
                        imageAltText       = Product.ImageAltText;
                    }
                    else
                    {
                        NoImage.Visible = true;
                    }
                }
                if (!string.IsNullOrEmpty(calculatedImageUrl))
                {
                    this.ProductImage.ImageUrl      = string.Format("~/GetImage.ashx?Path={0}&maintainAspectRatio=true&maxHeight={1}&maxWidth={1}", Server.UrlEncode(calculatedImageUrl), 300);
                    this.ProductImage.AlternateText = Server.HtmlEncode(imageAltText);
                }
                else
                {
                    this.ProductImage.Visible = false;
                }
            }
        }
 protected void FinishButton_Click(object sender, EventArgs e)
 {
     foreach (RepeaterItem ri in SelectedProductRepeater.Items)
     {
         HiddenField pid       = (HiddenField)ri.FindControl("PID");
         int         productId = AlwaysConvert.ToInt(pid.Value);
         Product     product   = ProductDataSource.Load(productId);
         if (product == null)
         {
             return;
         }
         if (!AllProductOptionsSelected(product, ri))
         {
             return;
         }
         TextBox KitQuantity = (TextBox)ri.FindControl("KitQuantity");
         short   quantity    = AlwaysConvert.ToInt16(KitQuantity.Text);
         if (quantity > 0)
         {
             ProductVariant productVariant = null;
             string         optionList     = string.Empty;
             if (product.ProductOptions.Count > 0)
             {
                 Dictionary <int, int> selectedOptions = GetSelectedOptions(ri.ItemIndex);
                 productVariant = ProductVariantDataSource.LoadForOptionList(productId, selectedOptions);
                 optionList     = ProductVariantDataSource.GetOptionList(productId, selectedOptions, true);
             }
             TextBox      NameFormat = (TextBox)ri.FindControl("NameFormat");
             DropDownList PriceMode  = (DropDownList)ri.FindControl("PriceMode");
             TextBox      Price      = (TextBox)ri.FindControl("Price");
             DropDownList WeightMode = (DropDownList)ri.FindControl("WeightMode");
             TextBox      Weight     = (TextBox)ri.FindControl("Weight");
             CheckBox     IsSelected = (CheckBox)ri.FindControl("IsSelected");
             KitProduct   kitProduct = new KitProduct();
             kitProduct.ProductId    = productId;
             kitProduct.KitComponent = _KitComponent;
             if (productVariant != null)
             {
                 kitProduct.OptionList = productVariant.OptionList;
             }
             kitProduct.Name     = NameFormat.Text;
             kitProduct.Quantity = quantity;
             ProductCalculator pcalc = ProductCalculator.LoadForProduct(productId, 1, optionList, string.Empty);
             kitProduct.PriceModeId = AlwaysConvert.ToByte(PriceMode.SelectedIndex);
             if (kitProduct.PriceMode == InheritanceMode.Inherit)
             {
                 kitProduct.Price = pcalc.Price;
             }
             else
             {
                 kitProduct.Price = AlwaysConvert.ToDecimal(Price.Text);
             }
             kitProduct.WeightModeId = AlwaysConvert.ToByte(WeightMode.SelectedIndex);
             if (kitProduct.WeightMode == InheritanceMode.Inherit)
             {
                 kitProduct.Weight = pcalc.Weight;
             }
             else
             {
                 kitProduct.Weight = AlwaysConvert.ToDecimal(Weight.Text);
             }
             kitProduct.IsSelected = IsSelected.Checked;
             kitProduct.Save();
         }
     }
     Response.Redirect(string.Format("EditKit.aspx?CategoryId={0}&ProductId={1}", _CategoryId, _ProductId));
 }
        /// <summary>
        /// Prepare list of used images
        /// Many be associated with products, as thumbnail, icon, or std. images
        /// or as additional images
        /// or to option swathces
        /// </summary>
        private void InitAssociatedImageUrls()
        {
            associatedImages = new List <string>();

            // ADD PRODUCT IMAGES
            ICriteria criteria = NHibernateHelper.CreateCriteria <Product>();

            criteria.Add(Restrictions.Eq("Store", AbleContext.Current.Store));
            criteria.Add(Restrictions.Disjunction()
                         .Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("IconUrl", "~/Assets/ProductImages/%")));

            IList <Product> products = ProductDataSource.LoadForCriteria(criteria);

            foreach (Product product in products)
            {
                if (product.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(product.ImageUrl);
                }
                if (product.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(product.ThumbnailUrl);
                }
                if (product.IconUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(product.IconUrl);
                }
            }

            // ADDITIONAL IMAGES
            ICriteria imageCriteria = NHibernateHelper.CreateCriteria <ProductImage>();

            imageCriteria.Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"));
            IList <ProductImage> images = ProductImageDataSource.LoadForCriteria(imageCriteria);

            foreach (ProductImage image in images)
            {
                associatedImages.Add(image.ImageUrl);
            }

            // OPTION SWATCHES
            ICriteria choicesCriteria = NHibernateHelper.CreateCriteria <OptionChoice>();

            choicesCriteria.Add(Restrictions.Disjunction()
                                .Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"))
                                .Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%")));

            IList <OptionChoice> choices = OptionChoiceDataSource.LoadForCriteria(choicesCriteria);

            foreach (OptionChoice choice in choices)
            {
                if (choice.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(choice.ImageUrl);
                }
                if (choice.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(choice.ThumbnailUrl);
                }
            }

            // ADD CATEGORY IMAGES
            ICriteria categoryCriteria = NHibernateHelper.CreateCriteria <Category>();

            categoryCriteria.Add(Restrictions.Eq("Store", AbleContext.Current.Store));
            categoryCriteria.Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"));
            IList <Category> categories = CategoryDataSource.LoadForCriteria(categoryCriteria);

            foreach (Category category in categories)
            {
                if (category.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(category.ThumbnailUrl);
                }
            }

            // ADD LINK IMAGES
            ICriteria linksCriteria = NHibernateHelper.CreateCriteria <Link>();

            linksCriteria.Add(Restrictions.Eq("Store", AbleContext.Current.Store));
            linksCriteria.Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"));
            IList <Link> links = LinkDataSource.LoadForCriteria(linksCriteria);

            foreach (Link link in links)
            {
                if (link.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(link.ThumbnailUrl);
                }
            }

            // ADD GIFT WRAPING IMAGES
            ICriteria wrapstylesCriteria = NHibernateHelper.CreateCriteria <WrapStyle>();

            wrapstylesCriteria.Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"));

            IList <WrapStyle> wrapStyles = WrapStyleDataSource.LoadForCriteria(wrapstylesCriteria);

            foreach (WrapStyle ws in wrapStyles)
            {
                if (ws.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(ws.ImageUrl);
                }
                if (ws.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(ws.ThumbnailUrl);
                }
            }

            // ADD VARIANT IMAGES
            ICriteria variantsCriteria = NHibernateHelper.CreateCriteria <ProductVariant>();

            criteria.Add(Restrictions.Disjunction()
                         .Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("IconUrl", "~/Assets/ProductImages/%")));

            int variantsCount      = ProductVariantDataSource.CountForCriteria(variantsCriteria.Clone() as ICriteria);
            int maxVariantsToCache = 500;

            // avoid loading all variants at same time
            for (int index = 0; index < variantsCount; index += maxVariantsToCache)
            {
                variantsCriteria.SetMaxResults(maxVariantsToCache);
                variantsCriteria.SetFirstResult(index);
                IList <ProductVariant> productVariants = ProductVariantDataSource.LoadForCriteria(variantsCriteria);
                foreach (ProductVariant productVariant in productVariants)
                {
                    if (productVariant.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                    {
                        associatedImages.Add(productVariant.ImageUrl);
                    }
                    if (productVariant.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                    {
                        associatedImages.Add(productVariant.ThumbnailUrl);
                    }
                    if (productVariant.IconUrl.StartsWith("~/Assets/ProductImages/"))
                    {
                        associatedImages.Add(productVariant.IconUrl);
                    }
                }
            }
        }