Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.92 KB | None | 0 0
  1.         /// <summary>
  2.         ///  Gets available shipping options
  3.         /// </summary>
  4.         /// <param name="cart">Shopping cart</param>
  5.         /// <param name="shippingAddress">Shipping address</param>
  6.         /// <param name="customer">Load records allowed only to a specified customer; pass null to ignore ACL permissions</param>
  7.         /// <param name="allowedShippingRateComputationMethodSystemName">Filter by shipping rate computation method identifier; null to load shipping options of all shipping rate computation methods</param>
  8.         /// <param name="storeId">Load records allowed only in a specified store; pass 0 to load all records</param>
  9.         /// <returns>Shipping options</returns>
  10.         public virtual GetShippingOptionResponse GetShippingOptions(IList<ShoppingCartItem> cart,
  11.             Address shippingAddress, Customer customer = null, string allowedShippingRateComputationMethodSystemName = "",
  12.             int storeId = 0)
  13.         {
  14.             if (cart == null)
  15.                 throw new ArgumentNullException("cart");
  16.  
  17.             var result = new GetShippingOptionResponse();
  18.            
  19.             //create a package
  20.             bool shippingFromMultipleLocations;
  21.             var shippingOptionRequests = CreateShippingOptionRequests(cart, shippingAddress, storeId, out shippingFromMultipleLocations);
  22.             result.ShippingFromMultipleLocations = shippingFromMultipleLocations;
  23.  
  24.             var shippingRateComputationMethods = LoadActiveShippingRateComputationMethods(customer, storeId);
  25.             //filter by system name
  26.             if (!String.IsNullOrWhiteSpace(allowedShippingRateComputationMethodSystemName))
  27.             {
  28.                 shippingRateComputationMethods = shippingRateComputationMethods
  29.                     .Where(srcm => allowedShippingRateComputationMethodSystemName.Equals(srcm.PluginDescriptor.SystemName, StringComparison.InvariantCultureIgnoreCase))
  30.                     .ToList();
  31.             }
  32.             if (!shippingRateComputationMethods.Any())
  33.                 //throw new NopException("Shipping rate computation method could not be loaded");
  34.                 return result;
  35.  
  36.  
  37.  
  38.             //request shipping options from each shipping rate computation methods
  39.             foreach (var srcm in shippingRateComputationMethods)
  40.             {
  41.                 //request shipping options (separately for each package-request)
  42.                 IList<ShippingOption> srcmShippingOptions = null;
  43.                 foreach (var shippingOptionRequest in shippingOptionRequests)
  44.                 {
  45.                     var getShippingOptionResponse = srcm.GetShippingOptions(shippingOptionRequest);
  46.  
  47.                     if (getShippingOptionResponse.Success)
  48.                     {
  49.                         //success
  50.                         if (srcmShippingOptions == null)
  51.                         {
  52.                             //first shipping option request
  53.                             srcmShippingOptions = getShippingOptionResponse.ShippingOptions;
  54.                         }
  55.                         else
  56.                         {
  57.                             //get shipping options which already exist for prior requested packages for this scrm (i.e. common options)
  58.                             srcmShippingOptions = srcmShippingOptions
  59.                                 .Where(existingso => getShippingOptionResponse.ShippingOptions.Any(newso => newso.Name == existingso.Name))
  60.                                 .ToList();
  61.  
  62.                             //and sum the rates
  63.                             foreach (var existingso in srcmShippingOptions)
  64.                             {
  65.                                 existingso.Rate += getShippingOptionResponse
  66.                                     .ShippingOptions
  67.                                     .First(newso => newso.Name == existingso.Name)
  68.                                     .Rate;
  69.                             }
  70.                         }
  71.                     }
  72.                     else
  73.                     {
  74.                         //errors
  75.                         foreach (string error in getShippingOptionResponse.Errors)
  76.                         {
  77.                             result.AddError(error);
  78.                             _logger.Warning(string.Format("Shipping ({0}). {1}", srcm.PluginDescriptor.FriendlyName, error));
  79.                         }
  80.                         //clear the shipping options in this case
  81.                         srcmShippingOptions = new List<ShippingOption>();
  82.                         break;
  83.                     }
  84.                 }
  85.  
  86.                 //add this scrm's options to the result
  87.                 if (srcmShippingOptions != null)
  88.                 {
  89.                     foreach (var so in srcmShippingOptions)
  90.                     {
  91.                         //set system name if not set yet
  92.                         if (String.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName))
  93.                             so.ShippingRateComputationMethodSystemName = srcm.PluginDescriptor.SystemName;
  94.                         if (_shoppingCartSettings.RoundPricesDuringCalculation)
  95.                             so.Rate = RoundingHelper.RoundPrice(so.Rate);
  96.                         result.ShippingOptions.Add(so);
  97.                     }
  98.                 }
  99.             }
  100.  
  101.             if (_shippingSettings.ReturnValidOptionsIfThereAreAny)
  102.             {
  103.                 //return valid options if there are any (no matter of the errors returned by other shipping rate compuation methods).
  104.                 if (result.ShippingOptions.Any() && result.Errors.Any())
  105.                     result.Errors.Clear();
  106.             }
  107.            
  108.             //no shipping options loaded
  109.             if (!result.ShippingOptions.Any() && !result.Errors.Any())
  110.                 result.Errors.Add(_localizationService.GetResource("Checkout.ShippingOptionCouldNotBeLoaded"));
  111.            
  112.             return result;
  113.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement