Email Reminders
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System.Configuration;
|
||||
using System.Net.Mail;
|
||||
using System.Reflection;
|
||||
using System.Web.Security;
|
||||
using MileageTraker.Web.Models;
|
||||
using log4net;
|
||||
|
||||
@@ -56,10 +57,16 @@ namespace MileageTraker.Web.Email
|
||||
SendMessage(new MailMessage(_emaialFromAddress, user.Email, _initializePasswordSubject, body));
|
||||
}
|
||||
|
||||
public void SendServiceReminder(ServiceReminderEmail email)
|
||||
{
|
||||
SendMessage(new MailMessage(_emaialFromAddress, email.Recipient.Email, email.Subject, email.Body));
|
||||
}
|
||||
|
||||
private void SendMessage(MailMessage mailMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
Logger.Debug("Email sending to " + mailMessage.To + ", subject: " + mailMessage.Subject);
|
||||
_smtpClient.Send(mailMessage);
|
||||
}
|
||||
catch (SmtpException ex)
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Linq;
|
||||
using MileageTraker.Web.Models;
|
||||
|
||||
namespace MileageTraker.Web.Email
|
||||
{
|
||||
public class ServiceReminderEmail
|
||||
{
|
||||
private readonly string _emailSubject;
|
||||
private readonly string _emailBody;
|
||||
public User Recipient { get; set; }
|
||||
public IList<ServiceReminder> ServiceReminders { get; set; }
|
||||
|
||||
public string Subject
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!ServiceReminders.Any())
|
||||
return "No upcoming vehicle services currently scheduled";
|
||||
var vehicles = ServiceReminders.Select(sr => sr.Vehicle.VehicleId).Distinct().ToList();
|
||||
var vehicleDesc = vehicles.Count > 1 ? vehicles.Count.ToString() + " vehicles" : "Vehicle Id " + vehicles.First();
|
||||
var subject = string.Format(_emailSubject, vehicleDesc);
|
||||
return subject;
|
||||
}
|
||||
}
|
||||
|
||||
public string Body
|
||||
{
|
||||
get
|
||||
{
|
||||
var reminderTexts = GetReminderTexts();
|
||||
var body =
|
||||
string.Format(_emailBody,
|
||||
Recipient.FullName,
|
||||
Environment.NewLine + Environment.NewLine
|
||||
+ string.Join(Environment.NewLine, reminderTexts)
|
||||
);
|
||||
|
||||
return body;
|
||||
}
|
||||
}
|
||||
|
||||
public ServiceReminderEmail(User recipient, IList<ServiceReminder> serviceReminders)
|
||||
{
|
||||
_emailSubject = ConfigurationManager.AppSettings["ServiceReminderSubject"];
|
||||
_emailBody = ConfigurationManager.AppSettings["ServiceReminderBody"];
|
||||
Recipient = recipient;
|
||||
ServiceReminders = serviceReminders;
|
||||
}
|
||||
|
||||
private IEnumerable<string> GetReminderTexts()
|
||||
{
|
||||
if (!ServiceReminders.Any())
|
||||
return new[] {"No upcoming services currently scheduled"};
|
||||
|
||||
return
|
||||
from sr in ServiceReminders
|
||||
let diff =
|
||||
sr.TargetOdometer - (sr.Vehicle.CurrentOdometer.HasValue ? sr.Vehicle.CurrentOdometer.Value : 0)
|
||||
orderby diff
|
||||
let description =
|
||||
!string.IsNullOrEmpty(sr.Description)
|
||||
? String.Format(", description is '{0}'", sr.Description)
|
||||
: string.Empty
|
||||
let assignedTo =
|
||||
!string.IsNullOrEmpty(sr.Vehicle.Assigned)
|
||||
? String.Format("assigned to {0}", sr.Vehicle.Assigned)
|
||||
: "unassigned"
|
||||
select
|
||||
string.Format("Vehicle with Id {0}, which is {3}, has a reminder for service {1} miles{2}.",
|
||||
sr.Vehicle.VehicleId, diff < 0 ? " overdue " + (-diff).ToString() : " in " + diff.ToString(),
|
||||
description,
|
||||
assignedTo);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using MileageTraker.Web.DAL;
|
||||
using MileageTraker.Web.Models;
|
||||
using log4net;
|
||||
|
||||
namespace MileageTraker.Web.Email
|
||||
{
|
||||
public class ServiceReminderEmailService : IDisposable
|
||||
{
|
||||
private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected readonly DataService DataService = new DataService();
|
||||
protected readonly EmailNotificationService EmailService = new EmailNotificationService();
|
||||
|
||||
public void SendAllNotificationEmails()
|
||||
{
|
||||
Logger.Info("Starting vehicle service notifications");
|
||||
var serviceReminders = DataService.GetUpcomingServiceReminders().ToList();
|
||||
|
||||
Logger.Debug("Got " + serviceReminders.Count + " service reminders.");
|
||||
|
||||
SendAdminEmails(serviceReminders);
|
||||
|
||||
SendUserEmails(serviceReminders);
|
||||
}
|
||||
|
||||
private void SendAdminEmails(IList<ServiceReminder> serviceReminders)
|
||||
{
|
||||
var admins =
|
||||
(from u in DataService.GetUsers()
|
||||
where u.Roles.Any(r => r.RoleName == "Vehicle Admin")
|
||||
select u).Distinct().ToList();
|
||||
|
||||
var adminEmails =
|
||||
from admin in admins
|
||||
select new ServiceReminderEmail(admin, serviceReminders);
|
||||
|
||||
foreach (var email in adminEmails)
|
||||
{
|
||||
EmailService.SendServiceReminder(email);
|
||||
}
|
||||
}
|
||||
|
||||
private void SendUserEmails(IList<ServiceReminder> serviceReminders)
|
||||
{
|
||||
// send email to user
|
||||
var userEmails =
|
||||
from sr in serviceReminders
|
||||
group sr by sr.Vehicle.Assigned
|
||||
into g
|
||||
let driver = DataService.FindUserByFullName(g.Key)
|
||||
where driver != null
|
||||
let userReminders = g.ToList()
|
||||
select new ServiceReminderEmail(driver, userReminders);
|
||||
|
||||
foreach (var email in userEmails)
|
||||
{
|
||||
EmailService.SendServiceReminder(email);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
DataService.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user