Try your search with a different keyword or use * as a wildcard.
using Nop.Core.Domain.Cms;
using Nop.Core.Domain.Messages;
using Nop.Plugin.Misc.RFQ.Components;
using Nop.Plugin.Misc.RFQ.Services;
using Nop.Services.Cms;
using Nop.Services.Common;
using Nop.Services.Configuration;
using Nop.Services.Localization;
using Nop.Services.Messages;
using Nop.Services.Plugins;
using Nop.Services.Security;
using Nop.Web.Framework.Infrastructure;
using Nop.Web.Framework.Mvc.Routing;
namespace Nop.Plugin.Misc.RFQ;
///
/// Represents the "Request a quote" and "Quotes" plugin
///
public class RfqPlugin : BasePlugin, IWidgetPlugin, IMiscPlugin
{
#region Fields
private readonly EmailAccountSettings _emailAccountSettings;
private readonly IEmailAccountService _emailAccountService;
private readonly ILocalizationService _localizationService;
private readonly IMessageTemplateService _messageTemplateService;
private readonly INopUrlHelper _nopUrlHelper;
private readonly IPermissionService _permissionService;
private readonly ISettingService _settingService;
private readonly WidgetSettings _widgetSettings;
#endregion
#region Ctor
public RfqPlugin(EmailAccountSettings emailAccountSettings,
IEmailAccountService emailAccountService,
ILocalizationService localizationService,
IMessageTemplateService messageTemplateService,
INopUrlHelper nopUrlHelper,
IPermissionService permissionService,
ISettingService settingService,
WidgetSettings widgetSettings)
{
_emailAccountSettings = emailAccountSettings;
_emailAccountService = emailAccountService;
_localizationService = localizationService;
_messageTemplateService = messageTemplateService;
_nopUrlHelper = nopUrlHelper;
_permissionService = permissionService;
_settingService = settingService;
_widgetSettings = widgetSettings;
}
#endregion
#region Methods
///
/// Gets a configuration page URL
///
public override string GetConfigurationPageUrl()
{
return _nopUrlHelper.RouteUrl(RfqDefaults.ConfigurationRouteName);
}
///
/// Gets widget zones where this widget should be rendered
///
///
/// A task that represents the asynchronous operation
/// The task result contains the widget zones
///
public Task> GetWidgetZonesAsync()
{
return Task.FromResult>(new List
{
PublicWidgetZones.OrderSummaryContentAfter,
PublicWidgetZones.AccountNavigationAfter
});
}
///
/// Gets a type of a view component for displaying widget
///
/// Name of the widget zone
/// View component type
public Type GetWidgetViewComponent(string widgetZone)
{
if (widgetZone == PublicWidgetZones.OrderSummaryContentAfter)
return typeof(AddRfqComponent);
if (widgetZone == PublicWidgetZones.AccountNavigationAfter)
return typeof(CustomerRfqMenuComponent);
return null;
}
///
/// Install plugin
///
/// A task that represents the asynchronous operation
public override async Task InstallAsync()
{
//settings
await _settingService.SaveSettingAsync(new RfqSettings
{
Enabled = true
});
if (!_widgetSettings.ActiveWidgetSystemNames.Contains(RfqDefaults.SystemName))
{
_widgetSettings.ActiveWidgetSystemNames.Add(RfqDefaults.SystemName);
await _settingService.SaveSettingAsync(_widgetSettings);
}
var eaGeneral = await _emailAccountService.GetEmailAccountByIdAsync(_emailAccountSettings.DefaultEmailAccountId)
?? (await _emailAccountService.GetAllEmailAccountsAsync()).FirstOrDefault()
?? throw new Exception("Default email account cannot be loaded");
var messageTemplates = new List();
var allMessageTemplates = await _messageTemplateService.GetAllMessageTemplatesAsync(0);
var existsMessageTemplateNames = allMessageTemplates.Select(t => t.Name).ToList();
if (!existsMessageTemplateNames.Contains(RfqDefaults.CUSTOMER_SENT_NEW_REQUEST_QUOTE))
{
messageTemplates.Add(new MessageTemplate
{
Name = RfqDefaults.CUSTOMER_SENT_NEW_REQUEST_QUOTE,
Subject = "%Store.Name%. New request a quote #%RequestQuote.Id% sent",
Body = $"{Environment.NewLine}%Store.Name%{Environment.NewLine}
{Environment.NewLine}
{Environment.NewLine}%Customer.FullName% (%Customer.Email%) has just sent a new request a quote.{Environment.NewLine}
{Environment.NewLine}
{Environment.NewLine}Request a quote number: %RequestQuote.Id%{Environment.NewLine}
{Environment.NewLine}Date of request a quote: %RequestQuote.CreatedOn%{Environment.NewLine}
{Environment.NewLine}
{Environment.NewLine}See details on the request a quote page{Environment.NewLine}
{Environment.NewLine}",
IsActive = true,
EmailAccountId = eaGeneral.Id
});
}
if (!existsMessageTemplateNames.Contains(RfqDefaults.ADMIN_SENT_NEW_QUOTE))
{
messageTemplates.Add(new MessageTemplate
{
Name = RfqDefaults.ADMIN_SENT_NEW_QUOTE,
Subject = "%Store.Name%. New quote #%Quote.Id% received",
Body = $"{Environment.NewLine}%Store.Name%{Environment.NewLine}
{Environment.NewLine}
{Environment.NewLine}Store owner has just sent a new quote.{Environment.NewLine}
{Environment.NewLine}
{Environment.NewLine}Quote number: %Quote.Id%{Environment.NewLine}
{Environment.NewLine}Date of the quote: %Quote.CreatedOn%{Environment.NewLine}
%if(%Quote.ExpirationOnIsSet%)Expiration date of the quote: %Quote.ExpirationOn%{Environment.NewLine}
endif%{Environment.NewLine}
{Environment.NewLine}See details on the The quote page{Environment.NewLine}
{Environment.NewLine}",
IsActive = true,
EmailAccountId = eaGeneral.Id
});
}
if (messageTemplates.Any())
await Task.WhenAll(messageTemplates.Select(_messageTemplateService.InsertMessageTemplateAsync));
//locales
await _localizationService.AddOrUpdateLocaleResourceAsync(new Dictionary
{
["Plugins.Misc.RFQ.Enabled"] = "Enabled",
["Plugins.Misc.RFQ.Enabled.Hint"] = "Check to enable RFQ functionality.",
["Plugins.Misc.RFQ.CreateRequest"] = "Request a quote",
["Plugins.Misc.RFQ.ClearRequest"] = "Exit quote mode",
["Plugins.Misc.RFQ.CreateNew"] = "Add new",
["Plugins.Misc.RFQ.SendRequest"] = "Send request",
["Plugins.Misc.RFQ.RequestsQuote"] = "Requests for quote",
["Plugins.Misc.RFQ.RequestQuoteNumber"] = "Request a quote #{0}",
["Plugins.Misc.RFQ.NewRequestQuote"] = "Create a new request a quote",
["Plugins.Misc.RFQ.QuoteNumber"] = "Quote #{0}",
["Plugins.Misc.RFQ.Quotes"] = "Quotes",
["Plugins.Misc.RFQ.CustomerRequest.Info"] = "Request info",
["Plugins.Misc.RFQ.CustomerQuote.Info"] = "Quote info",
["Plugins.Misc.RFQ.Fields.Quote.CreatedOn"] = "Created on",
["Plugins.Misc.RFQ.Fields.Quote.CreatedOn.Hint"] = "The date/time that the quote was created.",
["Plugins.Misc.RFQ.Fields.RequestQuote.CreatedOn"] = "Created on",
["Plugins.Misc.RFQ.Fields.RequestQuote.CreatedOn.Hint"] = "The date/time that the request a quote was created.",
["Plugins.Misc.RFQ.Fields.Quote.Status"] = "Status",
["Plugins.Misc.RFQ.Fields.Quote.Status.Hint"] = "The status of the quote",
["Plugins.Misc.RFQ.Fields.RequestQuote.Status"] = "Status",
["Plugins.Misc.RFQ.Fields.RequestQuote.Status.Hint"] = "The status of the request a quote",
["Plugins.Misc.RFQ.Fields.Order"] = "Order",
["Plugins.Misc.RFQ.Fields.Order.Hint"] = "Created order",
["Plugins.Misc.RFQ.Fields.CustomerNotes"] = "Customer notes",
["Plugins.Misc.RFQ.Fields.CustomerNotes.Hint"] = "The customer notes and additional information",
["Plugins.Misc.RFQ.Products"] = "Product(s)",
["Plugins.Misc.RFQ.Product"] = "Product",
["Plugins.Misc.RFQ.ProductDeleted"] = "The product has been deleted",
["Plugins.Misc.RFQ.OriginalProductPrice"] = "Original unit price",
["Plugins.Misc.RFQ.CustomerRequest.RequestedQty"] = "Requested qty",
["Plugins.Misc.RFQ.CustomerRequest.RequestedUnitPrice"] = "Requested unit price",
["Plugins.Misc.RFQ.RequestQuoteItem.Fields.CustomerNotes"] = "Customer notes",
["Plugins.Misc.RFQ.Fields.AdminNotes"] = "Admin notes",
["Plugins.Misc.RFQ.Fields.AdminNotes.Hint"] = "The admin notes and changelog",
["Plugins.Misc.RFQ.CustomerRequests.NoRequests"] = "You don't have any requests for quote.",
["Plugins.Misc.RFQ.CustomerRequests.NoQuotes"] = "You don't have any quotes yet.",
["Plugins.Misc.RFQ.CreatedOnFrom"] = "Created from",
["Plugins.Misc.RFQ.CreatedOnFrom.Hint"] = "The creation from date for the search.",
["Plugins.Misc.RFQ.CreatedOnTo"] = "Created to",
["Plugins.Misc.RFQ.CreatedOnTo.Hint"] = "The creation to date for the search.",
["Plugins.Misc.RFQ.AdminRequests.RequestQuoteStatus"] = "Request status",
["Plugins.Misc.RFQ.AdminRequests.RequestQuoteStatus.Hint"] = "Select the request status",
["Plugins.Misc.RFQ.Fields.CustomerEmail"] = "Customer email",
["Plugins.Misc.RFQ.Fields.CustomerEmail.Hint"] = "The email address of customer",
["Plugins.Misc.RFQ.DeleteSelected"] = "Delete selected",
["Plugins.Misc.RFQ.AdminRequest.BackToList"] = "back to requests for quote list",
["Plugins.Misc.RFQ.AdminQuote.BackToList"] = "back to quote list",
["Plugins.Misc.RFQ.AddNewProduct"] = "Add new product",
["Plugins.Misc.RFQ.AdminQuote.Products.AddNew.Title1"] = "Add a new product to quote #{0}",
["Plugins.Misc.RFQ.AdminRequest.Customer.Select.Title"] = "Select a customer to create the quote",
["Plugins.Misc.RFQ.AdminRequest.Products.AddNew.Title2"] = "Add product '{0}' to quote #{1}",
["Plugins.Misc.RFQ.AdminRequest.Products.AddNew.BackToRequest"] = "back to requests for quote",
["Plugins.Misc.RFQ.AdminQuote.Products.AddNew.BackToQuote"] = "back to quote",
["Plugins.Misc.RFQ.Products.AddNew.Name"] = "Product name",
["Plugins.Misc.RFQ.Products.AddNew.SKU"] = "SKU",
["Plugins.Misc.RFQ.RequestCreated"] = "Request created by {0}",
["Plugins.Misc.RFQ.RequestItemCreated"] = "Request item created by {0}",
["Plugins.Misc.RFQ.QuantityChanged"] = "Quantity changed from {0} to {1} by {2}",
["Plugins.Misc.RFQ.UnitPriceChanged"] = "Unit price changed from {0} to {1} by {2}",
["Plugins.Misc.RFQ.CustomerNoteChanged"] = "Customer changed the notes",
["Plugins.Misc.RFQ.CreateQuote"] = "Create the quote",
["Plugins.Misc.RFQ.AdminQuote.QuoteCreatedByRequest"] = "Quote created from the request by {0}",
["Plugins.Misc.RFQ.AdminQuote.QuoteCreatedManuallyByStoreOwner"] = "Quote created manually by {0}",
["Plugins.Misc.RFQ.Fields.Quote.ExpirationDate"] = "Expiration date",
["Plugins.Misc.RFQ.Fields.Quote.ExpirationDate.Hint"] = "The date/time that the quote will expire in Coordinated Universal Time (UTC).",
["Plugins.Misc.RFQ.AdminQuote.QuoteStatus"] = "Quote status",
["Plugins.Misc.RFQ.AdminQuote.QuoteStatus.Hint"] = "Select the quote status",
["Plugins.Misc.RFQ.AdminRequest.Updated"] = "The request a quote has been updated successfully.",
["Plugins.Misc.RFQ.AdminRequest.Deleted"] = "The request a quote has been deleted successfully.",
["Plugins.Misc.RFQ.AdminRequest.Canceled"] = "The request a quote has been canceled successfully.",
["Plugins.Misc.RFQ.AdminRequest.Selected.Deleted"] = "The selected requests a quote has been deleted successfully.",
["Plugins.Misc.RFQ.AdminQuote.Updated"] = "The quote has been updated successfully.",
["Plugins.Misc.RFQ.AdminQuote.Deleted"] = "The quote has been deleted successfully.",
["Plugins.Misc.RFQ.AdminQuote.QuoteSubmitted"] = "The quote has been submitted successfully",
["Plugins.Misc.RFQ.AdminQuote.RequestedUnitPrice"] = "Requested unit price",
["Plugins.Misc.RFQ.AdminQuote.RequestedQty"] = "Requested qty",
["Plugins.Misc.RFQ.AdminQuote.Selected.Deleted"] = "The selected quotes has been deleted successfully.",
["Plugins.Misc.RFQ.OfferedQty"] = "Offered qty",
["Plugins.Misc.RFQ.OfferedUnitPrice"] = "Offered unit price",
["Plugins.Misc.RFQ.SendQuote"] = "Send quote",
["Plugins.Misc.RFQ.CreateOrder"] = "Create the order",
["Enums.Nop.Plugin.Misc.RFQ.Domains.RequestQuoteStatus.Submitted"] = "Submitted to store owner",
["Enums.Nop.Plugin.Misc.RFQ.Domains.RequestQuoteStatus.Canceled"] = "Canceled",
["Enums.Nop.Plugin.Misc.RFQ.Domains.RequestQuoteStatus.QuoteIsCreated"] = "Quote is created",
["Enums.Nop.Plugin.Misc.RFQ.Domains.QuoteStatus.CreatedFromRequestQuote"] = "Created from customer request",
["Enums.Nop.Plugin.Misc.RFQ.Domains.QuoteStatus.CreatedManuallyByStoreOwner"] = "Created manually by store owner",
["Enums.Nop.Plugin.Misc.RFQ.Domains.QuoteStatus.Submitted"] = "Submitted to customer",
["Enums.Nop.Plugin.Misc.RFQ.Domains.QuoteStatus.OrderCreated"] = "Order is created",
["Enums.Nop.Plugin.Misc.RFQ.Domains.QuoteStatus.Expired"] = "Quote is expired",
["Plugins.Misc.RFQ.RequestQuoteStatusChanged"] = "Status changed from {0} to {1} by {2}",
["Plugins.Misc.RFQ.QuoteStatusChanged"] = "Status changed from {0} to {1} by {2}",
["Plugins.Misc.RFQ.RequestQuoteItemDeleted"] = "Item id #{0} is deleted by {1}",
["Plugins.Misc.RFQ.QuoteItemAdded"] = "Item id #{0} is added by {1}",
["Plugins.Misc.RFQ.QuoteItemDeleted"] = "Item id #{0} is deleted by {1}",
["Plugins.Misc.RFQ.Image"] = "Image",
["Plugins.Misc.RFQ.Product(s)"] = "Product(s)",
["Plugins.Misc.RFQ.Fields.RequestQuoteId"] = "Related request a quote",
["Plugins.Misc.RFQ.Fields.RequestQuoteId.Hint"] = "The link to the related request a quote",
["Plugins.Misc.RFQ.Fields.QuoteId"] = "Related quote",
["Plugins.Misc.RFQ.Fields.QuoteId.Hint"] = "The link to the related quote",
["Plugins.Misc.RFQ.BackToShoppingCart"] = "Back to shopping cart",
["Plugins.Misc.RFQ.QuoteExpired"] = "Status changed to expired",
[$"Admin.ContentManagement.MessageTemplates.Description.{RfqDefaults.CUSTOMER_SENT_NEW_REQUEST_QUOTE}"] = "This message template is used to notify a store owner that the new request a quote sent",
[$"Admin.ContentManagement.MessageTemplates.Description.{RfqDefaults.ADMIN_SENT_NEW_QUOTE}"] = "This message template is used to notify a customer that the new quote sent",
["Security.Permission.Misc.RFQ.AccessRFQ.Admin.AccessRFQ"] = "Admin area. Access to the customer’s Request and Price Offer functionality",
["Security.Permission.Misc.RFQ.AccessRFQ.PublicStore.AccessRFQ"] = "Public store. Access to the customer’s Request and Price Offer functionality"
});
await base.InstallAsync();
}
///
/// Uninstall plugin
///
/// A task that represents the asynchronous operation
public override async Task UninstallAsync()
{
//settings
await _settingService.DeleteSettingAsync();
//delete permission
var permissionRecord = (await _permissionService.GetAllPermissionRecordsAsync())
.FirstOrDefault(x => x.SystemName == RfqPermissionConfigManager.ADMIN_ACCESS_RFQ);
if (permissionRecord != null)
await _permissionService.DeletePermissionRecordAsync(permissionRecord);
permissionRecord = (await _permissionService.GetAllPermissionRecordsAsync())
.FirstOrDefault(x => x.SystemName == RfqPermissionConfigManager.ACCESS_RFQ);
if (permissionRecord != null)
await _permissionService.DeletePermissionRecordAsync(permissionRecord);
if (_widgetSettings.ActiveWidgetSystemNames.Contains(RfqDefaults.SystemName))
{
_widgetSettings.ActiveWidgetSystemNames.Remove(RfqDefaults.SystemName);
await _settingService.SaveSettingAsync(_widgetSettings);
}
var deletedMessageTemplates = new List();
deletedMessageTemplates.AddRange((await _messageTemplateService.GetMessageTemplatesByNameAsync(RfqDefaults.CUSTOMER_SENT_NEW_REQUEST_QUOTE)).ToList());
deletedMessageTemplates.AddRange((await _messageTemplateService.GetMessageTemplatesByNameAsync(RfqDefaults.ADMIN_SENT_NEW_QUOTE)).ToList());
deletedMessageTemplates = deletedMessageTemplates.Where(mt => mt != null).ToList();
if (deletedMessageTemplates.Any())
await Task.WhenAll(deletedMessageTemplates.Select(_messageTemplateService.DeleteMessageTemplateAsync));
await _localizationService.DeleteLocaleResourcesAsync("Plugins.Misc.RFQ");
await _localizationService.DeleteLocaleResourcesAsync("Enums.Nop.Plugin.Misc.RFQ.Domains.RequestQuoteStatus");
await _localizationService.DeleteLocaleResourcesAsync("Enums.Nop.Plugin.Misc.RFQ.Domains.QuoteStatus");
await _localizationService.DeleteLocaleResourceAsync($"Admin.ContentManagement.MessageTemplates.Description.{RfqDefaults.CUSTOMER_SENT_NEW_REQUEST_QUOTE}");
await _localizationService.DeleteLocaleResourceAsync($"Admin.ContentManagement.MessageTemplates.Description.{RfqDefaults.ADMIN_SENT_NEW_QUOTE}");
await _localizationService.DeleteLocaleResourcesAsync("Security.Permission.Misc.RFQ.AccessRFQ.Admin.AccessRFQ");
await _localizationService.DeleteLocaleResourcesAsync("Security.Permission.Misc.RFQ.AccessRFQ.PublicStore.AccessRFQ");
}
#endregion
#region Properties
///
/// Gets a value indicating whether to hide this plugin on the widget list page in the admin area
///
public bool HideInWidgetList => true;
#endregion
}