using Microsoft.AspNetCore.Mvc; using Nop.Core; using Nop.Plugin.Payments.Manual.Models; using Nop.Services; using Nop.Services.Configuration; using Nop.Services.Localization; using Nop.Services.Messages; using Nop.Services.Security; using Nop.Web.Framework; using Nop.Web.Framework.Controllers; using Nop.Web.Framework.Mvc.Filters; namespace Nop.Plugin.Payments.Manual.Controllers; [AuthorizeAdmin] [Area(AreaNames.ADMIN)] [AutoValidateAntiforgeryToken] public class PaymentManualController : BasePaymentController { #region Fields protected readonly ILocalizationService _localizationService; protected readonly INotificationService _notificationService; protected readonly IPermissionService _permissionService; protected readonly ISettingService _settingService; protected readonly IStoreContext _storeContext; #endregion #region Ctor public PaymentManualController(ILocalizationService localizationService, INotificationService notificationService, IPermissionService permissionService, ISettingService settingService, IStoreContext storeContext) { _localizationService = localizationService; _notificationService = notificationService; _permissionService = permissionService; _settingService = settingService; _storeContext = storeContext; } #endregion #region Methods public async Task Configure() { if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePaymentMethods)) return AccessDeniedView(); //load settings for a chosen store scope var storeScope = await _storeContext.GetActiveStoreScopeConfigurationAsync(); var manualPaymentSettings = await _settingService.LoadSettingAsync(storeScope); var model = new ConfigurationModel { TransactModeId = Convert.ToInt32(manualPaymentSettings.TransactMode), AdditionalFee = manualPaymentSettings.AdditionalFee, AdditionalFeePercentage = manualPaymentSettings.AdditionalFeePercentage, TransactModeValues = await manualPaymentSettings.TransactMode.ToSelectListAsync(), ActiveStoreScopeConfiguration = storeScope }; if (storeScope > 0) { model.TransactModeId_OverrideForStore = await _settingService.SettingExistsAsync(manualPaymentSettings, x => x.TransactMode, storeScope); model.AdditionalFee_OverrideForStore = await _settingService.SettingExistsAsync(manualPaymentSettings, x => x.AdditionalFee, storeScope); model.AdditionalFeePercentage_OverrideForStore = await _settingService.SettingExistsAsync(manualPaymentSettings, x => x.AdditionalFeePercentage, storeScope); } return View("~/Plugins/Payments.Manual/Views/Configure.cshtml", model); } [HttpPost] public async Task Configure(ConfigurationModel model) { if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePaymentMethods)) return AccessDeniedView(); if (!ModelState.IsValid) return await Configure(); //load settings for a chosen store scope var storeScope = await _storeContext.GetActiveStoreScopeConfigurationAsync(); var manualPaymentSettings = await _settingService.LoadSettingAsync(storeScope); //save settings manualPaymentSettings.TransactMode = (TransactMode)model.TransactModeId; manualPaymentSettings.AdditionalFee = model.AdditionalFee; manualPaymentSettings.AdditionalFeePercentage = model.AdditionalFeePercentage; /* We do not clear cache after each setting update. * This behavior can increase performance because cached settings will not be cleared * and loaded from database after each update */ await _settingService.SaveSettingOverridablePerStoreAsync(manualPaymentSettings, x => x.TransactMode, model.TransactModeId_OverrideForStore, storeScope, false); await _settingService.SaveSettingOverridablePerStoreAsync(manualPaymentSettings, x => x.AdditionalFee, model.AdditionalFee_OverrideForStore, storeScope, false); await _settingService.SaveSettingOverridablePerStoreAsync(manualPaymentSettings, x => x.AdditionalFeePercentage, model.AdditionalFeePercentage_OverrideForStore, storeScope, false); //now clear settings cache await _settingService.ClearCacheAsync(); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Plugins.Saved")); return await Configure(); } #endregion }