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)
- Paquete:
com.intt2hub.asistencia_geo
- Etiqueta: “Asistencia Geo”
- minSdk efectivo: 24 (Android 7+);
targetSdk/compileSdk por Flutter.
- Lenguaje nativo: Java 17 / Kotlin (host
FlutterFragmentActivity).
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)
- Lenguaje: Python 3.12
- Framework: FastAPI (async) + Uvicorn
- ORM: SQLAlchemy 2.0 (asíncrono) + asyncpg
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
- Motor: PostgreSQL 15 + PostGIS 3.4 (imagen
postgis/postgis:15-3.4).
- Extensiones:
postgis,
pgcrypto.
- Conector:
asyncpg (backend).
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