예제 #1
0
        public IActionResult AddToCart(int productId)
        {
            var product     = _db.Products.FirstOrDefault(p => p.Id == productId);
            var productItem = _db.Inventory.FirstOrDefault(pi => pi.Sold == false && pi.Product.Id == productId);

            productItem.Product = product;
            var newOrder = new ApplicationOrder();

            _db.Orders.Add(newOrder);

            var orderItem = new ApplicationOrderItem {
                Product = productItem.Product, Order = newOrder
            };

            productItem.OrderItem = orderItem;

            _db.OrderItems.Add(orderItem);
            _db.Entry(productItem).State = EntityState.Modified;
            _db.SaveChanges();
            var viewModel = new ProductViewModel {
                Name = productItem.Product.Name, InitialQuantity = productItem.Product.InitialQuantity, Price = productItem.Product.Price
            };

            return(RedirectToAction("Cart", viewModel));
        }
예제 #2
0
        private async Task <string> PrettifyVariableValue(ViewProperty variable, List <ViewProperty> properties,
                                                          CommerceContext commerceContext)
        {
            switch (variable.Name)
            {
            case "Hc_BasicStringCompare":
            case "Hc_Compares":
            case "Hc_Operator":
                return(variable.Value.PrettifyOperatorName());

            case "Hc_SpecificCategory":
                return(await PrettifyCategory(variable.Value, properties, commerceContext));

            case "Hc_Date":
                if (DateTimeOffset.TryParse(variable.Value, out DateTimeOffset date))
                {
                    return(date.LocalDateTime.ToString("d MMM yyyy HH:mm"));
                }

                return(variable.Value);

            case "Hc_ApplyActionTo":
                return(ApplicationOrder.Parse(variable.Value).DisplayName);

            case "TargetItemId":
                return(await PrettifyProduct(variable.Value, commerceContext));

            default:
                return(variable.Value);
            }
        }
예제 #3
0
        public void Execute(IRuleExecutionContext context)
        {
            var commerceContext = context.Fact <CommerceContext>();

            //Get configuration
            string  specificCategory     = Ny_SpecificCategory.Yield(context);
            decimal itemsToAward         = Ny_ItemsToAward.Yield(context);
            decimal itemsToPurchase      = Ny_ItemsToPurchase.Yield(context);
            bool    includeSubCategories = Ny_IncludeSubCategories.Yield(context);
            decimal percentageOff        = Ny_PercentageOff.Yield(context);
            string  applyActionTo        = Ny_ApplyActionTo.Yield(context);
            int     actionLimit          = Ny_ActionLimit.Yield(context);

            if (string.IsNullOrEmpty(specificCategory) ||
                itemsToAward == 0 ||
                itemsToPurchase == 0 ||
                percentageOff == 0 ||
                string.IsNullOrEmpty(applyActionTo) ||
                actionLimit == 0)
            {
                return;
            }

            //Get data
            IEnumerable <CartLineComponent> categoryLines =
                categoryCartLinesResolver.Resolve(commerceContext, specificCategory, includeSubCategories);

            if (categoryLines == null)
            {
                return;
            }

            //Validate and apply action
            int     cartQuantity        = Convert.ToInt32(categoryLines.Sum(x => x.Quantity));
            decimal cartProductsToAward = Math.Floor(cartQuantity / itemsToPurchase) * itemsToAward;

            decimal productsToAward = cartProductsToAward > actionLimit ? actionLimit : cartProductsToAward;

            if (productsToAward <= 0)
            {
                return;
            }

            var discountApplicator = new DiscountApplicator(commerceContext);

            discountApplicator.ApplyPercentageDiscount(categoryLines, percentageOff, new DiscountOptions
            {
                ActionLimit      = Convert.ToInt32(productsToAward),
                ApplicationOrder = ApplicationOrder.Parse(applyActionTo),
                AwardingBlock    = nameof(CartEveryXItemsInCategoryPercentageDiscountAction)
            });
        }
예제 #4
0
        public void Execute(IRuleExecutionContext context)
        {
            var commerceContext = context.Fact <CommerceContext>();

            //Get configuration
            string  specificCategory     = Ny_SpecificCategory.Yield(context);
            decimal specificValue        = Ny_SpecificValue.Yield(context);
            bool    includeSubCategories = Ny_IncludeSubCategories.Yield(context);
            decimal percentageOff        = Ny_PercentageOff.Yield(context);
            string  applyActionTo        = Ny_ApplyActionTo.Yield(context);
            int     actionLimit          = Ny_ActionLimit.Yield(context);

            if (string.IsNullOrEmpty(specificCategory) ||
                specificValue == 0 ||
                percentageOff == 0 ||
                string.IsNullOrEmpty(applyActionTo) ||
                actionLimit == 0 ||
                Ny_Operator == null)
            {
                return;
            }

            //Get data
            IEnumerable <CartLineComponent> categoryLines =
                categoryCartLinesResolver.Resolve(commerceContext, specificCategory, includeSubCategories);

            if (categoryLines == null)
            {
                return;
            }

            //Validate and apply action
            decimal productAmount = categoryLines.Sum(x => x.Quantity);

            if (!Ny_Operator.Evaluate(productAmount, specificValue))
            {
                return;
            }

            var discountApplicator = new DiscountApplicator(commerceContext);

            discountApplicator.ApplyPercentageDiscount(categoryLines, percentageOff, new DiscountOptions
            {
                ActionLimit      = actionLimit,
                ApplicationOrder = ApplicationOrder.Parse(applyActionTo),
                AwardingBlock    = nameof(CartItemsMatchingInCategoryPercentageDiscountAction)
            });
        }
예제 #5
0
        public async override Task <ExtPostContainer <string> > SaveInput(ApplicationOrderInput input)
        {
            await Validate(input);

            var id    = !string.IsNullOrWhiteSpace(input.Id) ? input.Id : Guid.NewGuid().ToString("N");
            var order = new ApplicationOrder {
                Id          = id,
                Barracks    = input.Barracks,
                DosesOrder  = input.DosesOrder,
                EndDate     = input.EndDate,
                StartDate   = input.StartDate,
                IdsPreOrder = input.IdsPreOrder,
                Name        = input.Name,
                OrderType   = input.OrderType,
                Wetting     = input.Wetting
            };

            search.DeleteElementsWithRelatedElement(EntityRelated.BARRACK_EVENT, EntityRelated.ORDER, id);
            search.DeleteElementsWithRelatedElement(EntityRelated.DOSES_ORDER, EntityRelated.ORDER, id);
            await SaveDb(order);

            return(await SaveSearch(order));
        }
 public CartItemsMatchingInCategoryPercentageDiscountActionBuilder ApplyActionTo(ApplicationOrder applicationOrder)
 {
     this.applicationOrder = applicationOrder;
     return(this);
 }
 public CartEveryXItemsInCategoryPriceDiscountActionBuilder ApplyActionTo(ApplicationOrder applicationOrder)
 {
     this.applicationOrder = applicationOrder;
     return(this);
 }