public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
 {
     if (orderCarrier.GrandTotal < 300)
     {
         throw new PreOrderValidationException("OrderGrandTotalOverLimitValidatorErrorMessage".AsWebSiteString());
     }
 }
Exemplo n.º 2
0
        /// <summary>
        ///     Validates the specified order carrier.
        /// </summary>
        /// <param name="orderCarrier">The order carrier.</param>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
        {
            if (orderCarrier.OrderRows.Count != 0 && !string.IsNullOrEmpty(orderCarrier.CampaignInfo))
            {
                var withVoucherCode = orderCarrier.Clone(true, true, true, true, true, true);
                var noVoucherCode   = withVoucherCode.Clone(true, true, true, true, true, true);
                noVoucherCode.CampaignInfo = string.Empty;

                _moduleECommerce.Orders.CalculateOrderTotals(noVoucherCode, _securityToken);
                _moduleECommerce.Orders.CalculateOrderTotals(withVoucherCode, _securityToken);

                //if the order total becomes modified, it surely is due to the voucherCode since the carriers are just clones of each other and only difference is voucher code.
                if (noVoucherCode.GrandTotal == withVoucherCode.GrandTotal)
                {
                    //the order grand total is not modified, but still the voucher code may have resulted in a different campaign.
                    //obtain all campaign ids in the order carrier and see whether withVoucherCode resulted in a new campaign id.
                    var noVoucherCodeCampaignIds   = noVoucherCode.GetCampaignIds();
                    var withVoucherCodeCampaignIds = withVoucherCode.GetCampaignIds();

                    //check whether withVoucherCodeCampaignIds has any campaign ids, that are not there in noVoucherCodeCampaignIds.
                    if (!withVoucherCodeCampaignIds.Except(noVoucherCodeCampaignIds).Any())
                    {
                        throw new PreOrderValidationException("accelerator.validation.campaigncode.notvalid".AsAngularResourceString());
                    }
                }
            }
        }
        /// <summary>
        ///     Validates the specified order carrier.
        /// </summary>
        /// <param name="orderCarrier">The order carrier.</param>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
        {
            //get allowed delivery methods, if configuration is missing, consider all delivery methods as allowed.
            var allowedDeliveryMethodIDs = _channelService.Get(orderCarrier.ChannelID)?.CountryLinks?.FirstOrDefault(x => x.CountrySystemId == orderCarrier.CountryID)?.DeliveryMethodSystemIds ??
                                           _moduleECommerce.DeliveryMethods.GetAll().Select(x => x.ID).ToList();

            foreach (var delivery in orderCarrier.Deliveries)
            {
                var deliveryMethod = _moduleECommerce.DeliveryMethods.Get(delivery.DeliveryMethodID, _moduleECommerce.AdminToken);
                if (deliveryMethod != null && allowedDeliveryMethodIDs.Contains(deliveryMethod.ID))
                {
                    continue;
                }

                if (allowedDeliveryMethodIDs.Count > 0)
                {
                    var payload = new DeliveryPayloadInfo
                    {
                        DeliveryAddress  = delivery.Address,
                        DeliveryMethodId = allowedDeliveryMethodIDs[0]
                    };
                    _moduleECommerce.CheckoutFlow.EditDelivery(orderCarrier, delivery.ID, payload, _moduleECommerce.AdminToken);
                }
                throw new PreOrderValidationException("accelerator.validation.deliverymethod.nolongersupported".AsAngularResourceString());
            }
        }
Exemplo n.º 4
0
        /// <summary>
        ///     Validates the specified order carrier.
        /// </summary>
        /// <param name="orderCarrier">The order carrier.</param>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
        {
            //get allowed payment methods, if configuration is missing, consider all payment methods as allowed.
            var allowedPaymentMethodIDs = _channelService.Get(orderCarrier.ChannelID)?.CountryLinks?.FirstOrDefault(x => x.CountrySystemId == orderCarrier.CountryID)?.PaymentMethodSystemIds ??
                                          _moduleECommerce.PaymentMethods.GetAll().Select(x => x.ID).ToList();

            foreach (var paymentInfo in orderCarrier.PaymentInfo)
            {
                var paymentMethod = _moduleECommerce.PaymentMethods.Get(paymentInfo.PaymentMethod, paymentInfo.PaymentProvider, _moduleECommerce.AdminToken);
                if (paymentMethod != null && allowedPaymentMethodIDs.Contains(paymentMethod.ID))
                {
                    continue;
                }

                if (allowedPaymentMethodIDs.Count > 0)
                {
                    var defaultPaymentmethod = _moduleECommerce.PaymentMethods.Get(allowedPaymentMethodIDs[0], _moduleECommerce.AdminToken);
                    if (defaultPaymentmethod != null)
                    {
                        _moduleECommerce.CheckoutFlow.AddPaymentInfo(orderCarrier, defaultPaymentmethod.PaymentProviderName, defaultPaymentmethod.Name, paymentInfo.BillingAddress, _moduleECommerce.AdminToken);
                    }
                }
                throw new PreOrderValidationException("accelerator.validation.paymentmethod.nolongersupported".AsAngularResourceString());
            }
        }
        /// <summary>
        ///     Validates the specified order carrier.
        /// </summary>
        /// <param name="orderCarrier">The order carrier.</param>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
        {
            if (orderCarrier.OrderRows.Count != 0)
            {
                var personId  = orderCarrier.CustomerInfo?.PersonID ?? _securityToken.UserID;
                var orderRows = from orderRowCarrier in orderCarrier.OrderRows
                                let result = _orderRowFactory.Create(new ShoppingCartItemCarrier
                {
                    ArticleNumber = orderRowCarrier.ArticleNumber,
                    ProductID     = orderRowCarrier.ProductID,
                    CustomerID    = personId,
                    LanguageID    = FoundationContext.Current.LanguageID,
                    Quantity      = orderRowCarrier.Quantity,
                    Comments      = orderRowCarrier.Comments
                },
                                                                     orderCarrier.WebSiteID,
                                                                     orderCarrier.CurrencyID,
                                                                     personId,
                                                                     orderCarrier.CountryID,
                                                                     _securityToken)
                                             where result != null
                                             where Math.Round(orderRowCarrier.UnitListPrice, 2) != Math.Round(result.UnitListPrice, 2) ||
                                             Math.Round(orderRowCarrier.VATPercentage, 2) != Math.Round(result.VATPercentage, 2)
                                             select orderRowCarrier;

                if (orderRows.Any())
                {
                    throw new PreOrderValidationException("accelerator.validation.productprices.haschanged".AsAngularResourceString());
                }
            }
        }
Exemplo n.º 6
0
 /// <summary>
 ///     Validates the specified order carrier.
 /// </summary>
 /// <param name="orderCarrier">The order carrier.</param>
 /// <param name="checkoutFlowInfo">The checkout flow info.</param>
 public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
 {
     if (orderCarrier.OrderRows.Count(x => !x.CarrierState.IsMarkedForDeleting) == 0)
     {
         throw new PreOrderValidationException("accelerator.validation.cart.doesnotcontainsproduct".AsAngularResourceString());
     }
 }
Exemplo n.º 7
0
            /// <summary>
            /// Creates the payment args.
            /// </summary>
            /// <param name="checkoutFlowInfo">The checkout flow info.</param>
            /// <returns>Instance of ExecutePaymentArgs</returns>
            public override ExecutePaymentArgs CreatePaymentArgs(CheckoutFlowInfo checkoutFlowInfo)
            {
                var isCallback = checkoutFlowInfo.GetValue <bool?>("ProviderOrderIsCreated");

                return(isCallback != null && isCallback.Value
                    ? new KlarnaPaymentArgs()
                    : base.CreatePaymentArgs(checkoutFlowInfo));
            }
Exemplo n.º 8
0
 /// <summary>
 ///     Validates the specified order carrier.
 /// </summary>
 /// <param name="orderCarrier">The order carrier.</param>
 /// <param name="checkoutFlowInfo">The checkout flow info.</param>
 public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
 {
     if (orderCarrier.OrderRows.Count != 0)
     {
         var clone = orderCarrier.Clone(true, true, true, true, true, true);
         _moduleECommerce.Orders.CalculateOrderTotals(clone, _securityToken);
         if (Math.Round(clone.GrandTotal, 2) != Math.Round(orderCarrier.GrandTotal, 2))
         {
             throw new PreOrderValidationException("accelerator.validation.ordertotal.haschanged".AsAngularResourceString());
         }
     }
 }
Exemplo n.º 9
0
        /// <summary>
        /// Creates the payment args.
        /// </summary>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        /// <param name="paymentProviderType">Type of the payment provider.</param>
        /// <returns>Instance of <see cref="ExecutePaymentArgs"/> if checkout info can be 
        /// converted to <see cref="ExtendedCheckoutFlowInfo"/> else a null reference.</returns>
        public virtual ExecutePaymentArgs CreatePaymentArgs(CheckoutFlowInfo checkoutFlowInfo)
        {
            DirectPayPaymentArgs args = new DirectPayPaymentArgs();

            //store end-users IP address
            HttpContext currentContext = HttpContext.Current;
            if (currentContext != null && currentContext.Request != null)
                args.UserHostAddress = HttpContext.Current.Request.UserHostAddress;

            //set the payment mode if its being set, otherwise leave it at its default value.
            if (checkoutFlowInfo.ExecutePaymentMode != ExecutePaymentMode.Unset)
                args.PaymentMode = checkoutFlowInfo.ExecutePaymentMode;

            return args;
        }
Exemplo n.º 10
0
        /// <summary>
        /// Creates the payment args.
        /// </summary>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        /// <returns>Instance of <see cref="ExecutePaymentArgs"/> if checkout info can be 
        /// converted to <see cref="ExtendedCheckoutFlowInfo"/> else a null reference.</returns>
        public virtual ExecutePaymentArgs CreatePaymentArgs(CheckoutFlowInfo checkoutFlowInfo)
        {
            PayPalExecutePaymentArgs args = new PayPalExecutePaymentArgs();
            ExtendedCheckoutFlowInfo info = checkoutFlowInfo as ExtendedCheckoutFlowInfo;
            if (info != null)
            {
                args.CancelUrl = info.CancelUrl;
                args.ResponseUrl = info.ResponseUrl;
                args.ClientLanguage = CurrentState.Current.WebSite.Culture.Name;
                args.ExecuteScript = new PayPalExecutePaymentArgs.ExecuteScriptHandler(info.ExecuteScript);

                //store end-users IP address
                HttpContext currentContext = HttpContext.Current;
                if (currentContext != null && currentContext.Request != null)
                    args.UserHostAddress = HttpContext.Current.Request.UserHostAddress;

                //set the payment mode if its being set, otherwise leave it at its default value.
                if (checkoutFlowInfo.ExecutePaymentMode != ExecutePaymentMode.Unset)
                    args.PaymentMode = checkoutFlowInfo.ExecutePaymentMode;
            }
            return args;
        }
        /// <summary>
        ///     Validates the specified order carrier.
        /// </summary>
        /// <param name="orderCarrier">The order carrier.</param>
        /// <param name="checkoutFlowInfo">The checkout flow info.</param>
        public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
        {
            var personId  = orderCarrier.CustomerInfo?.PersonID ?? _securityToken.UserID;
            var orderRows = orderCarrier.OrderRows.Select(orderRowCarrier =>
                                                          _orderRowFactory.Create(new ShoppingCartItemCarrier
            {
                ArticleNumber = orderRowCarrier.ArticleNumber,
                ProductID     = orderRowCarrier.ProductID,
                CustomerID    = personId,
                LanguageID    = FoundationContext.Current.LanguageID,
                Quantity      = orderRowCarrier.Quantity,
                Comments      = orderRowCarrier.Comments
            },
                                                                                  orderCarrier.WebSiteID,
                                                                                  orderCarrier.CurrencyID,
                                                                                  personId,
                                                                                  orderCarrier.CountryID,
                                                                                  _securityToken));

            if (orderRows.Any(result => result == null))
            {
                throw new PreOrderValidationException("accelerator.validation.product.nolongeravailableforsale".AsAngularResourceString());
            }
        }
Exemplo n.º 12
0
        /// <summary>
        ///     Validates the specified order carrier.
        /// </summary>
        /// <param name="orderCarrier"> The order carrier. </param>
        /// <param name="checkoutFlowInfo"> The checkout flow info. </param>
        public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo)
        {
            if (orderCarrier.OrderRows.Count > 0)
            {
                var personId          = orderCarrier.CustomerInfo?.PersonID ?? _securityToken.UserID;
                var articlesPurchased = orderCarrier.OrderRows
                                        .Where(o => !o.CarrierState.IsMarkedForDeleting && !o.IsAutoGenerated)
                                        .GroupBy(o => o.ArticleNumber)
                                        .Select(g => new { ArticleNumber = g.Key, Quantity = g.Sum(p => p.Quantity) });

                var outOfStocksProducts       = new List <string>();
                var notEnoughInStocksProducts = new List <string>();
                foreach (var item in articlesPurchased)
                {
                    var article = _variantService.Get(item.ArticleNumber);
                    if (article != null)
                    {
                        StockStatusCalculatorResult stockStatus;
                        _stockStatusCalculator.GetStockStatuses(new StockStatusCalculatorArgs
                        {
                            Date            = HttpContext.Current.Timestamp,
                            UserSystemId    = personId,
                            WebSiteSystemId = orderCarrier.WebSiteID,
                            CountrySystemId = orderCarrier.CountryID
                        }, new StockStatusCalculatorItemArgs
                        {
                            VariantSystemId = article.SystemId,
                            Quantity        = item.Quantity
                        }).TryGetValue(article.SystemId, out stockStatus);

                        //if stock status is not returned or the actual stock level is zero or below.
                        if (stockStatus == null || stockStatus.InStockQuantity.GetValueOrDefault() <= decimal.Zero)
                        {
                            //remove the order row from order carrier.
                            foreach (var orderRow in orderCarrier.OrderRows.Where(x => x.ArticleNumber == article.Id).ToList())
                            {
                                //we have to call edit order row to handle the correct removal from delivery, and to provide access to extension point.
                                _moduleECommerce.CheckoutFlow.EditOrderRow(orderCarrier, orderRow.ID, 0, string.Empty, 0, _moduleECommerce.AdminToken);
                                Cart.UpdateRowQuantity(orderRow.ID, 0);
                            }

                            outOfStocksProducts.Add(article.GetDisplayName(CultureInfo.CurrentCulture));
                        }
                        else
                        {
                            var existingStocks  = stockStatus.InStockQuantity.GetValueOrDefault();
                            var notEnoughStocks = false;
                            foreach (var orderRow in orderCarrier.OrderRows
                                     .Where(x => x.ArticleNumber == article.Id && !x.CarrierState.IsMarkedForDeleting)
                                     .OrderByDescending(x => x.IsAutoGenerated)
                                     .ToList()
                                     )
                            {
                                if (existingStocks >= decimal.Zero)
                                {
                                    if (orderRow.Quantity > existingStocks)
                                    {
                                        //we have to call edit order row to handle the correct removal from delivery, and to provide access to extension point.
                                        var changedRow = _moduleECommerce.CheckoutFlow.EditOrderRow(orderCarrier, orderRow.ID, existingStocks, orderRow.Comments, orderRow.DiscountPercentage, _moduleECommerce.AdminToken);
                                        notEnoughStocks = true;
                                        existingStocks -= changedRow.Quantity;
                                        Cart.UpdateRowQuantity(changedRow.ID, changedRow.Quantity);
                                    }
                                    else
                                    {
                                        existingStocks -= orderRow.Quantity;
                                    }
                                }
                                else
                                {
                                    //we have to call edit order row to handle the correct removal from delivery, and to provide access to extension point.
                                    _moduleECommerce.CheckoutFlow.EditOrderRow(orderCarrier, orderRow.ID, 0, string.Empty, 0, _moduleECommerce.AdminToken);
                                    notEnoughStocks = true;
                                    Cart.UpdateRowQuantity(orderRow.ID, 0);
                                }
                            }

                            if (notEnoughStocks)
                            {
                                notEnoughInStocksProducts.Add(article.GetDisplayName(CultureInfo.CurrentCulture));
                            }
                        }
                    }
                }

                if (outOfStocksProducts.Count > 0 || notEnoughInStocksProducts.Count > 0)
                {
                    Cart.UpdateChangedRows();

                    var sb = new StringBuilder();
                    if (outOfStocksProducts.Count > 0)
                    {
                        var outOfStocksMsg = "accelerator.validation.product.outofstock".AsAngularResourceString();
                        outOfStocksProducts.ForEach(x => sb.AppendFormat(outOfStocksMsg, x));
                    }
                    if (notEnoughInStocksProducts.Count > 0)
                    {
                        var notEnoughInStocksProductsMsg = "accelerator.validation.product.notenoughinstock".AsAngularResourceString();
                        notEnoughInStocksProducts.ForEach(x => sb.AppendFormat(notEnoughInStocksProductsMsg, x));
                    }
                    throw new PreOrderValidationException(sb.ToString());
                }
            }
        }