""" Schemas Pydantic para Reportes y Dashboard. """ from datetime import datetime from typing import Any, Dict, List, Optional from pydantic import Field from app.schemas.base import BaseSchema class DashboardResumen(BaseSchema): """Schema para datos del dashboard principal.""" # Contadores total_vehiculos: int vehiculos_activos: int vehiculos_en_movimiento: int vehiculos_detenidos: int vehiculos_sin_señal: int total_conductores: int conductores_activos: int # Alertas alertas_pendientes: int alertas_criticas: int alertas_hoy: int # Viajes de hoy viajes_hoy: int distancia_hoy_km: float # Mantenimiento mantenimientos_vencidos: int mantenimientos_proximos: int # Última actualización actualizado_en: datetime class DashboardGrafico(BaseSchema): """Schema para datos de gráficos del dashboard.""" # Distancia por día (últimos 7 días) distancia_diaria: List[dict] # [{fecha, km}] # Viajes por día (últimos 7 días) viajes_diarios: List[dict] # [{fecha, cantidad}] # Alertas por tipo (últimos 7 días) alertas_por_tipo: List[dict] # [{tipo, cantidad}] # Consumo de combustible (últimos 30 días) consumo_combustible: List[dict] # [{fecha, litros}] class ReporteRequest(BaseSchema): """Schema para solicitar generación de reporte.""" tipo: str = Field( ..., pattern="^(viajes|alertas|combustible|mantenimiento|ubicaciones|resumen)$" ) formato: str = Field(default="pdf", pattern="^(pdf|excel|csv)$") fecha_inicio: datetime fecha_fin: datetime vehiculos_ids: Optional[List[int]] = None # None = todos conductores_ids: Optional[List[int]] = None parametros: Optional[Dict[str, Any]] = None class ReporteResponse(BaseSchema): """Schema de respuesta de generación de reporte.""" id: str # UUID del reporte tipo: str formato: str estado: str # pendiente, procesando, completado, error archivo_url: Optional[str] = None creado_en: datetime completado_en: Optional[datetime] = None error: Optional[str] = None class ReporteViajesResumen(BaseSchema): """Schema para reporte de viajes.""" periodo_inicio: datetime periodo_fin: datetime total_viajes: int distancia_total_km: float tiempo_total_conduccion: str velocidad_promedio: float por_vehiculo: List[dict] por_conductor: List[dict] viajes: List[dict] class ReporteAlertasResumen(BaseSchema): """Schema para reporte de alertas.""" periodo_inicio: datetime periodo_fin: datetime total_alertas: int atendidas: int pendientes: int por_tipo: List[dict] por_severidad: List[dict] por_vehiculo: List[dict] alertas: List[dict] class ReporteCombustibleResumen(BaseSchema): """Schema para reporte de combustible.""" periodo_inicio: datetime periodo_fin: datetime total_litros: float total_costo: float rendimiento_promedio: float por_vehiculo: List[dict] cargas: List[dict] class ReporteMantenimientoResumen(BaseSchema): """Schema para reporte de mantenimiento.""" periodo_inicio: datetime periodo_fin: datetime total_mantenimientos: int completados: int pendientes: int vencidos: int costo_total: float por_tipo: List[dict] por_vehiculo: List[dict] mantenimientos: List[dict] class ReporteUbicacionesResumen(BaseSchema): """Schema para reporte de ubicaciones/recorridos.""" periodo_inicio: datetime periodo_fin: datetime vehiculo_id: int vehiculo_nombre: str total_puntos: int distancia_km: float # Ruta en GeoJSON ruta_geojson: dict class EstadisticasFlota(BaseSchema): """Schema para estadísticas generales de la flota.""" periodo: str # diario, semanal, mensual # Distancia distancia_total_km: float distancia_promedio_vehiculo_km: float # Tiempo tiempo_conduccion_total_horas: float tiempo_ocioso_total_horas: float # Combustible combustible_total_litros: float costo_combustible_total: float rendimiento_promedio: float # Alertas alertas_total: int alertas_por_vehiculo_promedio: float # Mantenimiento costo_mantenimiento_total: float # Top vehículos top_distancia: List[dict] # [{vehiculo_id, nombre, km}] top_alertas: List[dict] # [{vehiculo_id, nombre, cantidad}] top_combustible: List[dict] # [{vehiculo_id, nombre, litros}] class KPIsFlota(BaseSchema): """Schema para KPIs de la flota.""" # Utilización porcentaje_utilizacion: float # % de vehículos en uso horas_promedio_uso_diario: float # Eficiencia km_por_litro_flota: float costo_por_km: float # Seguridad alertas_por_1000km: float excesos_velocidad_por_1000km: float # Mantenimiento porcentaje_mantenimientos_a_tiempo: float costo_mantenimiento_por_km: float # Disponibilidad porcentaje_disponibilidad: float # % de tiempo operativo # Comparación con periodo anterior variacion_km: float # % vs periodo anterior variacion_combustible: float variacion_alertas: float variacion_costo: float