public void Validate(OrderCarrier orderCarrier, CheckoutFlowInfo checkoutFlowInfo) { if (orderCarrier.GrandTotal < 300) { throw new PreOrderValidationException("OrderGrandTotalOverLimitValidatorErrorMessage".AsWebSiteString()); } }
/// <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()); } }
/// <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()); } } }
/// <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()); } }
/// <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)); }
/// <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()); } } }
/// <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; }
/// <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()); } }
/// <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()); } } }