예제 #1
0
        internal BasketItem GetBasketItem(int index, Basket basket)
        {
            WishlistItem item       = this[index];
            BasketItem   basketItem = BasketItemDataSource.CreateForProduct(item.ProductId, item.Desired, item.OptionList, item.KitList);

            basketItem.BasketId = basket.BasketId;
            if (item.Product.UseVariablePrice)
            {
                basketItem.Price = item.Price;
                if (basketItem.Price < item.Product.MinimumPrice)
                {
                    basketItem.Price = item.Product.MinimumPrice;
                }
                if (basketItem.Price > item.Product.MaximumPrice)
                {
                    basketItem.Price = item.Product.MaximumPrice;
                }
            }
            basketItem.WishlistItemId = item.WishlistItemId;
            basketItem.LineMessage    = item.LineMessage;
            //COPY OVER ITEM INPUTS
            foreach (WishlistItemInput input in item.Inputs)
            {
                BasketItemInput cloneInput = new BasketItemInput();
                cloneInput.InputFieldId = input.InputFieldId;
                cloneInput.InputValue   = input.InputValue;
                basketItem.Inputs.Add(cloneInput);
            }
            return(basketItem);
        }
        public async Task <UpdateBasketPayload> UpdateBasketItemAsync(
            BasketItemInput input,
            [ScopedService] ApplicationDbContext dbContext)
        {
            (Guid ownerId, Guid itemId, var quantity) = input;

            Model.Basket basket = await dbContext
                                  .Baskets.Where(b => b.OwnerId == ownerId)
                                  .Include(b => b.BasketItems)
                                  .FirstOrDefaultAsync();

            if (basket == null)
            {
                var extensions = new Dictionary <string, object?>()
                {
                    { "code", "1001" },
                    { "id", ownerId }
                };

                Error error = new("Invalid basket owner id", extensions : extensions);
                throw new QueryException(error);
            }

            // Check that the item exists
            BasketItem?item = basket.BasketItems.FirstOrDefault(i => i.ItemId == itemId);

            if (item == null)
            {
                var extensions = new Dictionary <string, object?>()
                {
                    { "code", "1002" },
                    { "id", itemId }
                };

                Error error = new("Invalid basket item id", extensions : extensions);

                throw new QueryException(error);
            }

            if (quantity > 0)
            {
                item.Quantity = quantity;
            }
            else
            {
                basket.BasketItems.Remove(item);
                dbContext.Remove(item);
            }

            await dbContext.SaveChangesAsync();

            return(new UpdateBasketPayload(basket));
        }
        public async Task <UpdateBasketPayload> AddBasketItemAsync(
            BasketItemInput input,
            [ScopedService] ApplicationDbContext dbContext)
        {
            (Guid ownerId, Guid itemId, var quantity) = input;

            if (quantity == 0)
            {
                Error error = new("Invalid item quantity", "1003");
                throw new QueryException(error);
            }

            Model.Basket basket = await dbContext
                                  .Baskets.Where(b => b.OwnerId == ownerId)
                                  .Include(b => b.BasketItems)
                                  .FirstOrDefaultAsync();

            if (basket == null)
            {
                var extensions = new Dictionary <string, object?>()
                {
                    { "code", "1001" },
                    { "id", ownerId }
                };

                Error error = new("Invalid basket owner id", extensions : extensions);
                throw new QueryException(error);
            }

            // See if there is an item with this ID already, if so then increase it's quantity
            BasketItem?item = basket.BasketItems.FirstOrDefault(i => i.ItemId == itemId);

            if (item != null)
            {
                item.Quantity += quantity;
            }
            else
            {
                item = new BasketItem
                {
                    BasketId = basket.Id,
                    ItemId   = itemId,
                    Quantity = quantity
                };

                basket.BasketItems.Add(item);
            }

            await dbContext.SaveChangesAsync();

            return(new UpdateBasketPayload(basket));
        }
예제 #4
0
        private async Task <dynamic> AddItemToBasket(Guid ownerId, Guid itemId, int quantity)
        {
            var basketItemInput = new BasketItemInput(ownerId, itemId, quantity);

            IExecutionResult result = await ServiceProvider.ExecuteRequestAsync(
                QueryRequestBuilder
                .New()
                .SetQuery(@"
                        mutation AddBasketItem($input: BasketItemInput!) {
                          addBasketItem(input: $input) {
                            basket {
                              id
                              ownerId
                              items {
                                id
                                name
                                quantity
                              }
                            }
                          }
                        }
                    ")
                .SetVariableValue(name : "input", value : basketItemInput)
                .Create()
                );

            // Check against the snapshot, the existing basket was returned
            var json = await result.ToJsonAsync();

            Assert.NotNull(json);

            ExpandoObject response = JsonConvert.DeserializeObject <ExpandoObject>(json, new ExpandoObjectConverter());

            Assert.NotNull(response);

            return(response);
        }
예제 #5
0
        public static void CollectProductTemplateInput(BasketItem item, Control container)
        {
            // COLLECT ANY ADDITIONAL INPUTS
            Product product = item.Product;

            if (product != null)
            {
                foreach (ProductTemplate template in product.ProductTemplates)
                {
                    foreach (InputField input in template.InputFields)
                    {
                        //ONLY LOOK FOR CUSTOMER INPUT FIELDS
                        if (!input.IsMerchantField)
                        {
                            //SEE IF WE CAN LOCATE THE CONTROL
                            WebControl inputControl = (WebControl)AbleCommerce.Code.PageHelper.RecursiveFindControl(container, input.UniqueId);
                            if (inputControl != null)
                            {
                                // look for existing input item
                                BasketItemInput itemInput = item.Inputs.FirstOrDefault(bi => bi.InputFieldId == input.Id);
                                if (itemInput == null)
                                {
                                    // need to add the input item
                                    itemInput = new BasketItemInput();
                                    itemInput.InputFieldId = input.Id;
                                    itemInput.BasketItem   = item;
                                    item.Inputs.Add(itemInput);
                                }

                                // update input value
                                itemInput.InputValue = input.GetControlValue(inputControl);
                            }
                        }
                    }
                }
            }
        }
예제 #6
0
        public void ProcessRequest(HttpContext context)
        {
            HttpResponse Response = context.Response;
            //GET THE ORDER ID FROM THE URL
            int   orderId = AlwaysConvert.ToInt(context.Request.QueryString["o"]);
            Order order   = OrderDataSource.Load(orderId);

            if (order != null)
            {
                //MAKE SURE ORDER IS FOR CURRENT USER
                User user = AbleContext.Current.User;
                if (order.User != null && order.User.Id == user.Id)
                {
                    //CLEAR THE EXISTING BASKET
                    List <string>  basketMessages = new List <string>();
                    Basket         basket         = user.Basket;
                    IBasketService basketService  = AbleContext.Resolve <IBasketService>();
                    basketService.Clear(basket);
                    foreach (OrderItem item in order.Items)
                    {
                        if ((item.OrderItemType == OrderItemType.Product) && (!item.IsChildItem))
                        {
                            Product product = item.Product;
                            if ((product != null) && (product.Visibility != CommerceBuilder.Catalog.CatalogVisibility.Private))
                            {
                                BasketItem basketItem;
                                try
                                {
                                    basketItem = BasketItemDataSource.CreateForProduct(item.Product.Id, item.Quantity, item.OptionList, item.KitList);
                                    basketItem.IsSubscription = item.IsSubscription;
                                    if (!item.IsSubscription && item.Product != null)
                                    {
                                        basketItem.IsSubscription = item.Product.IsSubscription;
                                    }
                                    basketItem.Frequency     = item.Frequency;
                                    basketItem.FrequencyUnit = item.FrequencyUnit;
                                }
                                catch
                                {
                                    string itemName = item.Name;
                                    if (!string.IsNullOrEmpty(item.VariantName))
                                    {
                                        itemName += " (" + item.VariantName + ")";
                                    }
                                    basketMessages.Add("The item " + itemName + " is no longer available.");
                                    basketItem = null;
                                }
                                if (basketItem != null)
                                {
                                    //SEE IF A PRODUCT TEMPLATE IS ASSOCIATED
                                    foreach (ProductTemplate template in product.ProductTemplates)
                                    {
                                        if (template != null)
                                        {
                                            foreach (InputField inputField in template.InputFields)
                                            {
                                                if (!inputField.IsMerchantField)
                                                {
                                                    //COPY OVER ANY CUSTOMER INPUTS
                                                    BasketItemInput itemInput = new BasketItemInput();
                                                    itemInput.BasketItem = basketItem;
                                                    itemInput.InputField = inputField;
                                                    itemInput.InputValue = GetItemInputValue(item, inputField.Name);
                                                    basketItem.Inputs.Add(itemInput);
                                                }
                                            }
                                        }
                                    }
                                    if ((basketItem.OrderItemType == OrderItemType.Product) && (basketItem.Product.UseVariablePrice))
                                    {
                                        basketItem.Price = item.Price;
                                    }
                                    basketItem.Basket = basket;
                                    basket.Items.Add(basketItem);
                                    //WE HAVE TO SAVE THE BASKET IN CASE IT IS NOT YET CREATED
                                    basket.Save();
                                }
                            }
                        }
                    }
                    if (context.Session != null)
                    {
                        context.Session["BasketMessage"] = basketMessages;
                    }
                    Response.Redirect(NavigationHelper.GetBasketUrl());
                }
            }
            Response.Redirect(NavigationHelper.GetHomeUrl());
        }
예제 #7
0
        public static Basket GetAcBasket(AutoGen.ShoppingCart shoppingcart, bool clearShipNTax)
        {
            TraceContext trace    = WebTrace.GetTraceContext();
            string       traceKey = "GoogleCheckout.AC.AcHelper";

            trace.Write(traceKey, "Begin AcHelper.GetAcBasket");

            int basketId = AcHelper.GetAcBasketId(shoppingcart);

            trace.Write(traceKey, "Look for basket ID " + basketId.ToString());
            Basket basket = BasketDataSource.Load(basketId, false);

            if (basket == null)
            {
                trace.Write(traceKey, "Basket not found. Creating New Basket.");
                basket = new Basket();
            }
            else
            {
                //basket found. check if content hash matches
                string contentHash = GetReportedBasketHash(shoppingcart);
                if (contentHash.Equals(GetAcBasketHash(basket)))
                {
                    //hash matched. basket has not changed.
                    if (clearShipNTax)
                    {
                        ClearShippingAndTaxes(basket);
                    }
                    return(basket);
                }
            }

            trace.Write(traceKey, "Clear existing Basket contents and populate with Google Input.");
            basket.Clear();

            if (shoppingcart.items != null)
            {
                trace.Write(traceKey, "Looping " + shoppingcart.items.Length.ToString() + " items in Google cart");
            }
            foreach (Item thisItem in shoppingcart.items)
            {
                trace.Write(traceKey, "itemName: " + thisItem.itemname);
                BasketItem basketItem = new BasketItem();
                basketItem.Name     = thisItem.itemname;
                basketItem.Quantity = (short)thisItem.quantity;
                basketItem.Price    = thisItem.unitprice.Value;

                XmlNode[] privateNodes = thisItem.merchantprivateitemdata.Any;
                foreach (XmlNode privateNode in privateNodes)
                {
                    trace.Write(traceKey, "privateNode.Name: " + privateNode.Name);
                    switch (privateNode.Name)
                    {
                    case "productId":
                        basketItem.ProductId = AlwaysConvert.ToInt(privateNode.InnerText);
                        break;

                    case "orderItemType":
                        basketItem.OrderItemType = (OrderItemType)AlwaysConvert.ToEnum(typeof(OrderItemType), privateNode.InnerText, OrderItemType.Product, true);
                        break;

                    case "shippable":
                        basketItem.Shippable = (Shippable)AlwaysConvert.ToEnum(typeof(Shippable), privateNode.InnerText, Shippable.Yes, true);
                        break;

                    case "taxCodeId":
                        basketItem.TaxCodeId = AlwaysConvert.ToInt(privateNode.InnerText);
                        break;

                    case "weight":
                        basketItem.Weight = AlwaysConvert.ToDecimal(privateNode.InnerText);
                        break;

                    case "wrapStyleId":
                        basketItem.WrapStyleId = AlwaysConvert.ToInt(privateNode.InnerText);
                        break;

                    case "optionList":
                        basketItem.OptionList = privateNode.InnerText;
                        break;

                    case "giftMessage":
                        basketItem.GiftMessage = privateNode.InnerText;
                        break;

                    case "lineMessage":
                        basketItem.LineMessage = privateNode.InnerText;
                        break;

                    case "lastModifiedDate":
                        basketItem.LastModifiedDate = AlwaysConvert.ToDateTime(privateNode.InnerText, LocaleHelper.LocalNow);
                        break;

                    case "orderBy":
                        basketItem.OrderBy = AlwaysConvert.ToInt16(privateNode.InnerText);
                        break;

                    case "parentItemId":
                        basketItem.ParentItemId = AlwaysConvert.ToInt(privateNode.InnerText);
                        break;

                    case "sku":
                        basketItem.Sku = privateNode.InnerText;
                        break;

                    case "wishlistItemId":
                        basketItem.WishlistItemId = AlwaysConvert.ToInt(privateNode.InnerText);
                        break;

                    case "basketItemKitProducts":
                        List <string> kitList = new List <string>();
                        foreach (XmlNode subNode in privateNode.ChildNodes)
                        {
                            if (subNode.Name.Equals("kitProductId"))
                            {
                                int        kitProductId = AlwaysConvert.ToInt(subNode.InnerText);
                                KitProduct kitProd      = KitProductDataSource.Load(kitProductId);
                                if (kitProd != null)
                                {
                                    kitList.Add(kitProductId.ToString());
                                }
                            }
                        }
                        if (kitList.Count > 0)
                        {
                            basketItem.KitList = string.Join(",", kitList.ToArray());
                        }
                        break;

                    case "inputs":
                        foreach (XmlNode subNode in privateNode.ChildNodes)
                        {
                            if (subNode.Name.Equals("itemInput"))
                            {
                                int inputFieldId = 0;
                                foreach (XmlAttribute attr in subNode.Attributes)
                                {
                                    if (attr.Name.Equals("inputFieldId"))
                                    {
                                        inputFieldId = AlwaysConvert.ToInt(attr.InnerText);
                                        break;
                                    }
                                }
                                InputField inputField = InputFieldDataSource.Load(inputFieldId);
                                if (inputField != null)
                                {
                                    BasketItemInput bInput = new BasketItemInput();
                                    bInput.InputFieldId = inputFieldId;
                                    bInput.InputValue   = subNode.InnerText;
                                    basketItem.Inputs.Add(bInput);
                                }
                            }
                        }
                        break;

                    case "couponCode":
                        basketItem.Sku = privateNode.InnerText;
                        break;
                    }
                }
                basket.Items.Add(basketItem);
            }
            trace.Write(traceKey, "Saving basket");
            basket.Save();

            string key = "Basket_" + basket.BasketId.ToString();

            ContextCache.SetObject(key, basket);

            trace.Write(traceKey, "Basket created, returning to caller (End GetAcBasket)");
            return(basket);
        }