Asistencia Geo — Documentación

09 — Stack tecnológico

Inventario completo de tecnologías, lenguajes, frameworks, librerías y versiones del sistema de asistencia georeferenciada. Fecha de referencia: 2026-09-22.


1. Visión general

Capa Tecnología Versión
App móvil Flutter (Dart) Dart >=3.3.0 <4.0.0 · app 0.3.1+6
Backend Python + FastAPI Python 3.12 · FastAPI 0.115.x
Base de datos PostgreSQL + PostGIS PostgreSQL 15 · PostGIS 3.4
Panel web React + Vite + TypeScript React 18.3 · Vite 5.4 · TS 5.5
Mapas OpenStreetMap + MapLibre GL (sin API keys / sin costo)
ERP Odoo Community 18.0 (XML-RPC hr.attendance)

2. App móvil (Flutter)

Dependencias (pubspec.yaml)

Paquete Versión Propósito
geolocator ^13.0.1 Geolocalización GPS
local_auth ^2.2.0 Biometría nativa (huella / FaceID)
flutter_secure_storage ^9.2.2 Almacenamiento seguro (tokens, offset NTP, cola offline)
device_info_plus ^10.1.0 Información del dispositivo
connectivity_plus ^6.0.3 Detección online/offline
http ^1.2.1 Cliente HTTP
uuid ^4.4.0 Claves de idempotencia
flutter_jailbreak_detection ^1.10.0 Detección root/jailbreak
google_mlkit_face_detection ^0.11.0 Reconocimiento facial on-device (ML Kit)
flutter_map ^7.0.0 Mapas (OpenStreetMap)
latlong2 ^0.9.0 Utilidades de coordenadas
flutter_lints ^4.0.0 (dev) Linting

3. Backend (FastAPI)

Dependencias (requirements.txt)

Paquete Rango Propósito
fastapi >=0.115,<0.116 Framework web
uvicorn[standard] >=0.30,<0.31 Servidor ASGI
sqlalchemy[asyncio] >=2.0,<2.1 ORM
asyncpg >=0.29,<0.30 Driver PostgreSQL asíncrono
pydantic >=2.7,<3 Validación de datos
pydantic-settings >=2.3,<3 Configuración por entorno
PyJWT >=2.8,<3 Tokens JWT
argon2-cffi >=23.1,<24 Hash de contraseñas (Argon2id)
cryptography >=43,<44 Cifrado (Fernet AES-256-GCM, HMAC)
APScheduler >=3.10,<4 Tareas programadas (worker Odoo, recordatorios)
odoorpc >=0.10,<0.11 Cliente XML-RPC de Odoo
httpx >=0.27,<0.28 Cliente HTTP asíncrono
pytest >=8.2,<9 (dev) Testing
pytest-asyncio >=0.23,<0.24 (dev) Testing asíncrono

4. Base de datos

Tablas

Tabla Descripción
companies Multi-tenant (empresa)
users Empleados/usuarios (PII cifrada en reposo)
sites Centros de trabajo (geocerca, geography Point)
employee_site_assignments Asignación empleado ↔︎ sitio
shifts Turnos / horarios
attendance_events Núcleo, append-only + cadena de hash
attendance_approvals Aprobaciones (mutable; refiere al evento)
attendance_audit_log Correcciones legales
consents Consentimientos INAI
devices Dispositivos registrados
push_tokens Tokens de notificaciones push
alerts Alertas (fraude, salida faltante, fuera de geocerca)
odoo_sync Outbox de sincronización con Odoo

5. Panel web (React)

Paquete Versión Propósito
react / react-dom ^18.3.1 UI
maplibre-gl ^4.7.0 Mapa
vite ^5.4.0 Bundler / dev server
typescript ^5.5.3 Tipado
@vitejs/plugin-react ^4.3.1 Plugin React de Vite
@types/react / @types/react-dom ^18.3.x Tipos

6. Infraestructura

Componente Detalle
Servidor Linode 172.238.169.174
Reverse proxy nginx (intt2hub.conf)
CDN Cloudflare (TLS 1.3, edge cache)
Backend systemd ia-asistencia.service → uvicorn 127.0.0.1:8095
BD Docker asistencia-postgis → 127.0.0.1:5433
ERP Docker odoo (Odoo 18 Community) → JSON-RPC 127.0.0.1:8069, BD inttodoo01
Redis redis:7-alpine (rate-limiting / caché, opcional)
Entregas /opt/ia-intt/html/downloads/asistencia/ (APK estáticos)

7. Dónde vive el código

asistencia-geo/
├── docs/       # documentación técnica, legal y de operación
├── db/         # DDL PostgreSQL + PostGIS + triggers de inmutabilidad
├── backend/    # FastAPI (app/ por capas: core, models, schemas, api, services, tasks)
├── mobile/     # Flutter (lib/ por feature + core)
├── web/        # panel web React + Vite + MapLibre
└── entregas/   # APK versionados + SHA256SUMS.txt