From d75f78651b00d3d0aad812c34d57619b49d0438a Mon Sep 17 00:00:00 2001 From: Arthur Bassi Date: Wed, 2 Sep 2026 09:49:56 -0300 Subject: [PATCH] feat(work-orders): include unresolved prior-week rows on GET board --- .../WorkOrderBoardDataService.cs | 8 ++- .../WorkOrderBoardServiceTests.cs | 70 ++++++++++++++++++- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/SeaHaven.DataServices/Implementation/WorkOrderBoardDataService.cs b/SeaHaven.DataServices/Implementation/WorkOrderBoardDataService.cs index 5a9d841..55a5a30 100644 --- a/SeaHaven.DataServices/Implementation/WorkOrderBoardDataService.cs +++ b/SeaHaven.DataServices/Implementation/WorkOrderBoardDataService.cs @@ -1,4 +1,5 @@ using Data.SeaHavenIndustries; +using Data.SeaHavenIndustries.Enums; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Helpers; using SeaHaven.DataServices.Interfaces; @@ -32,6 +33,10 @@ namespace SeaHaven.DataServices.Implementation (w.ScheduledDate != null && w.ScheduledDate >= weekStartDate && w.ScheduledDate < weekEndExclusive) + || (w.ScheduledDate != null + && w.ScheduledDate < weekStartDate + && w.LifecycleStatus != LifecycleStatus.Completed + && w.LifecycleStatus != LifecycleStatus.Canceled) || (w.ScheduleWeekOnly == true && w.TargetWeek == query.WeekStart)); var scheduledTotal = await scheduledBase.CountAsync(cancellationToken); @@ -46,7 +51,8 @@ namespace SeaHaven.DataServices.Implementation isUnscheduled: false, cancellationToken); - // Weekly board is scheduled-in-week only. Undated rows belong on GET /board/search. + // Weekly board is in-week scheduled rows plus unresolved prior-week carry-over. + // Undated rows belong on GET /board/search. return new WorkOrderBoardQueryResult( scheduledRows, Array.Empty(), diff --git a/SeaHavenIndustries.Tests/WorkOrderBoardServiceTests.cs b/SeaHavenIndustries.Tests/WorkOrderBoardServiceTests.cs index a3871de..3588666 100644 --- a/SeaHavenIndustries.Tests/WorkOrderBoardServiceTests.cs +++ b/SeaHavenIndustries.Tests/WorkOrderBoardServiceTests.cs @@ -117,11 +117,77 @@ public class WorkOrderBoardDataServiceTests weekB, weekB.AddDays(4), null, false, null, false, null, null)); Assert.Equal(1, resultA.ScheduledRows[0].Id); - Assert.Equal(2, resultB.ScheduledRows[0].Id); + Assert.Equal(2, resultB.ScheduledRows.Count); + Assert.Contains(resultB.ScheduledRows, r => r.Id == 1); + Assert.Contains(resultB.ScheduledRows, r => r.Id == 2); Assert.Empty(resultA.UnscheduledRows); Assert.Empty(resultB.UnscheduledRows); Assert.Equal(1, resultA.ScheduledTotalBeforeSearch); - Assert.Equal(1, resultB.ScheduledTotalBeforeSearch); + Assert.Equal(2, resultB.ScheduledTotalBeforeSearch); + } + + [Fact] + public async Task GetBoardRows_IncludesPriorWeekUnresolvedAndKeepsScheduledDate() + { + await using var context = CreateContext(); + var viewedWeek = new DateOnly(2026, 5, 18); + + context.workOrders.AddRange( + new WorkOrder + { + Id = 1, + InternalWONumber = "10000000001", + ScheduledDate = new DateTime(2026, 5, 13), + LifecycleStatus = LifecycleStatus.Scheduled, + CarriedOver = 2, + OriginalDate = new DateOnly(2026, 5, 13), + OriginalWeek = new DateOnly(2026, 5, 11) + }, + new WorkOrder + { + Id = 2, + InternalWONumber = "10000000002", + ScheduledDate = new DateTime(2026, 5, 13), + LifecycleStatus = LifecycleStatus.Completed + }, + new WorkOrder + { + Id = 3, + InternalWONumber = "10000000003", + ScheduledDate = new DateTime(2026, 5, 13), + LifecycleStatus = LifecycleStatus.Canceled + }, + new WorkOrder + { + Id = 4, + InternalWONumber = "10000000004", + ScheduledDate = new DateTime(2026, 5, 20), + LifecycleStatus = LifecycleStatus.Scheduled + }); + + await context.SaveChangesAsync(); + + var service = new WorkOrderBoardDataService(context); + var result = await service.GetBoardRowsAsync(new WorkOrderBoardQuery( + viewedWeek, + viewedWeek.AddDays(4), + null, + false, + null, + false, + null, + null)); + + Assert.Equal(2, result.ScheduledRows.Count); + var carried = Assert.Single(result.ScheduledRows, r => r.Id == 1); + Assert.Equal(new DateTime(2026, 5, 13), carried.ScheduledDate); + Assert.Equal(2, carried.CarriedOver); + Assert.Equal(new DateOnly(2026, 5, 11), carried.OriginalWeek); + Assert.Equal(new DateOnly(2026, 5, 13), carried.OriginalDate); + Assert.Contains(result.ScheduledRows, r => r.Id == 4); + Assert.DoesNotContain(result.ScheduledRows, r => r.Id == 2); + Assert.DoesNotContain(result.ScheduledRows, r => r.Id == 3); + Assert.Equal(2, result.ScheduledTotalBeforeSearch); } [Fact]