2817 lines
127 KiB
C#
2817 lines
127 KiB
C#
using System.Net;
|
|
using Nop.Core;
|
|
using Nop.Core.Domain.Blogs;
|
|
using Nop.Core.Domain.Catalog;
|
|
using Nop.Core.Domain.Common;
|
|
using Nop.Core.Domain.Customers;
|
|
using Nop.Core.Domain.Forums;
|
|
using Nop.Core.Domain.Messages;
|
|
using Nop.Core.Domain.News;
|
|
using Nop.Core.Domain.Orders;
|
|
using Nop.Core.Domain.Shipping;
|
|
using Nop.Core.Domain.Vendors;
|
|
using Nop.Core.Events;
|
|
using Nop.Services.Affiliates;
|
|
using Nop.Services.Catalog;
|
|
using Nop.Services.Common;
|
|
using Nop.Services.Customers;
|
|
using Nop.Services.Localization;
|
|
using Nop.Services.Orders;
|
|
using Nop.Services.Stores;
|
|
|
|
namespace Nop.Services.Messages;
|
|
|
|
/// <summary>
|
|
/// Workflow message service
|
|
/// </summary>
|
|
public partial class WorkflowMessageService : IWorkflowMessageService
|
|
{
|
|
#region Fields
|
|
|
|
protected readonly CommonSettings _commonSettings;
|
|
protected readonly EmailAccountSettings _emailAccountSettings;
|
|
protected readonly IAddressService _addressService;
|
|
protected readonly IAffiliateService _affiliateService;
|
|
protected readonly ICustomerService _customerService;
|
|
protected readonly IEmailAccountService _emailAccountService;
|
|
protected readonly IEventPublisher _eventPublisher;
|
|
protected readonly ILanguageService _languageService;
|
|
protected readonly ILocalizationService _localizationService;
|
|
protected readonly IMessageTemplateService _messageTemplateService;
|
|
protected readonly IMessageTokenProvider _messageTokenProvider;
|
|
protected readonly IOrderService _orderService;
|
|
protected readonly IProductService _productService;
|
|
protected readonly IQueuedEmailService _queuedEmailService;
|
|
protected readonly IStoreContext _storeContext;
|
|
protected readonly IStoreService _storeService;
|
|
protected readonly ITokenizer _tokenizer;
|
|
protected readonly MessagesSettings _messagesSettings;
|
|
|
|
#endregion
|
|
|
|
#region Ctor
|
|
|
|
public WorkflowMessageService(CommonSettings commonSettings,
|
|
EmailAccountSettings emailAccountSettings,
|
|
IAddressService addressService,
|
|
IAffiliateService affiliateService,
|
|
ICustomerService customerService,
|
|
IEmailAccountService emailAccountService,
|
|
IEventPublisher eventPublisher,
|
|
ILanguageService languageService,
|
|
ILocalizationService localizationService,
|
|
IMessageTemplateService messageTemplateService,
|
|
IMessageTokenProvider messageTokenProvider,
|
|
IOrderService orderService,
|
|
IProductService productService,
|
|
IQueuedEmailService queuedEmailService,
|
|
IStoreContext storeContext,
|
|
IStoreService storeService,
|
|
ITokenizer tokenizer,
|
|
MessagesSettings messagesSettings)
|
|
{
|
|
_commonSettings = commonSettings;
|
|
_emailAccountSettings = emailAccountSettings;
|
|
_addressService = addressService;
|
|
_affiliateService = affiliateService;
|
|
_customerService = customerService;
|
|
_emailAccountService = emailAccountService;
|
|
_eventPublisher = eventPublisher;
|
|
_languageService = languageService;
|
|
_localizationService = localizationService;
|
|
_messageTemplateService = messageTemplateService;
|
|
_messageTokenProvider = messageTokenProvider;
|
|
_orderService = orderService;
|
|
_productService = productService;
|
|
_queuedEmailService = queuedEmailService;
|
|
_storeContext = storeContext;
|
|
_storeService = storeService;
|
|
_tokenizer = tokenizer;
|
|
_messagesSettings = messagesSettings;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Utilities
|
|
|
|
/// <summary>
|
|
/// Get active message templates by the name
|
|
/// </summary>
|
|
/// <param name="messageTemplateName">Message template name</param>
|
|
/// <param name="storeId">Store identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the list of message templates
|
|
/// </returns>
|
|
protected virtual async Task<IList<MessageTemplate>> GetActiveMessageTemplatesAsync(string messageTemplateName, int storeId)
|
|
{
|
|
//get message templates by the name
|
|
var messageTemplates = await _messageTemplateService.GetMessageTemplatesByNameAsync(messageTemplateName, storeId);
|
|
|
|
//no template found
|
|
if (!messageTemplates?.Any() ?? true)
|
|
return new List<MessageTemplate>();
|
|
|
|
//filter active templates
|
|
messageTemplates = messageTemplates.Where(messageTemplate => messageTemplate.IsActive).ToList();
|
|
|
|
return messageTemplates;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get EmailAccount to use with a message templates
|
|
/// </summary>
|
|
/// <param name="messageTemplate">Message template</param>
|
|
/// <param name="languageId">Language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the emailAccount
|
|
/// </returns>
|
|
protected virtual async Task<EmailAccount> GetEmailAccountOfMessageTemplateAsync(MessageTemplate messageTemplate, int languageId)
|
|
{
|
|
var emailAccountId = await _localizationService.GetLocalizedAsync(messageTemplate, mt => mt.EmailAccountId, languageId);
|
|
//some 0 validation (for localizable "Email account" dropdownlist which saves 0 if "Standard" value is chosen)
|
|
if (emailAccountId == 0)
|
|
emailAccountId = messageTemplate.EmailAccountId;
|
|
|
|
var emailAccount = (await _emailAccountService.GetEmailAccountByIdAsync(emailAccountId) ?? await _emailAccountService.GetEmailAccountByIdAsync(_emailAccountSettings.DefaultEmailAccountId)) ??
|
|
(await _emailAccountService.GetAllEmailAccountsAsync()).FirstOrDefault();
|
|
return emailAccount;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ensure language is active
|
|
/// </summary>
|
|
/// <param name="languageId">Language identifier</param>
|
|
/// <param name="storeId">Store identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the return a value language identifier
|
|
/// </returns>
|
|
protected virtual async Task<int> EnsureLanguageIsActiveAsync(int languageId, int storeId)
|
|
{
|
|
//load language by specified ID
|
|
var language = await _languageService.GetLanguageByIdAsync(languageId);
|
|
|
|
if (language == null || !language.Published)
|
|
{
|
|
//load any language from the specified store
|
|
language = (await _languageService.GetAllLanguagesAsync(storeId: storeId)).FirstOrDefault();
|
|
}
|
|
|
|
if (language == null || !language.Published)
|
|
{
|
|
//load any language
|
|
language = (await _languageService.GetAllLanguagesAsync()).FirstOrDefault();
|
|
}
|
|
|
|
if (language == null)
|
|
throw new Exception("No active language could be loaded");
|
|
|
|
return language.Id;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get email and name to send email for store owner
|
|
/// </summary>
|
|
/// <param name="messageTemplateEmailAccount">Message template email account</param>
|
|
/// <returns>Email address and name to send email fore store owner</returns>
|
|
protected virtual async Task<(string email, string name)> GetStoreOwnerNameAndEmailAsync(EmailAccount messageTemplateEmailAccount)
|
|
{
|
|
var storeOwnerEmailAccount = _messagesSettings.UseDefaultEmailAccountForSendStoreOwnerEmails ? await _emailAccountService.GetEmailAccountByIdAsync(_emailAccountSettings.DefaultEmailAccountId) : null;
|
|
storeOwnerEmailAccount ??= messageTemplateEmailAccount;
|
|
|
|
return (storeOwnerEmailAccount.Email, storeOwnerEmailAccount.DisplayName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get email and name to set ReplyTo property of email from customer
|
|
/// </summary>
|
|
/// <param name="messageTemplate">Message template</param>
|
|
/// <param name="customer">Customer</param>
|
|
/// <returns>Email address and name when reply to email</returns>
|
|
protected virtual async Task<(string email, string name)> GetCustomerReplyToNameAndEmailAsync(MessageTemplate messageTemplate, Customer customer)
|
|
{
|
|
if (!messageTemplate.AllowDirectReply)
|
|
return (null, null);
|
|
|
|
var replyToEmail = await _customerService.IsGuestAsync(customer)
|
|
? string.Empty
|
|
: customer.Email;
|
|
|
|
var replyToName = await _customerService.IsGuestAsync(customer)
|
|
? string.Empty
|
|
: await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return (replyToEmail, replyToName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get email and name to set ReplyTo property of email from order
|
|
/// </summary>
|
|
/// <param name="messageTemplate">Message template</param>
|
|
/// <param name="order">Order</param>
|
|
/// <returns>Email address and name when reply to email</returns>
|
|
protected virtual async Task<(string email, string name)> GetCustomerReplyToNameAndEmailAsync(MessageTemplate messageTemplate, Order order)
|
|
{
|
|
if (!messageTemplate.AllowDirectReply)
|
|
return (null, null);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
return (billingAddress.Email, $"{billingAddress.FirstName} {billingAddress.LastName}");
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
#region Customer workflow
|
|
|
|
/// <summary>
|
|
/// Sends 'New customer' notification message to a store owner
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendCustomerRegisteredStoreOwnerNotificationMessageAsync(Customer customer, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CUSTOMER_REGISTERED_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a welcome message to a customer
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendCustomerWelcomeMessageAsync(Customer customer, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CUSTOMER_WELCOME_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an email validation message to a customer
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendCustomerEmailValidationMessageAsync(Customer customer, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CUSTOMER_EMAIL_VALIDATION_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an email re-validation message to a customer
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendCustomerEmailRevalidationMessageAsync(Customer customer, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CUSTOMER_EMAIL_REVALIDATION_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
//email to re-validate
|
|
var toEmail = customer.EmailToRevalidate;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends password recovery message to a customer
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendCustomerPasswordRecoveryMessageAsync(Customer customer, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CUSTOMER_PASSWORD_RECOVERY_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends 'New request to delete customer' message to a store owner
|
|
/// </summary>
|
|
/// <param name="customer">Customer</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendDeleteCustomerRequestStoreOwnerNotificationAsync(Customer customer, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.DELETE_CUSTOMER_REQUEST_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Order workflow
|
|
|
|
/// <summary>
|
|
/// Sends an order placed notification to a vendor
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="vendor">Vendor instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPlacedVendorNotificationAsync(Order order, Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PLACED_VENDOR_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId, vendor.Id);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = vendor.Email;
|
|
var toName = vendor.Name;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order placed notification to a store owner
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPlacedStoreOwnerNotificationAsync(Order order, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PLACED_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, order);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order placed notification to an affiliate
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPlacedAffiliateNotificationAsync(Order order, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var affiliate = await _affiliateService.GetAffiliateByIdAsync(order.AffiliateId);
|
|
|
|
ArgumentNullException.ThrowIfNull(affiliate);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PLACED_AFFILIATE_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var affiliateAddress = await _addressService.GetAddressByIdAsync(affiliate.AddressId);
|
|
var toEmail = affiliateAddress.Email;
|
|
var toName = $"{affiliateAddress.FirstName} {affiliateAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order paid notification to a store owner
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPaidStoreOwnerNotificationAsync(Order order, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PAID_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, order);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order paid notification to an affiliate
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPaidAffiliateNotificationAsync(Order order, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var affiliate = await _affiliateService.GetAffiliateByIdAsync(order.AffiliateId);
|
|
|
|
ArgumentNullException.ThrowIfNull(affiliate);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PAID_AFFILIATE_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var affiliateAddress = await _addressService.GetAddressByIdAsync(affiliate.AddressId);
|
|
var toEmail = affiliateAddress.Email;
|
|
var toName = $"{affiliateAddress.FirstName} {affiliateAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order paid notification to a customer
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="attachmentFilePath">Attachment file path</param>
|
|
/// <param name="attachmentFileName">Attachment file name. If specified, then this file name will be sent to a recipient. Otherwise, "AttachmentFilePath" name will be used.</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPaidCustomerNotificationAsync(Order order, int languageId,
|
|
string attachmentFilePath = null, string attachmentFileName = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PAID_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
attachmentFilePath, attachmentFileName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order paid notification to a vendor
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="vendor">Vendor instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPaidVendorNotificationAsync(Order order, Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PAID_VENDOR_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId, vendor.Id);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = vendor.Email;
|
|
var toName = vendor.Name;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order placed notification to a customer
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="attachmentFilePath">Attachment file path</param>
|
|
/// <param name="attachmentFileName">Attachment file name. If specified, then this file name will be sent to a recipient. Otherwise, "AttachmentFilePath" name will be used.</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderPlacedCustomerNotificationAsync(Order order, int languageId,
|
|
string attachmentFilePath = null, string attachmentFileName = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PLACED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
attachmentFilePath, attachmentFileName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a shipment sent notification to a customer
|
|
/// </summary>
|
|
/// <param name="shipment">Shipment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendShipmentSentCustomerNotificationAsync(Shipment shipment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(shipment);
|
|
|
|
var order = await _orderService.GetOrderByIdAsync(shipment.OrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.SHIPMENT_SENT_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddShipmentTokensAsync(commonTokens, shipment, languageId);
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a shipment ready for pickup notification to a customer
|
|
/// </summary>
|
|
/// <param name="shipment">Shipment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendShipmentReadyForPickupNotificationAsync(Shipment shipment, int languageId)
|
|
{
|
|
var order = await _orderService.GetOrderByIdAsync(shipment.OrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.SHIPMENT_READY_FOR_PICKUP_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddShipmentTokensAsync(commonTokens, shipment, languageId);
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a shipment delivered notification to a customer
|
|
/// </summary>
|
|
/// <param name="shipment">Shipment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendShipmentDeliveredCustomerNotificationAsync(Shipment shipment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(shipment);
|
|
|
|
var order = await _orderService.GetOrderByIdAsync(shipment.OrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.SHIPMENT_DELIVERED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddShipmentTokensAsync(commonTokens, shipment, languageId);
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order processing notification to a customer
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="attachmentFilePath">Attachment file path</param>
|
|
/// <param name="attachmentFileName">Attachment file name. If specified, then this file name will be sent to a recipient. Otherwise, "AttachmentFilePath" name will be used.</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderProcessingCustomerNotificationAsync(Order order, int languageId,
|
|
string attachmentFilePath = null, string attachmentFileName = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_PROCESSING_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
attachmentFilePath, attachmentFileName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order completed notification to a customer
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="attachmentFilePath">Attachment file path</param>
|
|
/// <param name="attachmentFileName">Attachment file name. If specified, then this file name will be sent to a recipient. Otherwise, "AttachmentFilePath" name will be used.</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderCompletedCustomerNotificationAsync(Order order, int languageId,
|
|
string attachmentFilePath = null, string attachmentFileName = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_COMPLETED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
attachmentFilePath, attachmentFileName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order cancelled notification to a customer
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderCancelledCustomerNotificationAsync(Order order, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_CANCELLED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order cancelled notification to a vendor
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="vendor">Vendor instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderCancelledVendorNotificationAsync(Order order, Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_CANCELLED_VENDOR_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId, vendor.Id);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = vendor.Email;
|
|
var toName = vendor.Name;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order refunded notification to a store owner
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="refundedAmount">Amount refunded</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderRefundedStoreOwnerNotificationAsync(Order order, decimal refundedAmount, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_REFUNDED_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddOrderRefundedTokensAsync(commonTokens, order, refundedAmount);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, order);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends an order refunded notification to a customer
|
|
/// </summary>
|
|
/// <param name="order">Order instance</param>
|
|
/// <param name="refundedAmount">Amount refunded</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendOrderRefundedCustomerNotificationAsync(Order order, decimal refundedAmount, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.ORDER_REFUNDED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddOrderRefundedTokensAsync(commonTokens, order, refundedAmount);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a new order note added notification to a customer
|
|
/// </summary>
|
|
/// <param name="orderNote">Order note</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewOrderNoteAddedCustomerNotificationAsync(OrderNote orderNote, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(orderNote);
|
|
|
|
var order = await _orderService.GetOrderByIdAsync(orderNote.OrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_ORDER_NOTE_ADDED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderNoteTokensAsync(commonTokens, orderNote);
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "Recurring payment cancelled" notification to a store owner
|
|
/// </summary>
|
|
/// <param name="recurringPayment">Recurring payment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendRecurringPaymentCancelledStoreOwnerNotificationAsync(RecurringPayment recurringPayment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(recurringPayment);
|
|
|
|
var order = await _orderService.GetOrderByIdAsync(recurringPayment.InitialOrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.RECURRING_PAYMENT_CANCELLED_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
await _messageTokenProvider.AddRecurringPaymentTokensAsync(commonTokens, recurringPayment);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, order);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "Recurring payment cancelled" notification to a customer
|
|
/// </summary>
|
|
/// <param name="recurringPayment">Recurring payment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendRecurringPaymentCancelledCustomerNotificationAsync(RecurringPayment recurringPayment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(recurringPayment);
|
|
|
|
var order = await _orderService.GetOrderByIdAsync(recurringPayment.InitialOrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.RECURRING_PAYMENT_CANCELLED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
await _messageTokenProvider.AddRecurringPaymentTokensAsync(commonTokens, recurringPayment);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "Recurring payment failed" notification to a customer
|
|
/// </summary>
|
|
/// <param name="recurringPayment">Recurring payment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendRecurringPaymentFailedCustomerNotificationAsync(RecurringPayment recurringPayment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(recurringPayment);
|
|
|
|
var order = await _orderService.GetOrderByIdAsync(recurringPayment.InitialOrderId) ?? throw new Exception("Order cannot be loaded");
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.RECURRING_PAYMENT_FAILED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, order.CustomerId);
|
|
await _messageTokenProvider.AddRecurringPaymentTokensAsync(commonTokens, recurringPayment);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = billingAddress.Email;
|
|
var toName = $"{billingAddress.FirstName} {billingAddress.LastName}";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Newsletter workflow
|
|
|
|
/// <summary>
|
|
/// Sends a newsletter subscription activation message
|
|
/// </summary>
|
|
/// <param name="subscription">Newsletter subscription</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewsLetterSubscriptionActivationMessageAsync(NewsLetterSubscription subscription)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(subscription);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
var languageId = await EnsureLanguageIsActiveAsync(subscription.LanguageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEWSLETTER_SUBSCRIPTION_ACTIVATION_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddNewsLetterSubscriptionTokensAsync(commonTokens, subscription);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, subscription.Email, string.Empty);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a newsletter subscription deactivation message
|
|
/// </summary>
|
|
/// <param name="subscription">Newsletter subscription</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewsLetterSubscriptionDeactivationMessageAsync(NewsLetterSubscription subscription)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(subscription);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
var languageId = await EnsureLanguageIsActiveAsync(subscription.LanguageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEWSLETTER_SUBSCRIPTION_DEACTIVATION_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddNewsLetterSubscriptionTokensAsync(commonTokens, subscription);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, subscription.Email, string.Empty);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Send a message to a friend
|
|
|
|
/// <summary>
|
|
/// Sends "email a friend" message
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="product">Product instance</param>
|
|
/// <param name="customerEmail">Customer's email</param>
|
|
/// <param name="friendsEmail">Friend's email</param>
|
|
/// <param name="personalMessage">Personal message</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendProductEmailAFriendMessageAsync(Customer customer, int languageId,
|
|
Product product, string customerEmail, string friendsEmail, string personalMessage)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
ArgumentNullException.ThrowIfNull(product);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.EMAIL_A_FRIEND_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
await _messageTokenProvider.AddProductTokensAsync(commonTokens, product, languageId);
|
|
commonTokens.Add(new Token("EmailAFriend.PersonalMessage", personalMessage, true));
|
|
commonTokens.Add(new Token("EmailAFriend.Email", customerEmail));
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, friendsEmail, string.Empty);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends wishlist "email a friend" message
|
|
/// </summary>
|
|
/// <param name="customer">Customer</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="customerEmail">Customer's email</param>
|
|
/// <param name="friendsEmail">Friend's email</param>
|
|
/// <param name="personalMessage">Personal message</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendWishlistEmailAFriendMessageAsync(Customer customer, int languageId,
|
|
string customerEmail, string friendsEmail, string personalMessage)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.WISHLIST_TO_FRIEND_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
commonTokens.Add(new Token("Wishlist.PersonalMessage", personalMessage, true));
|
|
commonTokens.Add(new Token("Wishlist.Email", customerEmail));
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, friendsEmail, string.Empty);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Return requests
|
|
|
|
/// <summary>
|
|
/// Sends 'New Return Request' message to a store owner
|
|
/// </summary>
|
|
/// <param name="returnRequest">Return request</param>
|
|
/// <param name="orderItem">Order item</param>
|
|
/// <param name="order">Order</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewReturnRequestStoreOwnerNotificationAsync(ReturnRequest returnRequest, OrderItem orderItem, Order order, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(returnRequest);
|
|
|
|
ArgumentNullException.ThrowIfNull(orderItem);
|
|
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_RETURN_REQUEST_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, returnRequest.CustomerId);
|
|
await _messageTokenProvider.AddReturnRequestTokensAsync(commonTokens, returnRequest, orderItem, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, order);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends 'New Return Request' message to a customer
|
|
/// </summary>
|
|
/// <param name="returnRequest">Return request</param>
|
|
/// <param name="orderItem">Order item</param>
|
|
/// <param name="order">Order</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewReturnRequestCustomerNotificationAsync(ReturnRequest returnRequest, OrderItem orderItem, Order order)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(returnRequest);
|
|
|
|
ArgumentNullException.ThrowIfNull(orderItem);
|
|
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
var languageId = await EnsureLanguageIsActiveAsync(order.CustomerLanguageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_RETURN_REQUEST_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(returnRequest.CustomerId);
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
await _messageTokenProvider.AddReturnRequestTokensAsync(commonTokens, returnRequest, orderItem, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = (await _customerService.IsGuestAsync(customer))
|
|
? billingAddress.Email
|
|
: customer.Email;
|
|
var toName = (await _customerService.IsGuestAsync(customer))
|
|
? billingAddress.FirstName
|
|
: await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends 'Return Request status changed' message to a customer
|
|
/// </summary>
|
|
/// <param name="returnRequest">Return request</param>
|
|
/// <param name="orderItem">Order item</param>
|
|
/// <param name="order">Order</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendReturnRequestStatusChangedCustomerNotificationAsync(ReturnRequest returnRequest, OrderItem orderItem, Order order)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(returnRequest);
|
|
|
|
ArgumentNullException.ThrowIfNull(orderItem);
|
|
|
|
ArgumentNullException.ThrowIfNull(order);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(order.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
var languageId = await EnsureLanguageIsActiveAsync(order.CustomerLanguageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.RETURN_REQUEST_STATUS_CHANGED_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(returnRequest.CustomerId);
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddOrderTokensAsync(commonTokens, order, languageId);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
await _messageTokenProvider.AddReturnRequestTokensAsync(commonTokens, returnRequest, orderItem, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var billingAddress = await _addressService.GetAddressByIdAsync(order.BillingAddressId);
|
|
|
|
var toEmail = (await _customerService.IsGuestAsync(customer))
|
|
? billingAddress.Email
|
|
: customer.Email;
|
|
var toName = (await _customerService.IsGuestAsync(customer))
|
|
? billingAddress.FirstName
|
|
: await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Forum Notifications
|
|
|
|
/// <summary>
|
|
/// Sends a forum subscription message to a customer
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="forumTopic">Forum Topic</param>
|
|
/// <param name="forum">Forum</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewForumTopicMessageAsync(Customer customer, ForumTopic forumTopic, Forum forum, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_FORUM_TOPIC_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddForumTopicTokensAsync(commonTokens, forumTopic);
|
|
await _messageTokenProvider.AddForumTokensAsync(commonTokens, forum);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a forum subscription message to a customer
|
|
/// </summary>
|
|
/// <param name="customer">Customer instance</param>
|
|
/// <param name="forumPost">Forum post</param>
|
|
/// <param name="forumTopic">Forum Topic</param>
|
|
/// <param name="forum">Forum</param>
|
|
/// <param name="friendlyForumTopicPageIndex">Friendly (starts with 1) forum topic page to use for URL generation</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewForumPostMessageAsync(Customer customer, ForumPost forumPost, ForumTopic forumTopic,
|
|
Forum forum, int friendlyForumTopicPageIndex, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_FORUM_POST_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddForumPostTokensAsync(commonTokens, forumPost);
|
|
await _messageTokenProvider.AddForumTopicTokensAsync(commonTokens, forumTopic, friendlyForumTopicPageIndex, forumPost.Id);
|
|
await _messageTokenProvider.AddForumTokensAsync(commonTokens, forum);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a private message notification
|
|
/// </summary>
|
|
/// <param name="privateMessage">Private message</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendPrivateMessageNotificationAsync(PrivateMessage privateMessage, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(privateMessage);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(privateMessage.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.PRIVATE_MESSAGE_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddPrivateMessageTokensAsync(commonTokens, privateMessage);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, privateMessage.ToCustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(privateMessage.ToCustomerId);
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Misc
|
|
|
|
/// <summary>
|
|
/// Sends 'New vendor account submitted' message to a store owner
|
|
/// </summary>
|
|
/// <param name="customer">Customer</param>
|
|
/// <param name="vendor">Vendor</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewVendorAccountApplyStoreOwnerNotificationAsync(Customer customer, Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_VENDOR_ACCOUNT_APPLY_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
await _messageTokenProvider.AddVendorTokensAsync(commonTokens, vendor);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
|
|
var vendorAddress = await _addressService.GetAddressByIdAsync(vendor.AddressId);
|
|
var replyToEmail = messageTemplate.AllowDirectReply ? vendorAddress.Email : "";
|
|
var replyToName = messageTemplate.AllowDirectReply ? $"{vendorAddress.FirstName} {vendorAddress.LastName}" : "";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends 'Vendor information changed' message to a store owner
|
|
/// </summary>
|
|
/// <param name="vendor">Vendor</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendVendorInformationChangeStoreOwnerNotificationAsync(Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.VENDOR_INFORMATION_CHANGE_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddVendorTokensAsync(commonTokens, vendor);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
|
|
var vendorAddress = await _addressService.GetAddressByIdAsync(vendor.AddressId);
|
|
var replyToEmail = messageTemplate.AllowDirectReply ? vendorAddress.Email : "";
|
|
var replyToName = messageTemplate.AllowDirectReply ? $"{vendorAddress.FirstName} {vendorAddress.LastName}" : "";
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a gift card notification
|
|
/// </summary>
|
|
/// <param name="giftCard">Gift card</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendGiftCardNotificationAsync(GiftCard giftCard, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(giftCard);
|
|
|
|
var order = await _orderService.GetOrderByOrderItemAsync(giftCard.PurchasedWithOrderItemId ?? 0);
|
|
var currentStore = await _storeContext.GetCurrentStoreAsync();
|
|
var store = order != null ? await _storeService.GetStoreByIdAsync(order.StoreId) ?? currentStore : currentStore;
|
|
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.GIFT_CARD_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddGiftCardTokensAsync(commonTokens, giftCard, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = giftCard.RecipientEmail;
|
|
var toName = giftCard.RecipientName;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a product review notification message to a store owner
|
|
/// </summary>
|
|
/// <param name="productReview">Product review</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendProductReviewStoreOwnerNotificationMessageAsync(ProductReview productReview, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(productReview);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.PRODUCT_REVIEW_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddProductReviewTokensAsync(commonTokens, productReview);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, productReview.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(productReview.CustomerId);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, customer);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a product review reply notification message to a customer
|
|
/// </summary>
|
|
/// <param name="productReview">Product review</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendProductReviewReplyCustomerNotificationMessageAsync(ProductReview productReview, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(productReview);
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(productReview.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.PRODUCT_REVIEW_REPLY_CUSTOMER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(productReview.CustomerId);
|
|
|
|
//We should not send notifications to guests
|
|
if (await _customerService.IsGuestAsync(customer))
|
|
return new List<int>();
|
|
|
|
//We should not send notifications to guests
|
|
if (await _customerService.IsGuestAsync(customer))
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddProductReviewTokensAsync(commonTokens, productReview);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "quantity below" notification to a store owner
|
|
/// </summary>
|
|
/// <param name="product">Product</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendQuantityBelowStoreOwnerNotificationAsync(Product product, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(product);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.QUANTITY_BELOW_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddProductTokensAsync(commonTokens, product, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "quantity below" notification to a store owner
|
|
/// </summary>
|
|
/// <param name="combination">Attribute combination</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendQuantityBelowStoreOwnerNotificationAsync(ProductAttributeCombination combination, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(combination);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.QUANTITY_BELOW_ATTRIBUTE_COMBINATION_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var commonTokens = new List<Token>();
|
|
var product = await _productService.GetProductByIdAsync(combination.ProductId);
|
|
|
|
await _messageTokenProvider.AddProductTokensAsync(commonTokens, product, languageId);
|
|
await _messageTokenProvider.AddAttributeCombinationTokensAsync(commonTokens, combination, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "quantity below" notification to a vendor
|
|
/// </summary>
|
|
/// <param name="product">Product</param>
|
|
/// <param name="vendor">Vendor</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendQuantityBelowVendorNotificationAsync(Product product, Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(product);
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.QUANTITY_BELOW_VENDOR_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddProductTokensAsync(commonTokens, product, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = vendor.Email;
|
|
var toName = vendor.Name;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "quantity below" notification to a vendor
|
|
/// </summary>
|
|
/// <param name="combination">Attribute combination</param>
|
|
/// <param name="vendor">Vendor</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendQuantityBelowVendorNotificationAsync(ProductAttributeCombination combination, Vendor vendor, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(combination);
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.QUANTITY_BELOW_ATTRIBUTE_COMBINATION_VENDOR_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var commonTokens = new List<Token>();
|
|
var product = await _productService.GetProductByIdAsync(combination.ProductId);
|
|
|
|
await _messageTokenProvider.AddProductTokensAsync(commonTokens, product, languageId);
|
|
await _messageTokenProvider.AddAttributeCombinationTokensAsync(commonTokens, combination, languageId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = vendor.Email;
|
|
var toName = vendor.Name;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a "new VAT submitted" notification to a store owner
|
|
/// </summary>
|
|
/// <param name="customer">Customer</param>
|
|
/// <param name="vatName">Received VAT name</param>
|
|
/// <param name="vatAddress">Received VAT address</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewVatSubmittedStoreOwnerNotificationAsync(Customer customer,
|
|
string vatName, string vatAddress, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEW_VAT_SUBMITTED_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
commonTokens.Add(new Token("VatValidationResult.Name", vatName));
|
|
commonTokens.Add(new Token("VatValidationResult.Address", vatAddress));
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a blog comment notification message to a store owner
|
|
/// </summary>
|
|
/// <param name="blogComment">Blog comment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the list of queued email identifiers
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendBlogCommentStoreOwnerNotificationMessageAsync(BlogComment blogComment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(blogComment);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.BLOG_COMMENT_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(blogComment.CustomerId);
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddBlogCommentTokensAsync(commonTokens, blogComment);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, blogComment.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a news comment notification message to a store owner
|
|
/// </summary>
|
|
/// <param name="newsComment">News comment</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendNewsCommentStoreOwnerNotificationMessageAsync(NewsComment newsComment, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(newsComment);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.NEWS_COMMENT_STORE_OWNER_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(newsComment.CustomerId);
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddNewsCommentTokensAsync(commonTokens, newsComment);
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, newsComment.CustomerId);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var (toEmail, toName) = await GetStoreOwnerNameAndEmailAsync(emailAccount);
|
|
var (replyToEmail, replyToName) = await GetCustomerReplyToNameAndEmailAsync(messageTemplate, customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
replyToEmailAddress: replyToEmail, replyToName: replyToName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a 'Back in stock' notification message to a customer
|
|
/// </summary>
|
|
/// <param name="subscription">Subscription</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendBackInStockNotificationAsync(BackInStockSubscription subscription, int languageId)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(subscription);
|
|
|
|
var customer = await _customerService.GetCustomerByIdAsync(subscription.CustomerId);
|
|
|
|
ArgumentNullException.ThrowIfNull(customer);
|
|
|
|
//ensure that customer is registered (simple and fast way)
|
|
if (!CommonHelper.IsValidEmail(customer.Email))
|
|
return new List<int>();
|
|
|
|
var store = await _storeService.GetStoreByIdAsync(subscription.StoreId) ?? await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.BACK_IN_STOCK_NOTIFICATION, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>();
|
|
await _messageTokenProvider.AddCustomerTokensAsync(commonTokens, customer);
|
|
await _messageTokenProvider.AddBackInStockTokensAsync(commonTokens, subscription);
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = customer.Email;
|
|
var toName = await _customerService.GetCustomerFullNameAsync(customer);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends "contact us" message
|
|
/// </summary>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="senderEmail">Sender email</param>
|
|
/// <param name="senderName">Sender name</param>
|
|
/// <param name="subject">Email subject. Pass null if you want a message template subject to be used.</param>
|
|
/// <param name="body">Email body</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendContactUsMessageAsync(int languageId, string senderEmail,
|
|
string senderName, string subject, string body)
|
|
{
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CONTACT_US_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>
|
|
{
|
|
new("ContactUs.SenderEmail", senderEmail),
|
|
new("ContactUs.SenderName", senderName)
|
|
};
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
string fromEmail;
|
|
string fromName;
|
|
//required for some SMTP servers
|
|
if (_commonSettings.UseSystemEmailForContactUsForm)
|
|
{
|
|
fromEmail = emailAccount.Email;
|
|
fromName = emailAccount.DisplayName;
|
|
body = $"<strong>From</strong>: {WebUtility.HtmlEncode(senderName)} - {WebUtility.HtmlEncode(senderEmail)}<br /><br />{body}";
|
|
}
|
|
else
|
|
{
|
|
fromEmail = senderEmail;
|
|
fromName = senderName;
|
|
}
|
|
|
|
tokens.Add(new Token("ContactUs.Body", body, true));
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = emailAccount.Email;
|
|
var toName = emailAccount.DisplayName;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
fromEmail: fromEmail,
|
|
fromName: fromName,
|
|
subject: subject,
|
|
replyToEmailAddress: senderEmail,
|
|
replyToName: senderName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends "contact vendor" message
|
|
/// </summary>
|
|
/// <param name="vendor">Vendor</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <param name="senderEmail">Sender email</param>
|
|
/// <param name="senderName">Sender name</param>
|
|
/// <param name="subject">Email subject. Pass null if you want a message template subject to be used.</param>
|
|
/// <param name="body">Email body</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<IList<int>> SendContactVendorMessageAsync(Vendor vendor, int languageId, string senderEmail,
|
|
string senderName, string subject, string body)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(vendor);
|
|
|
|
var store = await _storeContext.GetCurrentStoreAsync();
|
|
languageId = await EnsureLanguageIsActiveAsync(languageId, store.Id);
|
|
|
|
var messageTemplates = await GetActiveMessageTemplatesAsync(MessageTemplateSystemNames.CONTACT_VENDOR_MESSAGE, store.Id);
|
|
if (!messageTemplates.Any())
|
|
return new List<int>();
|
|
|
|
//tokens
|
|
var commonTokens = new List<Token>
|
|
{
|
|
new("ContactUs.SenderEmail", senderEmail),
|
|
new("ContactUs.SenderName", senderName),
|
|
new("ContactUs.Body", body, true)
|
|
};
|
|
|
|
return await messageTemplates.SelectAwait(async messageTemplate =>
|
|
{
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
string fromEmail;
|
|
string fromName;
|
|
//required for some SMTP servers
|
|
if (_commonSettings.UseSystemEmailForContactUsForm)
|
|
{
|
|
fromEmail = emailAccount.Email;
|
|
fromName = emailAccount.DisplayName;
|
|
body = $"<strong>From</strong>: {WebUtility.HtmlEncode(senderName)} - {WebUtility.HtmlEncode(senderEmail)}<br /><br />{body}";
|
|
}
|
|
else
|
|
{
|
|
fromEmail = senderEmail;
|
|
fromName = senderName;
|
|
}
|
|
|
|
var tokens = new List<Token>(commonTokens);
|
|
await _messageTokenProvider.AddStoreTokensAsync(tokens, store, emailAccount, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
var toEmail = vendor.Email;
|
|
var toName = vendor.Name;
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, toEmail, toName,
|
|
fromEmail: fromEmail,
|
|
fromName: fromName,
|
|
subject: subject,
|
|
replyToEmailAddress: senderEmail,
|
|
replyToName: senderName);
|
|
}).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sends a test email
|
|
/// </summary>
|
|
/// <param name="messageTemplateId">Message template identifier</param>
|
|
/// <param name="sendToEmail">Send to email</param>
|
|
/// <param name="tokens">Tokens</param>
|
|
/// <param name="languageId">Message language identifier</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<int> SendTestEmailAsync(int messageTemplateId, string sendToEmail, List<Token> tokens, int languageId)
|
|
{
|
|
var messageTemplate = await _messageTemplateService.GetMessageTemplateByIdAsync(messageTemplateId) ?? throw new ArgumentException("Template cannot be loaded");
|
|
|
|
//email account
|
|
var emailAccount = await GetEmailAccountOfMessageTemplateAsync(messageTemplate, languageId);
|
|
|
|
//event notification
|
|
await _eventPublisher.MessageTokensAddedAsync(messageTemplate, tokens);
|
|
|
|
return await SendNotificationAsync(messageTemplate, emailAccount, languageId, tokens, sendToEmail, null, ignoreDelayBeforeSend: true);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Common
|
|
|
|
/// <summary>
|
|
/// Send notification
|
|
/// </summary>
|
|
/// <param name="messageTemplate">Message template</param>
|
|
/// <param name="emailAccount">Email account</param>
|
|
/// <param name="languageId">Language identifier</param>
|
|
/// <param name="tokens">Tokens</param>
|
|
/// <param name="toEmailAddress">Recipient email address</param>
|
|
/// <param name="toName">Recipient name</param>
|
|
/// <param name="attachmentFilePath">Attachment file path</param>
|
|
/// <param name="attachmentFileName">Attachment file name</param>
|
|
/// <param name="replyToEmailAddress">"Reply to" email</param>
|
|
/// <param name="replyToName">"Reply to" name</param>
|
|
/// <param name="fromEmail">Sender email. If specified, then it overrides passed "emailAccount" details</param>
|
|
/// <param name="fromName">Sender name. If specified, then it overrides passed "emailAccount" details</param>
|
|
/// <param name="subject">Subject. If specified, then it overrides subject of a message template</param>
|
|
/// <param name="ignoreDelayBeforeSend">A value indicating whether to ignore the delay before sending message</param>
|
|
/// <returns>
|
|
/// A task that represents the asynchronous operation
|
|
/// The task result contains the queued email identifier
|
|
/// </returns>
|
|
public virtual async Task<int> SendNotificationAsync(MessageTemplate messageTemplate,
|
|
EmailAccount emailAccount, int languageId, IList<Token> tokens,
|
|
string toEmailAddress, string toName,
|
|
string attachmentFilePath = null, string attachmentFileName = null,
|
|
string replyToEmailAddress = null, string replyToName = null,
|
|
string fromEmail = null, string fromName = null, string subject = null,
|
|
bool ignoreDelayBeforeSend = false)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(messageTemplate);
|
|
|
|
ArgumentNullException.ThrowIfNull(emailAccount);
|
|
|
|
//retrieve localized message template data
|
|
var bcc = await _localizationService.GetLocalizedAsync(messageTemplate, mt => mt.BccEmailAddresses, languageId);
|
|
if (string.IsNullOrEmpty(subject))
|
|
subject = await _localizationService.GetLocalizedAsync(messageTemplate, mt => mt.Subject, languageId);
|
|
var body = await _localizationService.GetLocalizedAsync(messageTemplate, mt => mt.Body, languageId);
|
|
|
|
//Replace subject and body tokens
|
|
var subjectReplaced = _tokenizer.Replace(subject, tokens, false);
|
|
var bodyReplaced = _tokenizer.Replace(body, tokens, true);
|
|
|
|
//limit name length
|
|
toName = CommonHelper.EnsureMaximumLength(toName, 300);
|
|
|
|
var email = new QueuedEmail
|
|
{
|
|
Priority = QueuedEmailPriority.High,
|
|
From = !string.IsNullOrEmpty(fromEmail) ? fromEmail : emailAccount.Email,
|
|
FromName = !string.IsNullOrEmpty(fromName) ? fromName : emailAccount.DisplayName,
|
|
To = toEmailAddress,
|
|
ToName = toName,
|
|
ReplyTo = replyToEmailAddress,
|
|
ReplyToName = replyToName,
|
|
CC = string.Empty,
|
|
Bcc = bcc,
|
|
Subject = subjectReplaced,
|
|
Body = bodyReplaced,
|
|
AttachmentFilePath = attachmentFilePath,
|
|
AttachmentFileName = attachmentFileName,
|
|
AttachedDownloadId = messageTemplate.AttachedDownloadId,
|
|
CreatedOnUtc = DateTime.UtcNow,
|
|
EmailAccountId = emailAccount.Id,
|
|
DontSendBeforeDateUtc = ignoreDelayBeforeSend || !messageTemplate.DelayBeforeSend.HasValue ? null
|
|
: (DateTime?)(DateTime.UtcNow + TimeSpan.FromHours(messageTemplate.DelayPeriod.ToHours(messageTemplate.DelayBeforeSend.Value)))
|
|
};
|
|
|
|
await _queuedEmailService.InsertQueuedEmailAsync(email);
|
|
return email.Id;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
} |