mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 07:13:12 +00:00
96 lines
3.5 KiB
C#
96 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(6));
|
||
|
|
}
|
||
|
|
|
||
|
|
private static WorkOrderSearchDateRange LastIsoWeek(DateOnly today)
|
||
|
|
{
|
||
|
|
var start = GetIsoWeekStart(today).AddDays(-7);
|
||
|
|
return new WorkOrderSearchDateRange(start, start.AddDays(6));
|
||
|
|
}
|
||
|
|
|
||
|
|
private static WorkOrderSearchDateRange NextIsoWeek(DateOnly today)
|
||
|
|
{
|
||
|
|
var start = GetIsoWeekStart(today).AddDays(7);
|
||
|
|
return new WorkOrderSearchDateRange(start, start.AddDays(6));
|
||
|
|
}
|
||
|
|
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|