diff --git a/CutList.Web/Services/OverviewService.cs b/CutList.Web/Services/OverviewService.cs index e7e00d6..c032b86 100644 --- a/CutList.Web/Services/OverviewService.cs +++ b/CutList.Web/Services/OverviewService.cs @@ -33,17 +33,18 @@ public class OverviewService var frequentStock = await context.JobStocks .AsNoTracking() - .GroupBy(s => new { s.MaterialId, s.LengthInches }) + .GroupBy(s => new { s.MaterialId, s.LengthInches, s.Material.Shape, s.Material.Size }) .Select(g => new { g.Key.MaterialId, g.Key.LengthInches, - JobCount = g.Select(s => s.JobId).Distinct().Count(), - Material = g.Select(s => s.Material).First() + g.Key.Shape, + g.Key.Size, + JobCount = g.Select(s => s.JobId).Distinct().Count() }) .OrderByDescending(s => s.JobCount) - .ThenBy(s => s.Material.Shape) - .ThenBy(s => s.Material.Size) + .ThenBy(s => s.Shape) + .ThenBy(s => s.Size) .ThenBy(s => s.LengthInches) .Take(5) .ToListAsync(); @@ -61,7 +62,7 @@ public class OverviewService recentJobs, frequentStock.Select(s => new FrequentStockOverview( s.MaterialId, - s.Material.DisplayName, + $"{s.Shape.GetDisplayName()} - {s.Size}", s.LengthInches, s.JobCount)).ToList()); } diff --git a/tests/test_overview_dashboard.py b/tests/test_overview_dashboard.py index b1fac6e..73fc02e 100644 --- a/tests/test_overview_dashboard.py +++ b/tests/test_overview_dashboard.py @@ -20,7 +20,7 @@ class OverviewDashboardTests(unittest.TestCase): self.assertIn("context.Jobs", source) self.assertIn("context.JobStocks", source) self.assertIn("OrderByDescending(j => j.CreatedAt)", source) - self.assertIn("GroupBy(s => new { s.MaterialId, s.LengthInches })", source) + self.assertIn("GroupBy(s => new { s.MaterialId, s.LengthInches, s.Material.Shape, s.Material.Size })", source) def test_overview_renders_recent_jobs_and_frequently_specified_stock(self) -> None: markup = HOME_PAGE.read_text() @@ -31,6 +31,14 @@ class OverviewDashboardTests(unittest.TestCase): self.assertIn("overview.RecentJobs", markup) self.assertIn("overview.FrequentStock", markup) + def test_overview_groups_stock_by_scalar_material_fields(self) -> None: + source = OVERVIEW_SERVICE.read_text() + self.assertIn( + "GroupBy(s => new { s.MaterialId, s.LengthInches, s.Material.Shape, s.Material.Size })", + source, + ) + self.assertNotIn("Material = g.Select(s => s.Material).First()", source) + def test_overview_service_is_registered_and_has_dashboard_layout_rules(self) -> None: self.assertIn("AddScoped()", PROGRAM.read_text()) css = APP_CSS.read_text()