mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 08:23:12 +00:00
* feat(work-orders): enrich board search overdue filters and 0-based paging * fix(work-orders): align stacked services with CI build * fix(tests): pass userDataService in comment service unit test * fix(work-orders): use dedicated overdue query flag Stop treating WorkOrderType.Other as an overdue sentinel. Board and advanced search now accept overdue=true while types=Other filters real Other rows; combining both uses OR. * test(work-orders): cover overdue date/status boundary and Other type-filter Lock the PR #23 overdue regression boundary through the public advanced search service. Prove overdue filtering is driven by past-due date plus non-terminal status, not by the WorkOrderType.Other sentinel: - Other + future/not-completed excluded from overdue - past-due + Scheduled included; past-due + Completed/Canceled excluded - types=[PM, Other] keeps real Other rows and does not pull past-due rows - assert 0-based paging (Page=0) is preserved alongside overdue/type filters --------- Co-authored-by: Arthur Bassi <arthur.winiarski.ranger@outlook.com> Co-authored-by: Alexandre Brandizzi <alex_brandizzi@hotmail.com>
95 lines
3.5 KiB
C#
95 lines
3.5 KiB
C#
namespace SeaHaven.Services.Helpers
|
|
{
|
|
public enum WorkOrderAdvancedSearchDatePreset
|
|
{
|
|
ThisWeek,
|
|
LastWeek,
|
|
ThisMonth,
|
|
Last3Months,
|
|
NextWeek,
|
|
NextMonth,
|
|
Custom
|
|
}
|
|
|
|
public record WorkOrderSearchDateRange(DateOnly From, DateOnly To);
|
|
|
|
public static class WorkOrderSearchDateRangeResolver
|
|
{
|
|
public static WorkOrderSearchDateRange Resolve(
|
|
WorkOrderAdvancedSearchDatePreset? preset,
|
|
DateOnly? dateFrom,
|
|
DateOnly? dateTo,
|
|
DateOnly? referenceDate = null)
|
|
{
|
|
var today = referenceDate ?? DateOnly.FromDateTime(DateTime.UtcNow);
|
|
var resolvedPreset = preset ?? WorkOrderAdvancedSearchDatePreset.ThisWeek;
|
|
|
|
if (resolvedPreset == WorkOrderAdvancedSearchDatePreset.Custom)
|
|
{
|
|
if (!dateFrom.HasValue || !dateTo.HasValue)
|
|
throw new ArgumentException("dateFrom and dateTo are required when datePreset is custom.");
|
|
|
|
if (dateTo.Value < dateFrom.Value)
|
|
throw new ArgumentException("dateTo must be on or after dateFrom.");
|
|
|
|
return new WorkOrderSearchDateRange(dateFrom.Value, dateTo.Value);
|
|
}
|
|
|
|
return resolvedPreset switch
|
|
{
|
|
WorkOrderAdvancedSearchDatePreset.ThisWeek => ThisIsoWeek(today),
|
|
WorkOrderAdvancedSearchDatePreset.LastWeek => LastIsoWeek(today),
|
|
WorkOrderAdvancedSearchDatePreset.ThisMonth => ThisMonth(today),
|
|
WorkOrderAdvancedSearchDatePreset.Last3Months => Last3Months(today),
|
|
WorkOrderAdvancedSearchDatePreset.NextWeek => NextIsoWeek(today),
|
|
WorkOrderAdvancedSearchDatePreset.NextMonth => NextMonth(today),
|
|
_ => ThisIsoWeek(today)
|
|
};
|
|
}
|
|
|
|
public static DateOnly GetIsoWeekStart(DateOnly date)
|
|
{
|
|
var diff = (7 + (date.DayOfWeek - DayOfWeek.Monday)) % 7;
|
|
return date.AddDays(-diff);
|
|
}
|
|
|
|
private static WorkOrderSearchDateRange ThisIsoWeek(DateOnly today)
|
|
{
|
|
var start = GetIsoWeekStart(today);
|
|
return new WorkOrderSearchDateRange(start, start.AddDays(4));
|
|
}
|
|
|
|
private static WorkOrderSearchDateRange LastIsoWeek(DateOnly today)
|
|
{
|
|
var start = GetIsoWeekStart(today).AddDays(-7);
|
|
return new WorkOrderSearchDateRange(start, start.AddDays(4));
|
|
}
|
|
|
|
private static WorkOrderSearchDateRange NextIsoWeek(DateOnly today)
|
|
{
|
|
var start = GetIsoWeekStart(today).AddDays(7);
|
|
return new WorkOrderSearchDateRange(start, start.AddDays(4));
|
|
}
|
|
|
|
private static WorkOrderSearchDateRange ThisMonth(DateOnly today)
|
|
{
|
|
var start = new DateOnly(today.Year, today.Month, 1);
|
|
var end = start.AddMonths(1).AddDays(-1);
|
|
return new WorkOrderSearchDateRange(start, end);
|
|
}
|
|
|
|
private static WorkOrderSearchDateRange NextMonth(DateOnly today)
|
|
{
|
|
var start = new DateOnly(today.Year, today.Month, 1).AddMonths(1);
|
|
var end = start.AddMonths(1).AddDays(-1);
|
|
return new WorkOrderSearchDateRange(start, end);
|
|
}
|
|
|
|
private static WorkOrderSearchDateRange Last3Months(DateOnly today)
|
|
{
|
|
var end = today;
|
|
var start = today.AddMonths(-3);
|
|
return new WorkOrderSearchDateRange(start, end);
|
|
}
|
|
}
|
|
}
|