public ActionResult RequestBackup(BackupRequest model, List <BackupRequestShiftAndDate> BackupDatesAndShifts) { var retvalue = true; using (var db = new MTCDbContext()) { var currentMonth = DateTime.Today.ToString("MM"); model.RequestNumber = currentMonth + (db.BackupRequests.Count(p => p.RequestNumber.StartsWith(currentMonth)) + 1).ToString().PadLeft(2, "0"[0]); model.CreatedOn = DateTime.Now; model.LastExpiredOn = DateTime.Now; model.CreatedBy = HttpContext.User.Identity.Name; model.ModifiedOn = DateTime.Now; model.ModifiedBy = HttpContext.User.Identity.Name; model.IsCancelled = false; if (BackupDatesAndShifts != null) { foreach (var item in BackupDatesAndShifts) { db.BackupRequestShiftsAndDates.Add(item); } } Contractor toContractor = null; var backupProviders = db.BackupProviders.ToList(); var ba = db.BackupAssignments.FirstOrDefault(p => p.BeatId == model.BeatId); var assignmentLevel = BackupAssignmentLevel.Primary; if (model.SelectedBackupContractorId == Guid.Empty) { //no prior arrangements have been made. Get the primary back-up for this contractorId and beatId combination. if (ba != null) { var baProvider = backupProviders.FirstOrDefault(p => p.BackupBeatId == ba.PrimaryBackupBeatId); if (baProvider != null) { model.SelectedBackupContractorId = baProvider.ContractorId; } model.SelectedBackupContractorAssignmentLevel = assignmentLevel; toContractor = EmailManager.GetContractorById(model.SelectedBackupContractorId); } } else { toContractor = EmailManager.GetContractorById(model.SelectedBackupContractorId); assignmentLevel = model.SelectedBackupContractorAssignmentLevel; } model.CurrentBackupContractorId = model.SelectedBackupContractorId; model.CurrentBackupContractorAssignmentLevel = model.SelectedBackupContractorAssignmentLevel; db.BackupRequests.Add(model); db.SaveChanges(); var requestingContractor = EmailManager.GetContractorById(model.ContractorId); var toRecipients = new List <MTCEmailRecipient>(); var ccRecipients = new List <MTCEmailRecipient>(); toRecipients.Add(new MTCEmailRecipient { Email = toContractor?.Email, Name = toContractor?.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = Utilities.GetApplicationSettingValue("MTCContactEmail"), Name = Utilities.GetApplicationSettingValue("MTCContactName") }); ccRecipients.Add(new MTCEmailRecipient { Email = requestingContractor.Email, Name = requestingContractor.ContractCompanyName }); var body = EmailManager.BuildBackupRequestEmail(model); EmailManager.SendEmail(toRecipients, EmailManager.BuildBackupRequestSubject(model.RequestNumber, assignmentLevel), body, ccRecipients); } return(Json(retvalue, JsonRequestBehavior.AllowGet)); }
private void CheckBackupRequests() { using (var db = new MTCDbContext()) { var backupRequests = db.BackupRequests.Where(p => p.IsCancelled == false).ToList().Select(p => new { p.Id, p.ContractorId, p.BeatId, p.LastExpiredOn, p.PrimaryBackupResponseTimeExpiredOrDeclined, p.SecondaryBackupResponseTimeExpiredOrDeclined, p.TertiaryBackupResponseTimeExpiredOrDeclined, p.AllBackupsNotified, Resolved = db.BackupResponses.Any(l => l.BackupRequestId == p.Id && (l.BackupResponseStatus == BackupResponseStatus.Accepted || l.BackupResponseStatus == BackupResponseStatus.Qualified)), p.SelectedBackupContractorId, p.SelectedBackupContractorAssignmentLevel, p.RequestIsUrgent }); foreach (var unResolvedBackupRequest in backupRequests.Where(p => p.Resolved == false)) { //if the time the backup request was made is longer than the initial respoinse time, send email to next guy in line var now = DateTime.Now; var timeBackupRequestWasMade = unResolvedBackupRequest.LastExpiredOn; var timeSinceBackupRequestWasMadeInMinutes = now.Subtract(timeBackupRequestWasMade).Minutes; var responseTimeInMinutes = _standardBackupRequestResponseTimeInMinutes; if (unResolvedBackupRequest.RequestIsUrgent) { responseTimeInMinutes = _urgentBackupRequestResponseTimeInMinutes; } var backupProviders = db.BackupProviders.ToList(); if (timeSinceBackupRequestWasMadeInMinutes >= responseTimeInMinutes && backupProviders.Count > 0) { var backupRequest = db.BackupRequests.Find(unResolvedBackupRequest.Id); var backupAssignment = db.BackupAssignments.FirstOrDefault(p => p.BeatId == unResolvedBackupRequest.BeatId); var requestor = EmailManager.GetContractorById(unResolvedBackupRequest.ContractorId); var primaryBackupContractor = EmailManager.GetContractorById(backupProviders.FirstOrDefault(p => p.BackupBeatId == backupAssignment.PrimaryBackupBeatId).ContractorId); //EmailManager.GetContractorById(backupAssignment.PrimaryBackupContractorId); var secondaryBackupContractor = EmailManager.GetContractorById(backupProviders.FirstOrDefault(p => p.BackupBeatId == backupAssignment.SecondaryBackupBeatId).ContractorId); //EmailManager.GetContractorById(backupAssignment.PrimaryBackupContractorId); var tertiaryBackupContractor = EmailManager.GetContractorById(backupProviders.FirstOrDefault(p => p.BackupBeatId == backupAssignment.TertiaryBackupBeatId).ContractorId); //EmailManager.GetContractorById(backupAssignment.PrimaryBackupContractorId); if (backupAssignment != null) { var ccRecipients = new List <MTCEmailRecipient>(); var toRecipients = new List <MTCEmailRecipient>(); var toRecipient = new MTCEmailRecipient(); var backupAssignmentLevel = BackupAssignmentLevel.Primary; if (unResolvedBackupRequest.PrimaryBackupResponseTimeExpiredOrDeclined == false) { //PBUO's time has expired. Now, start clock for SBUO. #region backupRequest.PrimaryBackupResponseTimeExpiredOrDeclined = true; backupRequest.PrimaryBackupResponseTimeExpiredOrDeclinedOn = DateTime.Now; backupRequest.CurrentBackupContractorId = backupProviders.FirstOrDefault(p => p.BackupBeatId == backupAssignment.SecondaryBackupBeatId).ContractorId; //backupAssignment.SecondaryBackupContractorId; backupRequest.CurrentBackupContractorAssignmentLevel = BackupAssignmentLevel.Secondary; backupRequest.LastExpiredOn = DateTime.Now; db.SaveChanges(); //Email to SBUO backupAssignmentLevel = BackupAssignmentLevel.Secondary; toRecipients.Add(new MTCEmailRecipient { Email = secondaryBackupContractor.Email, Name = secondaryBackupContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = Utilities.GetApplicationSettingValue("MTCContactEmail"), Name = Utilities.GetApplicationSettingValue("MTCContactName") }); #endregion } else if (unResolvedBackupRequest.PrimaryBackupResponseTimeExpiredOrDeclined && unResolvedBackupRequest.SecondaryBackupResponseTimeExpiredOrDeclined == false) { //SBUO's time has expired. Now, start clock for TBUO. #region Seconday backupRequest.SecondaryBackupResponseTimeExpiredOrDeclined = true; backupRequest.SecondaryBackupResponseTimeExpiredOrDeclinedOn = DateTime.Now; backupRequest.CurrentBackupContractorId = backupProviders.FirstOrDefault(p => p.BackupBeatId == backupAssignment.TertiaryBackupBeatId).ContractorId; //backupAssignment.TertiaryBackupContractorId; backupRequest.CurrentBackupContractorAssignmentLevel = BackupAssignmentLevel.Tertiary; backupRequest.LastExpiredOn = DateTime.Now; db.SaveChanges(); //Email to TBUO backupAssignmentLevel = BackupAssignmentLevel.Tertiary; toRecipients.Add(new MTCEmailRecipient { Email = tertiaryBackupContractor.Email, Name = tertiaryBackupContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = Utilities.GetApplicationSettingValue("MTCContactEmail"), Name = Utilities.GetApplicationSettingValue("MTCContactName") }); #endregion } else if (unResolvedBackupRequest.PrimaryBackupResponseTimeExpiredOrDeclined && unResolvedBackupRequest.SecondaryBackupResponseTimeExpiredOrDeclined && unResolvedBackupRequest.TertiaryBackupResponseTimeExpiredOrDeclined == false) { //TBUO's time has expired. Send email to all. #region backupRequest.TertiaryBackupResponseTimeExpiredOrDeclined = true; backupRequest.TertiaryBackupResponseTimeExpiredOrDeclinedOn = DateTime.Now; backupRequest.CurrentBackupContractorId = null; backupRequest.CurrentBackupContractorAssignmentLevel = BackupAssignmentLevel.AllBackupOperators; backupRequest.LastExpiredOn = DateTime.Now; backupAssignmentLevel = BackupAssignmentLevel.AllBackupOperators; backupRequest.AllBackupsNotified = true; db.SaveChanges(); //Email to all BUOs foreach (var backupProvider in backupProviders) { if (backupProvider.ContractorId != primaryBackupContractor.ContractorID && backupProvider.ContractorId != secondaryBackupContractor.ContractorID && backupProvider.ContractorId != tertiaryBackupContractor.ContractorID) { var backupContractor = EmailManager.GetContractorById(backupProvider.ContractorId); toRecipients.Add(new MTCEmailRecipient { Email = backupContractor.Email, Name = backupContractor.ContractCompanyName }); } } ccRecipients.Add(new MTCEmailRecipient { Email = Utilities.GetApplicationSettingValue("MTCContactEmail"), Name = Utilities.GetApplicationSettingValue("MTCContactName") }); ccRecipients.Add(new MTCEmailRecipient { Email = requestor.Email, Name = requestor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = primaryBackupContractor.Email, Name = primaryBackupContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = secondaryBackupContractor.Email, Name = secondaryBackupContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = tertiaryBackupContractor.Email, Name = tertiaryBackupContractor.ContractCompanyName }); #endregion } var body = EmailManager.BuildBackupRequestEmail(backupRequest); //Emails if (toRecipients.Count() > 0 && ccRecipients.Count() > 0) { EmailManager.SendEmail(toRecipients, EmailManager.BuildBackupRequestSubject(backupRequest.RequestNumber, backupAssignmentLevel), body, ccRecipients); } } } } } }