feat(Reportes): Refactoriza vista Dist. General y corrige totales PDF
All checks were successful
Optimized Build and Deploy / remote-build-and-deploy (push) Successful in 5m35s

Frontend:
- Se refactoriza la página `ReporteListadoDistribucionGeneralPage.tsx` para reemplazar la tabla HTML estándar por el componente `DataGrid` de MUI X.
- Se implementa el cálculo y la visualización de una fila de totales para las tablas de "Resumen Diario" y "Promedios por Día", mejorando la legibilidad y consistencia con otros reportes.
- Se actualiza la exportación a Excel para incluir estas nuevas filas de totales.
- Se corrigen errores de tipado (TypeScript) relacionados con la importación de DTOs.

Backend:
- Se ajusta la lógica en `ListadoDistribucionGeneralViewModel.cs` para calcular correctamente la fila "General" de promedios en la exportación a PDF.
- Anteriormente, el promedio se calculaba incorrectamente dividiendo por el total de días del mes. Ahora, se calcula un promedio real basado únicamente en los días con actividad (tirada > 0), asegurando que los datos del PDF coincidan con los de la interfaz.
This commit is contained in:
2025-07-28 11:34:40 -03:00
parent 28c1b88a92
commit 7e4d3282fb
6 changed files with 249 additions and 96 deletions

View File

@@ -14,8 +14,6 @@ namespace GestionIntegral.Api.Dtos.Reportes.ViewModels
public string MesConsultado { get; set; } = string.Empty;
public string FechaReporte { get; set; } = DateTime.Now.ToString("dd/MM/yyyy");
// --- PROPIEDAD PARA LOS TOTALES GENERALES DE PROMEDIOS ---
// Esta propiedad calcula los promedios generales basados en los datos del resumen mensual.
public ListadoDistribucionGeneralPromedioDiaDto? PromedioGeneral
{
get
@@ -24,21 +22,30 @@ namespace GestionIntegral.Api.Dtos.Reportes.ViewModels
{
return null;
}
// 1. Filtrar solo los días con actividad para no diluir el promedio.
var diasActivos = ResumenMensual.Where(r => r.CantidadTirada > 0).ToList();
// Contar solo los días con tirada > 0 para promediar correctamente
var diasConTirada = ResumenMensual.Count(d => d.CantidadTirada > 0);
if (diasConTirada == 0) return null;
if (!diasActivos.Any())
{
return null; // No hay días con actividad, no se puede calcular el promedio.
}
// 2. Usar el conteo de días activos como divisor.
var totalDiasActivos = diasActivos.Count;
return new ListadoDistribucionGeneralPromedioDiaDto
{
Dia = "General",
CantidadDias = diasConTirada,
PromedioTirada = (int)ResumenMensual.Average(r => r.CantidadTirada),
PromedioSinCargo = (int)ResumenMensual.Average(r => r.SinCargo),
PromedioPerdidos = (int)ResumenMensual.Average(r => r.Perdidos),
PromedioLlevados = (int)ResumenMensual.Average(r => r.Llevados),
PromedioDevueltos = (int)ResumenMensual.Average(r => r.Devueltos),
PromedioVendidos = (int)ResumenMensual.Average(r => r.Vendidos)
CantidadDias = totalDiasActivos,
// 3. Calcular el promedio real: Suma de valores / Cantidad de días activos.
// Se usa división entera para que coincida con el formato sin decimales.
PromedioTirada = diasActivos.Sum(r => r.CantidadTirada) / totalDiasActivos,
PromedioSinCargo = diasActivos.Sum(r => r.SinCargo) / totalDiasActivos,
PromedioPerdidos = diasActivos.Sum(r => r.Perdidos) / totalDiasActivos,
PromedioLlevados = diasActivos.Sum(r => r.Llevados) / totalDiasActivos,
PromedioDevueltos = diasActivos.Sum(r => r.Devueltos) / totalDiasActivos,
PromedioVendidos = diasActivos.Sum(r => r.Vendidos) / totalDiasActivos
};
}
}