public async Task Handle(TodayLogsNotificationsPMs notification, CancellationToken cancellationToken) { if (DateTime.Now.Hour >= 20 && DateTime.Now.Hour < 23) { try { var service = await _context.ServiceTimeCheckers .FirstOrDefaultAsync(x => x.ServiceName == "DailyLogsPm", cancellationToken); if (service != null && (!service.ExecutedLastTime.HasValue || (DateTime.Now - service.ExecutedLastTime.Value).Hours >= 22)) { service.ExecutedLastTime = DateTime.Now; _context.ServiceTimeCheckers.Update(service); await _context.SaveChangesAsync(cancellationToken); } else { return; } } catch (Exception exception) { Debug.WriteLine(exception.Message); } var administration = (await Task.Run(async() => { var owners = await _userManager.GetUsersInRoleAsync("PM Owner"); var admins = await _userManager.GetUsersInRoleAsync("PM Admin"); var ownerEmails = owners?.Where(x => x.Active)?.Select(x => x.Email) ?? new List <string>(); var adminEmails = admins?.Where(x => x.Active)?.Select(x => x.Email) ?? new List <string>(); return(ownerEmails.Union(adminEmails)); }, cancellationToken)).ToList(); var teams = await Task.Run(() => { var projectManagers = _context.Projects .Include(x => x.ProjectManager) .Include(x => x.ProjectMembers) .Where(x => x.ProjectManagerId.HasValue && x.ProjectManagerId.Value != Guid.Empty && x.ProjectManager != null && x.ProjectManager.Active && !administration.Contains(x.ProjectManager.Email)); return(projectManagers .OrderBy(x => x.ProjectManager.Email) .GroupBy(x => x.ProjectManager.Email, TeamMembersDto.Create) .ToDictionary(x => x.Key, x => x)); }, cancellationToken); var activityTypeIds = await _context.ActivityTypes.Select(x => x.Id).ToListAsync(cancellationToken); var now = DateTime.Now; var yesterday = now.AddDays(-1); var today = $"{now.Year}-{now.Month}-{now.Day}"; foreach (var manager in teams) { manager.Deconstruct(out var email, out var projectEmployeeIds); var employeeIds = new List <Guid>(); foreach (var employeeGroup in projectEmployeeIds) { employeeIds.AddRange(employeeGroup.EmployeeIds); } var projectIds = projectEmployeeIds.Select(x => x.ProjectId); TeamsFilteredReportListViewModel request; try { request = await _mediator.Send(new GetTeamsByFiltersReportQuery { ProjectIds = projectIds.ToList(), ActivityStatuses = new List <ActivityStatus> { ActivityStatus.Completed, ActivityStatus.Developed, ActivityStatus.InProgress, ActivityStatus.New, ActivityStatus.Refused, ActivityStatus.Tested }, ActivityTypeIds = activityTypeIds, EmployeeIds = employeeIds, StartDate = now.AddYears(-1), //StartDate = new DateTime(yesterday.Year, yesterday.Month, yesterday.Day, 23, 59, 59), DueDate = now }, cancellationToken); } catch (Exception exception) { Debug.WriteLine(exception.Message); continue; } var tableHelper = new ExcelTableHelper(); var tableHeaders = tableHelper.GetTeamsByFiltersReportTableHeaders(); var excelReportHelper = new ExcelReportHelper(); var result = excelReportHelper.GetTeamsByFiltersReport(request, tableHeaders); var message = new Message { Subject = $"Daily Logs Report", Body = $"Daily logs report for the Project Manager {manager.Key}\n" + GetTeamsHtmlContent(request), To = email, Attachments = new List <Attachment> { new Attachment { Content = result, ContentId = Guid.NewGuid().ToString(), Disposition = "attachment", Filename = $"{today}_Employee-TimeLogged.xlsx", Type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" } }, EventName = "DailyLogsNotifications", SentTime = now }; try { await _notification.SendAsync(message); } catch (Exception exception) { Debug.WriteLine(exception.Message); } } } }