private byte[] GetOverdueAttachment(OverdueTasksFilteredReportViewModel request) { var tableHelper = new ExcelTableHelper(); var tableHeaders = tableHelper.GetOverdueTasksFilteredReportTableHeaders(); var excelReportHelper = new ExcelReportHelper(); return(excelReportHelper.GetOverdueTasksFilteredReport(request, tableHeaders)); }
public byte[] GetEmployeeFilteredReport(EmployeeFilteredReportListViewModel request, IList <ExcelTableCell> tableHeaders) { var tableNames = tableHeaders.Where(x => x.IsActive).Select(x => x.Name).ToList(); var tableHelper = new ExcelTableHelper(); var headers = tableHelper.GetTeamsByFiltersReportTableHeaders(); var result = new StringBuilder(); result.Append(string.Join(',', tableNames)); result.AppendLine(); var row = 0; foreach (var assignee in request.Assignees) { bool isSettedAssignee = false; foreach (var activity in assignee.ActivityView.Activities) { foreach (var loggedTime in activity.LoggedTimeView.LoggedTimes) { ++row; foreach (var name in tableNames) { if (name == headers[0].Name) { result.Append($"{row}, "); } else if (name == headers[1].Name) { if (isSettedAssignee) { continue; } result.Append($"{assignee.AssigneeName}, "); isSettedAssignee = true; } else if (name == headers[2].Name) { result.Append($"{activity.ProjectName}, "); } else if (name == headers[3].Name) { result.Append($"{activity.ActivityName}, "); } else if (name == headers[4].Name) { result.Append($"{activity.ActivityStatus}, "); } else if (name == headers[5].Name) { result.Append($"{activity.LoggedTimeView.TotalEstimatedTime}, "); } else if (name == headers[6].Name) { result.Append($"{activity.LoggedTimeView.TotalLoggedTime}, "); } } result.AppendLine(); } } } return(Encoding.Unicode.GetBytes(result.ToString())); }
public byte[] GetGeneralFilteredReport(GeneralFilteredReportListViewModel request, IList <ExcelTableCell> tableHeaders) { var tableNames = tableHeaders.Where(x => x.IsActive).Select(x => x.Name).ToList(); var tableHelper = new ExcelTableHelper(); var headers = tableHelper.GetGeneralFilteredReportTableHeaders(); var result = new StringBuilder(); result.Append(string.Join(',', tableNames)); result.AppendLine(); var estimatedHoursColumn = 'A'; var loggedHoursColumn = 'A'; var startColumn = 'B'; var startRow = 0; var row = 0; foreach (var projectGroup in request.ProjectGroups) { var isProjectGroupSetted = false; foreach (var project in projectGroup.ProjectView.Projects) { var isProjectSetted = false; foreach (var sprint in project.SprintView.Sprints) { var isSprintSetted = false; foreach (var activity in sprint.ActivityView.Activities) { var isActivitySetted = false; foreach (var assignee in activity.AssigneeView.Assignees) { ++row; result.AppendLine(); var currentColumn = startColumn; foreach (var name in tableNames) { var pattern = $"{currentColumn++}{row}"; if (name == headers[0].Name) { result.Append($"{row - startRow}, "); } else if (name == headers[1].Name) { if (isProjectGroupSetted) { continue; } result.Append($"{projectGroup.ProjectGroupName}, "); isProjectGroupSetted = true; } else if (name == headers[2].Name) { if (isProjectSetted) { continue; } result.Append($"{project.ProjectName}, "); isProjectSetted = true; } else if (name == headers[3].Name) { if (isSprintSetted) { continue; } result.Append($"{sprint.SprintName}, "); isSprintSetted = true; } else if (name == headers[4].Name) { if (isActivitySetted) { continue; } result.Append($"{activity.ActivityName}, "); isActivitySetted = true; } else if (name == headers[5].Name) { result.Append($"{assignee.AssigneeName}, "); } else if (name == headers[6].Name) { result.Append($"{activity.EstimatedTime:0.00}, "); estimatedHoursColumn = currentColumn; } else if (name == headers[7].Name) { result.Append($"{activity.AssigneeView.TotalLoggedTime:0.00}, "); loggedHoursColumn = currentColumn; } } } if (isActivitySetted && (estimatedHoursColumn != 'A' || loggedHoursColumn != 'A')) { ++startRow; ++row; result.AppendLine(); result.Append("Total:, "); if (estimatedHoursColumn != 'A') { result.Append($"\"Activity estimated: {activity.EstimatedTime:0.00}\", "); ++estimatedHoursColumn; } if (loggedHoursColumn != 'A') { result.Append($"\"Activity logged: {activity.AssigneeView.TotalLoggedTime:0.00}\", "); ++loggedHoursColumn; } } } if (isSprintSetted && (estimatedHoursColumn != 'A' || loggedHoursColumn != 'A')) { ++startRow; ++row; result.AppendLine(); result.Append("Total:, "); if (estimatedHoursColumn != 'A') { result.Append($"\"Sprint estimated: {sprint.ActivityView.TotalEstimatedTime:0.00}\", "); ++estimatedHoursColumn; } if (loggedHoursColumn != 'A') { result.Append($"\"Sprint logged: {sprint.ActivityView.TotalLoggedTime:0.00}\", "); ++loggedHoursColumn; } } } if (isProjectSetted && (estimatedHoursColumn != 'A' || loggedHoursColumn != 'A')) { ++startRow; ++row; result.AppendLine(); result.Append("Total:, "); if (estimatedHoursColumn != 'A') { result.Append($"\"Project estimated: {project.SprintView.TotalEstimatedTime:0.00}\", "); ++estimatedHoursColumn; } if (loggedHoursColumn != 'A') { result.Append($"\"Project logged: {project.SprintView.TotalLoggedTime:0.00}\", "); ++loggedHoursColumn; } } } if (isProjectGroupSetted && (estimatedHoursColumn != 'A' || loggedHoursColumn != 'A')) { ++startRow; ++row; result.AppendLine(); result.Append("Total:, "); if (estimatedHoursColumn != 'A') { result.Append($"\"Project group estimated: {projectGroup.ProjectView.TotalEstimatedTime:0.00}\", "); ++estimatedHoursColumn; } if (loggedHoursColumn != 'A') { result.Append($"\"Project group logged: {projectGroup.ProjectView.TotalLoggedTime:0.00}\", "); ++loggedHoursColumn; } } } startRow = row; var rowForFinal = row + 1; if (estimatedHoursColumn == 'A' && loggedHoursColumn == 'A') { return(Encoding.Unicode.GetBytes(result.ToString())); } result.AppendLine(); result.Append("Total:, "); if (estimatedHoursColumn != 'A') { result.Append($"\"All estimated: {request.TotalEstimatedTime:0.00}\", "); } if (loggedHoursColumn == 'A') { return(Encoding.Unicode.GetBytes(result.ToString())); } result.Append($"\"All logged: {request.TotalLoggedTime:0.00}\", "); return(Encoding.Unicode.GetBytes(result.ToString())); }
public byte[] GetOverdueTasksFilteredReport(OverdueTasksFilteredReportViewModel request, IList <ExcelTableCell> tableHeaders) { var result = new StringBuilder(); var tableNames = tableHeaders.Where(x => x.IsActive).Select(x => x.Name).ToList(); var tableHelper = new ExcelTableHelper(); var headers = tableHelper.GetOverdueTasksFilteredReportTableHeaders(); var row = 0; foreach (var projectGroup in request.ProjectGroups) { var isProjectGroupSetted = false; foreach (var project in projectGroup.Projects) { var isProjectSetted = false; foreach (var activity in project.Activities) { var isActivitySetted = false; foreach (var assignee in activity.Assignees) { ++row; foreach (var name in tableNames) { if (name == headers[0].Name) { result.Append(row); } else if (name == headers[1].Name) { if (isProjectGroupSetted) { continue; } result.Append($"{projectGroup.ProjectGroupName}, "); isProjectGroupSetted = true; } else if (name == headers[2].Name) { if (isProjectSetted) { continue; } result.Append($"{project.ProjectName}, "); isProjectSetted = true; } else if (name == headers[3].Name) { if (isActivitySetted) { continue; } result.Append($"{activity.ActivityName}, "); isActivitySetted = true; } else if (name == headers[4].Name) { result.Append($"{assignee.AssigneeName}, "); } else if (name == headers[5].Name) { if (assignee.Deadline.HasValue) { result.Append($"{assignee.Deadline:dddd, dd MMMM yyyy}, "); } else { result.Append("\"Deadline not setted\", "); } } else if (name == headers[6].Name) { result.Append($"{assignee.Overdue}, "); } } result.AppendLine(); } } } } return(Encoding.Unicode.GetBytes(result.ToString())); }
public byte[] GetProjectGroupsFilteredReportWithHistory(ProjectGroupFilteredReportListViewModel request, DateTime startDate, DateTime dueDate, Interval intervalType, IList <ExcelTableCell> tableHeaders) { var result = new StringBuilder(); var startInterval = (int)Math.Ceiling((12 * startDate.Year + startDate.Month) / ((float)intervalType)); var endInclusiveInterval = (int)Math.Ceiling((12 * dueDate.Year + dueDate.Month) / ((float)intervalType)); var tableHelper = new ExcelTableHelper(); var headers = tableHelper.GetProjectGroupsWithHistoryFilteredReportTableHeaders(); var tableNames = tableHeaders.Where(x => x.IsActive).Select(x => x.Name).ToList(); var periodName = tableNames.FirstOrDefault(x => x == headers[4].Name); int order = 0; if (!string.IsNullOrWhiteSpace(periodName)) { order = tableNames.IndexOf(periodName); var temporaryLeft = tableNames.GetRange(0, order); var temporaryRight = tableNames.GetRange(order + 1, tableNames.Count - order - 1); var temporaryMiddle = new List <string>(); for (var intervalOrder = startInterval - 1; intervalOrder++ < endInclusiveInterval;) { temporaryMiddle.Add($"{(intervalOrder - 1) * (int)intervalType / 12} Year, " + $"{Math.Ceiling(intervalOrder % (12 / (int)intervalType) == 0 ? (12 / (float)intervalType) : intervalOrder % (12 / (int)intervalType) * 1.0f)} {intervalType.ToString()}"); } tableNames = temporaryLeft; tableNames.AddRange(temporaryMiddle); tableNames.AddRange(temporaryRight); } result.AppendLine(string.Join(',', tableNames)); var startRow = 2; var row = 2; var startColumn = "B"; var projectNameColumn = "A"; var projectGroupNameColumn = "A"; foreach (var projectGroup in request.ProjectGroups) { var isSettedProjectGroup = false; foreach (var project in projectGroup.ProjectView.Projects) { startRow = row; var isSettedProject = false; foreach (var assignee in project.AssigneeView.Assignees) { ++row; var currentColumn = "B"; var periodColumn = 0; foreach (var name in tableNames) { var pattern = $"{currentColumn}{row}"; if (name == headers[0].Name) { result.Append($"{row - startRow}, "); } else if (name == headers[1].Name) { if (!isSettedProjectGroup) { result.Append($"{projectGroup.ProjectGroupName}, "); projectGroupNameColumn = currentColumn; isSettedProjectGroup = true; } } else if (name == headers[2].Name) { if (!isSettedProject) { result.Append($"{project.ProjectName}, "); projectNameColumn = currentColumn; isSettedProject = true; } } else if (name == headers[3].Name) { result.Append($"{assignee.AssigneeName}, "); } else if (name == headers[5].Name) { result.Append($"{assignee.LoggedTimeView.TotalLoggedTime:0.00}, "); } else { var loggedTime = assignee.LoggedTimeView.LoggedTimes?.FirstOrDefault(x => x.Key == startInterval + periodColumn); periodColumn++; if (loggedTime.HasValue && Math.Abs(loggedTime.Value.Value) >= 0.01) { var keyValuePair = loggedTime.Value; result.Append($"{keyValuePair.Value:0.00}, "); } else { result.Append("-, "); } } currentColumn = currentColumn.Next(); } result.AppendLine(); } result.AppendLine(); if (projectNameColumn == "A") { continue; } result.AppendLine($"Total per project: {project.AssigneeView.TotalLoggedTime:0.00}"); } if (projectGroupNameColumn != "A") { result.AppendLine($"Total per project group: {projectGroup.ProjectView.TotalLoggedTime:0.00}"); } row += 2; result.AppendLine("\n"); } return(Encoding.Unicode.GetBytes(result.ToString())); }
public byte[] GetProjectsByFiltersReport(ProjectFilteredReportListViewModel request, IList <ExcelTableCell> tableHeaders) { var tableNames = tableHeaders.Where(x => x.IsActive).Select(x => x.Name).ToList(); var tableHelper = new ExcelTableHelper(); var headers = tableHelper.GetProjectsByFiltersReportTableHeaders(); var result = new StringBuilder(); result.Append(string.Join(',', tableNames)); result.AppendLine(); var row = 0; foreach (var project in request.Projects) { foreach (var activity in project.ActivityView.Activities) { foreach (var assignee in activity.AssigneeView.Assignees) { var activityStatus = assignee.LoggedTimeView.LoggedTimes[0].ActivityStatus; var activityType = assignee.LoggedTimeView.LoggedTimes[0].ActivityType; foreach (var name in tableNames) { if (name == headers[0].Name) { result.Append($"{++row}, "); } else if (name == headers[1].Name) { result.Append($"{project.ProjectName}, "); } else if (name == headers[2].Name) { result.Append($"{assignee.AssigneeName}, "); } else if (name == headers[3].Name) { result.Append($"{activity.ActivityName}, "); } else if (name == headers[4].Name) { result.Append($"{activityStatus}, "); } else if (name == headers[5].Name) { result.Append($"{activityType}, "); } else if (name == headers[6].Name) { result.Append($"{assignee.LoggedTimeView.TotalEstimatedTime}, "); } else if (name == headers[7].Name) { result.Append($"{assignee.LoggedTimeView.TotalLoggedTime}, "); } } result.AppendLine(); } } } return(Encoding.Unicode.GetBytes(result.ToString())); }
private string GetOverdueHtmlContent(OverdueTasksFilteredReportViewModel request, ApplicationUser administrator) { var result = new StringBuilder(); result.AppendLine($"Overdue tasks report for the Administrator {administrator}\n"); result.AppendLine("<table name=\"overdue-report\">"); result.AppendLine("<tr>"); var tableHelper = new ExcelTableHelper(); var tableHeaders = tableHelper.GetOverdueTasksFilteredReportTableHeaders(); foreach (var item in tableHeaders.Where(item => item.Name != "Project Group")) { result.AppendLine($"<th style=\"width:{item.Width}px; alignment:{item.Alignment.ToString().ToLower()};\">{item.Name}</th>"); } result.AppendLine("</tr>"); var rowOrder = 0; foreach (var projectGroup in request.ProjectGroups) { var previousProjectName = string.Empty; foreach (var project in projectGroup.Projects) { var previousActivityName = string.Empty; foreach (var activity in project.Activities) { foreach (var assignee in activity.Assignees) { result.AppendLine("<tr>"); result.AppendLine($"<td>{++rowOrder}</td>"); var projectNameReference = EliminatedDuplicate(project.ProjectName, previousProjectName) != string.Empty ? $"<a href=\"{_indrivoAddress}/Activities/{project.ProjectId}\">" + $"{EliminatedDuplicate(project.ProjectName, previousProjectName)}</a>" : $"{EliminatedDuplicate(project.ProjectName, previousProjectName)}"; result.AppendLine( $"<td>" + $"{projectNameReference}</td>"); var activityNameReference = EliminatedDuplicate(activity.ActivityName, previousActivityName) != string.Empty ? $"<a href=\"{_indrivoAddress}/Activities/Details/{activity.ActivityId}\">" + $"{EliminatedDuplicate(activity.ActivityName, previousActivityName)}</a>" : $"{EliminatedDuplicate(activity.ActivityName, previousActivityName)}"; result.AppendLine( $"<td>" + $"{activityNameReference}</td>"); var assigneeNameReference = $"<a href=\"{_indrivoAddress}/ApplicationUsers/Details/{assignee.AssigneeId}\">" + $"{assignee.AssigneeName}</a>"; result.AppendLine( $"<td>{assigneeNameReference}</td>"); var deadline = assignee.Deadline.HasValue ? $"{assignee.Deadline:dd MMMM yyyy}" : "Deadline Not Setted."; result.AppendLine($"<td>{deadline}</td>"); result.AppendLine($"<td>{assignee.Overdue}</td>"); result.AppendLine("</tr>"); previousProjectName = project.ProjectName; previousActivityName = activity.ActivityName; } } } } result.AppendLine("</table>"); return(result.ToString()); }
private StringBuilder GetTeamsHtmlContent(TeamsFilteredReportListViewModel request) { var result = new StringBuilder(); result.AppendLine("<table name=\"teams-report\">"); result.AppendLine("<tr>"); var tableHelper = new ExcelTableHelper(); var tableHeaders = tableHelper.GetTeamsByFiltersReportTableHeaders(); foreach (var item in tableHeaders) { result.AppendLine($"<th style=\"width:{item.Width}px; alignment:{item.Alignment.ToString().ToLower()};\">{item.Name}</th>"); } var rowOrder = 0; result.AppendLine("</tr>"); var previousAssigneeName = string.Empty; foreach (var assignee in request.Assignees) { var previousProjectName = string.Empty; var previousActivityName = string.Empty; foreach (var activity in assignee.ActivityView.Activities) { var loggedTime = activity.LoggedTimeView.LoggedTimes[0]; result.AppendLine("<tr>"); result.AppendLine($"<td>{++rowOrder}</td>"); var assigneeNameReference = EliminatedDuplicate(assignee.AssigneeName, previousAssigneeName) != string.Empty ? $"<a href=\"{IndrivoAddress}/ApplicationUsers/Details/{assignee.AssigneeId}\">" + $"{EliminatedDuplicate(assignee.AssigneeName, previousAssigneeName)}</a>" : $"{EliminatedDuplicate(assignee.AssigneeName, previousAssigneeName)}"; result.AppendLine( $"<td>{assigneeNameReference}</td>"); var projectNameReference = EliminatedDuplicate(loggedTime.ProjectName, previousProjectName) != string.Empty ? $"<a href=\"{IndrivoAddress}/Activities/{activity.ProjectId}\">" + $"{EliminatedDuplicate(loggedTime.ProjectName, previousProjectName)}</a>" : $"{EliminatedDuplicate(loggedTime.ProjectName, previousProjectName)}"; result.AppendLine( $"<td>" + $"{projectNameReference}</td>"); var activityNameReference = EliminatedDuplicate(activity.ActivityName, previousActivityName) != string.Empty ? $"<a href=\"{IndrivoAddress}/Activities/Details/{activity.ActivityId}\">" + $"{EliminatedDuplicate(activity.ActivityName, previousActivityName)}</a>" : $"{EliminatedDuplicate(activity.ActivityName, previousActivityName)}"; result.AppendLine( $"<td>" + $"{activityNameReference}</td>"); result.AppendLine($"<td>{loggedTime.ActivityStatus}</td>"); result.AppendLine($"<td>{activity.LoggedTimeView.TotalEstimatedTime}</td>"); result.AppendLine($"<td>{activity.LoggedTimeView.TotalLoggedTime}</td>"); result.AppendLine("</tr>"); previousAssigneeName = assignee.AssigneeName; previousActivityName = activity.ActivityName; previousProjectName = loggedTime.ProjectName; } } result.AppendLine("</table>"); return(result); }
public async Task Handle(TodayLogsNotificationsAdm notification, CancellationToken cancellationToken) { if (DateTime.Now.Hour >= 20 && DateTime.Now.Hour < 23) { try { var service = await _context.ServiceTimeCheckers .FirstOrDefaultAsync(x => x.ServiceName == "DailyLogsAdm", 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); } #region Recepients var administration = await Task.Run(async() => { var owners = await _userManager.GetUsersInRoleAsync("PM Owner"); var admins = await _userManager.GetUsersInRoleAsync("PM Admin"); var activeOwners = owners?.Where(x => x.Active).ToList() ?? new List <ApplicationUser>(); var activeAdmins = admins?.Where(x => x.Active).ToList() ?? new List <ApplicationUser>(); return(activeOwners.Union(activeAdmins)); }, cancellationToken); #endregion var teamsReport = await _mediator.Send(new GetReportDetailsByNameQuery() { Name = "Teams by filters" }, cancellationToken); var projectsReport = await _mediator.Send(new GetReportDetailsByNameQuery() { Name = "Projects by filters" }, cancellationToken); var now = DateTime.Now; var today = $"{now.Year}-{now.Month}-{now.Day}"; var yesterday = now.AddDays(-1); var tableHelper = new ExcelTableHelper(); var excelReportHelper = new ExcelReportHelper(); foreach (var administrator in administration) { var userTeamsReport = await _mediator.Send(new GetUserReportDetailsQuery { UserId = administrator.Id, ReportId = teamsReport.Id }, cancellationToken); var teamsHtmlContent = new StringBuilder(); #region Team report byte[] teamsAttachment = null; if (userTeamsReport.Active) { var employeeModelForTeams = await _mediator.Send(new GetUserReportGuidListQuery { UserId = administrator.Id, ReportId = teamsReport.Id, FilterType = FilterType.EmployeeIds }, cancellationToken); var projectModelForTeams = await _mediator.Send(new GetUserReportGuidListQuery { UserId = administrator.Id, ReportId = teamsReport.Id, FilterType = FilterType.ProjectIds }, cancellationToken); var activityTypeForTeams = await _mediator.Send(new GetUserReportGuidListQuery { UserId = administrator.Id, ReportId = teamsReport.Id, FilterType = FilterType.ActivityTypeIds }, cancellationToken); var activityStatusesForTeams = await _mediator.Send(new GetUserReportActivityStatusesQuery { UserId = administrator.Id, ReportId = teamsReport.Id }, cancellationToken); var teamsRequest = await _mediator.Send(new GetTeamsByFiltersReportQuery { ProjectIds = projectModelForTeams.GuidList, ActivityStatuses = activityStatusesForTeams.ActivityStatuses, ActivityTypeIds = activityTypeForTeams.GuidList, EmployeeIds = employeeModelForTeams.GuidList, StartDate = new DateTime(yesterday.Year, yesterday.Month, yesterday.Day, 23, 59, 59), DueDate = now }, cancellationToken); var tableHeaders = tableHelper.GetTeamsByFiltersReportTableHeaders(); teamsAttachment = excelReportHelper.GetTeamsByFiltersReport(teamsRequest, tableHeaders); teamsHtmlContent = GetTeamsHtmlContent(teamsRequest); } #endregion var projectsHtmlContent = new StringBuilder(); #region Projects report var userProjectsReport = await _mediator.Send(new GetUserReportDetailsQuery { UserId = administrator.Id, ReportId = projectsReport.Id }, cancellationToken); byte[] projectsAttachment = null; if (userProjectsReport.Active) { var projectModelForProjects = await _mediator.Send(new GetUserReportGuidListQuery { UserId = administrator.Id, ReportId = projectsReport.Id, FilterType = FilterType.ProjectIds }, cancellationToken); var activityTypeForProjects = await _mediator.Send(new GetUserReportGuidListQuery { UserId = administrator.Id, ReportId = projectsReport.Id, FilterType = FilterType.ActivityTypeIds }, cancellationToken); var activityStatusesForProjects = await _mediator.Send( new GetUserReportActivityStatusesQuery { UserId = administrator.Id, ReportId = projectsReport.Id }, cancellationToken); var projectsRequest = await _mediator.Send(new GetProjectsByFiltersReportQuery { ProjectIds = projectModelForProjects.GuidList, ActivityStatuses = activityStatusesForProjects.ActivityStatuses, ActivityTypes = activityTypeForProjects.GuidList, StartDate = new DateTime(yesterday.Year, yesterday.Month, yesterday.Day, 23, 59, 59), DueDate = now }, cancellationToken); var tableHeaders = tableHelper.GetProjectsByFiltersReportTableHeaders(); projectsAttachment = excelReportHelper.GetProjectsByFiltersReport(projectsRequest, tableHeaders); projectsHtmlContent = GetProjectsHtmlContent(projectsRequest); } #endregion var attachments = new List <Attachment>(); if (teamsAttachment != null) { attachments.Add(new Attachment { Content = teamsAttachment, ContentId = Guid.NewGuid().ToString(), Disposition = "attachment", Filename = $"TodayLogs-Employees-YMD-{now.Year}-{now.Month}-{now.Day}.xlsx", Type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); } if (projectsAttachment != null) { attachments.Add(new Attachment { Content = projectsAttachment, ContentId = Guid.NewGuid().ToString(), Disposition = "attachment", Filename = $"TodayLogs-Projects-YMD-{now.Year}-{now.Month}-{now.Day}.xlsx", Type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); } if (!attachments.Any()) { continue; } var htmlMessageContent = $"Daily logs report on today for the Administrator {administrator.Email}\n" + teamsHtmlContent + "\n<hr>\n" + projectsHtmlContent; var message = new Message { Subject = $"Daily Logs Tasks Report for {today}", Body = htmlMessageContent, To = administrator.Email, Attachments = attachments, EventName = "DailyLogsNotifications", SentTime = now, From = "*****@*****.**" }; try { await _notification.SendAsync(message); } catch (Exception exception) { Debug.WriteLine(exception); } } } }
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); } } } }