namespace DepoSched.Services.Infrastructure.Email
{
#region << Using >>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using DepoSched.Domain.Infrastructure;
using DepoSched.Domain.Infrastructure.HttpSessionContext;
using DepoSched.Domain.Repositories.DepoSchedGeneralSetting;
using DepoSched.Domain.Repositories.User;
using DepoSched.Infrastructure.Dto.Request.DepoRequest;
using DepoSched.Infrastructure.Dto.Options;
using DepoSched.Infrastructure.Dto.Request.UserVendorDepoService;
using DepoSched.Infrastructure.Dto.User;
using DepoSched.Infrastructure.Models.Enums;
using DepoSched.Infrastructure.Models.Models;
using DepoSched.Infrastructure.Models.Models.Log;
using DepoSched.Infrastructure.Models.Models.Request;
using DepoSched.Infrastructure.Models.Models.User;
using DepoSched.Infrastructure.Models.Models.User.Admin;
using DepoSched.Infrastructure.Models.Models.User.Vendor;
using DepoSched.Infrastructure.Utils;
using DepoSched.Services.Infrastructure.DepoRequest.Models;
using HandlebarsDotNet;
using Kongrevsky.Infrastructure.Repository;
using Kongrevsky.Utilities.DateTime;
using Kongrevsky.Utilities.Object;
using Kongrevsky.Utilities.String;
using LinqKit;
using Microsoft.Extensions.Options;
#endregion
public class EmailManager : IEmailManager
{
public EmailManager(IOptions<EmailOptions> emailOptions, IHttpSessionContext httpSessionContext, IKongrevskyRepository<EmailItem, DepoSchedDbContext> emailItemRepository, IKongrevskyRepository<UserApp, DepoSchedDbContext> userAppRepository, IKongrevskyRepository<UserAdminApp, DepoSchedDbContext> userAdminRepository, IUserAccessTokenRepository userAccessTokenRepository, IOptions<DepoSchedGeneralOptions> depoSchedGeneralOptions)
{
_httpSessionContext = httpSessionContext;
_emailItemRepository = emailItemRepository;
_userAppRepository = userAppRepository;
_userAdminRepository = userAdminRepository;
_userAccessTokenRepository = userAccessTokenRepository;
_depoSchedGeneralOptions = depoSchedGeneralOptions.Value;
_emailOptions = emailOptions.Value;
}
private EmailOptions _emailOptions { get; }
private IHttpSessionContext _httpSessionContext { get; }
private IKongrevskyRepository<EmailItem, DepoSchedDbContext> _emailItemRepository { get; }
private IKongrevskyRepository<UserApp, DepoSchedDbContext> _userAppRepository { get; }
private IKongrevskyRepository<UserAdminApp, DepoSchedDbContext> _userAdminRepository { get; }
private IUserAccessTokenRepository _userAccessTokenRepository { get; }
private DepoSchedGeneralOptions _depoSchedGeneralOptions { get; }
private static string _logoBase64 { get; set; }
#region DepoRequest
public void DepoRequest_Opened(DepoRequest depoRequest)
{
var emails = new List<EmailItem>();
var title = "Depo Request opened";
emails.AddRange(GetAdminEmails(setting => setting.DepoRequestOpened).Select(x => GenerateEmail("DepoRequest.Opened.Admin",
new
{
username = x.FullName,
request = new
{
id = depoRequest.Id,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
services = depoRequest.Services.ListServices,
notes = depoRequest.Notes,
location = depoRequest.Location.ToFullString(),
files = depoRequest.Files.Select(y => new
{
id = y.Id,
filename = y.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, y.Id, TimeSpan.FromDays(90))
})
}
},
$"Job#{depoRequest.Number} {depoRequest.ClientContact.Client.Name} has a Deposition Request for {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} ",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
if (!depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableSalesRepNotifications)
{
emails.AddRange(depoRequest.SalesReps.Select(x => GenerateEmail("DepoRequest.Opened.SalesRep",
new
{
username = x.FullName,
request = new
{
id = depoRequest.Id,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
services = depoRequest.Services.ListServices,
notes = depoRequest.Notes,
location = depoRequest.Location.ToFullString(),
files = depoRequest.Files.Select(y => new
{
id = y.Id,
filename = y.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, y.Id, TimeSpan.FromDays(90))
})
}
},
$"Job#{depoRequest.Number} {depoRequest.ClientContact.Client.Name} has a Deposition Request for {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} ",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
}
if (!string.IsNullOrEmpty(depoRequest.ClientContact?.Email) && !depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableClientNotifications)
{
emails.Add(GenerateEmail("DepoRequest.Opened.Client",
new
{
username = depoRequest.ClientContact.FullName,
request = new
{
id = depoRequest.Id,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
services = depoRequest.Services.ListServices,
location = depoRequest.Location.ToFullString(),
files = depoRequest.Files.Select(y => new
{
id = y.Id,
filename = y.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, y.Id, TimeSpan.FromDays(90))
})
},
number = depoRequest.Number,
timezone = depoRequest.TimezoneEntity.DisplayName
},
$"Job#{depoRequest.Number} Your Deposition Request has been submitted",
title,
new[] { depoRequest.ClientContact.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
// TODO: No Email template
if (depoRequest.Services.Interpreter)
{
if (!depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableSalesRepNotifications)
{
emails.AddRange(depoRequest.SalesReps.Select(x => GenerateEmail("DepoRequest.Opened.InterpreterSelected.SalesRep",
new
{
username = x.FullName,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("R"),
languagePairs = depoRequest.Services.InterpreterLanguages.Select(l => new
{
source = l.Source,
target = l.Target
})
},
"New Deposition Request created with Interpreter",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
}
emails.AddRange(depoRequest.InternalInfo.DepoRequestGeneralSetting.InterpreterEmails.Select(x => GenerateEmail("DepoRequest.Opened.InterpreterSelected.ConfigEmail",
new
{
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("R"),
languagePairs = depoRequest.Services.InterpreterLanguages.Select(l => new
{
source = l.Source,
target = l.Target
})
},
"New Deposition Request created with Interpreter",
title,
new List<string>() { x },
sendInTime: TimeSpan.FromMinutes(1)
)));
}
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void DepoRequest_Updated(DepoRequest depoRequest, List<DepoRequestModifiedFieldDto> modifiedFields)
{
var emails = new List<EmailItem>();
emails.AddRange(depoRequest.UserVendors.Where(x => x.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(y => y.DepoRequestUpdated)).Select(x => GenerateEmail("DepoRequest.Updated.Vendor",
new
{
username = x.UserVendor.FullName,
request = new
{
id = depoRequest.Id,
number = depoRequest.Number,
fields = modifiedFields
}
},
$"Job#{depoRequest.Number} {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} Updated Info",
"Depo Request details updated",
new List<string>() { x.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void DepoRequest_VendorInvited(UserVendorInviteToRequest invite)
{
var depoRequest = invite.Request;
var rushLabel = depoRequest.IsRush ? "Urgent — " : "";
var emails = new List<EmailItem>();
if (invite.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorInvited))
{
var acceptToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.AcceptUserVendorInviteToRequestByEmail, UserAccessTokenActions.GetUserVendorInviteToRequestByEmail }, new[] { invite.Id }, TimeSpan.FromDays(1));
var rejectToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.RejectUserVendorInviteToRequestByEmail, UserAccessTokenActions.GetUserVendorInviteToRequestByEmail }, new[] { invite.Id }, TimeSpan.FromDays(1));
emails.Add(GenerateEmail("DepoRequest.VendorInvited.Vendor",
new
{
username = invite.UserVendor.FullName,
invite = new
{
id = invite.Id
},
request = new
{
isRush = depoRequest.IsRush,
id = depoRequest.Id,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
serviceType = invite.ServiceType.GetDisplayName(),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
startTime = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("t"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
servives = depoRequest.Services.ListServices,
location = depoRequest.Location.ToFullString()
},
acceptToken = acceptToken,
rejectToken = rejectToken
},
$"{rushLabel}Need a {invite.ServiceType.GetDisplayName()} for {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} in {depoRequest.Location.ToFullString()}",
"Invitation for Deposition Request",
new List<string>() { invite.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
if (depoRequest.IsRush &&
depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorInvited))
{
emails.Add(GenerateEmail("DepoRequest.VendorInvited.Admin",
new
{
username = depoRequest.Submitter.FullName,
userVendorFullName = invite.UserVendor.FullName,
request = new
{
isRush = depoRequest.IsRush,
id = depoRequest.Id,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
serviceType = invite.ServiceType.GetDisplayName(),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
startTime = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("t"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
servives = depoRequest.Services.ListServices,
location = depoRequest.Location.ToFullString()
}
},
$"Job#{depoRequest.Number} {invite.UserVendor.FullName} is invited for {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):R} at {depoRequest.Location.ToFullString()}",
"Vendor invited to Depo Request",
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void DepoRequest_VendorAcceptedInvite(UserVendorInviteToRequest invite)
{
var emails = new List<EmailItem>();
var depoRequest = invite.Request;
if (depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorAcceptedInvite))
{
emails.Add(GenerateEmail("DepoRequest.VendorAcceptedInvite.Admin",
new
{
username = depoRequest.Submitter.FullName,
id = depoRequest.Id,
number = invite.Request.Number,
vendorName = invite.UserVendor.FullName,
serviceType = invite.ServiceType.GetDisplayName(),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
},
$"Job#{depoRequest.Number} {invite.UserVendor.FullName} is Available for {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} at {depoRequest.Location.ToFullString()}",
"Vendor accepted Depo Request invite",
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_VendorRejectedInvite(UserVendorInviteToRequest invite)
{
var emails = new List<EmailItem>();
var depoRequest = invite.Request;
if (depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorRejectedInvite))
{
emails.Add(GenerateEmail("DepoRequest.VendorRejectedInvite.Admin",
new
{
username = depoRequest.Submitter.FullName,
id = depoRequest.Id,
number = invite.Request.Number,
vendorName = invite.UserVendor.FullName,
serviceType = invite.ServiceType.GetDisplayName(),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
},
$"Job#{depoRequest.Number} {invite.UserVendor.FullName} is Unavailable for {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} at {depoRequest.Location.ToFullString()}",
"Vendor rejected Depo Request invite",
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_VendorAssignedToRequest(DepoRequestUserVendor assignment)
{
if (!assignment.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorAssignedToRequest))
return;
var depoRequest = assignment.Request;
var emailVendor = GenerateEmail("DepoRequest.VendorAssignedToRequest.Vendor",
new
{
username = assignment.UserVendor.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
vendorName = assignment.UserVendor.FullName,
serviceType = assignment.ServiceType.GetDisplayName(),
serviceTypes = depoRequest.Services.ListServices,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
startTime = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("t"),
location = depoRequest.Location.ToFullString(),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f")
},
$"Job#{depoRequest.Number} You're Scheduled for {depoRequest.CaseName} for {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} at {depoRequest.Location.ToFullString()} for {depoRequest.DeponentName}",
"Vendor assigned to Depo Request",
new List<string>() { assignment.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
);
_emailItemRepository.BulkInsert(new List<EmailItem>() { emailVendor }.ToList(), x => x.Id);
}
public void DepoRequest_VendorUnassignedFromRequest(DepoRequestUserVendor assignment)
{
if (!assignment.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorUnassignedFromRequest))
return;
var depoRequest = assignment.Request;
var emailVendor = GenerateEmail("DepoRequest.VendorUnassignedFromRequest.Vendor",
new
{
username = assignment.UserVendor.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
vendorName = assignment.UserVendor.FullName,
serviceType = assignment.ServiceType.GetDisplayName(),
},
$"Job#{depoRequest.Number} Services no longer required",
"Vendor unassigned from Depo Request",
new List<string>() { assignment.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
);
_emailItemRepository.BulkInsert(new List<EmailItem>() { emailVendor }.ToList(), x => x.Id);
}
public void DepoRequest_Rescheduled(DepoRequest depoRequest, RescheduleTriggerData data)
{
var emails = new List<EmailItem>();
var title = "Depo Request rescheduled";
if (depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestRescheduled))
{
emails.Add(GenerateEmail("DepoRequest.Rescheduled.Admin",
new
{
username = depoRequest.Submitter.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
caseName = depoRequest.CaseName,
data = new
{
startDate = data.StartDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
endDate = data.EndDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)),
deliverablesDate = data.DeliverablesDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
},
previousData = new
{
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(depoRequest.TimezoneEntity),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f")
},
isTimezoneChanged = data.Timezone != depoRequest.Timezone
},
$"Job#{depoRequest.Number} {depoRequest.CaseName} Deposition date has changed",
title,
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
emails.AddRange(depoRequest.UserVendors.Where(x => x.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(c => c.DepoRequestRescheduled)).Select(x =>
{
var rescheduleConfirmToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.VendorRescheduleConfirmsByEmail, UserAccessTokenActions.GetVendorRescheduleConfirmsByEmail }, new[] { depoRequest.Id }, x.UserVendorId, TimeSpan.FromDays(1));
return GenerateEmail("DepoRequest.Rescheduled.Vendor",
new
{
username = x.UserVendor.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
caseName = depoRequest.CaseName,
data = new
{
startDate = data.StartDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
endDate = data.EndDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)),
deliverablesDate = data.DeliverablesDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
},
previousData = new
{
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(depoRequest.TimezoneEntity),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f")
},
isTimezoneChanged = data.Timezone != depoRequest.Timezone,
rescheduleConfirmToken = rescheduleConfirmToken
},
$"Job#{depoRequest.Number} Urgent! {depoRequest.CaseName} Deposition date has changed - still available?",
title,
new List<string>() { x.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
);
}));
if (!string.IsNullOrEmpty(depoRequest.ClientContact?.Email) && !depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableClientNotifications)
{
emails.Add(GenerateEmail("DepoRequest.Rescheduled.Client",
new
{
username = depoRequest.ClientContact.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
data = new
{
startDate = data.StartDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
endDate = data.EndDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)),
deliverablesDate = data.DeliverablesDate.ToTimezoneTime(TimeZoneInfoUtils.TryFromSerializedStringOrDefault(data.Timezone)).ToString("f"),
},
previousData = new
{
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(depoRequest.TimezoneEntity),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f")
},
isTimezoneChanged = data.Timezone != depoRequest.Timezone
},
data.ByEmail
? $"Job#{depoRequest.Number} {depoRequest.CaseName} You've rescheduled your deposition for {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f}"
: $"Job#{depoRequest.Number} {depoRequest.CaseName} Deposition date has changed",
title,
new[] { depoRequest.ClientContact.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_VendorCanceled(DepoRequest depoRequest, CancelByVendorTriggerData data)
{
var emailAdmins = GetAdminEmails(x => x.DepoRequestVendorCanceled).Select(x => GenerateEmail("DepoRequest.VendorCanceled.Admin",
new
{
username = x.FullName,
number = depoRequest.Number
},
$"Job#{depoRequest.Number} {data.DepoRequestUserVendor.UserVendor.FullName} canceled request",
"Vendor cancelled availability for Depo Request",
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
_emailItemRepository.BulkInsert(emailAdmins.ToList(), x => x.Id);
}
public void DepoRequest_Scheduled(DepoRequest depoRequest)
{
var emailAdmins = GetAdminEmails(x => x.DepoRequestScheduled).Select(x => GenerateEmail("DepoRequest.Scheduled.Admin",
new
{
username = x.FullName,
id = depoRequest.Id,
number = depoRequest.Number
},
$"Job#{depoRequest.Number} Request has been scheduled",
"Depo Request scheduled",
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
_emailItemRepository.BulkInsert(emailAdmins.ToList(), x => x.Id);
}
public void DepoRequest_Canceled(DepoRequest depoRequest, CancelTriggerData data)
{
var emails = new List<EmailItem>();
var title = "Depo Request cancelled";
if (depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestCanceled))
{
emails.Add(GenerateEmail("DepoRequest.Canceled.Admin",
new
{
byEmail = data.ByEmail,
username = depoRequest.Submitter.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
clientContactName = depoRequest.ClientContact.FullName,
reason = data.Reason,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(depoRequest.TimezoneEntity)
},
data.ByEmail
? $"Job#{depoRequest.Number} {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} for {depoRequest.DeponentName} will NOT be moving forward"
: $"Job#{depoRequest.Number} {depoRequest.CaseName} has request this Deposition Cancelled",
title,
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
if (!depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableSalesRepNotifications)
{
emails.AddRange(depoRequest.SalesReps.Select(x => GenerateEmail("DepoRequest.Canceled.SalesRep",
new
{
byEmail = data.ByEmail,
username = x.FullName,
number = depoRequest.Number,
id = depoRequest.Id,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
clientContactName = depoRequest.ClientContact.FullName,
reason = data.Reason,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
timezone = TimezoneUtil.GetTimezoneDisplayName(depoRequest.TimezoneEntity)
},
data.ByEmail
? $"Job#{depoRequest.Number} {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} for {depoRequest.DeponentName} will NOT be moving forward"
: $"Job#{depoRequest.Number} {depoRequest.CaseName} has request this Deposition Cancelled",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
}
if (!string.IsNullOrEmpty(depoRequest.ClientContact?.Email) && !depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableClientNotifications)
{
emails.Add(GenerateEmail("DepoRequest.Canceled.Client",
new
{
username = depoRequest.ClientContact.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f")
},
data.ByEmail
? $"Job#{depoRequest.Number} {depoRequest.CaseName} Deposition of {depoRequest.DeponentName} has been Successfully Cancelled"
: $"Job#{depoRequest.Number} {depoRequest.CaseName} Deposition has been Canceled",
title,
new[] { depoRequest.ClientContact.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_ClientConfirmation(DepoRequest depoRequest)
{
if (string.IsNullOrEmpty(depoRequest.ClientContact?.Email) || depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableClientNotifications)
return;
var cancelToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.CancelByEmail, UserAccessTokenActions.GetCancelByEmail, UserAccessTokenActions.GetDepoRequestWorkflowInfo }, new[] { depoRequest.Id }, TimeSpan.FromDays(1));
var rescheduleToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.RescheduleByEmail, UserAccessTokenActions.GetRescheduleByEmail, UserAccessTokenActions.GetDepoRequestWorkflowInfo }, new[] { depoRequest.Id }, TimeSpan.FromDays(1));
var confirmToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.ClientConfirmsByEmail, UserAccessTokenActions.GetConfirmByEmail, UserAccessTokenActions.GetDepoRequestWorkflowInfo }, new[] { depoRequest.Id }, TimeSpan.FromDays(1));
var emailClient = GenerateEmail("DepoRequest.ClientConfirmation.Client",
new
{
username = depoRequest.ClientContact.FullName,
cancelToken = cancelToken,
rescheduleToken = rescheduleToken,
confirmToken = confirmToken,
request = new
{
id = depoRequest.Id,
isRush = depoRequest.IsRush,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
startTime = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("t"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
services = depoRequest.Services.ListServices,
location = depoRequest.Location.ToFullString(),
vendorTypes = depoRequest.UserVendors.Select(x => x.ServiceType.GetDisplayName()).Distinct()
}
},
$"Job#{depoRequest.Number} {depoRequest.CaseName} Confirming {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} for {depoRequest.DeponentName}",
"Depo Request confirmation",
new List<string>() { depoRequest.ClientContact.Email },
sendInTime: TimeSpan.FromMinutes(1)
);
_emailItemRepository.BulkInsert(new List<EmailItem>() { emailClient }, x => x.Id);
}
public void DepoRequest_ClientConfirmed(DepoRequest depoRequest)
{
var emails = new List<EmailItem>();
var title = "Depo Request confirmed by Client";
if (depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestClientConfirmed))
{
emails.Add(GenerateEmail("DepoRequest.ClientConfirmed.Admin",
new
{
username = depoRequest.Submitter.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientContactName = depoRequest.ClientContact.FullName
},
$"Job#{depoRequest.Number} {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} for {depoRequest.DeponentName} has been Confirmed",
title,
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
if (!depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableSalesRepNotifications)
{
emails.AddRange(depoRequest.SalesReps.Select(x => GenerateEmail("DepoRequest.ClientConfirmed.SalesRep",
new
{
username = x.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientContactName = depoRequest.ClientContact.FullName
},
$"Job#{depoRequest.Number} {depoRequest.CaseName} on {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} for {depoRequest.DeponentName} has been Confirmed",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
}
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_VendorConfirmation(DepoRequest depoRequest)
{
var emailVendors = depoRequest.UserVendors.Where(x => x.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(c => c.DepoRequestVendorConfirmation)).Select(x =>
GenerateEmail("DepoRequest.VendorConfirmation.Vendor",
new
{
username = x.UserVendor.FullName,
cancelToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.CancelByVendorByEmail, UserAccessTokenActions.GetCancelByEmail, UserAccessTokenActions.GetDepoRequestWorkflowInfoWithVendorToken }, new[] { depoRequest.Id }, x.UserVendorId, TimeSpan.FromDays(1)),
confirmToken = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.VendorConfirmsByEmail, UserAccessTokenActions.GetConfirmByEmail, UserAccessTokenActions.GetDepoRequestWorkflowInfoWithVendorToken }, new[] { depoRequest.Id }, x.UserVendorId, TimeSpan.FromDays(1)),
request = new
{
id = depoRequest.Id,
isRush = depoRequest.IsRush,
number = depoRequest.Number,
clientName = depoRequest.ClientContact.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
clientMatterNumber = depoRequest.ClientMatterNumber,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
location = depoRequest.Location.ToFullString(),
}
},
$"Job#{depoRequest.Number} Vendor confirmation of Request",
"Depo Request confirmation",
new List<string>() { x.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
_emailItemRepository.BulkInsert(emailVendors.ToList(), x => x.Id);
}
public void DepoRequest_VendorConfirmed(DepoRequestUserVendor depoRequestUserVendor)
{
if (!depoRequestUserVendor.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorUnassignedFromRequest))
return;
var emails = new List<EmailItem>();
var depoRequest = depoRequestUserVendor.Request;
emails.Add(GenerateEmail("DepoRequest.VendorConfirmed.Vendor",
new
{
username = depoRequestUserVendor.UserVendor.FullName,
id = depoRequestUserVendor.Request.Id,
number = depoRequestUserVendor.Request.Number,
serviceTypes = depoRequest.Services.ListServices,
serviceType = depoRequestUserVendor.ServiceType.GetDisplayName(),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
startTime = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("t"),
location = depoRequest.Location.ToFullString(),
deliverablesDate = depoRequest.DeliverablesDate?.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
},
$"Job#{depoRequest.Number} {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} {depoRequest.CaseName} - Confirmed",
"Depo Request confirmed by Vendor",
new List<string>() { depoRequestUserVendor.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_VendorNotSendRoughDraft(DepoRequestUserVendor depoRequestUserVendor)
{
var emails = new List<EmailItem>();
var title = "Rough draft required from Vendor";
var depoRequest = depoRequestUserVendor.Request;
if (depoRequest.Submitter.GetUserRole() == UserRole.Admin &&
depoRequest.Submitter.GetUser<UserAdminApp>().AdminSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorNotSendRoughDraft))
{
emails.Add(GenerateEmail("DepoRequest.VendorNotSendRoughDraft.Admin",
new
{
username = depoRequest.Submitter.FullName,
caseName = depoRequest.CaseName,
clientName = depoRequest.ClientContact.Client.Name,
depoRequestId = depoRequest.Id,
number = depoRequest.Number,
vendorFullname = depoRequestUserVendor.UserVendor.FullName
},
$"Job#{depoRequestUserVendor.Request.Number} A friendly reminder about {depoRequest.CaseName} Rough Draft",
title,
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
if (depoRequestUserVendor.UserVendor.VendorSettings.EmailNotificationSetting.IsEnabled(x => x.DepoRequestVendorNotSendRoughDraft))
{
emails.Add(GenerateEmail("DepoRequest.VendorNotSendRoughDraft.Vendor",
new
{
username = depoRequestUserVendor.UserVendor.FullName,
caseName = depoRequest.CaseName,
clientName = depoRequest.ClientContact.Client.Name,
depoRequestId = depoRequest.Id,
number = depoRequest.Number,
vendorFullname = depoRequestUserVendor.UserVendor.FullName
},
$"Job#{depoRequestUserVendor.Request.Number} A friendly reminder about {depoRequest.CaseName} Rough Draft",
"Rough draft required",
new List<string>() { depoRequestUserVendor.UserVendor.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
emails.AddRange(depoRequest.InternalInfo.DepoRequestGeneralSetting.ProductionEmails.Select(x => GenerateEmail("DepoRequest.VendorNotSendRoughDraft.Production",
new
{
caseName = depoRequest.CaseName,
clientName = depoRequest.ClientContact.Client.Name,
depoRequestId = depoRequest.Id,
number = depoRequest.Number,
vendorFullname = depoRequestUserVendor.UserVendor.FullName
},
$"Job#{depoRequestUserVendor.Request.Number} A friendly reminder about {depoRequest.CaseName} Rough Draft",
title,
new List<string>() { x },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_VendorNotSendRequiredFilesBeforeDeliverablesDate(DepoRequestUserVendor depoRequestUserVendor)
{
var emails = new List<EmailItem>();
var depoRequest = depoRequestUserVendor.Request;
emails.AddRange(GetAdminEmails(x => x.DepoRequestVendorNotSendRequiredFilesBeforeDeliverablesDate).Select(x => GenerateEmail("DepoRequest.VendorNotSendRequiredFilesBeforeDeliverablesDate.Admin",
new
{
username = x.FullName,
id = depoRequest.Id,
number = depoRequestUserVendor.Request.Number,
vendorFullname = depoRequestUserVendor.UserVendor.FullName,
vendorEmail = depoRequestUserVendor.UserVendor.Email
},
$"Job#{depoRequest.Number} Important! Required files for {depoRequest.CaseName} not sent",
"Files from Vendor required",
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
emails.AddRange(depoRequest.InternalInfo.DepoRequestGeneralSetting.ProductionEmails.Select(x => GenerateEmail("DepoRequest.VendorNotSendRequiredFilesBeforeDeliverablesDate.Production",
new
{
number = depoRequestUserVendor.Request.Number,
id = depoRequest.Id,
vendorFullname = depoRequestUserVendor.UserVendor.FullName,
vendorEmail = depoRequestUserVendor.UserVendor.Email
},
$"Job#{depoRequest.Number} Important! Required files for {depoRequest.CaseName} not sent",
"Deliverable files required",
new List<string>() { x },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_DeliveryFileUploaded(IEnumerable<DepoDeliveryFile> depoDeliveryFiles, DepoRequestServicesDto services)
{
var title = "Depo Request Delivery file uploaded";
var deliveryFiles = depoDeliveryFiles.ToList();
if (!deliveryFiles.Any())
return;
var depoRequest = deliveryFiles.First().Request;
var user = deliveryFiles.First().User;
var comment = deliveryFiles.First().Comments;
var emails = new List<EmailItem>();
var filesForClient = deliveryFiles.Where(x => x.FileType == DepoDeliveryFileType.RoughDraft).ToList();
if (filesForClient.Any() &&
!services.FinalTranscript &&
!string.IsNullOrEmpty(depoRequest.ClientContact?.Email) &&
!depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableClientNotifications)
{
emails.Add(GenerateEmail("DepoRequest.DeliveryFileUploaded.Client",
new
{
username = depoRequest.ClientContact.FullName,
id = depoRequest.Id,
uploaderName = user.FullName,
files = filesForClient.Select(x => new
{
id = x.File.Id,
filename = x.File.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, x.File.Id, TimeSpan.FromDays(90)),
fileType = x.FileType.GetDisplayName()
}),
comment = comment
},
$"Job#{depoRequest.Number} {user.FullName} Rough Draft files uploaded",
title,
new List<string>() { depoRequest.ClientContact.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
emails.AddRange(GetAdminEmails(x => x.DepoRequestDeliveryFileUploaded).Select(x => GenerateEmail("DepoRequest.DeliveryFileUploaded.Admin",
new
{
username = x.FullName,
id = depoRequest.Id,
uploaderName = user.FullName,
files = deliveryFiles.Select(file => new
{
id = file.File.Id,
filename = file.File.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, file.File.Id, TimeSpan.FromDays(90)),
fileType = file.FileType.GetDisplayName()
}),
comment = comment
},
$"Job#{depoRequest.Number} {user.FullName} has uploaded documents to {depoRequest.CaseName}",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
emails.AddRange(depoRequest.InternalInfo.DepoRequestGeneralSetting.ProductionEmails.Select(x => GenerateEmail("DepoRequest.DeliveryFileUploaded.Production",
new
{
uploaderName = user.FullName,
id = depoRequest.Id,
files = deliveryFiles.Select(file => new
{
id = file.File.Id,
filename = file.File.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, file.File.Id, TimeSpan.FromDays(90)),
fileType = file.FileType.GetDisplayName()
}),
comment = comment
},
$"Job#{depoRequest.Number} {user.FullName} has uploaded documents to {depoRequest.CaseName}",
title,
new List<string>() { x },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void DepoRequest_ClientDeliveryFiles(DepoRequest depoRequest)
{
var emails = new List<EmailItem>();
var files = depoRequest.DepoDeliveryFiles.ToList();
if (!files.Any())
return;
var filesForClient = files.Where(x => x.FileType == DepoDeliveryFileType.RoughDraft).ToList();
if (filesForClient.Any() &&
!depoRequest.Services.FinalTranscript &&
!depoRequest.ClientContact.Email.IsNullOrEmpty() &&
!depoRequest.InternalInfo.DepoRequestGeneralSetting.DisableClientNotifications)
{
emails.Add(GenerateEmail("DepoRequest.ClientDeliveryFiles.Client",
new
{
username = depoRequest.Submitter.FullName,
id = depoRequest.Id,
number = depoRequest.Number,
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName,
clientContactName = depoRequest.ClientContact.FullName,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
files = filesForClient.Select(x => new
{
id = x.File.Id,
filename = x.File.FileName,
downloadToken = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, x.File.Id, TimeSpan.FromDays(90)),
fileType = x.FileType.GetDisplayName()
})
},
$"Job#{depoRequest.Number} {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} {depoRequest.DeponentName} {depoRequest.CaseName} Transcripts attached",
"Depo Request Client file uploaded",
new List<string>() { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
public void DepoRequest_RequestShippingLabel(DepoRequest depoRequest, UserVendorApp vendor)
{
var title = "Shipping label request";
// Scheduler email
var emails = new List<EmailItem>
{
GenerateEmail("DepoRequest.RequestShippingLabel.Admin",
new
{
username = depoRequest.Submitter.FullName,
vendor = vendor.FullName,
id = depoRequest.Id,
job = $"Job#{ depoRequest.Number } { depoRequest.CaseName }"
},
$"Job#{ depoRequest.Number } { depoRequest.CaseName } Shipping Label Request",
title,
new List<string> { depoRequest.Submitter.Email },
sendInTime: TimeSpan.FromMinutes(1)
)
};
// Production emails
emails.AddRange(depoRequest.InternalInfo.DepoRequestGeneralSetting.ProductionEmails.Select(x => GenerateEmail("DepoRequest.RequestShippingLabel.Production",
new
{
vendor = vendor.FullName,
id = depoRequest.Id,
job = $"Job#{ depoRequest.Number } { depoRequest.CaseName }"
},
$"Job#{ depoRequest.Number } { depoRequest.CaseName } Shipping Label Request",
title,
new List<string> { x },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void DepoRequest_DraftStartDateCame(DepoRequest depoRequest)
{
var emails = new List<EmailItem>();
emails.AddRange(GetAdminEmails(setting => setting.DepoRequestDraftStartDateCame).Select(x => GenerateEmail("DepoRequest.DraftStartDateCame.Admin",
new
{
username = x.FullName,
request = new
{
id = depoRequest.Id,
number = depoRequest.Number,
clientName = depoRequest.ClientContact?.Client.Name,
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
endDate = depoRequest.EndDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
location = depoRequest.Location.ToFullString(),
caseName = depoRequest.CaseName,
deponentName = depoRequest.DeponentName
}
},
$"Job#{depoRequest.Number} {depoRequest.ClientContact?.Client.Name} is in Draft status and Start Date has come",
"Depo Request start date",
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
#endregion
#region DepoRequestUserVendor
public void DepoRequestUserVendor_OrderFormUploaded(DepoRequestUserVendor depoRequestUserVendor, string orderFormFileId, bool isFirstUpload)
{
var title = "Vendor uploaded Order Form";
var emails = new List<EmailItem>();
var depoRequest = depoRequestUserVendor.Request;
var userVendorApp = depoRequestUserVendor.UserVendor;
emails.AddRange(depoRequest.InternalInfo.DepoRequestGeneralSetting.ProductionEmails.Select(x => GenerateEmail("DepoRequestUserVendor.OrderFormUploaded.Production",
new
{
number = depoRequest.Number,
isFirstUpload = isFirstUpload,
vendorFullName = userVendorApp.FullName,
caseName = depoRequest.CaseName,
orderFormFileId = orderFormFileId,
token = _userAccessTokenRepository.GenerateAccessToken(UserAccessTokenActions.GetFileByToken, orderFormFileId, TimeSpan.FromDays(90)),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
},
$"Job#{depoRequestUserVendor.Request.Number} {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} - Order Information",
title,
new List<string>() { x },
sendInTime: TimeSpan.FromMinutes(1)
)));
emails.AddRange(GetAdminEmails(x => x.DepoRequestOrderFormUploaded).Select(x => GenerateEmail("DepoRequestUserVendor.OrderFormUploaded.Admin",
new
{
username = x.FullName,
id = depoRequest.Id,
isFirstUpload = isFirstUpload,
number = depoRequest.Number,
vendorFullName = userVendorApp.FullName,
caseName = depoRequest.CaseName,
orderFormFileId = orderFormFileId,
token = _userAccessTokenRepository.GenerateAccessToken(new[] { UserAccessTokenActions.GetFileByToken }, new[] { orderFormFileId }, x.Id, TimeSpan.FromDays(90)),
startDate = depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity).ToString("f"),
},
$"Job#{depoRequestUserVendor.Request.Number} {depoRequest.StartDate.ToTimezoneTime(depoRequest.TimezoneEntity):f} - Order Information",
title,
new List<string>() { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails.ToList(), x => x.Id);
}
#endregion
#region User
public void User_CreateUser(CreateUserAppDto user, UserSource source)
{
var email = GenerateEmail("User.CreateUser",
new
{
login = user.Email,
password = source == UserSource.Local ? user.Password : source == UserSource.ActiveDirectory ? "The same as for TPT" : "-"
},
"Registration in DepoSched",
"You have been registered in Depo Scheduler",
new string[] { user.Email },
isForce: true,
sendInTime: TimeSpan.FromMinutes(1));
_emailItemRepository.BulkInsert(new List<EmailItem>() { email }, x => x.Id);
}
public void User_ForgotPassword(UserApp user)
{
var email = GenerateEmail("User.ForgotPassword",
new
{
token = user.Token
},
"DepoSched password reset",
"DepoScheduler password reset",
new[] { user.Email },
sendInTime: TimeSpan.FromMinutes(1)
);
_emailItemRepository.BulkInsert(new List<EmailItem>() { email }, x => x.Id);
}
#endregion
#region UserInvite
public void UserInvite_InviteUser(UserInvite invite)
{
var emails = new List<EmailItem>();
emails.Add(GenerateEmail("UserInvite.InviteUser.Vendor",
new
{
username = invite.User.FullName,
token = invite.Token,
invitedBy = invite.InvitedByUser.FullName
},
$"{invite.InvitedByUser.FullName} has invited you to join the Depo Portal",
"Depo Scheduler Invitation",
new[] { invite.User.Email },
isForce: true,
sendInTime: TimeSpan.FromMinutes(1)
));
emails.AddRange(GetAdminEmails(x => x.UserInvited).Select(x => GenerateEmail("UserInvite.InviteUser.Admin",
new
{
username = invite.User.FullName,
vendorFullName = invite.User.FullName,
vendorEmail = invite.User.Email,
invitedBy = invite.InvitedByUser.FullName
},
$"{invite.InvitedByUser.FullName} has invited {invite.User.FullName} to the Depo Portal",
"Vendor invited to DepoSched",
new[] { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
#endregion
#region Vendor
public void Vendor_IncompleteApplication(UserVendorApp userVendorApp)
{
var emails = new List<EmailItem>();
emails.Add(GenerateEmail("Vendor.IncompleteApplication.Vendor",
new
{
username = userVendorApp.FullName,
isPaymentNameMissed = string.IsNullOrEmpty(userVendorApp.Info.PaymentName),
isW9FormMissed = string.IsNullOrEmpty(userVendorApp.Info.W9FileId),
isICAFormMissed = string.IsNullOrEmpty(userVendorApp.Info.ICAFileId)
},
$"Reminder: Your application is incomplete",
"DepoScheduler Application incomplete",
new[] { userVendorApp.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
emails.AddRange(GetAdminEmails(setting => setting.VendorIncompleteApplication).Select(x => GenerateEmail("Vendor.IncompleteApplication.Admin",
new
{
username = x.FullName,
vendorName = userVendorApp.FullName,
isW9FormMissed = string.IsNullOrEmpty(userVendorApp.Info.W9FileId),
isICAFormMissed = string.IsNullOrEmpty(userVendorApp.Info.ICAFileId)
},
$"Reminder: {userVendorApp.FullName} application is incomplete",
"DepoScheduler Vendor Application incomplete",
new[] { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void Vendor_Registered(UserVendorApp userVendorApp)
{
var emails = new List<EmailItem>();
emails.Add(GenerateEmail("Vendor.Register.Vendor",
new
{
username = userVendorApp.FullName
},
$"Welcome to TransPerfect",
"You've registered for the DepoSched",
new[] { userVendorApp.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
emails.AddRange(GetAdminEmails(setting => setting.VendorRegistered).Select(x => GenerateEmail("Vendor.Register.Admin",
new
{
username = userVendorApp.FullName
},
$"{userVendorApp.FullName} joined to TransPerfect",
"Vendor registered in DepoSched",
new[] { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void Vendor_ChangedToAvailable(UserVendorApp user)
{
var emails = GetAdminEmails(setting => setting.VendorAvailableStatusChanged).Select(x => GenerateEmail("Vendor.ChangedToAvailable.Admin",
new
{
username = x.FullName,
vendor = user.FullName,
vendorId = user.Id
},
$"Vendor {user.FullName} has been activated",
"Vendor availability status",
new[] {x.Email},
isForce: true,
sendInTime: TimeSpan.FromMinutes(1)
)).ToList();
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void Vendor_ChangedToUnavailable(UserVendorApp user)
{
var emails = GetAdminEmails(setting => setting.VendorAvailableStatusChanged).Select(x => GenerateEmail("Vendor.ChangedToUnavailable.Admin",
new
{
username = x.FullName,
vendor = user.FullName,
vendorId = user.Id
},
$"Vendor {user.FullName} has been deactivated",
"Vendor availability status",
new[] {x.Email},
isForce: true,
sendInTime: TimeSpan.FromMinutes(1)
)).ToList();
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
public void Vendor_RatesUpdated(UserVendorApp userVendorApp, List<UserVendorDepoServiceChangeDto> changedRates)
{
if (!changedRates.Any())
return;
var emails = new List<EmailItem>();
var rates = changedRates.Select(x => new
{
Service = x.Entity.Service.Name,
Action = x.ChangeType.ToString(),
Location = x.ChangeType == UserVendorDepoServiceChangeType.Updated &&
x.Original.Location.ToFullString() != x.Entity.Location.ToFullString()
? $"from: {x.Original.Location.ToFullString()} to {x.Entity.Location.ToFullString()}"
: x.Entity.Location.ToFullString(),
Rate = x.ChangeType == UserVendorDepoServiceChangeType.Updated && x.Original.Rate != x.Entity.Rate
? $"from: {x.Original.Rate:0.00} to {x.Entity.Rate:0.00}"
: $"{x.Entity.Rate:0.00}"
}).ToArray();
if (userVendorApp.VendorSettings.EmailNotificationSetting.IsEnabled(x => x.VendorRatesUpdated))
{
emails.Add(GenerateEmail("Vendor.RatesUpdated.Vendor",
new
{
username = userVendorApp.FullName,
rates
},
$"Your rates have been updated",
"Your service rates are updated",
new[] { userVendorApp.Email },
sendInTime: TimeSpan.FromMinutes(1)
));
}
emails.AddRange(GetAdminEmails(setting => setting.VendorRatesUpdated).Select(x => GenerateEmail("Vendor.RatesUpdated.Admin",
new
{
username = userVendorApp.FullName,
id = userVendorApp.Id,
rates
},
$"Vendor {userVendorApp.FullName} rates have been updated",
"Vendor service rates updated",
new[] { x.Email },
sendInTime: TimeSpan.FromMinutes(1)
)));
_emailItemRepository.BulkInsert(emails, x => x.Id);
}
#endregion
#region Exception
public void Exception(ErrorLog errorLog)
{
var email = GenerateEmail("Exception.Index",
new
{
id = errorLog.Id,
dateCreated = errorLog.DateCreated.ToString("R"),
message = errorLog.Message,
details = errorLog.Details,
actionName = errorLog.ActionName,
controllerName = errorLog.ControllerName,
requestUri = errorLog.RequestUri,
requestHeader = errorLog.RequestHeader,
requestParams = errorLog.RequestParams,
userEmail = errorLog.UserEmail,
userId = errorLog.UserId
},
"DepoSched threw an Exception",
"Error Summary",
new[] { _emailOptions.ReportsTo },
_emailOptions.FromEmail);
_emailItemRepository.BulkInsert(new List<EmailItem>() { email }, x => x.Id);
}
#endregion
#region Helpers
private Func<object, string> GetEmailTemplate(string name)
{
var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"DepoSched.Services.Resources.EmailTemplates.{name}.html");
if (resourceStream == null)
throw new NotImplementedException($"Email Template '{name}' is not implemented yet.");
var str = new StreamReader(resourceStream).ReadToEnd();
var template = Handlebars.Compile(str);
return template;
}
private string GenerateEmailBody(string body, string title)
{
var rootUrl = _emailOptions.RootUrl;
var template = GetEmailTemplate("Index");
return template(new
{
body,
rootUrl,
title,
year = DateTime.UtcNow.Date.Year,
contactEmail = _emailOptions.FromEmail
});
}
private EmailItem GenerateEmail(string emailTemplate, dynamic emailContent, string subject, string title, IEnumerable<string> toList = null, string from = null, IEnumerable<string> ccList = null, IEnumerable<string> bccList = null, bool isForce = false, TimeSpan? sendInTime = null)
{
var currentUser = _httpSessionContext.GetCurrentUserAsync().Result;
dynamic data = new Expando(emailContent);
data.authorAction = $"{currentUser?.PersonalInfo?.FirstName} {currentUser?.PersonalInfo?.LastName}".Trim().IfNullOrEmpty("Administrator");
data.rootUrl = _emailOptions.RootUrl;
var template = GetEmailTemplate(emailTemplate);
var body = template(data);
var email = new EmailItem
{
Type = emailTemplate,
From = from ?? _emailOptions.FromEmail,
ToList = toList?.ToList() ?? new List<string>(),
CcList = ccList?.ToList() ?? new List<string>(),
BccList = bccList?.ToList() ?? new List<string>(),
Subject = subject,
IsForce = isForce,
Body = GenerateEmailBody(body, title),
DateSendingAfter = sendInTime == null ? null : _depoSchedGeneralOptions.EnableEditingEmailsBeforeSending ? DateTime.UtcNow.Add(sendInTime.Value) : (DateTime?)null
};
return email;
}
private List<UserAdminApp> GetAdminEmails(Expression<Func<UserAdminEmailNotificationSetting, bool>> func)
{
return _userAdminRepository.GetMany(x => x.AdminSettings.EmailNotificationSetting.IsEmailNotificationEnabled && func.Invoke(x.AdminSettings.EmailNotificationSetting), u => u.AdminSettings).ToList();
}
#endregion
}
}