Documento histórico
Este documento se conserva solo para trazabilidad. Consulte el índice maestro para la fuente vigente.
Documento histórico — no usar como fuente de decisiones actuales
Reemplazado por la versión canónica del 2026-07-11. Conservar solo como trazabilidad histórica.
CU-009: Recibir paquete físico en almacén¶
Caso de uso detallado para el operador que registra la llegada de un paquete físico al casillero de Miami.
Metadatos¶
| Campo | Valor |
|---|---|
| ID | CU-009 |
| Nombre | Recibir paquete físico en almacén |
| Actor primario | Operador |
| Módulo | Operación de almacén |
| Prioridad | Alta (MVP) |
| Frecuencia esperada | Muy alta (todos los días) |
| Trazabilidad SRS | RF-018, RF-019, RF-020 |
Descripción¶
El operador recibe físicamente un paquete en el casillero de Miami. Lo registra en el sistema escaneando o escribiendo el identificador del usuario, sube fotos, registra peso, dimensiones y estado del embalaje. Si el identificador es válido, el sistema asocia automáticamente el paquete a una prealerta (si existe) o al usuario; si no, va a la cola de conciliación.
Precondiciones¶
- El operador tiene una sesión activa en el backoffice.
- El operador tiene permiso para registrar recepciones.
- El casillero físico está operativo.
Postcondiciones¶
Éxito con identificador válido:
- Se crea un PhysicalPackage con estado recibido_sin_identificar (luego recibido_identificado).
- Se asocia al User (por identificador).
- Si existe una prealerta con ese tracking, se vincula.
- Se sube al menos 1 foto a MinIO.
- Se crea un package_event de recepción.
- Se notifica al usuario.
Éxito con identificador inválido:
- El paquete queda en received_sin_identificar y va a la cola de conciliación.
Flujo principal¶
- El operador accede a la pantalla Recepción del backoffice.
- El operador escanea (o escribe) el identificador del casillero de la etiqueta (
CP-NNNNNN-D). - El sistema valida el identificador con el algoritmo Mod-10.
- Si es válido:
- El sistema busca al usuario por
locker_codes.full_code. - Si el usuario existe y está activo: muestra sus datos (nombre, email) y prealertas abiertas con tracking similar.
- Si no hay match: va al paso 5b.
- El operador:
- (a) Confirma el usuario identificado
- (b) Va a flujo de identificación (conciliación, ver FA-1)
- El operador toma al menos 1 foto del paquete (obligatorio) y la sube a MinIO.
- El sistema valida que la foto se subió (URL firmada con TTL 5 min).
- El operador registra:
- Tracking (si está visible)
- Tienda (si se puede inferir)
- Peso (usando la báscula, en libras)
- Dimensiones (alto x ancho x largo, en pulgadas o cm)
- Estado del embalaje: Bien / Dañado / Reparado
- Ubicación física (estante, zona)
- El operador toca Confirmar recepción.
- El sistema:
- Crea el
PhysicalPackageconstatus = recibido_identificado - Lo asocia al
User - Si hay prealerta con ese tracking, la vincula (
purchase_status = vinculada_a_paquete) - Crea un
package_eventcon tipo "received" y timestamp - Sube los metadatos a
file_attachments(referencias a las fotos en MinIO)
- Crea el
- El sistema envía push al usuario: "Tu paquete de {tienda} {orden} ha llegado al almacén."
Flujos alternativos¶
FA-1: Identificador no legible (conciliación)¶
Si el operador no puede leer el identificador:
1. Toca Identificar más tarde.
2. El sistema crea el PhysicalPackage con status = recibido_sin_identificar y user_id = null.
3. El paquete va a la cola Conciliación.
4. El operador, después, puede buscar por tracking, nombre, descripción para identificarlo.
FA-2: Tracking coincide con prealerta pero identificador no¶
- El operador escanea el tracking.
- El sistema busca prealertas con ese tracking.
- Si encuentra, muestra: "Esto coincide con un reporte de {usuario}. ¿Confirmar?"
- Si el operador confirma, asocia al usuario (sin necesidad de identificador válido).
- Esto es válido según reglas-negocio.md (la regla 15 dice que el tracking es criterio secundario).
FA-3: Identificador con dígito verificador inválido¶
- El sistema muestra error: "Identificador inválido: dígito verificador no coincide."
- Sugiere: "Verifica que copiaste bien el código. Si es correcto, contacta a soporte."
FA-4: Usuario bloqueado¶
- Si el
Usertieneis_active = falseo estábloqueado_manual: - El sistema muestra: "Usuario bloqueado. Retener paquete y crear incidencia
user_blocked." - El paquete queda con
status = retenido_por_incidencia.
FA-5: Prealerta ya tiene paquete vinculado¶
- Si el sistema detecta que esa prealerta ya tiene un
PhysicalPackage: - Muestra: "Esta prealerta ya tiene un paquete asociado. ¿Es un duplicado?"
- Si el operador confirma que es duplicado, crea el paquete pero con
status = retenido_por_incidenciay motivoduplicate_package.
FA-6: Foto no se pudo subir¶
- Si la conexión a MinIO falla:
- La foto se guarda en el dispositivo del operador.
- Se sube automáticamente cuando haya red.
- El paquete se crea igual, pero con flag
pending_photos = true. - El operador es notificado cuando las fotos se suban exitosamente.
FA-7: Cambio de estado posterior¶
- El operador puede volver a un paquete y cambiar su estado (ej. de
recibido_sin_identificaraidentificado). - Cada cambio crea un
package_event.
Excepciones¶
| Excepción | Causa | Manejo |
|---|---|---|
INVALID_LOCKER_CODE |
Mod-10 no coincide | Error de validación |
USER_NOT_FOUND |
Identificador válido pero sin usuario en BD | Va a conciliación |
USER_BLOCKED |
Usuario bloqueado/suspendido | Retener + incidencia |
DUPLICATE_PACKAGE |
Mismo tracking + mismo usuario en el día | Marca como incidencia |
PHOTO_UPLOAD_FAILED |
Error de MinIO | Encolar localmente |
TRACKING_ALREADY_EXISTS |
Mismo tracking en otro paquete del día | Confirmar o marcar duplicado |
Reglas de negocio aplicables¶
- RN-25 (Identificador Mod-10): debe pasar validación antes de asociar. Ver identificador.md.
- RN-26 (Foto obligatoria): al recibir, debe haber al menos 1 foto. Ver modulos/modulos.md.
- RN-27 (Conciliación): paquetes sin identificador van a la cola. Ver backoffice.md.
- RN-28 (Identificación secundaria): tracking es segundo criterio después del identificador. Ver reglas-negocio.md.
Criterios de aceptación¶
- El identificador se valida con Mod-10 antes de aceptar.
- La foto es obligatoria (no se puede confirmar sin foto).
- El sistema asocia automáticamente a prealerta con mismo tracking.
- Un paquete sin identificador va a conciliación.
- Un usuario bloqueado genera retención automática.
- El operador recibe push de "Recibido" en su dispositivo.
- Cada cambio de estado queda registrado en
package_events. - El sistema procesa al menos 50 recepciones/hora sin degradación.
Diagrama de actividad¶
flowchart TD
A["Operador accede a Recepción"] --> B["Escanea identificador"]
B --> C{"¿Mod-10 válido?"}
C -- No --> D["Error: identificador inválido"]
C -- Sí --> E["Busca usuario"]
E --> F{"¿Existe?"}
F -- No --> G["Va a conciliación"]
F -- Sí --> H{"¿Activo?"}
H -- No --> I["Retener + incidencia"]
H -- Sí --> J["Muestra prealertas con mismo tracking"]
J --> K{"¿Confirma?"}
K -- No --> L["Va a conciliación"]
K -- Sí --> M["Operador sube foto obligatoria"]
M --> N["Registra tracking, peso, dimensiones, estado"]
N --> O["Operador confirma recepción"]
O --> P["Crea PhysicalPackage"]
P --> Q["Vincula con prealerta (si hay)"]
Q --> R["Crea package_event"]
R --> S["Push al usuario"]
Diagrama de estados (paquete) — flujo recepción¶
stateDiagram-v2
[*] --> recibido_sin_identificar: llega al almacén
recibido_sin_identificar --> recibido_identificado: operador identifica
recibido_sin_identificar --> pendiente_conciliacion: requiere revisión manual
recibido_identificado --> en_almacen: almacenado
pendiente_conciliacion --> recibido_identificado: conciliado
pendiente_conciliacion --> retenido_por_incidencia: no se pudo identificar
recibido_identificado --> retenido_por_incidencia: problema detectado
Pruebas asociadas¶
- PT-120: Recepción con identificador válido y prealerta coincidente
- PT-121: Recepción con identificador válido sin prealerta
- PT-122: Recepción con identificador inválido (Mod-10 falla)
- PT-123: Recepción sin foto (debe fallar)
- PT-124: Recepción de usuario bloqueado
- PT-125: Recepción de paquete duplicado
- PT-126: Recepción sin identificador (conciliación)
- PT-127: Conciliación posterior por tracking
- PT-128: Cambio de estado posterior
- PT-129: 50 recepciones por hora sin degradación
- PT-130: Push de notificación al usuario