예제 #1
0
        public decimal GetTax(CartItemData cartItemData)
        {
            // just multiply up if we're calculating individually
            if (_taxSettings.TaxCalculationMethod == TaxCalculationMethod.Individual)
            {
                return(cartItemData.PricedQuantity * GetUnitTax(cartItemData));
            }

            //otherwise we start the logic based on the total here
            if (!_taxSettings.TaxesEnabled)
            {
                return(decimal.Zero);
            }


            var productVariant    = cartItemData.Item;
            var priceBreak        = GetPriceBreak(cartItemData);
            var basePrice         = priceBreak?.Price ?? productVariant.BasePrice;
            var quantity          = cartItemData.PricedQuantity;
            var totalAmount       = basePrice * quantity;
            var taxRatePercentage = GetTaxRatePercentage(productVariant);
            var discountAmount    = cartItemData.UnitDiscountAmount * quantity;

            return(GetTax(totalAmount, taxRatePercentage, discountAmount, cartItemData.DiscountPercentage));
        }
예제 #2
0
        public IActionResult AddToCart()
        {
            if (!IsUser())
            {
                return(View(login));
            }
            int cartID = new CartData().GetCartIDByUsername(HttpContext.Session.GetString("SessionUser"));

            int quantity        = int.Parse(Request.Form["txtQuantity"]);
            int productDetailID = int.Parse(Request.Form["slProductDetail"]);

            CartItemData cid = new CartItemData();

            if (cid.AlreadyExistedInCart(cartID, productDetailID))
            {
                ViewBag.Announcement = "Product has already had in cart";
            }
            else
            {
                if (new CartItemData().InsertNewItemToCart(new CartItemDTO {
                    CartId = cartID, ProductDetailId = productDetailID, Quantity = quantity
                }))
                {
                    ViewBag.Announcement = "Add to cart successfully";
                }
                else
                {
                    ViewBag.Announcement = "Add to cart failed";
                }
            }
            ViewBag.Cart = new CartItemData().GetCartItemsByCartID(cartID);
            return(View("Cart"));
        }
예제 #3
0
        public IActionResult Checkout()
        {
            if (!IsUser())
            {
                return(View(index));
            }
            bool check = true;
            List <CartItemDTO> list = new List <CartItemDTO>();

            string[] productDetailID = Request.Form["txtProductDetailID"];
            string[] quantity        = Request.Form["txtQuantity"];
            int      cartID          = new CartData().GetCartIDByUsername(HttpContext.Session.GetString("SessionUser"));

            for (int i = 0; i < productDetailID.Length; i++)
            {
                int pdID = int.Parse(productDetailID[i]);
                int qtt  = int.Parse(quantity[i]);
                list.Add(new CartItemDTO {
                    CartId = cartID, Quantity = qtt, ProductDetailId = pdID
                });
            }
            if (check = new CartItemData().CheckValidCartItems(list))
            {
                ViewBag.UserInfo = new UserData().GetUserInfoByUserID(HttpContext.Session.GetString("SessionUser"));
                ViewBag.Cart     = new CartItemData().GetCartItemsByCartID(cartID);
                return(View());
            }
            else
            {
                ViewBag.Announcement = "Update failed";
            }

            ViewBag.Cart = new CartItemData().GetCartItemsByCartID(cartID);
            return(View("Cart"));
        }
예제 #4
0
        public decimal GetPrice(CartItemData cartItemData)
        {
            // just multiply up if we're calculating individually
            if (_taxSettings.TaxCalculationMethod == TaxCalculationMethod.Individual)
            {
                return(cartItemData.PricedQuantity * GetUnitPrice(cartItemData));
            }

            var productVariant    = cartItemData.Item;
            var quantity          = cartItemData.PricedQuantity;
            var priceBreak        = GetPriceBreak(cartItemData);
            var basePrice         = priceBreak?.Price ?? productVariant.BasePrice;
            var totalAmount       = basePrice * quantity;
            var taxRatePercentage = GetTaxRatePercentage(productVariant);
            var discount          = cartItemData.UnitDiscountAmount * quantity;

            if (_taxSettings.PriceLoadingMethod == PriceLoadingMethod.IncludingTax)
            {
                return(GetPrice(totalAmount, taxRatePercentage, discount, cartItemData.DiscountPercentage));
            }

            var pricePreTax = GetPricePreTax(cartItemData);
            var tax         = GetTax(cartItemData);

            return(pricePreTax + tax);
        }
예제 #5
0
 public decimal GetPricePreDiscount(CartItemData cartItemData)
 {
     // just copying the cart item without discount to get a pre discount price
     return(GetPrice(new CartItemData
     {
         Item = cartItemData.Item,
         Pricing = cartItemData.Pricing,
         Quantity = cartItemData.Quantity,
     }));
 }
예제 #6
0
        public void CartItem_Weight_ShouldBeWeightTimesQuantity()
        {
            A.CallTo(() => _productVariant.Weight).Returns(123);
            var cartItem = new CartItemData {
                Item = _productVariant, Quantity = 3
            };

            var weight = cartItem.Weight;

            weight.Should().Be(369);
        }
예제 #7
0
        public static bool IsAbleToUseShippingMethod(this CartItemData item, IShippingMethod shippingMethod)
        {
            var productVariant = item.Item;

            if (!productVariant.RequiresShipping)
            {
                return(true);
            }
            return(!productVariant.HasRestrictedShipping ||
                   productVariant.RestrictedTo.Contains(shippingMethod.TypeName));
        }
예제 #8
0
        public void Empty_RemovesItemsFromModel()
        {
            var cartItem = new CartItemData {
                Item = _productVariant, Quantity = 1
            };

            _cartModel.Items.Add(cartItem);

            _emptyBasket.Empty();

            _cartModel.Items.Should().BeEmpty();
        }
예제 #9
0
        public void Empty_RemovesItemsFromDB()
        {
            var cartItem = new CartItemData {
                Item = _productVariant, Quantity = 1
            };

            _cartModel.Items.Add(cartItem);

            _emptyBasket.Empty();

            Session.QueryOver <CartItem>().RowCount().Should().Be(0);
        }
예제 #10
0
        public static string GiftCardRecipient(this CartItemData item)
        {
            if (item == null || item.Item == null || !item.Item.IsGiftCard)
            {
                return(null);
            }

            var giftCardInfo = JsonConvert.DeserializeObject <GiftCardInfo>(item.Data);

            if (giftCardInfo == null)
            {
                return(null);
            }
            return(giftCardInfo.RecipientName);
        }
예제 #11
0
        public decimal GetUnitTax(CartItemData cartItemData)
        {
            if (_taxSettings.TaxCalculationMethod == TaxCalculationMethod.Individual)
            {
                //return GetUnitTax(cartItemData.Item, cartItemData.UnitDiscountAmount, cartItemData.DiscountPercentage);
                var unitPriceDiscountAmount = cartItemData.UnitDiscountAmount;
                var discountPercentage      = cartItemData.DiscountPercentage;

                var priceBreak = GetPriceBreak(cartItemData);
                return(priceBreak != null
                    ? GetUnitTax(priceBreak, unitPriceDiscountAmount, discountPercentage)
                    : GetUnitTax(cartItemData.Item, unitPriceDiscountAmount, discountPercentage));
            }
            return(Math.Round(GetTax(cartItemData) / cartItemData.PricedQuantity, 2, MidpointRounding.AwayFromZero));
        }
예제 #12
0
        public void CartItem_GetDiscountAmount_IfNullDiscountIsPassedShouldBeZero()
        {
            var cartItem = new CartItemData
            {
                Item     = _productVariant,
                Quantity = 3,
                Pricing  = A.Fake <IProductPricingMethod>()
            };

            cartItem.SetDiscountAmount(0m);

            var discountAmount = cartItem.DiscountAmount;

            discountAmount.Should().Be(0);
        }
예제 #13
0
        public OrderLine GetOrderLine(CartItemData item)
        {
            var options = string.Join(", ", item.Item.OptionValues.Select(value => value.FormattedValue));

            var orderLine = new OrderLine
            {
                UnitPrice        = item.UnitPrice,
                UnitPricePreTax  = item.UnitPricePreTax,
                Weight           = item.Weight,
                TaxRate          = item.TaxRatePercentage,
                Tax              = item.Tax,
                Quantity         = item.Quantity,
                ProductVariant   = item.Item,
                PricePreTax      = item.PricePreTax,
                Price            = item.Price,
                SKU              = item.Item.SKU,
                Name             = item.Item.FullName,
                Options          = options,
                Discount         = item.DiscountAmount,
                RequiresShipping = item.RequiresShipping,
                Data             = item.Data
            };

            if (item.IsDownloadable)
            {
                orderLine.IsDownloadable           = true;
                orderLine.AllowedNumberOfDownloads = item.AllowedNumberOfDownloads;
                orderLine.DownloadExpiresOn        =
                    (item.AllowedNumberOfDaysForDownload.HasValue && item.AllowedNumberOfDaysForDownload > 0)
                        ? CurrentRequestData.Now.AddDays(
                        item.AllowedNumberOfDaysForDownload
                        .GetValueOrDefault())
                        : (DateTime?)null;
                orderLine.NumberOfDownloads = 0;
                var fileByUrl = _fileService.GetFileByUrl(item.DownloadFileUrl);
                if (fileByUrl != null)
                {
                    orderLine.DownloadFileUrl         = fileByUrl.FileUrl;
                    orderLine.DownloadFileContentType = fileByUrl.ContentType;
                    orderLine.DownloadFileName        = fileByUrl.FileName;
                }
                else
                {
                    orderLine.DownloadFileUrl = item.DownloadFileUrl;
                }
            }
            return(orderLine);
        }
        public CanBuyStatus CanBuy(CartItemData item)
        {
            var productVariant = item.Item;
            var quantity       = item.Quantity;

            if (!_productStockChecker.IsInStock(productVariant))
            {
                return(new OutOfStock(productVariant));
            }
            var canOrderQuantityResult = _productStockChecker.CanOrderQuantity(productVariant, quantity);

            if (!canOrderQuantityResult.CanOrder)
            {
                return(new CannotOrderQuantity(productVariant, canOrderQuantityResult.StockRemaining));
            }
            return(new CanBuy());
        }
        public CartItem MapToCartItem(CartItemData cartItemData)
        {
            if (cartItemData == null)
            {
                return(null);
            }

            var productData = Products.FirstOrDefault(product => product.Id == cartItemData.ProductId);

            return(new CartItem
            {
                ProductId = cartItemData.ProductId,
                ProductName = productData?.Name,
                ProductDescription = productData?.Description,
                ProductPrice = productData?.Price ?? 0,
                Quantity = cartItemData.Quantity
            });
        }
예제 #16
0
 private PriceBreak GetPriceBreak(CartItemData cartItemData)
 {
     return
         (cartItemData.Item.PriceBreaks.OrderBy(x => x.Price)
          .FirstOrDefault(x => x.Quantity <= cartItemData.Quantity));
 }
예제 #17
0
 public decimal GetUnitPricePreDiscount(CartItemData cartItemData)
 {
     return(GetUnitPrice(cartItemData.Item, 0, 0));
 }