Sistema completo para monitoreo y gestion de flotas de vehiculos con: - Backend FastAPI con PostgreSQL/TimescaleDB - Frontend React con TypeScript y TailwindCSS - App movil React Native con Expo - Soporte para dispositivos GPS, Meshtastic y celulares - Video streaming en vivo con MediaMTX - Geocercas, alertas, viajes y reportes - Autenticacion JWT y WebSockets en tiempo real Documentacion completa y guias de usuario incluidas.
228 lines
5.6 KiB
Python
228 lines
5.6 KiB
Python
"""
|
|
Endpoints para reportes y dashboard.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.core.database import get_db
|
|
from app.core.security import get_current_user
|
|
from app.models.usuario import Usuario
|
|
from app.schemas.reporte import (
|
|
DashboardResumen,
|
|
DashboardGrafico,
|
|
ReporteRequest,
|
|
ReporteResponse,
|
|
)
|
|
from app.services.reporte_service import ReporteService
|
|
|
|
router = APIRouter(prefix="/reportes", tags=["Reportes"])
|
|
|
|
|
|
@router.get("/dashboard", response_model=DashboardResumen)
|
|
async def obtener_dashboard(
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Obtiene datos del dashboard principal.
|
|
|
|
Returns:
|
|
Resumen del dashboard.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
return await reporte_service.obtener_dashboard_resumen()
|
|
|
|
|
|
@router.get("/dashboard/graficos", response_model=DashboardGrafico)
|
|
async def obtener_graficos_dashboard(
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Obtiene datos para gráficos del dashboard.
|
|
|
|
Returns:
|
|
Datos para gráficos.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
return await reporte_service.obtener_dashboard_graficos()
|
|
|
|
|
|
@router.post("/generar", response_model=ReporteResponse)
|
|
async def generar_reporte(
|
|
request: ReporteRequest,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Genera un reporte según los parámetros.
|
|
|
|
Args:
|
|
request: Parámetros del reporte.
|
|
|
|
Returns:
|
|
Información del reporte generado.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
return await reporte_service.generar_reporte(request)
|
|
|
|
|
|
@router.get("/viajes")
|
|
async def reporte_viajes(
|
|
desde: datetime,
|
|
hasta: datetime,
|
|
vehiculo_id: Optional[int] = None,
|
|
formato: str = "json",
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Genera reporte de viajes.
|
|
|
|
Args:
|
|
desde: Fecha inicio.
|
|
hasta: Fecha fin.
|
|
vehiculo_id: Filtrar por vehículo.
|
|
formato: Formato de salida.
|
|
|
|
Returns:
|
|
Datos del reporte.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
request = ReporteRequest(
|
|
tipo="viajes",
|
|
formato=formato if formato != "json" else "pdf",
|
|
fecha_inicio=desde,
|
|
fecha_fin=hasta,
|
|
vehiculos_ids=[vehiculo_id] if vehiculo_id else None,
|
|
)
|
|
|
|
datos = await reporte_service._recopilar_datos_reporte(request)
|
|
|
|
if formato == "json":
|
|
return datos
|
|
|
|
resultado = await reporte_service.generar_reporte(request)
|
|
return resultado
|
|
|
|
|
|
@router.get("/alertas")
|
|
async def reporte_alertas(
|
|
desde: datetime,
|
|
hasta: datetime,
|
|
vehiculo_id: Optional[int] = None,
|
|
formato: str = "json",
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Genera reporte de alertas.
|
|
|
|
Args:
|
|
desde: Fecha inicio.
|
|
hasta: Fecha fin.
|
|
vehiculo_id: Filtrar por vehículo.
|
|
formato: Formato de salida.
|
|
|
|
Returns:
|
|
Datos del reporte.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
request = ReporteRequest(
|
|
tipo="alertas",
|
|
formato=formato if formato != "json" else "pdf",
|
|
fecha_inicio=desde,
|
|
fecha_fin=hasta,
|
|
vehiculos_ids=[vehiculo_id] if vehiculo_id else None,
|
|
)
|
|
|
|
datos = await reporte_service._recopilar_datos_reporte(request)
|
|
|
|
if formato == "json":
|
|
return datos
|
|
|
|
resultado = await reporte_service.generar_reporte(request)
|
|
return resultado
|
|
|
|
|
|
@router.get("/combustible")
|
|
async def reporte_combustible(
|
|
desde: datetime,
|
|
hasta: datetime,
|
|
vehiculo_id: Optional[int] = None,
|
|
formato: str = "json",
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Genera reporte de combustible.
|
|
|
|
Args:
|
|
desde: Fecha inicio.
|
|
hasta: Fecha fin.
|
|
vehiculo_id: Filtrar por vehículo.
|
|
formato: Formato de salida.
|
|
|
|
Returns:
|
|
Datos del reporte.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
request = ReporteRequest(
|
|
tipo="combustible",
|
|
formato=formato if formato != "json" else "pdf",
|
|
fecha_inicio=desde,
|
|
fecha_fin=hasta,
|
|
vehiculos_ids=[vehiculo_id] if vehiculo_id else None,
|
|
)
|
|
|
|
datos = await reporte_service._recopilar_datos_reporte(request)
|
|
|
|
if formato == "json":
|
|
return datos
|
|
|
|
resultado = await reporte_service.generar_reporte(request)
|
|
return resultado
|
|
|
|
|
|
@router.get("/mantenimiento")
|
|
async def reporte_mantenimiento(
|
|
desde: datetime,
|
|
hasta: datetime,
|
|
vehiculo_id: Optional[int] = None,
|
|
formato: str = "json",
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Usuario = Depends(get_current_user),
|
|
):
|
|
"""
|
|
Genera reporte de mantenimiento.
|
|
|
|
Args:
|
|
desde: Fecha inicio.
|
|
hasta: Fecha fin.
|
|
vehiculo_id: Filtrar por vehículo.
|
|
formato: Formato de salida.
|
|
|
|
Returns:
|
|
Datos del reporte.
|
|
"""
|
|
reporte_service = ReporteService(db)
|
|
request = ReporteRequest(
|
|
tipo="mantenimiento",
|
|
formato=formato if formato != "json" else "pdf",
|
|
fecha_inicio=desde,
|
|
fecha_fin=hasta,
|
|
vehiculos_ids=[vehiculo_id] if vehiculo_id else None,
|
|
)
|
|
|
|
datos = await reporte_service._recopilar_datos_reporte(request)
|
|
|
|
if formato == "json":
|
|
return datos
|
|
|
|
resultado = await reporte_service.generar_reporte(request)
|
|
return resultado
|