using Data.SeaHavenIndustries; using Data.SeaHavenIndustries.Enums; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Helpers; using SeaHaven.DataServices.Interfaces; namespace SeaHaven.DataServices.Implementation { public class WorkOrderBoardDataService : IWorkOrderBoardDataService { private readonly ApplicationDbContext _context; public WorkOrderBoardDataService(ApplicationDbContext context) { _context = context; } public async Task GetBoardRowsAsync(WorkOrderBoardQuery query) { var weekStartDate = query.WeekStart.ToDateTime(TimeOnly.MinValue); var weekEndDate = query.WeekEnd.ToDateTime(TimeOnly.MinValue); var baseQuery = WorkOrderBoardQueryFilters.ApplyBaseScope(_context.workOrders.AsNoTracking()); baseQuery = WorkOrderBoardQueryFilters.ApplyDispatcherFilter( baseQuery, query.Dispatchers, query.MyWorkOrders, query.CurrentUserId); baseQuery = WorkOrderBoardQueryFilters.ApplyTypeFilter(baseQuery, query.Types); var scheduledBase = baseQuery.Where(w => (w.ScheduledDate != null && w.ScheduledDate.Value.Date >= weekStartDate.Date && w.ScheduledDate.Value.Date <= weekEndDate.Date) || (w.ScheduleWeekOnly == true && w.TargetWeek == query.WeekStart)); var unscheduledBase = baseQuery.Where(w => w.ScheduledDate == null && !LifecycleStatusSets.Terminal.Contains(w.LifecycleStatus)); var scheduledTotal = await scheduledBase.CountAsync(); if (!string.IsNullOrWhiteSpace(query.Search)) { scheduledBase = WorkOrderBoardQueryFilters.ApplySearchFilter(scheduledBase, query.Search); unscheduledBase = WorkOrderBoardQueryFilters.ApplySearchFilter(unscheduledBase, query.Search); } var scheduledRows = await WorkOrderBoardProjection.ProjectRowsAsync( scheduledBase.OrderBy(w => w.ScheduledDate).ThenBy(w => w.InternalWONumber), isUnscheduled: false); var unscheduledRows = await WorkOrderBoardProjection.ProjectRowsAsync( unscheduledBase.OrderBy(w => w.InternalWONumber), isUnscheduled: true); return new WorkOrderBoardQueryResult(scheduledRows, unscheduledRows, scheduledTotal); } public async Task> GetDispatcherLookupsAsync() { return await _context.Users .AsNoTracking() .Where(u => u.IsDeleted != true) .OrderBy(u => u.FirstName) .ThenBy(u => u.LastName) .Select(u => new DispatcherLookupRow( u.Id, u.FirstName ?? "", u.LastName, u.Initials, u.Color)) .ToListAsync(); } } }