// Shop Report Notification Template. internal async Task SendShopReportNotification(int requestId) { // Load Repair to Populate Template. var request = await _connection.QuerySingleAsync <RequestNotificationModel>("EXEC Notification.usp_GetRequestNotification @RequestId", new { RequestId = requestId }); if (request == null) { throw new ArgumentNullException(nameof(request)); } // Check Complete Report. if (request.ReportCompletedInd) { // Load Template. var template = await _connection.QuerySingleAsync <NotificationTemplateModel>(TemplateSql, new { TemplateName = "ShopReportEmail" }); // Load Reporting Contacts. var reportingContacts = (await _contacts.GetReportingContacts(request.ShopGuid)).ToList(); // Load Distinct Timezones. var timezones = reportingContacts.Select(r => r.TimeZoneInfoId).Distinct().ToArray(); // Load Upload Attachments. var uploads = new List <INotificationMessageAttachment>(); uploads.AddRange(await LoadAttachments(UploadType.ScanRequests, request.RequestId.ToString())); uploads.AddRange(await LoadAttachments(UploadType.VehicleMakes, request.VehicleMakeId.ToString())); // Process Report per Timezone. foreach (string timezone in timezones) { // Load Time Zone Offset. var offset = TimeZoneInfo.FindSystemTimeZoneById(timezone).GetUtcOffset(DateTimeOffset.UtcNow).ToString(); // Load Report. var report = (await _reportGenerator.GetScanReportPdfStreamAsync(request.RequestId, offset)).ToBase64String(); // Create Attachment. var attachments = new List <INotificationMessageAttachment> { new NotificationMessageAttachment { Filename = $"AirProScan-{request.RequestId}.pdf", MimeType = "application/pdf", ContentBase64 = report } }; // Check Estimate Plan. if (request.EstimatePlanInd) { var estimateReport = (await _reportGenerator.GetEstimateReportPdfStreamAsync(request.RepairId, offset)).ToBase64String(); attachments.Add(new NotificationMessageAttachment { Filename = $"AirProAssessment-{request.RequestId}.pdf", MimeType = "application/pdf", ContentBase64 = estimateReport }); } // Add Upload Attachments. attachments.AddRange(uploads); // Populate Template. var message = new NotificationMessageModel { Destinations = reportingContacts.Where(r => r.TimeZoneInfoId == timezone).ToArray(), EmailSubject = Templates.ShopReportEmailTemplate(template.Subject, request), EmailBody = Templates.ShopReportEmailTemplate(template.EmailBody, request), TextMessage = Templates.ShopReportEmailTemplate(template.TextMessage, request), Attachments = attachments }; // Send Message. await SendNotifications(message); } } }