public async Task <IActionResult> SearchAsync( [FromQuery] ReportTypeEnum reportType, [FromQuery] ReportGroupTypeEnum groupType, [FromQuery] string project, [FromQuery] string user, [FromQuery] DateTime?startDate, [FromQuery] DateTime?endDate) { var paramDto = new ReportParamDto { ReportType = reportType, GroupBy = groupType, Project = project, User = user, StartDate = startDate, EndDate = endDate }; var validation = CheckValidation(paramDto); if (!validation.IsValid) { throw new BadRequestException(validation.Errors); } IReportDto result = new ReportDto(); switch (reportType) { default: { break; } case ReportTypeEnum.Daily: { result = await _reportService.DailyReportAsync(User.Identity.Name, paramDto); break; } case ReportTypeEnum.Weekly: { result = await _reportService.WeeklyReportAsync(User.Identity.Name, paramDto); break; } case ReportTypeEnum.Monthly: { result = await _reportService.MonthlyReportAsync(User.Identity.Name, paramDto); break; } } return(ResultOk(result)); }
public async Task <IReportDto> MonthlyReportAsync(string userName, ReportParamDto dto) { var reportData = new List <MonthlyReportDto>(); var user = await GetUserAsync(userName); // TODO: Report detail var logTimes = await GetReportDataAsync(user, dto); switch (dto.GroupBy) { default: break; case ReportGroupTypeEnum.Project: { var rptData = from u in logTimes group u by new { u.Project, u.MonthName } into gcs select new MonthlyReportDto { Project = gcs.Key.Project, MonthName = gcs.Key.MonthName, Duration = gcs.Sum(s => s.Duration) }; reportData.AddRange(rptData); break; } case ReportGroupTypeEnum.User: { var rptData = from u in logTimes group u by new { u.User, u.MonthName } into gcs select new MonthlyReportDto { User = gcs.Key.User, MonthName = gcs.Key.MonthName, Duration = gcs.Sum(s => s.Duration) }; reportData.AddRange(rptData); break; } } reportData.ForEach(r => { r.IsMarked = r.Duration < ReportLimitionHours.MonthHours; }); return(new ReportDto { Records = reportData, Param = dto, ReportType = ReportTypeEnum.Monthly }); }
private async Task <IEnumerable <LogTimeTransformDataDto> > GetReportDataAsync(User user, ReportParamDto dto) { var isAdmin = user.Roles.Contains(RoleSetting.ROLE_ADMIN); // TODO: Report detail var projects = (true.Equals(isAdmin) ? user.BehaveOfMagager?.AssignedProjects : user.AssignedProjects)?.Select(s => s.Name); var records = projects?.Count() > 0 ? await _unitOfWork.TimeRecordRepository.ReadAllAsync(s => projects.Contains(s.Project.Name)) : await _unitOfWork.TimeRecordRepository.ReadAllAsync(); if (!string.IsNullOrEmpty(dto.Project)) { records = records.Where(s => s.Project.Name == dto.Project); } var logTimes = new List <LogTimeTransformDataDto>(); records.ToList() .ForEach(s => { var items = s.LogTimeRecords.Select(l => new LogTimeTransformDataDto { Project = s.Project.Name, User = l.User.UserName, LogDate = l.LogTime.Date, WeekName = GetWeekOfYear(l.LogTime), MonthName = GetMonthOfYear(l.LogTime), Duration = l.Duration }); logTimes.AddRange(items); }); IEnumerable <LogTimeTransformDataDto> logRows = logTimes; if (!string.IsNullOrEmpty(dto.User)) { logRows = logRows.Where(s => s.User == dto.User); } if (dto.StartDate.HasValue) { logRows = logRows.Where(s => s.LogDate >= dto.StartDate && s.LogDate <= dto.EndDate); } return(logRows); }