diff --git a/API/ROLAC.API.Tests/Services/OfferingSessionServiceTests.cs b/API/ROLAC.API.Tests/Services/OfferingSessionServiceTests.cs index 394616c..7b07542 100644 --- a/API/ROLAC.API.Tests/Services/OfferingSessionServiceTests.cs +++ b/API/ROLAC.API.Tests/Services/OfferingSessionServiceTests.cs @@ -164,4 +164,27 @@ public class OfferingSessionServiceTests Assert.Equal("PP-456", line.PayPalTransactionId); Assert.Equal("C-789", line.CheckNumber); } + + [Fact] + public async Task GetPagedAsync_IncludesSundayAttendanceTotal_WhenRowExists() + { + using var db = BuildDb(); + var catId = await SeedCategoryAsync(db); + var svc = new OfferingSessionService(db, BuildAccessor(), new NoOpFileStorage()); + + var withDate = new DateOnly(2026, 5, 31); + var withoutDate = new DateOnly(2026, 5, 24); + await svc.CreateAsync(BuildRequest(catId, withDate)); + await svc.CreateAsync(BuildRequest(catId, withoutDate)); + db.MealAttendances.Add(new MealAttendance + { AttendanceDate = withDate, AdultCount = 40, YouthCount = 12, KidCount = 8 }); + await db.SaveChangesAsync(); + + var page = await svc.GetPagedAsync(1, 20, null, null); + + var withItem = page.Items.Single(i => i.SessionDate == "2026-05-31"); + var withoutItem = page.Items.Single(i => i.SessionDate == "2026-05-24"); + Assert.Equal(60, withItem.SundayAttendanceCount); // 40 + 12 + 8 + Assert.Null(withoutItem.SundayAttendanceCount); // no attendance row -> null + } } diff --git a/API/ROLAC.API/DTOs/Giving/OfferingSessionListItemDto.cs b/API/ROLAC.API/DTOs/Giving/OfferingSessionListItemDto.cs index 92c5888..c85a327 100644 --- a/API/ROLAC.API/DTOs/Giving/OfferingSessionListItemDto.cs +++ b/API/ROLAC.API/DTOs/Giving/OfferingSessionListItemDto.cs @@ -11,4 +11,5 @@ public class OfferingSessionListItemDto public decimal Difference { get; set; } public int LineCount { get; set; } public bool HasProof { get; set; } + public int? SundayAttendanceCount { get; set; } // null = no attendance recorded for the date } diff --git a/API/ROLAC.API/Services/OfferingSessionService.cs b/API/ROLAC.API/Services/OfferingSessionService.cs index d7a67d5..1f6192d 100644 --- a/API/ROLAC.API/Services/OfferingSessionService.cs +++ b/API/ROLAC.API/Services/OfferingSessionService.cs @@ -45,6 +45,11 @@ public class OfferingSessionService : IOfferingSessionService .Select(grp => new { Id = grp.Key, Count = grp.Count() }) .ToDictionaryAsync(x => x.Id, x => x.Count); + var dates = rows.Select(r => r.SessionDate).ToList(); + var attendance = await _db.MealAttendances.AsNoTracking() + .Where(a => dates.Contains(a.AttendanceDate)) + .ToDictionaryAsync(a => a.AttendanceDate, a => a.AdultCount + a.YouthCount + a.KidCount); + var items = rows.Select(s => new OfferingSessionListItemDto { Id = s.Id, SessionDate = s.SessionDate.ToString("yyyy-MM-dd"), Status = s.Status, @@ -52,6 +57,7 @@ public class OfferingSessionService : IOfferingSessionService SystemTotal = s.SystemTotal, Difference = s.Difference, LineCount = counts.TryGetValue(s.Id, out var c) ? c : 0, HasProof = s.ProofPdfPath != null, + SundayAttendanceCount = attendance.TryGetValue(s.SessionDate, out var att) ? att : (int?)null, }).ToList(); return new PagedResult