FlotillasGPS - Sistema completo de monitoreo de flotillas GPS
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.
This commit is contained in:
227
backend/app/api/v1/reportes.py
Normal file
227
backend/app/api/v1/reportes.py
Normal file
@@ -0,0 +1,227 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user