public ActionResult RespondToBackupRequest(BackupResponse model, List <BackupRequestShiftAndDate> BackupDatesAndShifts) { var retvalue = true; using (var db = new MTCDbContext()) { model.CreatedOn = DateTime.Now; model.CreatedBy = HttpContext.User.Identity.Name; model.ModifiedOn = DateTime.Now; model.ModifiedBy = HttpContext.User.Identity.Name; db.BackupResponses.Add(model); if (model.BackupResponseStatus == BackupResponseStatus.Qualified) { if (BackupDatesAndShifts != null) { foreach (var item in BackupDatesAndShifts) { var baDs = db.BackupRequestShiftsAndDates.Find(item.Id); if (baDs == null) { continue; } if (item.AMRequested) { baDs.AMSatisfied = item.AMSatisfied; } if (item.MIDRequested) { baDs.MIDSatisfied = item.MIDSatisfied; } if (item.PMRequested) { baDs.PMSatisfied = item.PMSatisfied; } } } } db.SaveChanges(); var br = db.BackupRequests.Find(model.BackupRequestId); var backupProviders = db.BackupProviders.ToList(); var ba = db.BackupAssignments.FirstOrDefault(p => p.BeatId == br.BeatId); var toContractor = EmailManager.GetContractorById(br.ContractorId); var primaryContractorId = backupProviders.FirstOrDefault(c => c.BackupBeatId == ba.PrimaryBackupBeatId).ContractorId; var primaryContractor = EmailManager.GetContractorById(primaryContractorId); var secondaryContractorId = backupProviders.FirstOrDefault(c => c.BackupBeatId == ba.SecondaryBackupBeatId).ContractorId; var secondaryContractor = EmailManager.GetContractorById(secondaryContractorId); var tertiaryContractorId = backupProviders.FirstOrDefault(c => c.BackupBeatId == ba.TertiaryBackupBeatId).ContractorId; var tertiaryContractor = EmailManager.GetContractorById(tertiaryContractorId); var ccRecipients = new List <MTCEmailRecipient>(); var toRecipients = new List <MTCEmailRecipient>(); if (model.BackupResponseStatus == BackupResponseStatus.Declined || model.BackupResponseStatus == BackupResponseStatus.Qualified) { #region if (br.CurrentBackupContractorAssignmentLevel == BackupAssignmentLevel.Primary) { if (model.BackupResponseStatus == BackupResponseStatus.Declined) { br.PrimaryBackupResponseTimeExpiredOrDeclined = true; br.PrimaryBackupResponseTimeExpiredOrDeclinedOn = DateTime.Now; } br.CurrentBackupContractorId = secondaryContractorId; br.CurrentBackupContractorAssignmentLevel = BackupAssignmentLevel.Secondary; } else if (br.CurrentBackupContractorAssignmentLevel == BackupAssignmentLevel.Secondary) { if (model.BackupResponseStatus == BackupResponseStatus.Declined) { br.SecondaryBackupResponseTimeExpiredOrDeclined = true; br.SecondaryBackupResponseTimeExpiredOrDeclinedOn = DateTime.Now; } br.CurrentBackupContractorId = tertiaryContractorId; br.CurrentBackupContractorAssignmentLevel = BackupAssignmentLevel.Tertiary; } else if (br.CurrentBackupContractorAssignmentLevel == BackupAssignmentLevel.Tertiary) { if (model.BackupResponseStatus == BackupResponseStatus.Declined) { br.TertiaryBackupResponseTimeExpiredOrDeclined = true; br.TertiaryBackupResponseTimeExpiredOrDeclinedOn = DateTime.Now; } br.CurrentBackupContractorId = null; br.CurrentBackupContractorAssignmentLevel = BackupAssignmentLevel.AllBackupOperators; foreach (var backupProvider in backupProviders) { var backupProviderContractor = EmailManager.GetContractorById(backupProvider.ContractorId); ccRecipients.Add(new MTCEmailRecipient { Email = backupProviderContractor.Email, Name = backupProviderContractor.ContractCompanyName }); } } #endregion br.ModifiedBy = HttpContext.User.Identity.Name; br.ModifiedOn = DateTime.Now; if (model.BackupResponseStatus == BackupResponseStatus.Qualified) { //check if maybe now all shifts have been covered. then set status to accepted. var backupDatesAndShifts = db.BackupRequestShiftsAndDates.Where(p => p.BackupRequestId == br.Id).ToList(); var allShiftsSatisfied = true; foreach (var item in backupDatesAndShifts) { if (item.AMSatisfied == false || item.MIDSatisfied == false || item.PMSatisfied == false) { allShiftsSatisfied = false; } } if (allShiftsSatisfied) { model.BackupResponseStatus = BackupResponseStatus.Accepted; } } db.SaveChanges(); } toRecipients.Add(new MTCEmailRecipient { Email = toContractor.Email, Name = toContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = primaryContractor.Email, Name = primaryContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = secondaryContractor.Email, Name = secondaryContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = tertiaryContractor.Email, Name = tertiaryContractor.ContractCompanyName }); ccRecipients.Add(new MTCEmailRecipient { Email = Utilities.GetApplicationSettingValue("MTCContactEmail"), Name = Utilities.GetApplicationSettingValue("MTCContactName") }); EmailManager.SendEmail(toRecipients, EmailManager.BuildBackupResponseSubject(br, model), EmailManager.BuildBackupResponseEmail(br, model), ccRecipients); } return(Json(retvalue, JsonRequestBehavior.AllowGet)); }