namespace AVSCartonShipmentVerifier.DTOs; public sealed class MovementAnalyticsDto { public MovementSummaryDto Summary { get; init; } = new(); public MovementStatusShareDto StatusShare { get; init; } = new(); public IReadOnlyList ChartByDay { get; init; } = []; public IReadOnlyList DayDetails { get; init; } = []; public string DateRangeLabel { get; init; } = string.Empty; } public sealed class MovementSummaryDto { public int MovedToday { get; init; } public int MovedThisWeek { get; init; } public int MovedThisMonth { get; init; } public int TotalMoved { get; init; } } public sealed class MovementStatusShareDto { public int Moved { get; init; } public int Pending { get; init; } public int Total => Moved + Pending; public double MovedPercent => Total > 0 ? Math.Round(Moved * 100.0 / Total, 1) : 0; public double PendingPercent => Total > 0 ? Math.Round(Pending * 100.0 / Total, 1) : 0; } public sealed class MovementChartDayDto { public string DayLabel { get; init; } = string.Empty; public int MovedCartons { get; init; } } public sealed class MovementDayDetailDto { public DateOnly Date { get; init; } public string DateDisplay { get; init; } = string.Empty; public int MovedCartons { get; init; } public int SuccessfulScans { get; init; } public int DuplicateRejections { get; init; } public int ManualEntryRejections { get; init; } public DateTime? LastMovedAtUtc { get; init; } }