/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); response.ShippingOptions.Add(new ShippingOption() { Name = "Shipping option 1", Description = "", Rate = GetRate() }); response.ShippingOptions.Add(new ShippingOption() { Name = "Shipping option 2", Description = "", Rate = GetRate() }); return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="cart">Shopping cart</param> /// <param name="shippingAddress">Shipping address</param> /// <param name="allowedShippingRateComputationMethodSystemName">Filter by shipping rate computation method identifier; null to load shipping options of all shipping rate computation methods</param> /// <returns>Shipping options</returns> public virtual GetShippingOptionResponse GetShippingOptions(IList<ShoppingCartItem> cart, Address shippingAddress, string allowedShippingRateComputationMethodSystemName = "") { if (cart == null) throw new ArgumentNullException("cart"); var result = new GetShippingOptionResponse(); //create a package var getShippingOptionRequest = CreateShippingOptionRequest(cart, shippingAddress); var shippingRateComputationMethods = LoadActiveShippingRateComputationMethods() .Where(srcm => String.IsNullOrWhiteSpace(allowedShippingRateComputationMethodSystemName) || allowedShippingRateComputationMethodSystemName.Equals(srcm.PluginDescriptor.SystemName, StringComparison.InvariantCultureIgnoreCase)) .ToList(); if (shippingRateComputationMethods.Count == 0) throw new NasException("Shipping rate computation method could not be loaded"); //get shipping options foreach (var srcm in shippingRateComputationMethods) { var getShippingOptionResponse = srcm.GetShippingOptions(getShippingOptionRequest); foreach (var so2 in getShippingOptionResponse.ShippingOptions) { //system name so2.ShippingRateComputationMethodSystemName = srcm.PluginDescriptor.SystemName; //round if (_shoppingCartSettings.RoundPricesDuringCalculation) so2.Rate = Math.Round(so2.Rate, 2); result.ShippingOptions.Add(so2); } //log errors if (!getShippingOptionResponse.Success) { foreach (string error in getShippingOptionResponse.Errors) { result.AddError(error); _logger.Warning(string.Format("Shipping ({0}). {1}", srcm.PluginDescriptor.FriendlyName, error)); } } } 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.Count > 0 && result.Errors.Count > 0) result.Errors.Clear(); } //no shipping options loaded if (result.ShippingOptions.Count == 0 && result.Errors.Count == 0) result.Errors.Add(_localizationService.GetResource("Checkout.ShippingOptionCouldNotBeLoaded")); return result; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null) { response.AddError("No shipment items"); return response; } if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return response; } string zipPostalCodeFrom = _australiaPostSettings.ShippedFromZipPostalCode; string zipPostalCodeTo = getShippingOptionRequest.ShippingAddress.ZipPostalCode; int weight = GetWeight(getShippingOptionRequest); int length = GetLength(getShippingOptionRequest); int width = GetWidth(getShippingOptionRequest); int height = GetHeight(getShippingOptionRequest); var country = getShippingOptionRequest.ShippingAddress.Country; //estimate packaging int totalPackages = 1; int totalPackagesDims = 1; int totalPackagesWeights = 1; if (length > MAX_LENGTH || width > MAX_LENGTH || height > MAX_LENGTH) { totalPackagesDims = Convert.ToInt32(Math.Ceiling((decimal)Math.Max(Math.Max(length, width), height) / MAX_LENGTH)); } if (weight > MAX_WEIGHT) { totalPackagesWeights = Convert.ToInt32(Math.Ceiling((decimal)weight / (decimal)MAX_WEIGHT)); } totalPackages = totalPackagesDims > totalPackagesWeights ? totalPackagesDims : totalPackagesWeights; if (totalPackages == 0) totalPackages = 1; if (totalPackages > 1) { //recalculate dims, weight weight = weight / totalPackages; height = height / totalPackages; width = width / totalPackages; length = length / totalPackages; if (weight < MIN_WEIGHT) weight = MIN_WEIGHT; if (height < MIN_LENGTH) height = MIN_LENGTH; if (width < MIN_LENGTH) width = MIN_LENGTH; if (length < MIN_LENGTH) length = MIN_LENGTH; } int girth = height + height + width + width; if (girth < MIN_GIRTH) { height = MIN_LENGTH; width = MIN_LENGTH; } if (girth > MAX_GIRTH) { height = MAX_LENGTH / 4; width = MAX_LENGTH / 4; } try { switch (country.ThreeLetterIsoCode) { case "AUS": //domestic services response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "Standard", weight, length, width, height, totalPackages)); response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "Express", weight, length, width, height, totalPackages)); response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "EXP_PLT", weight, length, width, height, totalPackages)); break; default: //international services response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "Air", weight, length, width, height, totalPackages)); response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "Sea", weight, length, width, height, totalPackages)); response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "ECI_D", weight, length, width, height, totalPackages)); response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "ECI_M", weight, length, width, height, totalPackages)); response.ShippingOptions.Add(RequestShippingOption(zipPostalCodeFrom, zipPostalCodeTo, country.TwoLetterIsoCode, "EPI", weight, length, width, height, totalPackages)); break; } foreach (var shippingOption in response.ShippingOptions) { shippingOption.Rate += _australiaPostSettings.AdditionalHandlingCharge; } } catch (Exception ex) { response.AddError(ex.Message); } return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null) { response.AddError("No shipment items"); return response; } if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return response; } if (String.IsNullOrEmpty(getShippingOptionRequest.ZipPostalCodeFrom)) getShippingOptionRequest.ZipPostalCodeFrom = _uspsSettings.ZipPostalCodeFrom; bool isDomestic = IsDomesticRequest(getShippingOptionRequest); string requestString = CreateRequest(_uspsSettings.Username, _uspsSettings.Password, getShippingOptionRequest); string responseXml = DoRequest(_uspsSettings.Url, requestString); string error = ""; var shippingOptions = ParseResponse(responseXml, isDomestic, ref error); if (String.IsNullOrEmpty(error)) { foreach (var shippingOption in shippingOptions) { if (!shippingOption.Name.ToLower().StartsWith("usps")) shippingOption.Name = string.Format("USPS {0}", shippingOption.Name); shippingOption.Rate += _uspsSettings.AdditionalHandlingCharge; response.ShippingOptions.Add(shippingOption); } } else { response.AddError(error); } return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null) { response.AddError("No shipment items"); return response; } if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return response; } if (getShippingOptionRequest.ShippingAddress.Country == null) { response.AddError("Shipping country is not set"); return response; } Currency requestedShipmentCurrency; var request = CreateRateRequest(getShippingOptionRequest, out requestedShipmentCurrency); var service = new RateService(); // Initialize the service service.Url = _fedexSettings.Url; try { // This is the call to the web service passing in a RateRequest and returning a RateReply var reply = service.getRates(request); // Service call if (reply.HighestSeverity == RateServiceWebReference.NotificationSeverityType.SUCCESS || reply.HighestSeverity == RateServiceWebReference.NotificationSeverityType.NOTE || reply.HighestSeverity == RateServiceWebReference.NotificationSeverityType.WARNING) // check if the call was successful { if (reply != null && reply.RateReplyDetails != null) { var shippingOptions = ParseResponse(reply, requestedShipmentCurrency); foreach (var shippingOption in shippingOptions) response.ShippingOptions.Add(shippingOption); } else { if (reply != null && reply.Notifications != null && reply.Notifications.Length > 0 && !String.IsNullOrEmpty(reply.Notifications[0].Message)) { response.AddError(string.Format("{0} (code: {1})", reply.Notifications[0].Message, reply.Notifications[0].Code)); return response; } else { response.AddError("Could not get reply from shipping server"); return response; } } } else { Debug.WriteLine(reply.Notifications[0].Message); response.AddError(reply.Notifications[0].Message); return response; } } catch (SoapException e) { Debug.WriteLine(e.Detail.InnerText); response.AddError(e.Detail.InnerText); return response; } catch (Exception e) { Debug.WriteLine(e.Message); response.AddError(e.Message); return response; } return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="cart">Shopping cart</param> /// <param name="shippingAddress">Shipping address</param> /// <param name="allowedShippingRateComputationMethodSystemName">Filter by shipping rate computation method identifier; null to load shipping options of all shipping rate computation methods</param> /// <returns>Shipping options</returns> public virtual GetShippingOptionResponse GetShippingOptions(IList <ShoppingCartItem> cart, Address shippingAddress, string allowedShippingRateComputationMethodSystemName = "") { if (cart == null) { throw new ArgumentNullException("cart"); } var result = new GetShippingOptionResponse(); //create a package var getShippingOptionRequest = CreateShippingOptionRequest(cart, shippingAddress); var shippingRateComputationMethods = LoadActiveShippingRateComputationMethods() .Where(srcm => String.IsNullOrWhiteSpace(allowedShippingRateComputationMethodSystemName) || allowedShippingRateComputationMethodSystemName.Equals(srcm.PluginDescriptor.SystemName, StringComparison.InvariantCultureIgnoreCase)) .ToList(); if (shippingRateComputationMethods.Count == 0) { throw new NasException("Shipping rate computation method could not be loaded"); } //get shipping options foreach (var srcm in shippingRateComputationMethods) { var getShippingOptionResponse = srcm.GetShippingOptions(getShippingOptionRequest); foreach (var so2 in getShippingOptionResponse.ShippingOptions) { //system name so2.ShippingRateComputationMethodSystemName = srcm.PluginDescriptor.SystemName; //round if (_shoppingCartSettings.RoundPricesDuringCalculation) { so2.Rate = Math.Round(so2.Rate, 2); } result.ShippingOptions.Add(so2); } //log errors if (!getShippingOptionResponse.Success) { foreach (string error in getShippingOptionResponse.Errors) { result.AddError(error); _logger.Warning(string.Format("Shipping ({0}). {1}", srcm.PluginDescriptor.FriendlyName, error)); } } } 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.Count > 0 && result.Errors.Count > 0) { result.Errors.Clear(); } } //no shipping options loaded if (result.ShippingOptions.Count == 0 && result.Errors.Count == 0) { result.Errors.Add(_localizationService.GetResource("Checkout.ShippingOptionCouldNotBeLoaded")); } return(result); }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null || getShippingOptionRequest.Items.Count == 0) { response.AddError("No shipment items"); return response; } if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return response; } int countryId = getShippingOptionRequest.ShippingAddress.CountryId.HasValue ? getShippingOptionRequest.ShippingAddress.CountryId.Value : 0; int stateProvinceId = getShippingOptionRequest.ShippingAddress.StateProvinceId.HasValue ? getShippingOptionRequest.ShippingAddress.StateProvinceId.Value : 0; string zip = getShippingOptionRequest.ShippingAddress.ZipPostalCode; decimal subTotal = decimal.Zero; foreach (var shoppingCartItem in getShippingOptionRequest.Items) { if (shoppingCartItem.IsFreeShipping || !shoppingCartItem.IsShipEnabled) continue; subTotal += _priceCalculationService.GetSubTotal(shoppingCartItem, true); } decimal weight = _shippingService.GetShoppingCartTotalWeight(getShippingOptionRequest.Items); var shippingMethods = _shippingService.GetAllShippingMethods(countryId); foreach (var shippingMethod in shippingMethods) { decimal? rate = GetRate(subTotal, weight, shippingMethod.Id, countryId, stateProvinceId, zip); if (rate.HasValue) { var shippingOption = new ShippingOption(); shippingOption.Name = shippingMethod.GetLocalized(x => x.Name); shippingOption.Description = shippingMethod.GetLocalized(x => x.Description); shippingOption.Rate = rate.Value; response.ShippingOptions.Add(shippingOption); } } return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null) { response.AddError("No shipment items"); return response; } if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return response; } if (getShippingOptionRequest.ShippingAddress.Country == null) { response.AddError("Shipping country is not set"); return response; } if (getShippingOptionRequest.CountryFrom == null) { getShippingOptionRequest.CountryFrom = _countryService.GetCountryById(_upsSettings.DefaultShippedFromCountryId); if (getShippingOptionRequest.CountryFrom == null) getShippingOptionRequest.CountryFrom = _countryService.GetAllCountries(true).FirstOrDefault(); } if (String.IsNullOrEmpty(getShippingOptionRequest.ZipPostalCodeFrom)) getShippingOptionRequest.ZipPostalCodeFrom = _upsSettings.DefaultShippedFromZipPostalCode; string requestString = CreateRequest(_upsSettings.AccessKey, _upsSettings.Username, _upsSettings.Password, getShippingOptionRequest, _upsSettings.CustomerClassification, _upsSettings.PickupType, _upsSettings.PackagingType); string responseXml = DoRequest(_upsSettings.Url, requestString); string error = ""; var shippingOptions = ParseResponse(responseXml, ref error); if (String.IsNullOrEmpty(error)) { foreach (var shippingOption in shippingOptions) { if (!shippingOption.Name.ToLower().StartsWith("ups")) shippingOption.Name = string.Format("UPS {0}", shippingOption.Name); shippingOption.Rate += _upsSettings.AdditionalHandlingCharge; response.ShippingOptions.Add(shippingOption); } } else { response.AddError(error); } return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null) { response.AddError("No shipment items"); return response; } if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return response; } if (getShippingOptionRequest.ShippingAddress.Country == null) { response.AddError("Shipping country is not set"); return response; } if (getShippingOptionRequest.ShippingAddress.StateProvince == null) { response.AddError("Shipping state is not set"); return response; } try { var profile = new Profile(); profile.MerchantId = _canadaPostSettings.CustomerId; var destination = new Destination(); destination.City = getShippingOptionRequest.ShippingAddress.City; destination.StateOrProvince = getShippingOptionRequest.ShippingAddress.StateProvince.Abbreviation; destination.Country = getShippingOptionRequest.ShippingAddress.Country.TwoLetterIsoCode; destination.PostalCode = getShippingOptionRequest.ShippingAddress.ZipPostalCode; var items = CreateItems(getShippingOptionRequest); var lang = CanadaPostLanguageEnum.English; if (_workContext.WorkingLanguage.LanguageCulture.StartsWith("fr", StringComparison.InvariantCultureIgnoreCase)) lang = CanadaPostLanguageEnum.French; var requestResult = GetShippingOptionsInternal(profile, destination, items, lang); if (requestResult.IsError) { response.AddError(requestResult.StatusMessage); } else { foreach (var dr in requestResult.AvailableRates) { var so = new ShippingOption(); so.Name = dr.Name; if (!string.IsNullOrEmpty(dr.DeliveryDate)) so.Name += string.Format(" - {0}", dr.DeliveryDate); so.Rate = dr.Amount; response.ShippingOptions.Add(so); } } foreach (var shippingOption in response.ShippingOptions) { if (!shippingOption.Name.StartsWith("canada post", StringComparison.InvariantCultureIgnoreCase)) shippingOption.Name = string.Format("Canada Post {0}", shippingOption.Name); } } catch (Exception e) { response.AddError(e.Message); } return response; }
/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns>Represents a response of getting shipping rate options</returns> public GetShippingOptionResponse GetShippingOptions(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) throw new ArgumentNullException("getShippingOptionRequest"); var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null || getShippingOptionRequest.Items.Count == 0) { response.AddError("No shipment items"); return response; } int? restrictByCountryId = (getShippingOptionRequest.ShippingAddress != null && getShippingOptionRequest.ShippingAddress.Country != null) ? (int?)getShippingOptionRequest.ShippingAddress.Country.Id : null; var shippingMethods = this._shippingService.GetAllShippingMethods(restrictByCountryId); foreach (var shippingMethod in shippingMethods) { var shippingOption = new ShippingOption(); shippingOption.Name = shippingMethod.GetLocalized(x => x.Name); shippingOption.Description = shippingMethod.GetLocalized(x => x.Description); shippingOption.Rate = GetRate(shippingMethod.Id); response.ShippingOptions.Add(shippingOption); } return response; }