Merge pull request #103 from Sea-Haven-Industries/feat/sh-167-board-carry-over

feat(work-orders): include unresolved prior-week rows on GET board
This commit is contained in:
Arthur Bassi 2026-09-03 09:59:24 -03:00 • committed by GitHub
commit a0183fa44c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 75 additions and 3 deletions

View file

@ -1,4 +1,5 @@
using Data.SeaHavenIndustries; using Data.SeaHavenIndustries;
using Data.SeaHavenIndustries.Enums;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using SeaHaven.DataServices.Helpers; using SeaHaven.DataServices.Helpers;
using SeaHaven.DataServices.Interfaces; using SeaHaven.DataServices.Interfaces;
@ -32,6 +33,10 @@ namespace SeaHaven.DataServices.Implementation
(w.ScheduledDate != null (w.ScheduledDate != null
&& w.ScheduledDate >= weekStartDate && w.ScheduledDate >= weekStartDate
&& w.ScheduledDate < weekEndExclusive) && w.ScheduledDate < weekEndExclusive)
|| (w.ScheduledDate != null
&& w.ScheduledDate < weekStartDate
&& w.LifecycleStatus != LifecycleStatus.Completed
&& w.LifecycleStatus != LifecycleStatus.Canceled)
|| (w.ScheduleWeekOnly == true && w.TargetWeek == query.WeekStart)); || (w.ScheduleWeekOnly == true && w.TargetWeek == query.WeekStart));
var scheduledTotal = await scheduledBase.CountAsync(cancellationToken); var scheduledTotal = await scheduledBase.CountAsync(cancellationToken);
@ -46,7 +51,8 @@ namespace SeaHaven.DataServices.Implementation
isUnscheduled: false, isUnscheduled: false,
cancellationToken); 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( return new WorkOrderBoardQueryResult(
scheduledRows, scheduledRows,
Array.Empty<WorkOrderBoardRawRow>(), Array.Empty<WorkOrderBoardRawRow>(),

View file

@ -117,11 +117,77 @@ public class WorkOrderBoardDataServiceTests
weekB, weekB.AddDays(4), null, false, null, false, null, null)); weekB, weekB.AddDays(4), null, false, null, false, null, null));
Assert.Equal(1, resultA.ScheduledRows[0].Id); 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(resultA.UnscheduledRows);
Assert.Empty(resultB.UnscheduledRows); Assert.Empty(resultB.UnscheduledRows);
Assert.Equal(1, resultA.ScheduledTotalBeforeSearch); 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] [Fact]