public async Task <IActionResult> GetReport([FromBody] ReportGetCommand req) { // TODO: Date checks & mapping queries var userId = req.UserId; var date = req.Date.Date; var user = await _context.Users.AnyAsync(x => x.Id == userId); if (!user) { return(BadRequest("User wasn't found")); } var dailyReport = await _context.DailyReports .Include(x => x.ReportItems) .ThenInclude(x => x.Article) .ThenInclude(x => x.Project) .ThenInclude(x => x.Client) .FirstOrDefaultAsync(x => x.UserId == userId && x.Date == date); if (dailyReport == null) { return(BadRequest("Report wasn't found")); } var itemsByClient = dailyReport.ReportItems.Where(x => !x.Article.IsCommon).GroupBy(x => x.Article.Project.Client).Distinct(); var clients = itemsByClient.Select(x => new { x.Key.Id, x.Key.Name, Projects = x.GroupBy(x => x.Article.Project).Select(x => new { x.Key.Id, x.Key.Name, Articles = x.Select(x => new { x.Article.Name, x.Article.Id, x.HoursConsumption }) }) }); var common = new List <ArticleInfo>(); foreach (var x in _context.ConsumptionArticles.Where(x => x.IsCommon)) { var artInfo = new ArticleInfo { Id = x.Id, Name = x.Name, HoursConsumption = null }; var art = dailyReport.ReportItems.FirstOrDefault(a => a.Article.Id == x.Id); if (art != null) { artInfo.HoursConsumption = art.HoursConsumption; } common.Add(artInfo); } return(Ok(new { common, clients })); }
private async Task <object> GetReportImpl(ReportGetCommand req) { var userId = req.UserId; var date = req.Date.Date; var user = await _context.Users.AnyAsync(x => x.Id == userId); if (!user) { return(BadRequest("User wasn't found")); } var dailyReport = await _context.DailyReports .Include(x => x.ReportItems) .ThenInclude(x => x.Article) .ThenInclude(x => x.Project) .ThenInclude(x => x.Client) .FirstOrDefaultAsync(x => x.UserId == userId && x.Date == date); if (dailyReport == null) { return(BadRequest("Report wasn't found")); } var clientsAll = await _context.Clients .ProjectTo <ReportClientItem>(_mapper.ConfigurationProvider) .ToListAsync(); var itemsByClient = dailyReport.ReportItems .Where(x => !x.Article.IsCommon) .GroupBy(x => x.Article.Project.Client) .Distinct(); foreach (var elem in dailyReport.ReportItems.Where(x => !x.Article.IsCommon).Select(x => x.Article)) { var client = clientsAll.FirstOrDefault(x => x.Id == elem.Project.ClientId); var project = client.Projects.FirstOrDefault(x => x.Id == elem.Project.Id); var article = project.Articles.FirstOrDefault(x => x.Id == elem.Id); client.IsChecked = true; project.IsChecked = true; article.IsChecked = true; } var clients = clientsAll.Select(x => new { x.Id, x.Name, x.IsChecked, Projects = x.Projects.Select(x => new { x.Id, x.Name, x.IsChecked, Articles = x.Articles.Select(x => new { x.Id, x.Name, x.IsChecked, HoursConsumption = GetHoursConsumptionIsChecked(x, dailyReport) }) }) }); var common = new List <ArticleInfo>(); foreach (var x in _context.ConsumptionArticles.Where(x => x.IsCommon)) { var artInfo = new ArticleInfo { Id = x.Id, Name = x.Name, HoursConsumption = null }; var art = dailyReport.ReportItems.FirstOrDefault(a => a.Article.Id == x.Id); if (art != null) { artInfo.HoursConsumption = art.HoursConsumption; } common.Add(artInfo); } return(new { common, clients }); }