mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 06:03:12 +00:00
fix(work-orders): preserve unscheduled status scope
This commit is contained in:
parent
f201c34a88
commit
2446c10117
2 changed files with 70 additions and 2 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue