public async Task CheckIfAlertHasBeenHandled(int alertId) { var alert = await _nyssContext.Alerts.Where(a => a.Id == alertId) .Select(a => new { a.Status, a.CreatedAt, a.ProjectHealthRisk.Project.NationalSociety.HeadManager, Supervisors = a.AlertReports.Select(x => x.Report.DataCollector.Supervisor.Name), HealthRiskName = a.ProjectHealthRisk.HealthRisk.LanguageContents.First().Name, VillageOfLastReport = a.AlertReports.OrderByDescending(ar => ar.Report.ReceivedAt) .Select(ar => ar.Report.RawReport.Village.Name) .FirstOrDefault(), LanguageCode = a.ProjectHealthRisk.Project.NationalSociety.ContentLanguage.LanguageCode.ToLower() }) .FirstOrDefaultAsync(); if (alert == null) { _loggerAdapter.WarnFormat("Alert {0} not found", alertId); return; } if (alert.Status == AlertStatus.Pending) { _loggerAdapter.WarnFormat("Alert {0} has not been assessed since it was triggered {1}, sending email to head manager", alertId, alert.CreatedAt.ToString("O")); var timeSinceTriggered = (_dateTimeProvider.UtcNow - alert.CreatedAt).TotalHours; var emailSubject = await GetEmailMessageContent(EmailContentKey.AlertHasNotBeenHandled.Subject, alert.LanguageCode); var emailBody = await GetEmailMessageContent(EmailContentKey.AlertHasNotBeenHandled.Body, alert.LanguageCode); emailBody = emailBody .Replace("{{healthRiskName}}", alert.HealthRiskName) .Replace("{{lastReportVillage}}", alert.VillageOfLastReport) .Replace("{{supervisors}}", string.Join(", ", alert.Supervisors.Distinct())) .Replace("{{timeSinceAlertWasTriggeredInHours}}", timeSinceTriggered.ToString("0.##")); await _queuePublisherService.SendEmail((alert.HeadManager.Name, alert.HeadManager.EmailAddress), emailSubject, emailBody); } }