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.
95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
"""
|
|
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
|