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:
FlotillasGPS Developer
2026-01-21 08:18:00 +00:00
commit 51d78bacf4
248 changed files with 50171 additions and 0 deletions

View File

@@ -0,0 +1,94 @@
"""
Schemas Pydantic para Conductor.
"""
from datetime import date
from typing import Optional
from pydantic import EmailStr, Field
from app.schemas.base import BaseSchema, TimestampSchema
class ConductorBase(BaseSchema):
"""Schema base de conductor."""
nombre: str = Field(..., min_length=2, max_length=100)
apellido: str = Field(..., min_length=2, max_length=100)
telefono: Optional[str] = Field(None, max_length=20)
email: Optional[EmailStr] = None
documento_tipo: Optional[str] = Field(None, max_length=20)
documento_numero: Optional[str] = Field(None, max_length=50)
licencia_numero: Optional[str] = Field(None, max_length=50)
licencia_tipo: Optional[str] = Field(None, max_length=20)
licencia_vencimiento: Optional[date] = None
fecha_nacimiento: Optional[date] = None
direccion: Optional[str] = None
contacto_emergencia: Optional[str] = Field(None, max_length=100)
telefono_emergencia: Optional[str] = Field(None, max_length=20)
fecha_contratacion: Optional[date] = None
numero_empleado: Optional[str] = Field(None, max_length=50)
class ConductorCreate(ConductorBase):
"""Schema para crear conductor."""
pass
class ConductorUpdate(BaseSchema):
"""Schema para actualizar conductor."""
nombre: Optional[str] = Field(None, min_length=2, max_length=100)
apellido: Optional[str] = Field(None, min_length=2, max_length=100)
telefono: Optional[str] = Field(None, max_length=20)
email: Optional[EmailStr] = None
documento_tipo: Optional[str] = Field(None, max_length=20)
documento_numero: Optional[str] = Field(None, max_length=50)
licencia_numero: Optional[str] = Field(None, max_length=50)
licencia_tipo: Optional[str] = Field(None, max_length=20)
licencia_vencimiento: Optional[date] = None
foto_url: Optional[str] = None
fecha_nacimiento: Optional[date] = None
direccion: Optional[str] = None
contacto_emergencia: Optional[str] = Field(None, max_length=100)
telefono_emergencia: Optional[str] = Field(None, max_length=20)
fecha_contratacion: Optional[date] = None
numero_empleado: Optional[str] = Field(None, max_length=50)
activo: Optional[bool] = None
notas: Optional[str] = None
class ConductorResponse(ConductorBase, TimestampSchema):
"""Schema de respuesta de conductor."""
id: int
foto_url: Optional[str] = None
activo: bool
notas: Optional[str] = None
nombre_completo: str
licencia_vigente: bool
class ConductorResumen(BaseSchema):
"""Schema resumido de conductor."""
id: int
nombre_completo: str
telefono: Optional[str] = None
licencia_vigente: bool
activo: bool
class ConductorEstadisticas(BaseSchema):
"""Estadísticas de un conductor."""
conductor_id: int
nombre_completo: str
total_viajes: int
distancia_total_km: float
tiempo_conduccion_horas: float
velocidad_promedio: float
alertas_total: int
alertas_velocidad: int
calificacion: Optional[float] = None # Score calculado