| Aislamiento por conjunto | Row Level Security en PostgreSQL 16 con política deny-by-default por conjunto en todas las tablas del tenant. El API se conecta con un rol sin privilegios de dueño y fija el conjunto por transacción. Login, invitaciones y renovación de sesión pasan por funciones SECURITY DEFINER que exponen solo lo mínimo. |
| Auditoría | Bitácora de accesos, historial de PQR, pagos y tokens de sesión son tablas de solo inserción: el rol de aplicación no tiene DELETE. Radicados únicos por conjunto con consecutivo atómico. |
| QR de visita | Token firmado con HMAC-SHA256 y secreto dedicado; en la base de datos solo el hash. La transición de activa a usada es atómica: dos escaneos simultáneos no autorizan dos ingresos. |
| Alta y acceso | El alta de conjuntos no es abierta: se hace desde la Consola Andén o con token de onboarding, y exige NIT. Invitaciones de unidad de 64 bits aleatorios, revocables. |
| Autenticación | Contraseñas con bcrypt. Token de acceso de 15 minutos; renovación de 30 días con rotación y detección de reuso que revoca toda la familia de sesiones. |
| Abuso | Límite global de 100 solicitudes por minuto por IP y límites estrictos en autenticación: inicio de sesión 5 por minuto, validación de invitación 10 por hora, onboarding 3 por hora. |
| Archivos | Almacenamiento S3 compatible propio (MinIO). URLs firmadas de subida (10 minutos) y descarga (1 hora), lista de tipos permitidos (PDF, JPG, PNG, WebP), máximo 10 MB y carpeta forzada al prefijo del conjunto. |
| Dinero | Importes en numeric(14,2). Confirmación y rechazo de pagos exclusivos del rol administrador; transiciones de estado atómicas. Sin pasarela: el flujo de dinero es externo y Andén guarda el control documental. |
| Ley 675 | Quórum por coeficiente con poderes; un voto por unidad garantizado por restricción única en la base de datos; inquilino sin voto; acta como borrador con firma humana. |
| Roles | Permisos en tres capas de la app (rutas, interfaz y datos) con paridad en el API. Soporte de plataforma con impersonación marcada; auditoría de calidad en solo lectura. |
| Infraestructura | PostgreSQL 16, Redis 7, MinIO y API NestJS 11 en contenedores propios sin puertos expuestos, con healthchecks y reinicio automático. HTTPS detrás de Cloudflare. Hora del servidor en America/Bogota. Firebase se usa únicamente como mensajero de notificaciones push. |
| Calidad | Pruebas automáticas en el backend y en la app, análisis estático sin advertencias antes de cada cambio, y pruebas de extremo a extremo de los siete roles contra el entorno de producción. |