Exemplo n.º 1
0
            private byte[] GetOverdueAttachment(OverdueTasksFilteredReportViewModel request)
            {
                var tableHelper       = new ExcelTableHelper();
                var tableHeaders      = tableHelper.GetOverdueTasksFilteredReportTableHeaders();
                var excelReportHelper = new ExcelReportHelper();

                return(excelReportHelper.GetOverdueTasksFilteredReport(request, tableHeaders));
            }
Exemplo n.º 2
0
        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()));
        }
Exemplo n.º 3
0
        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()));
        }
Exemplo n.º 4
0
        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()));
        }
Exemplo n.º 5
0
        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()));
        }
Exemplo n.º 6
0
        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()));
        }
Exemplo n.º 7
0
            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());
            }
Exemplo n.º 8
0
            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);
            }
Exemplo n.º 9
0
            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);
                        }
                    }
                }
            }
Exemplo n.º 10
0
            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);
                        }
                    }
                }
            }