Email Reminders

This commit is contained in:
2015-10-28 10:25:19 -04:00
parent 9177a8dbb3
commit cfe753fb00
13 changed files with 272 additions and 10 deletions
+7
View File
@@ -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)
+78
View File
@@ -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);
}
}
}
+70
View File
@@ -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();
}
}
}