/// <summary> /// Gets available shipping options /// </summary> /// <param name="getShippingOptionRequest">A request for getting shipping options</param> /// <returns> /// A task that represents the asynchronous operation /// The task result contains the represents a response of getting shipping rate options /// </returns> public async Task <GetShippingOptionResponse> GetShippingOptionsAsync(GetShippingOptionRequest getShippingOptionRequest) { if (getShippingOptionRequest == null) { throw new ArgumentNullException(nameof(getShippingOptionRequest)); } var response = new GetShippingOptionResponse(); if (getShippingOptionRequest.Items == null || !getShippingOptionRequest.Items.Any()) { response.AddError("No shipment items"); return(response); } //choose the shipping rate calculation method if (_fixedByWeightByTotalSettings.ShippingByWeightByTotalEnabled) { //shipping rate calculation by products weight if (getShippingOptionRequest.ShippingAddress == null) { response.AddError("Shipping address is not set"); return(response); } var store = await _storeContext.GetCurrentStoreAsync(); var storeId = getShippingOptionRequest.StoreId != 0 ? getShippingOptionRequest.StoreId : store.Id; var countryId = getShippingOptionRequest.ShippingAddress.CountryId ?? 0; var stateProvinceId = getShippingOptionRequest.ShippingAddress.StateProvinceId ?? 0; var warehouseId = getShippingOptionRequest.WarehouseFrom?.Id ?? 0; var zip = getShippingOptionRequest.ShippingAddress.ZipPostalCode; //get subtotal of shipped items var subTotal = decimal.Zero; foreach (var packageItem in getShippingOptionRequest.Items) { if (await _shippingService.IsFreeShippingAsync(packageItem.ShoppingCartItem)) { continue; } subTotal += (await _shoppingCartService.GetSubTotalAsync(packageItem.ShoppingCartItem, true)).subTotal; } //get weight of shipped items (excluding items with free shipping) var weight = await _shippingService.GetTotalWeightAsync(getShippingOptionRequest, ignoreFreeShippedItems : true); foreach (var shippingMethod in await _shippingService.GetAllShippingMethodsAsync(countryId)) { int?transitDays = null; var rate = decimal.Zero; var shippingByWeightByTotalRecord = await _shippingByWeightByTotalService.FindRecordsAsync( shippingMethod.Id, storeId, warehouseId, countryId, stateProvinceId, zip, weight, subTotal); if (shippingByWeightByTotalRecord == null) { if (_fixedByWeightByTotalSettings.LimitMethodsToCreated) { continue; } } else { rate = GetRate(shippingByWeightByTotalRecord, subTotal, weight); transitDays = shippingByWeightByTotalRecord.TransitDays; } response.ShippingOptions.Add(new ShippingOption { Name = await _localizationService.GetLocalizedAsync(shippingMethod, x => x.Name), Description = await _localizationService.GetLocalizedAsync(shippingMethod, x => x.Description), Rate = rate, TransitDays = transitDays }); } } else { //shipping rate calculation by fixed rate var restrictByCountryId = getShippingOptionRequest.ShippingAddress?.CountryId; response.ShippingOptions = await(await _shippingService.GetAllShippingMethodsAsync(restrictByCountryId)).SelectAwait(async shippingMethod => new ShippingOption { Name = await _localizationService.GetLocalizedAsync(shippingMethod, x => x.Name), Description = await _localizationService.GetLocalizedAsync(shippingMethod, x => x.Description), Rate = await GetRateAsync(shippingMethod.Id), TransitDays = await GetTransitDaysAsync(shippingMethod.Id) }).ToListAsync(); } return(response); }
/// <returns>A task that represents the asynchronous operation</returns> public async Task <IActionResult> RateByWeightByTotalList(ConfigurationModel searchModel, ConfigurationModel filter) { if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings)) { return(await AccessDeniedDataTablesJson()); } //var records = _shippingByWeightService.GetAll(command.Page - 1, command.PageSize); var records = await _shippingByWeightService.FindRecordsAsync( pageIndex : searchModel.Page - 1, pageSize : searchModel.PageSize, storeId : filter.SearchStoreId, warehouseId : filter.SearchWarehouseId, countryId : filter.SearchCountryId, stateProvinceId : filter.SearchStateProvinceId, zip : filter.SearchZip, shippingMethodId : filter.SearchShippingMethodId, weight : null, orderSubtotal : null ); var gridModel = await new ShippingByWeightByTotalListModel().PrepareToGridAsync(searchModel, records, () => { return(records.SelectAwait(async record => { var model = new ShippingByWeightByTotalModel { Id = record.Id, StoreId = record.StoreId, StoreName = (await _storeService.GetStoreByIdAsync(record.StoreId))?.Name ?? "*", WarehouseId = record.WarehouseId, WarehouseName = (await _shippingService.GetWarehouseByIdAsync(record.WarehouseId))?.Name ?? "*", ShippingMethodId = record.ShippingMethodId, ShippingMethodName = (await _shippingService.GetShippingMethodByIdAsync(record.ShippingMethodId))?.Name ?? "Unavailable", CountryId = record.CountryId, CountryName = (await _countryService.GetCountryByIdAsync(record.CountryId))?.Name ?? "*", StateProvinceId = record.StateProvinceId, StateProvinceName = (await _stateProvinceService.GetStateProvinceByIdAsync(record.StateProvinceId))?.Name ?? "*", WeightFrom = record.WeightFrom, WeightTo = record.WeightTo, OrderSubtotalFrom = record.OrderSubtotalFrom, OrderSubtotalTo = record.OrderSubtotalTo, AdditionalFixedCost = record.AdditionalFixedCost, PercentageRateOfSubtotal = record.PercentageRateOfSubtotal, RatePerWeightUnit = record.RatePerWeightUnit, LowerWeightLimit = record.LowerWeightLimit, Zip = !string.IsNullOrEmpty(record.Zip) ? record.Zip : "*" }; var htmlSb = new StringBuilder("<div>"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.WeightFrom"), model.WeightFrom); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.WeightTo"), model.WeightTo); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.OrderSubtotalFrom"), model.OrderSubtotalFrom); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.OrderSubtotalTo"), model.OrderSubtotalTo); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.AdditionalFixedCost"), model.AdditionalFixedCost); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.RatePerWeightUnit"), model.RatePerWeightUnit); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.LowerWeightLimit"), model.LowerWeightLimit); htmlSb.Append("<br />"); htmlSb.AppendFormat("{0}: {1}", await _localizationService.GetResourceAsync("Plugins.Shipping.FixedByWeightByTotal.Fields.PercentageRateOfSubtotal"), model.PercentageRateOfSubtotal); htmlSb.Append("</div>"); model.DataHtml = htmlSb.ToString(); return model; })); }); return(Json(gridModel)); }