Nop.Core_4.7/Plugins/Nop.Plugin.Shipping.FixedBy.../Controllers/FixedByWeightByTotalControl...

482 lines
23 KiB
C#

using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Nop.Core;
using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Directory;
using Nop.Plugin.Shipping.FixedByWeightByTotal.Domain;
using Nop.Plugin.Shipping.FixedByWeightByTotal.Models;
using Nop.Plugin.Shipping.FixedByWeightByTotal.Services;
using Nop.Services.Common;
using Nop.Services.Configuration;
using Nop.Services.Directory;
using Nop.Services.Localization;
using Nop.Services.Security;
using Nop.Services.Shipping;
using Nop.Services.Stores;
using Nop.Web.Framework;
using Nop.Web.Framework.Controllers;
using Nop.Web.Framework.Models.Extensions;
using Nop.Web.Framework.Mvc;
using Nop.Web.Framework.Mvc.Filters;
namespace Nop.Plugin.Shipping.FixedByWeightByTotal.Controllers;
[AuthorizeAdmin]
[Area(AreaNames.ADMIN)]
[AutoValidateAntiforgeryToken]
public class FixedByWeightByTotalController : BasePluginController
{
#region Fields
protected readonly CurrencySettings _currencySettings;
protected readonly FixedByWeightByTotalSettings _fixedByWeightByTotalSettings;
protected readonly ICountryService _countryService;
protected readonly ICurrencyService _currencyService;
protected readonly ILocalizationService _localizationService;
protected readonly IMeasureService _measureService;
protected readonly IPermissionService _permissionService;
protected readonly ISettingService _settingService;
protected readonly IShippingByWeightByTotalService _shippingByWeightService;
protected readonly IShippingService _shippingService;
protected readonly IStateProvinceService _stateProvinceService;
protected readonly IStoreService _storeService;
protected readonly IGenericAttributeService _genericAttributeService;
protected readonly IWorkContext _workContext;
protected readonly MeasureSettings _measureSettings;
#endregion
#region Ctor
public FixedByWeightByTotalController(CurrencySettings currencySettings,
FixedByWeightByTotalSettings fixedByWeightByTotalSettings,
ICountryService countryService,
ICurrencyService currencyService,
ILocalizationService localizationService,
IMeasureService measureService,
IPermissionService permissionService,
ISettingService settingService,
IShippingByWeightByTotalService shippingByWeightService,
IShippingService shippingService,
IStateProvinceService stateProvinceService,
IStoreService storeService,
IGenericAttributeService genericAttributeService,
IWorkContext workContext,
MeasureSettings measureSettings)
{
_currencySettings = currencySettings;
_fixedByWeightByTotalSettings = fixedByWeightByTotalSettings;
_countryService = countryService;
_currencyService = currencyService;
_localizationService = localizationService;
_measureService = measureService;
_permissionService = permissionService;
_settingService = settingService;
_shippingByWeightService = shippingByWeightService;
_stateProvinceService = stateProvinceService;
_shippingService = shippingService;
_storeService = storeService;
_genericAttributeService = genericAttributeService;
_workContext = workContext;
_measureSettings = measureSettings;
}
#endregion
#region Methods
public async Task<IActionResult> Configure(bool showtour = false)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return AccessDeniedView();
var model = new ConfigurationModel
{
LimitMethodsToCreated = _fixedByWeightByTotalSettings.LimitMethodsToCreated,
ShippingByWeightByTotalEnabled = _fixedByWeightByTotalSettings.ShippingByWeightByTotalEnabled
};
//stores
model.AvailableStores.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var store in await _storeService.GetAllStoresAsync())
model.AvailableStores.Add(new SelectListItem { Text = store.Name, Value = store.Id.ToString() });
//warehouses
model.AvailableWarehouses.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var warehouses in await _shippingService.GetAllWarehousesAsync())
model.AvailableWarehouses.Add(new SelectListItem { Text = warehouses.Name, Value = warehouses.Id.ToString() });
//shipping methods
foreach (var sm in await _shippingService.GetAllShippingMethodsAsync())
model.AvailableShippingMethods.Add(new SelectListItem { Text = sm.Name, Value = sm.Id.ToString() });
//countries
model.AvailableCountries.Add(new SelectListItem { Text = "*", Value = "0" });
var countries = await _countryService.GetAllCountriesAsync();
foreach (var c in countries)
model.AvailableCountries.Add(new SelectListItem { Text = c.Name, Value = c.Id.ToString() });
//states
model.AvailableStates.Add(new SelectListItem { Text = "*", Value = "0" });
model.SetGridPageSize();
//show configuration tour
if (showtour)
{
var customer = await _workContext.GetCurrentCustomerAsync();
var hideCard = await _genericAttributeService.GetAttributeAsync<bool>(customer, NopCustomerDefaults.HideConfigurationStepsAttribute);
var closeCard = await _genericAttributeService.GetAttributeAsync<bool>(customer, NopCustomerDefaults.CloseConfigurationStepsAttribute);
if (!hideCard && !closeCard)
ViewBag.ShowTour = true;
}
return View("~/Plugins/Shipping.FixedByWeightByTotal/Views/Configure.cshtml", model);
}
[HttpPost]
public async Task<IActionResult> Configure(ConfigurationModel model)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return Content("Access denied");
//save settings
_fixedByWeightByTotalSettings.LimitMethodsToCreated = model.LimitMethodsToCreated;
await _settingService.SaveSettingAsync(_fixedByWeightByTotalSettings);
return Json(new { Result = true });
}
[HttpPost]
public async Task<IActionResult> SaveMode(bool value)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return Content("Access denied");
//save settings
_fixedByWeightByTotalSettings.ShippingByWeightByTotalEnabled = value;
await _settingService.SaveSettingAsync(_fixedByWeightByTotalSettings);
return Json(new { Result = true });
}
#region Fixed rate
[HttpPost]
public async Task<IActionResult> FixedShippingRateList(ConfigurationModel searchModel)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return await AccessDeniedDataTablesJson();
var shippingMethods = (await _shippingService.GetAllShippingMethodsAsync()).ToPagedList(searchModel);
var gridModel = await new FixedRateListModel().PrepareToGridAsync(searchModel, shippingMethods, () =>
{
return shippingMethods.SelectAwait(async shippingMethod => new FixedRateModel
{
ShippingMethodId = shippingMethod.Id,
ShippingMethodName = shippingMethod.Name,
Rate = await _settingService
.GetSettingByKeyAsync<decimal>(string.Format(FixedByWeightByTotalDefaults.FIXED_RATE_SETTINGS_KEY, shippingMethod.Id)),
TransitDays = await _settingService
.GetSettingByKeyAsync<int?>(string.Format(FixedByWeightByTotalDefaults.TRANSIT_DAYS_SETTINGS_KEY, shippingMethod.Id))
});
});
return Json(gridModel);
}
[HttpPost]
public async Task<IActionResult> UpdateFixedShippingRate(FixedRateModel model)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return Content("Access denied");
await _settingService.SetSettingAsync(string.Format(FixedByWeightByTotalDefaults.FIXED_RATE_SETTINGS_KEY, model.ShippingMethodId), model.Rate, 0, false);
await _settingService.SetSettingAsync(string.Format(FixedByWeightByTotalDefaults.TRANSIT_DAYS_SETTINGS_KEY, model.ShippingMethodId), model.TransitDays, 0, false);
await _settingService.ClearCacheAsync();
return new NullJsonResult();
}
#endregion
#region Rate by weight
[HttpPost]
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);
}
public async Task<IActionResult> AddRateByWeightByTotalPopup()
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return AccessDeniedView();
var model = new ShippingByWeightByTotalModel
{
PrimaryStoreCurrencyCode = (await _currencyService.GetCurrencyByIdAsync(_currencySettings.PrimaryStoreCurrencyId))?.CurrencyCode,
BaseWeightIn = (await _measureService.GetMeasureWeightByIdAsync(_measureSettings.BaseWeightId))?.Name,
WeightTo = 1000000,
OrderSubtotalTo = 1000000
};
var shippingMethods = await _shippingService.GetAllShippingMethodsAsync();
if (!shippingMethods.Any())
return Content("No shipping methods can be loaded");
//stores
model.AvailableStores.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var store in await _storeService.GetAllStoresAsync())
model.AvailableStores.Add(new SelectListItem { Text = store.Name, Value = store.Id.ToString() });
//warehouses
model.AvailableWarehouses.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var warehouses in await _shippingService.GetAllWarehousesAsync())
model.AvailableWarehouses.Add(new SelectListItem { Text = warehouses.Name, Value = warehouses.Id.ToString() });
//shipping methods
foreach (var sm in shippingMethods)
model.AvailableShippingMethods.Add(new SelectListItem { Text = sm.Name, Value = sm.Id.ToString() });
//countries
model.AvailableCountries.Add(new SelectListItem { Text = "*", Value = "0" });
var countries = await _countryService.GetAllCountriesAsync(showHidden: true);
foreach (var c in countries)
model.AvailableCountries.Add(new SelectListItem { Text = c.Name, Value = c.Id.ToString() });
//states
model.AvailableStates.Add(new SelectListItem { Text = "*", Value = "0" });
return View("~/Plugins/Shipping.FixedByWeightByTotal/Views/AddRateByWeightByTotalPopup.cshtml", model);
}
[HttpPost]
public async Task<IActionResult> AddRateByWeightByTotalPopup(ShippingByWeightByTotalModel model)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return AccessDeniedView();
await _shippingByWeightService.InsertShippingByWeightRecordAsync(new ShippingByWeightByTotalRecord
{
StoreId = model.StoreId,
WarehouseId = model.WarehouseId,
CountryId = model.CountryId,
StateProvinceId = model.StateProvinceId,
Zip = model.Zip == "*" ? null : model.Zip,
ShippingMethodId = model.ShippingMethodId,
WeightFrom = model.WeightFrom,
WeightTo = model.WeightTo,
OrderSubtotalFrom = model.OrderSubtotalFrom,
OrderSubtotalTo = model.OrderSubtotalTo,
AdditionalFixedCost = model.AdditionalFixedCost,
RatePerWeightUnit = model.RatePerWeightUnit,
PercentageRateOfSubtotal = model.PercentageRateOfSubtotal,
LowerWeightLimit = model.LowerWeightLimit,
TransitDays = model.TransitDays
});
ViewBag.RefreshPage = true;
return View("~/Plugins/Shipping.FixedByWeightByTotal/Views/AddRateByWeightByTotalPopup.cshtml", model);
}
public async Task<IActionResult> EditRateByWeightByTotalPopup(int id)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return AccessDeniedView();
var sbw = await _shippingByWeightService.GetByIdAsync(id);
if (sbw == null)
//no record found with the specified id
return RedirectToAction("Configure");
var model = new ShippingByWeightByTotalModel
{
Id = sbw.Id,
StoreId = sbw.StoreId,
WarehouseId = sbw.WarehouseId,
CountryId = sbw.CountryId,
StateProvinceId = sbw.StateProvinceId,
Zip = sbw.Zip,
ShippingMethodId = sbw.ShippingMethodId,
WeightFrom = sbw.WeightFrom,
WeightTo = sbw.WeightTo,
OrderSubtotalFrom = sbw.OrderSubtotalFrom,
OrderSubtotalTo = sbw.OrderSubtotalTo,
AdditionalFixedCost = sbw.AdditionalFixedCost,
PercentageRateOfSubtotal = sbw.PercentageRateOfSubtotal,
RatePerWeightUnit = sbw.RatePerWeightUnit,
LowerWeightLimit = sbw.LowerWeightLimit,
PrimaryStoreCurrencyCode = (await _currencyService.GetCurrencyByIdAsync(_currencySettings.PrimaryStoreCurrencyId))?.CurrencyCode,
BaseWeightIn = (await _measureService.GetMeasureWeightByIdAsync(_measureSettings.BaseWeightId))?.Name,
TransitDays = sbw.TransitDays
};
var shippingMethods = await _shippingService.GetAllShippingMethodsAsync();
if (!shippingMethods.Any())
return Content("No shipping methods can be loaded");
var selectedStore = await _storeService.GetStoreByIdAsync(sbw.StoreId);
var selectedWarehouse = await _shippingService.GetWarehouseByIdAsync(sbw.WarehouseId);
var selectedShippingMethod = await _shippingService.GetShippingMethodByIdAsync(sbw.ShippingMethodId);
var selectedCountry = await _countryService.GetCountryByIdAsync(sbw.CountryId);
var selectedState = await _stateProvinceService.GetStateProvinceByIdAsync(sbw.StateProvinceId);
//stores
model.AvailableStores.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var store in await _storeService.GetAllStoresAsync())
model.AvailableStores.Add(new SelectListItem { Text = store.Name, Value = store.Id.ToString(), Selected = (selectedStore != null && store.Id == selectedStore.Id) });
//warehouses
model.AvailableWarehouses.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var warehouse in await _shippingService.GetAllWarehousesAsync())
model.AvailableWarehouses.Add(new SelectListItem { Text = warehouse.Name, Value = warehouse.Id.ToString(), Selected = (selectedWarehouse != null && warehouse.Id == selectedWarehouse.Id) });
//shipping methods
foreach (var sm in shippingMethods)
model.AvailableShippingMethods.Add(new SelectListItem { Text = sm.Name, Value = sm.Id.ToString(), Selected = (selectedShippingMethod != null && sm.Id == selectedShippingMethod.Id) });
//countries
model.AvailableCountries.Add(new SelectListItem { Text = "*", Value = "0" });
var countries = await _countryService.GetAllCountriesAsync(showHidden: true);
foreach (var c in countries)
model.AvailableCountries.Add(new SelectListItem { Text = c.Name, Value = c.Id.ToString(), Selected = (selectedCountry != null && c.Id == selectedCountry.Id) });
//states
var states = selectedCountry != null ? (await _stateProvinceService.GetStateProvincesByCountryIdAsync(selectedCountry.Id, showHidden: true)).ToList() : new List<StateProvince>();
model.AvailableStates.Add(new SelectListItem { Text = "*", Value = "0" });
foreach (var s in states)
model.AvailableStates.Add(new SelectListItem { Text = s.Name, Value = s.Id.ToString(), Selected = (selectedState != null && s.Id == selectedState.Id) });
return View("~/Plugins/Shipping.FixedByWeightByTotal/Views/EditRateByWeightByTotalPopup.cshtml", model);
}
[HttpPost]
public async Task<IActionResult> EditRateByWeightByTotalPopup(ShippingByWeightByTotalModel model)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return AccessDeniedView();
var sbw = await _shippingByWeightService.GetByIdAsync(model.Id);
if (sbw == null)
//no record found with the specified id
return RedirectToAction("Configure");
sbw.StoreId = model.StoreId;
sbw.WarehouseId = model.WarehouseId;
sbw.CountryId = model.CountryId;
sbw.StateProvinceId = model.StateProvinceId;
sbw.Zip = model.Zip == "*" ? null : model.Zip;
sbw.ShippingMethodId = model.ShippingMethodId;
sbw.WeightFrom = model.WeightFrom;
sbw.WeightTo = model.WeightTo;
sbw.OrderSubtotalFrom = model.OrderSubtotalFrom;
sbw.OrderSubtotalTo = model.OrderSubtotalTo;
sbw.AdditionalFixedCost = model.AdditionalFixedCost;
sbw.RatePerWeightUnit = model.RatePerWeightUnit;
sbw.PercentageRateOfSubtotal = model.PercentageRateOfSubtotal;
sbw.LowerWeightLimit = model.LowerWeightLimit;
sbw.TransitDays = model.TransitDays;
await _shippingByWeightService.UpdateShippingByWeightRecordAsync(sbw);
ViewBag.RefreshPage = true;
return View("~/Plugins/Shipping.FixedByWeightByTotal/Views/EditRateByWeightByTotalPopup.cshtml", model);
}
[HttpPost]
public async Task<IActionResult> DeleteRateByWeightByTotal(int id)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
return Content("Access denied");
var sbw = await _shippingByWeightService.GetByIdAsync(id);
if (sbw != null)
await _shippingByWeightService.DeleteShippingByWeightRecordAsync(sbw);
return new NullJsonResult();
}
#endregion
#endregion
}