shoc-backend/SeaHaven.Services/Implementation/WorkOrderAdvancedSearchService.cs
Alexandre Brandizzi 028908bd5a fix(board-search): make the Advanced Filters date range narrow results (SH-391)
An explicit date range let every undated, non-terminal work order through,
so Unassigned plus a range still returned all ~1,780 unassigned rows. The
range now matches Schedule On, or the Target Week for week-only rows
(overlap), the same date the weekly board groups by. Undated rows are added
only when the caller sends includeDateless, which the client uses for
searches with no range selected and for the Unassigned queue.
2026-09-24 20:51:44 -03:00

91 lines
3.3 KiB
C#

using System.Security.Claims;
using SeaHaven.DataServices.Helpers;
using SeaHaven.DataServices.Interfaces;
using SeaHaven.Services.DTOs;
using SeaHaven.Services.Helpers;
using SeaHaven.Services.Interfaces;
namespace SeaHaven.Services.Implementation
{
public class WorkOrderAdvancedSearchService : IWorkOrderAdvancedSearchService
{
private const int DefaultPageSize = 100;
private const int MaxPageSize = 200;
private readonly IWorkOrderAdvancedSearchDataService _searchDataService;
private readonly IWorkOrderAccountResolver _accountResolver;
public WorkOrderAdvancedSearchService(
IWorkOrderAdvancedSearchDataService searchDataService,
IWorkOrderAccountResolver accountResolver)
{
_searchDataService = searchDataService;
_accountResolver = accountResolver;
}
public async Task<PagedResult<WorkOrderBoardRowDto>> SearchAsync(
WorkOrderAdvancedSearchQueryDto query,
ClaimsPrincipal user,
string? currentUserId)
{
var accountId = _accountResolver.ResolveAccountFilter(user);
var page = query.Page < 0 ? 0 : query.Page;
var pageSize = query.PageSize < 1 ? DefaultPageSize : Math.Min(query.PageSize, MaxPageSize);
// Unscheduled-only mode ignores the scheduled-date range entirely;
// the inert wide range keeps the data contract satisfied.
var dateRange = query.UnscheduledOnly
? new WorkOrderSearchDateRange(DateOnly.MinValue, DateOnly.MaxValue)
: WorkOrderSearchDateRangeResolver.Resolve(
query.DatePreset,
query.DateFrom,
query.DateTo);
var sortBy = WorkOrderBoardSortFields.NormalizeOrThrow(query.SortBy);
var dataQuery = new WorkOrderAdvancedSearchQuery(
WorkOrderBoardSearchFilter.NormalizeSearch(query.Search),
dateRange.From,
dateRange.To,
query.UnscheduledOnly,
query.Sites,
query.Regions,
query.Types,
query.Overdue,
query.Dispatchers,
query.Statuses,
query.PmTypes,
query.VendorIds,
query.DocStatuses,
query.Severities,
query.Rescheduled,
query.CarriedOver,
query.AddOn,
query.AvetaOnly,
query.FlagColors,
query.InternalOnly,
query.HasUplift,
query.UpliftStatuses,
query.MyWorkOrders,
currentUserId,
page,
pageSize,
sortBy,
query.SortDir ?? "asc",
accountId,
query.IncludeDateless);
var result = await _searchDataService.SearchAsync(dataQuery);
var utcNow = DateTime.UtcNow;
return new PagedResult<WorkOrderBoardRowDto>
{
Items = result.Rows.Select(r => WorkOrderBoardService.MapRawRow(r, utcNow)).ToList(),
TotalCount = result.TotalCount,
Page = page,
PageSize = pageSize,
PageBase = 0
};
}
}
}