Riesgos operativos
Riesgos que la app debe prevenir o mitigar activamente, conectados a validaciones, pantallas, estados, notificaciones e incidencias.
Matriz de riesgos
| Riesgo |
Validación |
Pantalla |
Estado que previene |
Notificación |
Incidencia asociada |
Responsable |
| Dirección mal puesta |
No permite guardar sin formato válido de provincia + municipio + dirección |
Registro, Editar perfil |
N/A |
N/A |
Incidencia de dirección |
Usuario |
| Paquete sin identificador |
El operador recibe por código de casillero; sin código no se puede recibir |
Recepción (operador) |
pendiente_conciliacion |
N/A |
Paquete sin identificar |
Operador |
| Tracking incompleto |
Formato obligatorio: al menos 5 caracteres, solo letras y números |
Prealerta |
N/A |
N/A |
Tracking inválido |
Usuario |
| Valor subdeclarado |
Advertencia visible si el valor declarado está bajo el rango típico del marketplace |
Prealerta, Detalle de paquete |
N/A |
N/A |
Subdeclaración |
Usuario |
| Categoría incorrecta |
Guía visual con ejemplos por categoría; categoría requerida antes de cotizar |
Prealerta, Paquete |
N/A |
N/A |
Mal clasificado |
Usuario |
| Artículo restringido |
Lista de restricciones visible en tutoriales y al reportar; bloquea si es prohibido |
Prealerta, Paquete |
N/A |
N/A |
Retenido en aduana |
Usuario |
| Remitente/destinatario incompleto |
Campos obligatorios con formato validado antes de enviar |
Prealerta, Paquete |
N/A |
N/A |
Envío bloqueado |
Usuario |
| Error al consolidar |
Lista de paquetes a consolidar con foto y tracking antes de confirmar |
Consolidación |
consolidado |
N/A |
Paquetes mezclados |
Operador |
| Exceso de tiempo en almacén |
Job diario verifica días de almacenaje; alerta antes del día 20 |
Dashboard, Paquete |
N/A |
Push a los 15 y 19 días |
Cargo por almacenaje |
Sistema + Operador |
| Devolución no documentada |
Flujo formal con motivo obligatorio, evidencia y estado devuelto_a_tienda |
Paquete → Devolución |
devuelto_a_tienda |
Notificación de inicio y fin de devolución |
Trazabilidad de devolución |
Operador |
| Tutorial desactualizado |
Fecha de última actualización visible; contenido administrable desde Django Admin |
Tutoriales |
N/A |
N/A |
Instrucción incorrecta |
Admin |
| Reglas de aduana vencidas |
Fecha de actualización visible en módulo de aduana; fuente normativa cargada por admin |
Módulo de aduana |
N/A |
N/A |
Información errónea |
Admin |
| Falta de trazabilidad |
Cada cambio de estado genera package_event visible en timeline |
Paquete → Timeline |
Todos |
N/A |
N/A |
Sistema |
| KYC no aprobado |
No bloquea prealerta; bloquea despacho, consolidación, pago y crédito |
Dashboard (aviso), Paquete |
N/A |
Push cuando KYC expire |
Envío bloqueado |
Usuario |
| Pago duplicado |
Lock en Redis durante confirmación; estado pendiente antes de completar |
Pagos |
N/A |
N/A |
Doble cargo |
Sistema |
| Identificador duplicado |
Lock en Redis al generar; dígito verificador con mod-10 |
N/A (se genera) |
N/A |
N/A |
Identificador duplicado |
Sistema |
| Crédito negativo |
Check constraint en DB; validación en servicio antes de aplicar |
N/A |
N/A |
N/A |
Crédito inválido |
Sistema |
| Archivo KYC expuesto |
Bucket privado; URLs firmadas con TTL 5 min; log de acceso obligatorio |
KYC |
N/A |
N/A |
Exposición de documento |
Sistema |
| OTP reutilizado o brute-force |
Rate limit: 3 intentos por código; código expira en 5 min |
Login |
N/A |
N/A |
Acceso no autorizado |
Sistema |
Validaciones automáticas por pantalla
| Pantalla |
Validaciones automáticas |
| Registro |
Formato de email, teléfono con código de país, contraseña con requisitos mínimos |
| Prealerta |
Tracking no vacío ni inválido, valor > 0, categoría obligatoria, remitente completo |
| Recepción (operador) |
Identificador existe y está activo; tracking no duplicado en mismo día |
| Consolidación |
Al menos 2 paquetes, todos en estado en_almacen, mismo usuario, mismo KYC aprobado |
| Cotización |
Todos los paquetes en consolidación con KYC aprobado; cotización no expirada |
| Pago |
Saldo suficiente o método alternativo; sesión de pago no expirada |
| KYC |
Documento legible (no borroso), datos consistentes entre rostro y documento |
Estados que activan incidencias automáticamente
| Estado |
Incidencia automática |
Condición |
incidencia en paquete |
damaged_package o wrong_package |
Operador reporta |
perdido |
carrier_loss |
Después de 30 días en en_transito sin actualización |
rechazado en envío |
customs_hold |
Aduana reclasifica o retiene |
KYC vencido |
Bloqueo de dispatch |
User con KYC aprobado hace más de 10 años sin revalidación |
Notificaciones automáticas
| Evento |
Canal |
Timing |
| Paquete recibido en almacén |
Push |
Inmediato |
| Paquete próximo a vencer (15 días) |
Push |
Una vez al día a las 9am |
| Paquete próximo a vencer (19 días) |
Push + Email |
Una vez al día a las 9am |
| Cargo por almacenaje aplicado |
Push |
Inmediato |
| KYC próximo a vencer (90 días antes) |
Push + Email |
Una vez |
| KYC vencido |
Push |
Inmediato |
| Consolidación lista para pagar |
Push |
Inmediato |
| Envío despachado |
Push |
Inmediato |
| Envío entregado |
Push |
Inmediato |
| Incidencia abierta |
Push al usuario + email al operador |
Inmediato |
Auditoría de riesgos
Cada riesgo que resulta en una incidencia debe generar un registro en audit_logs con:
- Entidad afectada (paquete, usuario, envío)
- Acción que lo causó
- Usuario o sistema que lo provocó
- Timestamp
- Estado anterior y nuevo
Estrategia general
La app debe funcionar como una red de prevención que anticipa errores del usuario en lugar de corregirlos después:
- Validar antes, no después: campos obligatorios, formatos, rangos.
- Guiar con ejemplos: cada campo complejo debe tener un ejemplo visible.
- Alertar proactivamente: notificaciones antes de que un plazo venza.
- Registrar todo: auditoría de cambios para resolver disputas.
- Facilitar lo correcto: que lo más fácil de hacer sea lo correcto (copiar dirección en un toque, reportar en pocos pasos).