fix(work-orders): preserve unscheduled status scope

This commit is contained in:
Alexandre Brandizzi 2026-09-14 19:46:13 -03:00
parent f201c34a88
commit 2446c10117
2 changed files with 70 additions and 2 deletions

View file

@ -176,10 +176,15 @@ namespace SeaHaven.DataServices.Helpers
/// <summary>
/// Restricts to unscheduled rows. A null ScheduledDate is the canonical
/// unscheduled representation; replaces the date-range filter when the
/// unscheduled-only search mode is active.
/// unscheduled-only search mode is active. Mirrors the undated branch of
/// <see cref="ApplyDateRangeFilter"/>: completed and canceled rows are
/// excluded so both modes agree on the protected unscheduled semantics.
/// </summary>
public static IQueryable<WorkOrder> ApplyUnscheduledOnlyFilter(IQueryable<WorkOrder> query)
=> query.Where(w => w.ScheduledDate == null);
=> query.Where(w =>
w.ScheduledDate == null
&& w.LifecycleStatus != LifecycleStatus.Completed
&& w.LifecycleStatus != LifecycleStatus.Canceled);
public static IQueryable<WorkOrder> ApplyDateRangeFilter(
IQueryable<WorkOrder> query,

View file

@ -1425,4 +1425,67 @@ public class WorkOrderAdvancedSearchServiceTests
Assert.Empty(page0.Items.Select(i => i.Id).Intersect(page1.Items.Select(i => i.Id)));
Assert.Equal(new[] { 1, 2, 3 }, page0.Items.Concat(page1.Items).Select(i => i.Id).OrderBy(id => id).ToArray());
}
[Fact]
public async Task SearchAsync_UnscheduledOnly_ExcludesCompletedAndCanceledUndatedRows()
{
await using var context = CreateContext();
context.workOrders.AddRange(
new WorkOrder
{
Id = 1,
ScheduledDate = null,
LifecycleStatus = LifecycleStatus.Incomplete,
InternalWONumber = "10000000001",
istemplate = false
},
new WorkOrder
{
Id = 2,
ScheduledDate = null,
LifecycleStatus = LifecycleStatus.Completed,
InternalWONumber = "10000000002",
istemplate = false
},
new WorkOrder
{
Id = 3,
ScheduledDate = null,
LifecycleStatus = LifecycleStatus.Canceled,
InternalWONumber = "10000000003",
istemplate = false
},
new WorkOrder
{
Id = 4,
ScheduledDate = new DateTime(2026, 6, 23),
LifecycleStatus = LifecycleStatus.Completed,
InternalWONumber = "10000000004",
istemplate = false
});
await context.SaveChangesAsync();
var dataService = new WorkOrderAdvancedSearchDataService(context);
var service = new SeaHaven.Services.Implementation.WorkOrderAdvancedSearchService(
dataService,
WorkOrderAccountTestHelpers.Resolver(context));
var result = await service.SearchAsync(new SeaHaven.Services.DTOs.WorkOrderAdvancedSearchQueryDto
{
DatePreset = SeaHaven.Services.Helpers.WorkOrderAdvancedSearchDatePreset.Custom,
DateFrom = new DateOnly(2026, 6, 22),
DateTo = new DateOnly(2026, 6, 26),
UnscheduledOnly = true
}, WorkOrderAccountTestHelpers.OrgWideAdmin(), null);
Assert.Equal(1, result.TotalCount);
Assert.Single(result.Items);
Assert.Equal(1, result.Items.Single().Id);
Assert.Null(result.Items.Single().ScheduledDate);
Assert.DoesNotContain(result.Items, i => i.Id == 2);
Assert.DoesNotContain(result.Items, i => i.Id == 3);
Assert.DoesNotContain(result.Items, i => i.Id == 4);
}
}