public virtual async Task <CheckoutShippingMethodModel> PrepareShippingMethod(IList <ShoppingCartItem> cart, Address shippingAddress) { var model = new CheckoutShippingMethodModel(); var getShippingOptionResponse = await _shippingService .GetShippingOptions(_workContext.CurrentCustomer, cart, shippingAddress, "", _storeContext.CurrentStore); if (getShippingOptionResponse.Success) { //performance optimization. cache returned shipping options. //we'll use them later (after a customer has selected an option). await _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer, SystemCustomerAttributeNames.OfferedShippingOptions, getShippingOptionResponse.ShippingOptions, _storeContext.CurrentStore.Id); foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { var soModel = new CheckoutShippingMethodModel.ShippingMethodModel { Name = shippingOption.Name, Description = shippingOption.Description, ShippingRateComputationMethodSystemName = shippingOption.ShippingRateComputationMethodSystemName, ShippingOption = shippingOption, }; //adjust rate var shippingTotal = (await _orderTotalCalculationService.AdjustShippingRate( shippingOption.Rate, cart)).shippingRate; decimal rateBase = (await _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer)).shippingPrice; decimal rate = await _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, _workContext.WorkingCurrency); soModel.Fee = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingMethods.Add(soModel); } //find a selected (previously) shipping method var selectedShippingOption = await _workContext.CurrentCustomer.GetAttribute <ShippingOption>( _genericAttributeService, SystemCustomerAttributeNames.SelectedShippingOption, _storeContext.CurrentStore.Id); if (selectedShippingOption != null) { var shippingOptionToSelect = model.ShippingMethods.ToList() .Find(so => !String.IsNullOrEmpty(so.Name) && so.Name.Equals(selectedShippingOption.Name, StringComparison.OrdinalIgnoreCase) && !String.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName) && so.ShippingRateComputationMethodSystemName.Equals(selectedShippingOption.ShippingRateComputationMethodSystemName, StringComparison.OrdinalIgnoreCase)); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //if no option has been selected, let's do it for the first one if (model.ShippingMethods.FirstOrDefault(so => so.Selected) == null) { var shippingOptionToSelect = model.ShippingMethods.FirstOrDefault(); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //notify about shipping from multiple locations if (_shippingSettings.NotifyCustomerAboutShippingFromMultipleLocations) { model.NotifyCustomerAboutShippingFromMultipleLocations = getShippingOptionResponse.ShippingFromMultipleLocations; } } else { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } return(model); }
protected CheckoutShippingMethodModel PrepareShippingMethodModel(IList <OrganizedShoppingCartItem> cart) { var model = new CheckoutShippingMethodModel(); var getShippingOptionResponse = _shippingService.GetShippingOptions(cart, _workContext.CurrentCustomer.ShippingAddress, "", _storeContext.CurrentStore.Id); if (getShippingOptionResponse.Success) { //performance optimization. cache returned shipping options. //we'll use them later (after a customer has selected an option). _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer, SystemCustomerAttributeNames.OfferedShippingOptions, getShippingOptionResponse.ShippingOptions, _storeContext.CurrentStore.Id); var shippingMethods = _shippingService.GetAllShippingMethods(); foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { var soModel = new CheckoutShippingMethodModel.ShippingMethodModel() { ShippingMethodId = shippingOption.ShippingMethodId, Name = shippingOption.Name, Description = shippingOption.Description, ShippingRateComputationMethodSystemName = shippingOption.ShippingRateComputationMethodSystemName, }; var srcmProvider = _shippingService.LoadShippingRateComputationMethodBySystemName(shippingOption.ShippingRateComputationMethodSystemName); if (srcmProvider != null) { soModel.BrandUrl = _pluginMediator.GetBrandImageUrl(srcmProvider.Metadata); } //adjust rate Discount appliedDiscount = null; var shippingTotal = _orderTotalCalculationService.AdjustShippingRate( shippingOption.Rate, cart, shippingOption.Name, shippingMethods, out appliedDiscount); decimal rateBase = _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer); decimal rate = _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, _workContext.WorkingCurrency); soModel.FeeRaw = rate; soModel.Fee = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingMethods.Add(soModel); } //find a selected (previously) shipping method var selectedShippingOption = _workContext.CurrentCustomer.GetAttribute <ShippingOption>(SystemCustomerAttributeNames.SelectedShippingOption, _storeContext.CurrentStore.Id); if (selectedShippingOption != null) { var shippingOptionToSelect = model.ShippingMethods.ToList() .Find(so => !String.IsNullOrEmpty(so.Name) && so.Name.Equals(selectedShippingOption.Name, StringComparison.InvariantCultureIgnoreCase) && !String.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName) && so.ShippingRateComputationMethodSystemName.Equals(selectedShippingOption.ShippingRateComputationMethodSystemName, StringComparison.InvariantCultureIgnoreCase)); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //if no option has been selected, let's do it for the first one if (model.ShippingMethods.Where(so => so.Selected).FirstOrDefault() == null) { var shippingOptionToSelect = model.ShippingMethods.FirstOrDefault(); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } } else { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } return(model); }
public CheckoutShippingMethodModel PrepareShippingMethodModel(IList <ShoppingCartItem> cart) { var model = new CheckoutShippingMethodModel(); var shippingAddress = _addressService.GetAddressById(_workContext.CurrentCustomer.ShippingAddressId ?? 0); var getShippingOptionResponse = _shippingService.GetShippingOptions(cart, shippingAddress); if (getShippingOptionResponse.Success) { //performance optimization. cache returned shipping options. //we'll use them later (after a customer has selected an option). _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer, NopCustomerDefaults.OfferedShippingOptionsAttribute, getShippingOptionResponse.ShippingOptions, _storeContext.CurrentStore.Id); foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { var soModel = new CheckoutShippingMethodModel.ShippingMethodModel { Name = shippingOption.Name, Description = shippingOption.Description, ShippingRateComputationMethodSystemName = shippingOption.ShippingRateComputationMethodSystemName }; //adjust rate var shippingTotal = _orderTotalCalculationService.AdjustShippingRate( shippingOption.Rate, cart, out _); var rateBase = _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer); var rate = _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, _workContext.WorkingCurrency); soModel.Fee = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingMethods.Add(soModel); } //find a selected (previously) shipping method var selectedShippingOption = _genericAttributeService.GetAttribute <ShippingOption>(_workContext.CurrentCustomer, NopCustomerDefaults.SelectedShippingOptionAttribute, _storeContext.CurrentStore.Id); CheckoutShippingMethodModel.ShippingMethodModel shippingOptionToSelect; if (selectedShippingOption != null) { shippingOptionToSelect = model.ShippingMethods.ToList() .Find(so => !string.IsNullOrEmpty(so.Name) && so.Name.Equals(selectedShippingOption.Name, StringComparison.InvariantCultureIgnoreCase) && !string.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName) && so.ShippingRateComputationMethodSystemName.Equals(selectedShippingOption.ShippingRateComputationMethodSystemName, StringComparison.InvariantCultureIgnoreCase)); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //if no option has been selected, let's do it for the first one if (model.ShippingMethods.FirstOrDefault(so => so.Selected) != null) { return(model); } shippingOptionToSelect = model.ShippingMethods.FirstOrDefault(); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } else { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } return(model); }
public async Task <EstimateShippingResultModel> Handle(GetEstimateShippingResult request, CancellationToken cancellationToken) { var model = new EstimateShippingResultModel(); if (request.Cart.RequiresShipping()) { var address = new Address { CountryId = request.CountryId, StateProvinceId = request.StateProvinceId, ZipPostalCode = request.ZipPostalCode, }; GetShippingOptionResponse getShippingOptionResponse = await _shippingService .GetShippingOptions(request.Customer, request.Cart, address, "", request.Store); if (!getShippingOptionResponse.Success) { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } else { if (getShippingOptionResponse.ShippingOptions.Any()) { foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { var soModel = new EstimateShippingResultModel.ShippingOptionModel { Name = shippingOption.Name, Description = shippingOption.Description, }; //calculate discounted and taxed rate var total = await _orderTotalCalculationService.AdjustShippingRate(shippingOption.Rate, request.Cart); List <AppliedDiscount> appliedDiscounts = total.appliedDiscounts; decimal shippingTotal = total.shippingRate; decimal rateBase = (await _taxService.GetShippingPrice(shippingTotal, request.Customer)).shippingPrice; decimal rate = await _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, request.Currency); soModel.Price = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingOptions.Add(soModel); } //pickup in store? if (_shippingSettings.AllowPickUpInStore) { var pickupPoints = await _shippingService.GetAllPickupPoints(); if (pickupPoints.Count > 0) { var soModel = new EstimateShippingResultModel.ShippingOptionModel { Name = _localizationService.GetResource("Checkout.PickUpInStore"), Description = _localizationService.GetResource("Checkout.PickUpInStore.Description"), }; decimal shippingTotal = pickupPoints.Max(x => x.PickupFee); decimal rateBase = (await _taxService.GetShippingPrice(shippingTotal, request.Customer)).shippingPrice; decimal rate = await _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, request.Currency); soModel.Price = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingOptions.Add(soModel); } } } else { model.Warnings.Add(_localizationService.GetResource("Checkout.ShippingIsNotAllowed")); } } } return(model); }
public IActionResult GetShippings([FromBody] ShippingsParametersModel parameters) { var consumerKey = Request.Headers.GetInstantCheckoutConsumerKey(); var consumerSecret = Request.Headers.GetInstantCheckoutConsumerSecret(); if (consumerKey == Guid.Empty || consumerSecret == Guid.Empty) { return(Unauthorized()); } var storeScope = _storeContext.ActiveStoreScopeConfiguration; var instantCheckoutSettings = _settingService.LoadSetting <InstantCheckoutSettings>(storeScope); if (consumerKey != instantCheckoutSettings.ConsumerKey && consumerSecret != instantCheckoutSettings.ConsumerSecret) { return(Unauthorized()); } if (parameters.Ids == null && parameters.Ids.Any(x => x <= 0)) { return(Error(HttpStatusCode.BadRequest, "id", "invalid id")); } var allProducts = _productApiService.GetProducts(parameters.Ids) .Where(p => _storeMappingService.Authorize(p)); var cart = new List <ShoppingCartItem> { }; foreach (var product in allProducts) { cart.Add(new ShoppingCartItem { Customer = _workContext.CurrentCustomer, CustomerId = _workContext.CurrentCustomer.Id, ProductId = product.Id, Product = product, Quantity = 1 //TODO ADD Proper Quantity by Product Check Shipping By Weight }); } var model = new ShippingOptionsViewModel(); var country = _countryService.GetCountryByTwoLetterIsoCode(parameters.CountryCode); var state = _stateProvinceService.GetStateProvinceByAbbreviation(parameters.StateCode); var address = new Address { CountryId = country.Id, Country = country, StateProvinceId = state != null ? state.Id : 0, StateProvince = state != null ? state : null, ZipPostalCode = parameters.ZipCode, }; var getShippingOptionResponse = _shippingService.GetShippingOptions(cart, address, _workContext.CurrentCustomer, storeId: _storeContext.CurrentStore.Id); if (getShippingOptionResponse.Success) { if (getShippingOptionResponse.ShippingOptions.Any()) { foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { //calculate discounted and taxed rate var shippingRate = _orderTotalCalculationService.AdjustShippingRate(shippingOption.Rate, cart, out var _); shippingRate = _taxService.GetShippingPrice(shippingRate, _workContext.CurrentCustomer); shippingRate = _currencyService.ConvertFromPrimaryStoreCurrency(shippingRate, _workContext.WorkingCurrency); model.ShippingOptions.Add(new ShippingOptionModel { Name = shippingOption.Name, Description = shippingOption.Description, Price = shippingRate, Plugin = shippingOption.ShippingRateComputationMethodSystemName }); } } } else { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } if (_shippingSettings.AllowPickupInStore) { var pickupPointsResponse = _shippingService.GetPickupPoints(address, _workContext.CurrentCustomer, storeId: _storeContext.CurrentStore.Id); if (pickupPointsResponse.Success) { if (pickupPointsResponse.PickupPoints.Any()) { var soModel = new ShippingOptionModel { Name = _localizationService.GetResource("Checkout.PickupPoints"), Description = _localizationService.GetResource("Checkout.PickupPoints.Description"), }; var pickupFee = pickupPointsResponse.PickupPoints.Min(x => x.PickupFee); if (pickupFee > 0) { pickupFee = _taxService.GetShippingPrice(pickupFee, _workContext.CurrentCustomer); pickupFee = _currencyService.ConvertFromPrimaryStoreCurrency(pickupFee, _workContext.WorkingCurrency); } soModel.Price = pickupFee; soModel.Plugin = "Pickup.PickupInStore"; model.ShippingOptions.Add(soModel); } } else { foreach (var error in pickupPointsResponse.Errors) { model.Warnings.Add(error); } } } return(Ok(model)); }
/// <summary> /// Post cart to google /// </summary> /// <param name="req">Pre-generated request</param> /// <param name="cart">Shopping cart</param> /// <returns>Response</returns> public GCheckoutResponse PostCartToGoogle(CheckoutShoppingCartRequest req, IList <Core.Domain.Orders.ShoppingCartItem> cart) { //there's no need to round prices (Math.Round(,2)) because GCheckout library does it for us //items foreach (Core.Domain.Orders.ShoppingCartItem sci in cart) { var productVariant = sci.ProductVariant; if (productVariant != null) { decimal taxRate = decimal.Zero; string description = _productAttributeFormatter.FormatAttributes(productVariant, sci.AttributesXml, _workContext.CurrentCustomer, ", ", false, true, true, true, false); string fullName = ""; if (!String.IsNullOrEmpty(sci.ProductVariant.GetLocalized(x => x.Name))) { fullName = string.Format("{0} ({1})", sci.ProductVariant.Product.GetLocalized(x => x.Name), sci.ProductVariant.GetLocalized(x => x.Name)); } else { fullName = sci.ProductVariant.Product.GetLocalized(x => x.Name); } decimal unitPrice = _taxService.GetProductPrice(sci.ProductVariant, _priceCalculationService.GetUnitPrice(sci, true), out taxRate); req.AddItem(fullName, description, sci.Id.ToString(), unitPrice, sci.Quantity); } } if (cart.RequiresShipping()) { //AddMerchantCalculatedShippingMethod //AddCarrierCalculatedShippingOption var shippingOptions = _shippingService.GetShippingOptions(cart, null); foreach (ShippingOption shippingOption in shippingOptions.ShippingOptions) { //adjust rate Discount appliedDiscount = null; var shippingTotal = _orderTotalCalculationService.AdjustShippingRate( shippingOption.Rate, cart, out appliedDiscount); decimal shippingRateBase = _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer); req.AddFlatRateShippingMethod(shippingOption.Name, shippingRateBase); } } //add only US, GB states //CountryCollection countries = IoC.Resolve<ICountryService>().GetAllCountries(); //foreach (Country country in countries) //{ // foreach (StateProvince state in country.StateProvinces) // { // TaxByStateProvinceCollection taxByStateProvinceCollection = TaxByIoC.Resolve<IStateProvinceService>().GetAllByStateProvinceID(state.StateProvinceID); // foreach (TaxByStateProvince taxByStateProvince in taxByStateProvinceCollection) // { // if (!String.IsNullOrEmpty(state.Abbreviation)) // { // Req.AddStateTaxRule(state.Abbreviation, (double)taxByStateProvince.Percentage, false); // } // } // } //} //if (subTotalDiscountBase > decimal.Zero) //{ // req.AddItem("Discount", string.Empty, string.Empty, (decimal)(-1.0) * subTotalDiscountBase, 1); //} //foreach (AppliedGiftCard agc in appliedGiftCards) //{ // req.AddItem(string.Format("Gift Card - {0}", agc.GiftCard.GiftCardCouponCode), string.Empty, string.Empty, (decimal)(-1.0) * agc.AmountCanBeUsed, 1); //} var customerInfoDoc = new XmlDocument(); XmlElement customerInfo = customerInfoDoc.CreateElement("CustomerInfo"); customerInfo.SetAttribute("CustomerID", _workContext.CurrentCustomer.Id.ToString()); customerInfo.SetAttribute("CustomerLanguageID", _workContext.WorkingLanguage.Id.ToString()); customerInfo.SetAttribute("CustomerCurrencyID", _workContext.WorkingCurrency.Id.ToString()); req.AddMerchantPrivateDataNode(customerInfo); req.ContinueShoppingUrl = _webHelper.GetStoreLocation(false); if (_settingService.GetSettingByKey <bool>("GoogleCheckout.PassEditLink")) { req.EditCartUrl = _webHelper.GetStoreLocation(false) + "cart"; } GCheckoutResponse resp = req.Send(); return(resp); }
/// <summary> /// Prepares the checkout pickup points model /// </summary> /// <param name="cart">Cart</param> /// <returns>The checkout pickup points model</returns> protected virtual CheckoutPickupPointsModel PrepareCheckoutPickupPointsModel(IList <ShoppingCartItem> cart) { var model = new CheckoutPickupPointsModel() { AllowPickupInStore = _shippingSettings.AllowPickupInStore }; if (model.AllowPickupInStore) { model.DisplayPickupPointsOnMap = _shippingSettings.DisplayPickupPointsOnMap; model.GoogleMapsApiKey = _shippingSettings.GoogleMapsApiKey; var pickupPointProviders = _pickupPluginManager.LoadActivePlugins(_workContext.CurrentCustomer, _storeContext.CurrentStore.Id); if (pickupPointProviders.Any()) { var languageId = _workContext.WorkingLanguage.Id; var pickupPointsResponse = _shippingService.GetPickupPoints(_workContext.CurrentCustomer.BillingAddressId ?? 0, _workContext.CurrentCustomer, storeId: _storeContext.CurrentStore.Id); if (pickupPointsResponse.Success) { model.PickupPoints = pickupPointsResponse.PickupPoints.Select(point => { var country = _countryService.GetCountryByTwoLetterIsoCode(point.CountryCode); var state = _stateProvinceService.GetStateProvinceByAbbreviation(point.StateAbbreviation, country?.Id); var pickupPointModel = new CheckoutPickupPointModel { Id = point.Id, Name = point.Name, Description = point.Description, ProviderSystemName = point.ProviderSystemName, Address = point.Address, City = point.City, County = point.County, StateName = state != null ? _localizationService.GetLocalized(state, x => x.Name, languageId) : string.Empty, CountryName = country != null ? _localizationService.GetLocalized(country, x => x.Name, languageId) : string.Empty, ZipPostalCode = point.ZipPostalCode, Latitude = point.Latitude, Longitude = point.Longitude, OpeningHours = point.OpeningHours }; var cart = _shoppingCartService.GetShoppingCart(_workContext.CurrentCustomer, ShoppingCartType.ShoppingCart, _storeContext.CurrentStore.Id); var amount = _orderTotalCalculationService.IsFreeShipping(cart) ? 0 : point.PickupFee; if (amount > 0) { amount = _taxService.GetShippingPrice(amount, _workContext.CurrentCustomer); amount = _currencyService.ConvertFromPrimaryStoreCurrency(amount, _workContext.WorkingCurrency); pickupPointModel.PickupFee = _priceFormatter.FormatShippingPrice(amount, true); } //adjust rate var shippingTotal = _orderTotalCalculationService.AdjustShippingRate(point.PickupFee, cart, out var _, true); var rateBase = _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer); var rate = _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, _workContext.WorkingCurrency); pickupPointModel.PickupFee = _priceFormatter.FormatShippingPrice(rate, true); return(pickupPointModel); }).ToList(); } else { foreach (var error in pickupPointsResponse.Errors) { model.Warnings.Add(error); } } } //only available pickup points var shippingProviders = _shippingPluginManager.LoadActivePlugins(_workContext.CurrentCustomer, _storeContext.CurrentStore.Id); if (!shippingProviders.Any()) { if (!pickupPointProviders.Any()) { model.Warnings.Add(_localizationService.GetResource("Checkout.ShippingIsNotAllowed")); model.Warnings.Add(_localizationService.GetResource("Checkout.PickupPoints.NotAvailable")); } model.PickupInStoreOnly = true; model.PickupInStore = true; return(model); } } return(model); }
/// <summary> /// Prepare shipping method model /// </summary> /// <param name="cart">Cart</param> /// <param name="shippingAddress">Shipping address</param> /// <returns>Shipping method model</returns> public virtual CheckoutShippingMethodModel PrepareShippingMethodModel(IList <ShoppingCartItem> cart, Address shippingAddress) { var model = new CheckoutShippingMethodModel(); var getShippingOptionResponse = _shippingService.GetShippingOptions(cart, shippingAddress, _workContext.CurrentCustomer, storeId: _storeContext.CurrentStore.Id); if (getShippingOptionResponse.Success) { //performance optimization. cache returned shipping options. //we'll use them later (after a customer has selected an option). _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer, NopCustomerDefaults.OfferedShippingOptionsAttribute, getShippingOptionResponse.ShippingOptions, _storeContext.CurrentStore.Id); //ADDED FOR FREE SHIPPING var allshippingMethods = _shippingService.GetAllShippingMethods(); foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { var soModel = new CheckoutShippingMethodModel.ShippingMethodModel { Name = shippingOption.Name, Description = shippingOption.Description, ShippingRateComputationMethodSystemName = shippingOption.ShippingRateComputationMethodSystemName, ShippingOption = shippingOption, }; //adjust rate var shippingTotal = _orderTotalCalculationService.AdjustShippingRate(shippingOption.Rate, cart, out List <DiscountForCaching> _); var rateBase = _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer); //ADDED FOR FREE SHIPPING if (allshippingMethods.Where(s => s.Name == shippingOption.Name).Any()) { var shippingMethod = allshippingMethods.Where(s => s.Name == shippingOption.Name).FirstOrDefault(); bool isFreeShipping = _settingService.GetSettingByKey <bool>(string.Format("ShippingRateComputationMethod.FixedByWeightByTotal.FreeShipping.ShippingMethodId{0}", shippingMethod.Id)); var shipppingMethodRate = _settingService.GetSettingByKey <decimal>(string.Format("ShippingRateComputationMethod.FixedByWeightByTotal.Rate.ShippingMethodId{0}", shippingMethod.Id)); if (!isFreeShipping) { rateBase = shipppingMethodRate; } } var rate = _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, _workContext.WorkingCurrency); soModel.Fee = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingMethods.Add(soModel); } //find a selected (previously) shipping method var selectedShippingOption = _genericAttributeService.GetAttribute <ShippingOption>(_workContext.CurrentCustomer, NopCustomerDefaults.SelectedShippingOptionAttribute, _storeContext.CurrentStore.Id); if (selectedShippingOption != null) { var shippingOptionToSelect = model.ShippingMethods.ToList() .Find(so => !string.IsNullOrEmpty(so.Name) && so.Name.Equals(selectedShippingOption.Name, StringComparison.InvariantCultureIgnoreCase) && !string.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName) && so.ShippingRateComputationMethodSystemName.Equals(selectedShippingOption.ShippingRateComputationMethodSystemName, StringComparison.InvariantCultureIgnoreCase)); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //if no option has been selected, let's do it for the first one if (model.ShippingMethods.FirstOrDefault(so => so.Selected) == null) { var shippingOptionToSelect = model.ShippingMethods.FirstOrDefault(); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //notify about shipping from multiple locations if (_shippingSettings.NotifyCustomerAboutShippingFromMultipleLocations) { model.NotifyCustomerAboutShippingFromMultipleLocations = getShippingOptionResponse.ShippingFromMultipleLocations; } } else { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } return(model); }
/// <summary> /// Prepare shipping method model /// </summary> /// <param name="cart">Cart</param> /// <param name="shippingAddress">Shipping address</param> /// <returns>Shipping method model</returns> public virtual CheckoutShippingMethodModel PrepareShippingMethodModel(IList <ShoppingCartItem> cart, Address shippingAddress) { var model = new CheckoutShippingMethodModel(); var getShippingOptionResponse = _shippingService.GetShippingOptions(cart, shippingAddress, _workContext.CurrentCustomer, storeId: _storeContext.CurrentStore.Id); if (getShippingOptionResponse.Success) { //performance optimization. cache returned shipping options. //we'll use them later (after a customer has selected an option). _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer, SystemCustomerAttributeNames.OfferedShippingOptions, getShippingOptionResponse.ShippingOptions, _storeContext.CurrentStore.Id); foreach (var shippingOption in getShippingOptionResponse.ShippingOptions) { var soModel = new CheckoutShippingMethodModel.ShippingMethodModel { Name = shippingOption.Name, Description = shippingOption.Description, ShippingRateComputationMethodSystemName = shippingOption.ShippingRateComputationMethodSystemName, ShippingOption = shippingOption, }; //adjust rate var shippingTotal = _orderTotalCalculationService.AdjustShippingRate(shippingOption.Rate, cart, out List <DiscountForCaching> _); var rateBase = _taxService.GetShippingPrice(shippingTotal, _workContext.CurrentCustomer); var rate = _currencyService.ConvertFromPrimaryStoreCurrency(rateBase, _workContext.WorkingCurrency); soModel.Fee = _priceFormatter.FormatShippingPrice(rate, true); model.ShippingMethods.Add(soModel); } //find a selected (previously) shipping method var selectedShippingOption = _workContext.CurrentCustomer.GetAttribute <ShippingOption>( SystemCustomerAttributeNames.SelectedShippingOption, _storeContext.CurrentStore.Id); if (selectedShippingOption != null) { var shippingOptionToSelect = model.ShippingMethods.ToList() .Find(so => !string.IsNullOrEmpty(so.Name) && so.Name.Equals(selectedShippingOption.Name, StringComparison.InvariantCultureIgnoreCase) && !string.IsNullOrEmpty(so.ShippingRateComputationMethodSystemName) && so.ShippingRateComputationMethodSystemName.Equals(selectedShippingOption.ShippingRateComputationMethodSystemName, StringComparison.InvariantCultureIgnoreCase)); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //if no option has been selected, let's do it for the first one if (model.ShippingMethods.FirstOrDefault(so => so.Selected) == null) { var shippingOptionToSelect = model.ShippingMethods.FirstOrDefault(); if (shippingOptionToSelect != null) { shippingOptionToSelect.Selected = true; } } //notify about shipping from multiple locations if (_shippingSettings.NotifyCustomerAboutShippingFromMultipleLocations) { model.NotifyCustomerAboutShippingFromMultipleLocations = getShippingOptionResponse.ShippingFromMultipleLocations; } } else { foreach (var error in getShippingOptionResponse.Errors) { model.Warnings.Add(error); } } var lowesRate = 0M; var LowesName = string.Empty; var onlyIfTwo = 0; var sModel = new Nop.Web.Models.Checkout.CheckoutShippingMethodModel.ShippingMethodModel(); foreach (var lowes in model.ShippingMethods.Where(x => x.Name.ToLower().Contains("ground"))) { var price = Convert.ToDecimal(lowes.Fee.Replace(",", "").Replace("$", "")); if (lowes.Name.ToLower().Contains("ground")) { if (price > 0) { if (lowesRate <= price) { sModel = lowes; LowesName = lowes.Name; lowesRate = price; onlyIfTwo++; } } } } if (onlyIfTwo > 1) { model.ShippingMethods.Remove(sModel); } return(model); }