2026-09-16 17:12:03 -03:00
|
|
|
using System.Security.Claims;
|
2026-07-24 17:35:34 -03:00
|
|
|
using SeaHaven.DataServices.Interfaces;
|
|
|
|
|
using SeaHaven.Services.DTOs;
|
2026-09-16 17:28:21 -03:00
|
|
|
using SeaHaven.Services.Exceptions;
|
|
|
|
|
using SeaHaven.Services.Helpers;
|
2026-07-24 17:35:34 -03:00
|
|
|
using SeaHaven.Services.Interfaces;
|
|
|
|
|
|
|
|
|
|
namespace SeaHaven.Services.Implementation
|
|
|
|
|
{
|
|
|
|
|
public class DashboardService : IDashboardService
|
|
|
|
|
{
|
|
|
|
|
private readonly IDashboardDataService _dataService;
|
2026-09-16 17:12:03 -03:00
|
|
|
private readonly IWorkOrderAccountResolver _accountResolver;
|
2026-07-24 17:35:34 -03:00
|
|
|
|
2026-09-16 17:12:03 -03:00
|
|
|
public DashboardService(
|
|
|
|
|
IDashboardDataService dataService,
|
|
|
|
|
IWorkOrderAccountResolver accountResolver)
|
2026-07-24 17:35:34 -03:00
|
|
|
{
|
|
|
|
|
_dataService = dataService;
|
2026-09-16 17:12:03 -03:00
|
|
|
_accountResolver = accountResolver;
|
2026-07-24 17:35:34 -03:00
|
|
|
}
|
|
|
|
|
|
2026-09-16 17:12:03 -03:00
|
|
|
public async Task<DashboardStatsDTO> GetStatsAsync(
|
|
|
|
|
ClaimsPrincipal user,
|
2026-09-16 17:28:21 -03:00
|
|
|
DashboardStatsQueryDTO query,
|
2026-09-16 17:12:03 -03:00
|
|
|
CancellationToken cancellationToken)
|
2026-07-24 17:35:34 -03:00
|
|
|
{
|
2026-09-16 17:12:03 -03:00
|
|
|
var accountId = _accountResolver.ResolveAccountFilter(user);
|
2026-09-16 17:28:21 -03:00
|
|
|
var dispatcherId = user.IsInRole("Dispatcher")
|
|
|
|
|
? user.FindFirstValue(ClaimTypes.NameIdentifier)
|
|
|
|
|
: null;
|
|
|
|
|
if (user.IsInRole("Dispatcher") && string.IsNullOrWhiteSpace(dispatcherId))
|
|
|
|
|
throw new WorkOrderBoardValidationException("Forbidden", "Dispatcher identity is required.");
|
|
|
|
|
|
2026-09-16 17:12:03 -03:00
|
|
|
var counts = await _dataService.GetWorkOrderCountsAsync(accountId, cancellationToken);
|
2026-09-16 17:28:21 -03:00
|
|
|
var workOrders = await _dataService.GetDashboardWorkOrdersAsync(
|
|
|
|
|
accountId,
|
|
|
|
|
dispatcherId,
|
|
|
|
|
query.DateFrom,
|
|
|
|
|
query.DateTo,
|
|
|
|
|
cancellationToken);
|
|
|
|
|
var metrics = DashboardMetrics.Calculate(workOrders, DashboardBusinessTime.Today());
|
|
|
|
|
|
|
|
|
|
var useMetrics = query.DateFrom.HasValue && query.DateTo.HasValue || dispatcherId is not null;
|
2026-07-24 17:35:34 -03:00
|
|
|
|
|
|
|
|
return new DashboardStatsDTO
|
|
|
|
|
{
|
2026-09-16 17:28:21 -03:00
|
|
|
Total = useMetrics ? metrics.Total : counts.Total,
|
|
|
|
|
Open = useMetrics ? metrics.Open : counts.Open,
|
|
|
|
|
NotDispatched = useMetrics ? metrics.NotDispatched : counts.NotDispatched,
|
|
|
|
|
Completed = useMetrics ? metrics.Completed : counts.Completed,
|
|
|
|
|
Breakdown = metrics.Breakdown,
|
|
|
|
|
DueCount = metrics.DueCount,
|
|
|
|
|
CompletedDueCount = metrics.CompletedDueCount,
|
|
|
|
|
CompletionRate = metrics.CompletionRate,
|
|
|
|
|
AverageResolutionDays = metrics.AverageResolutionDays
|
2026-07-24 17:35:34 -03:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|