Requisitos no funcionales
Requisitos transversales que aplican a todo el sistema.
Interfaz y experiencia
| Requisito |
Descripción |
| Simplicidad |
Interfaz muy simple, sin pantallas sobrecargadas |
| Textos cortos |
Comunicación breve y directa |
| Mobile-first |
Diseño optimizado primero para móvil |
| Alta legibilidad |
Tipografía clara, contraste adecuado |
| Soporte para imágenes |
Tutoriales con capturas y guías visuales |
Administración y operación
| Requisito |
Descripción |
| Panel administrativo editable |
Contenido de aduana, tutoriales y tarifas editables sin código |
| Historial y auditoría |
Registro de todos los cambios relevantes |
| Exportación de reportes |
Datos exportables para análisis |
Comunicación
| Requisito |
Descripción |
| Notificaciones push |
Para eventos clave del paquete |
| Notificaciones por email |
Alternativa o complemento |
| WhatsApp (futuro) |
Integración posible para notificaciones |
Seguridad y datos
| Requisito |
Descripción |
| Protección de datos personales |
Cifrado, accesos restringidos, cumplimiento básico |
| Autenticación segura |
Login con contraseña robusta, recuperación de cuenta |
| Control de permisos |
Roles diferenciados (usuario, operador, admin) |
Moneda y costos
| Requisito |
Descripción |
| Soporte multimoneda |
Compras en USD como base, posible expansión |
| Tarifas variables |
Estructura flexible para manejar costos cambiantes |
| Cargos adicionales |
Modelado desde el inicio para no reestructurar después |
Rendimiento
| Requisito |
Descripción |
| Tiempo de respuesta |
API móvil debe responder en menos de 500ms para consultas comunes |
| Listados paginados |
Ningún listado devuelve más de 50 registros por página |
| Imágenes optimizadas |
Fotos comprimidas, thumbnails para previews |
| Carga diferida |
Imágenes fuera de pantalla se cargan al hacer scroll |
| Cache de datos |
Tarifas y categorías en Redis con TTL adecuado |
Archivos y almacenamiento
| Requisito |
Descripción |
| Subida directa a MinIO |
App sube archivos con URL prefirmada, no pasan por FastAPI |
| Validación de MIME type |
Se valida antes de aceptar la subida |
| Tamaño máximo por tipo |
KYC: 10 MB, fotos: 50 MB, avatar: 5 MB |
| Thumbnails |
Fotos de paquetes generan thumbnail de 200x200 |
| URLs firmadas |
Archivos privados solo accesibles con URL temporal (5 min) |
| Log de acceso |
Cada lectura o descarga de documento KYC queda registrada |
| Separación de buckets |
KYC, evidencias, fotos y contenido público en buckets distintos |
Seguridad
| Requisito |
Descripción |
| Rate limiting |
Login: 5 intentos/min. OTP: 3/min. Endpoints: 60/min por usuario |
| Cifrado de secretos |
Contraseñas, API keys y tokens cifrados (no en texto plano) |
| URLs firmadas |
Archivos sensibles solo con URL temporal y log de acceso |
| Separación de permisos |
Operador vs admin vs usuario vs sysadmin |
| Cifrado en reposo |
MinIO con cifrado si el proveedor lo soporta |
| HTTPS obligatorio |
Toda comunicación entre app y API es sobre TLS |
Procesos en background
| Requisito |
Descripción |
| Notificaciones push |
Se ejecutan via jobs, no bloquean requests |
| Vencimiento de almacenaje |
Job diario verifica paquetes que superan días gratis |
| Expiración de OTP |
Códigos de teléfono expiran en 5 minutos |
| Expiración de crédito |
Job diario marca crédito vencido |
| Recalculo de niveles |
Job cada hora recalcula nivel de usuarios |
| Consolidación |
Locks en Redis para evitar estados inconsistentes |
Apps móviles — experiencia offline
| Requisito |
Descripción |
| Sesión expirada |
Si el token expira, redirigir a login sin perder contexto |
| Subida de foto fallida |
Guardar foto en cola local y reintentar cuando haya red |
| Recurso modificado |
Si push llega con dato stale, traer versión actual del servidor |
| Cotización vencida |
Si el usuario intenta pagar con cotización expirada, mostrar error y recalcular |
| Permiso de cámara denegado |
Mensaje claro: "Necesitas dar permiso para subir fotos" |
| Sin internet |
Mostrar estado offline; las acciones se encolan localmente |