feat: add backend FastAPI structure and Supabase schema

This commit is contained in:
Alan Alonso
2026-05-23 00:41:13 -06:00
parent 17cdde7dbb
commit e6eb466c14
38 changed files with 1760 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
"""
Entidades del dominio — sin dependencias externas.
Alineadas con el esquema de Persona A.
"""
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import Optional
class EstadoCamion(str, Enum):
EN_RUTA = "EN_RUTA"
APROXIMANDOSE = "APROXIMANDOSE"
COMPLETADO = "COMPLETADO"
AVERIADA = "AVERIADA" # truck_status: AVERIADA
RETRASADA = "RETRASADA" # truck_status: RETRASADA
class TipoNotificacion(str, Enum):
RUTA_INICIADA = "ruta_iniciada"
APROXIMANDOSE = "aproximandose"
COMPLETADO = "completado"
FALLA_MECANICA = "falla_mecanica"
RUTA_TARDE = "ruta_tarde"
@dataclass
class Coordenada:
lat: float
lng: float
@dataclass
class PuntoRuta:
orden: int # == current_position_id en truck_status
nombre: str
coordenada: Coordenada
tiempo_estimado_min: int
@dataclass
class Ruta:
id: str # ej. "RUTA-01"
nombre: str
puntos: list[PuntoRuta] = field(default_factory=list)
turno: str = "mañana"
@dataclass
class TruckStatus:
"""Espejo directo de la tabla truck_status de Persona A."""
route_id: str
current_position_id: int
last_update: datetime
status: EstadoCamion
@dataclass
class NotificationPreferences:
"""Preferencias del usuario — leídas antes de cada notificación."""
user_id: int
notify_proximity: bool = True
notify_breakdown: bool = True
notify_delay: bool = True
notify_route_start: bool = True
@dataclass
class ETAResult:
"""Lo que ve el ciudadano — sin coordenadas, sin índice de waypoint."""
address_id: int
route_id: str
status: str
eta_minutos: Optional[int]
ventana_inicio: Optional[str] # ej. "7:20 pm"
ventana_fin: Optional[str] # ej. "7:35 pm"
mensaje: str