private byte[] GetOverdueAttachment(OverdueTasksFilteredReportViewModel request) { var tableHelper = new ExcelTableHelper(); var tableHeaders = tableHelper.GetOverdueTasksFilteredReportTableHeaders(); var excelReportHelper = new ExcelReportHelper(); return(excelReportHelper.GetOverdueTasksFilteredReport(request, tableHeaders)); }
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())); }
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()); }
public async Task Handle(OverdueNotificationsForPMs notification, CancellationToken cancellationToken) { if (DateTime.Now.Hour >= 6 && DateTime.Now.Hour < 9) { try { var service = await _context.ServiceTimeCheckers .FirstOrDefaultAsync(x => x.ServiceName == "OverduePm", cancellationToken); if (service != null && (!service.ExecutedLastTime.HasValue || (DateTime.Now - service.ExecutedLastTime.Value).TotalHours >= 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); 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); 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); OverdueTasksFilteredReportViewModel request = null; try { request = await _mediator.Send(new GetOverdueTasksFilteredReportQuery { AssigneeIds = employeeIds.Distinct().ToList(), StartDate = DateTime.Now.AddMonths(-12), DueDate = DateTime.Now, ProjectIds = projectIds.ToList() }, cancellationToken); } catch (Exception exception) { Debug.WriteLine(exception.Message); continue; } if (request == null) { continue; } var result = GetOverdueAttachment(request); if (result == null) { continue; } var now = DateTime.Now; var today = $"{now.Year}-{now.Month}-{now.Day}"; var message = new Message { Subject = $"Daily Report on Overdue Tasks for {today}", Body = GetOverdueHtmlContent(request, manager.Key), To = email, Attachments = new List <Attachment> { new Attachment { Content = result, ContentId = Guid.NewGuid().ToString(), Disposition = "attachment", Filename = $"{today}_Overdue-Tasks.xlsx", Type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" } }, EventName = "DailyOverdueNotifications", SentTime = now }; try { await _notification.SendAsync(message); } catch (Exception exception) { Debug.WriteLine(exception.Message); } } } }
public byte[] GetOverdueTasksFilteredReport(OverdueTasksFilteredReportViewModel request, IList <PdfTableCell> tableHeaders) { throw new NotImplementedException(); }