예제 #1
0
        public AddCartLineResult Execute(
            IUnitOfWork unitOfWork,
            AddCartLineParameter parameter,
            AddCartLineResult result)
        {
            if (!parameter.QtyOrdered.HasValue)
            {
                return(result);
            }
            OrderLine cartLine    = result.CartLine;
            Decimal   qtyOrdered1 = !this.cartSettings.ReplaceOnAdd || !(parameter.Cart.Status != "Requisition") ? parameter.QtyOrdered.Value + cartLine.QtyOrdered : parameter.QtyOrdered.Value;

            if (cartLine.Product.MinimumOrderQty > 0)
            {
                ProductUnitOfMeasure productUnitOfMeasure = cartLine.Product.ProductUnitOfMeasures.FirstOrDefault <ProductUnitOfMeasure>((Func <ProductUnitOfMeasure, bool>)(o =>
                {
                    if (o.UnitOfMeasure == cartLine.UnitOfMeasure)
                    {
                        return(o.QtyPerBaseUnitOfMeasure > Decimal.Zero);
                    }
                    return(false);
                }));
                Decimal num = productUnitOfMeasure != null ? productUnitOfMeasure.QtyPerBaseUnitOfMeasure : Decimal.One;
                if (qtyOrdered1 * num < (Decimal)cartLine.Product.MinimumOrderQty)
                {
                    qtyOrdered1          = Decimal.Ceiling((Decimal)cartLine.Product.MinimumOrderQty / num);
                    result.IsQtyAdjusted = true;
                }
            }
            Decimal qtyOrdered2 = this.roundingRulesProvider.ApplyRoundingRules(cartLine.Product, cartLine.UnitOfMeasure, qtyOrdered1);

            if (qtyOrdered2 != qtyOrdered1)
            {
                result.IsQtyAdjusted = true;
            }
            this.orderLineUtilities.SetQtyOrdered(cartLine, qtyOrdered2);

            // BUSA-1319: Limit Qty Per Product on PLP, PDP, QuickOrder, ReOrder, Saved Order
            var maxProductQty = cartLine.Product?.CustomProperties.Where(x => x.Name.EqualsIgnoreCase("maxProductQty")).Select(v => v.Value).FirstOrDefault() ?? "0";

            if (!string.IsNullOrEmpty(maxProductQty) && Convert.ToInt32(maxProductQty) != 0 && cartLine.QtyOrdered > Convert.ToDecimal(maxProductQty))
            {
                cartLine.QtyOrdered  = Convert.ToDecimal(maxProductQty);
                result.IsQtyAdjusted = true;
            }
            // BUSA- 1319: END

            return(result);
        }
        private Decimal GetQuantityToDecrement(OrderLine orderLine)
        {
            Decimal num1 = orderLine.QtyOrdered;

            if (!orderLine.Product.UnitOfMeasure.EqualsIgnoreCase(orderLine.UnitOfMeasure))
            {
                ProductUnitOfMeasure productUnitOfMeasure = orderLine.Product.ProductUnitOfMeasures.FirstOrDefault <ProductUnitOfMeasure>((Func <ProductUnitOfMeasure, bool>)(o => o.UnitOfMeasure.Equals(orderLine.UnitOfMeasure, StringComparison.OrdinalIgnoreCase)));
                if (productUnitOfMeasure != null)
                {
                    num1 *= productUnitOfMeasure.QtyPerBaseUnitOfMeasure;
                }
            }
            if (!this.inventorySettings.AllowNegativeQtyOnHand && this.inventorySettings.InventoryService != "RealTime")
            {
                ProductInventory inventory = this.inventoryPipeline.Value.GetQtyOnHand(new GetQtyOnHandParameter(false)
                {
                    GetInventoryParameter = new GetInventoryParameter()
                    {
                        ProductIds = new List <Guid>()
                        {
                            orderLine.Product.Id
                        },
                        Products = new List <Product>()
                        {
                            orderLine.Product
                        }
                    }
                }).Inventories[orderLine.Product.Id];
                Decimal num2 = inventory != null ? inventory.QtyOnHand : Decimal.Zero;
                if (num2 < num1)
                {
                    num1 = num2;
                }
            }
            if (!(num1 > Decimal.Zero))
            {
                return(Decimal.Zero);
            }
            return(num1);
        }