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:
94
backend/app/schemas/conductor.py
Normal file
94
backend/app/schemas/conductor.py
Normal 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
|
||||
Reference in New Issue
Block a user