Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// Gets available shipping options
- /// </summary>
- /// <param name="cart">Shopping cart</param>
- /// <param name="shippingAddress">Shipping address</param>
- /// <param name="customer">Load records allowed only to a specified customer; pass null to ignore ACL permissions</param>
- /// <param name="allowedShippingRateComputationMethodSystemName">Filter by shipping rate computation method identifier; null to load shipping options of all shipping rate computation methods</param>
- /// <param name="storeId">Load records allowed only in a specified store; pass 0 to load all records</param>
- /// <returns>Shipping options</returns>
- public virtual GetShippingOptionResponse GetShippingOptions(IList<ShoppingCartItem> cart,
- Address shippingAddress, Customer customer = null, string allowedShippingRateComputationMethodSystemName = "",
- int storeId = 0)
- {
- if (cart == null)
- throw new ArgumentNullException("cart");
- var result = new GetShippingOptionResponse();
- //create a package
- bool shippingFromMultipleLocations;
- var shippingOptionRequests = CreateShippingOptionRequests(cart, shippingAddress, storeId, out shippingFromMultipleLocations);
- result.ShippingFromMultipleLocations = shippingFromMultipleLocations;
- var shippingRateComputationMethods = LoadActiveShippingRateComputationMethods(customer, storeId);
- //filter by system name
- if (!String.IsNullOrWhiteSpace(allowedShippingRateComputationMethodSystemName))
- {
- shippingRateComputationMethods = shippingRateComputationMethods
- .Where(srcm => allowedShippingRateComputationMethodSystemName.Equals(srcm.PluginDescriptor.SystemName, StringComparison.InvariantCultureIgnoreCase))
- .ToList();
- }
- if (!shippingRateComputationMethods.Any())
- //throw new NopException("Shipping rate computation method could not be loaded");
- return result;
- //request shipping options from each shipping rate computation methods
- foreach (var srcm in shippingRateComputationMethods)
- {
- //request shipping options (separately for each package-request)
- IList<ShippingOption> srcmShippingOptions = null;
- foreach (var shippingOptionRequest in shippingOptionRequests)
- {
- var getShippingOptionResponse = srcm.GetShippingOptions(shippingOptionRequest);
- if (getShippingOptionResponse.Success)
- {
- //success
- if (srcmShippingOptions == null)
- {
- //first shipping option request
- srcmShippingOptions = getShippingOptionResponse.ShippingOptions;
- }
- else
- {
- //get shipping options which already exist for prior requested packages for this scrm (i.e. common options)
- srcmShippingOptions = srcmShippingOptions
- .Where(existingso => getShippingOptionResponse.ShippingOptions.Any(newso => newso.Name == existingso.Name))
- .ToList();
- //and sum the rates
- foreach (var existingso in srcmShippingOptions)
- {
- existingso.Rate += getShippingOptionResponse
- .ShippingOptions
- .First(newso => newso.Name == existingso.Name)
- .Rate;
- }
- }
- }
- else
- {
- //errors
- foreach (string error in getShippingOptionResponse.Errors)
- {
- result.AddError(error);
- _logger.Warning(string.Format("Shipping ({0}). {1}", srcm.PluginDescriptor.FriendlyName, error));
- }
- //clear the shipping options in this case
- srcmShippingOptions = new List<ShippingOption>();
- break;
- }
- }
- //add this scrm's options to the result
- if (srcmShippingOptions != null)
- {
- foreach (var so in srcmShippingOptions)
- {
- //set system name if not set yet
- if (String.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName))
- so.ShippingRateComputationMethodSystemName = srcm.PluginDescriptor.SystemName;
- if (_shoppingCartSettings.RoundPricesDuringCalculation)
- so.Rate = RoundingHelper.RoundPrice(so.Rate);
- result.ShippingOptions.Add(so);
- }
- }
- }
- if (_shippingSettings.ReturnValidOptionsIfThereAreAny)
- {
- //return valid options if there are any (no matter of the errors returned by other shipping rate compuation methods).
- if (result.ShippingOptions.Any() && result.Errors.Any())
- result.Errors.Clear();
- }
- //no shipping options loaded
- if (!result.ShippingOptions.Any() && !result.Errors.Any())
- result.Errors.Add(_localizationService.GetResource("Checkout.ShippingOptionCouldNotBeLoaded"));
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement