示例#1
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);
                        }
                    }
                }
            }