propuesta · ago 2026
Almacenaje · Mogos ID

Tu locker, tu Mogos ID.

El pase en tu Wallet es tu única identidad con Mogos: un código, un QR, una persona. Lo muestras al llegar al Almacén Caracas, lo escaneamos y te llevas tus bultos.

Por cliente
1 pase
Sin NFC
QR
Caracas
WH-CCS-001
Nuevas
0 apps

Hoy: el retiro de papel

storage-withdrawals.service.ts:446

Hoy el retiro del locker es un trámite de papel disfrazado de software. El admin tiene una solicitud con texto libre y un botón «Completar»; complete() cambia el estado y factura el fee, pero no sabe quién se llevó qué. Y del lado del cliente, /account/storage sigue detrás de «Próximamente» desde mayo.

  1. «Completar» a un clic, sin confirmación

    Sin guard de estado: dos clics, dos fees. Nadie registra completedById ni la hora real de la entrega.

  2. Sin quién retira ni quién entrega

    Ni receptor, ni cédula, ni firma, ni foto. La prueba de entrega del flete existe (DeliverySignature); la del locker, no.

  3. Bultos en texto libre — el CBM no se libera

    «cajas de repuestos» no es una entrada. Las StorageEntry nunca pasan a WITHDRAWN y el locker sigue lleno en el sistema.

  4. El fee se factura después, el saldo no se mira

    Se entrega primero y se cobra después; la mensualidad pendiente ni aparece en pantalla.

  5. El cliente ni siquiera ve el servicio

    «Próximamente» desde el 19 de mayo. El modal promete «sin costos fijos» mientras el seed cobra tiers mensuales.

Lo que sí existe

El esqueleto es real y sólido: módulo apps/api/src/storage/ completo (6 modelos, 6 controllers, cotización polimórfica entityType: STORAGE, auditoría en las 6 tablas), pasarela embebida PaymentPortalSheet, qrcode y CardsModule listos para reusar, y el QR del flete que ya se escanea en Caracas. Esta propuesta termina lo que hay; no lo reemplaza.

El Mogos ID

Apple generic · Google GenericObject

Un pase por persona, con los mismos datos en Apple Wallet y Google Wallet. El código MG-7F3K2Q es el nombre público del cliente; el QR lleva un token opaco que solo el mostrador puede resolver. Marino de fondo, wordmark blanco y el punto rojo como remate del código: la credencial se ve Mogos a un metro de distancia.

Mismos datos en las dos plataformas · el QR codifica MOG1.H9V4XN2B8RC6WJ5TQ3ZD7K, nunca el código ni la cédula

Identidad

Un pase, una persona

Nuevo User.customerCode: MG- + 6 caracteres sin 0/O/1/I, @unique, con backfill de los clientes existentes. Es el código que se lee en voz alta en el mostrador.

Seguridad

QR opaco, verificación en línea

El código de barras lleva MOG1.<token> — nunca un UUID ni la cédula. Solo POST /wallet/verify (staff) lo resuelve. Revocable: Apple voided + push, Google state: INACTIVE.

Ubicación

Se sugiere solo

locations[] en Apple y Nearby Passes en Google: al llegar a WH-CCS-001 el teléfono ofrece el pase en la pantalla de bloqueo. El cliente no busca nada.

Lectura

Sin NFC, a propósito

NFC en Apple exige un entitlement que se pide caso por caso. El QR no pide permiso a nadie, funciona en las dos plataformas y en una tarjeta impresa.

Sugerencia de ubicación — el cliente no busca nada

El pase lleva una sola ubicación, la del Almacén Caracas. Al acercarse, el teléfono lo sugiere en la pantalla de bloqueo; un toque y el QR está listo para el mostrador. Sin notificaciones push, sin app, sin buscar en el correo.

Es la misma credencial para todo lo que tenga listo: cajas de un flete READY_FOR_PICKUP y bultos del locker.

Cómo lo recibes

/account/mogos-id

Cuatro pasos y ninguno requiere instalar nada. La página detecta el dispositivo y ofrece la Wallet que corresponde; en escritorio, un QR que abre la misma página en el teléfono.

01Perfil completoNombre, cédula y teléfono verificados. Sin eso no hay pase.
02«Tu Mogos ID está listo»Email + WhatsApp con el enlace a /account/mogos-id.
03Agregar a la WalletiPhone en Safari → Apple · Android → Google · escritorio → QR + ambos.
04Lo muestras al llegarEl teléfono lo sugiere al acercarte. Escaneamos, entregamos.
Chrome en iPhone

No instala .pkpass. La página lo detecta y muestra «Ábrelo en Safari» con el enlace listo para copiar; el email y el WhatsApp abren en Safari por defecto.

Cliente sin smartphone

Se imprime una tarjeta PNG con el mismo QR — reusa CardsModule, con su throttle. Mismo token, misma verificación en línea.

Pase perdido o teléfono nuevo

Se revoca y se reemite desde /account/mogos-id o por un operador. El token cambia, el código no: el pase viejo deja de abrir al instante.

Tu locker

/account/storage

El locker sale de «Próximamente» con precio real: por uso hasta 10 CBM, plan mensual desde 10. Cuatro pantallas y ningún paso que el cliente no pueda terminar solo — reservar, ver sus bultos, retirar los que quiera, pagar el fee antes de ir y saber cuándo están en mostrador.

Desliza para ver las cuatro pantallas 1 / 4
Locker

Reservar mi lockerPor uso hasta 10 CBM; desde 10 CBM, plan mensual.

¿Cuánto espacio?

Por uso
4CBM
Por uso$1.50 / día / CBM~$6.00al día
Ver la tabla oficial
Hasta 10 CBM$1.50 / día / CBM
10–15 CBM$400 / mes
15–20 CBM$750 / mes
20–30 CBM$1,000 / mes
30+ CBMnegociado
Sede Almacén Caracas · La Florida
Reservar mi locker
PendienteTe confirmamos por WhatsApp cuando tu locker esté activo.

Reservar · Mi locker · Retirar · Pagado. El precio que ve el cliente es el del seed; el fee de retiro se paga antes de ir o en el mostrador. «Retiro listo» llega después, cuando los bultos ya están en mostrador.

Tu retiro está listo

Cuando el almacén pone los bultos en mostrador, el cliente lo sabe por tres canales a la vez.

WhatsAppEmailIn-app

Entregado

La nota de entrega en PDF — quién retiró, qué bultos, firma y hora — llega por WhatsApp y queda en la cuenta.

Nota de entrega PDF

Cancelar solicitud

Desde el cliente, mientras el retiro no esté entregado. Si ya pagó el fee, queda como saldo a favor.

Desde el cliente
Copy del modal, corregido

«Pagas por uso hasta 10 CBM; desde 10 CBM, plan mensual». La versión actual promete «sin costos fijos», que contradice los tiers del seed (10–15 $400 · 15–20 $750 · 20–30 $1,000 · 30+ negociado).

El mostrador

/pickups

El mostrador es la web del admin con la cámara del equipo — una ruta nueva, /pickups, y ninguna app que instalar. El operador escanea el Mogos ID, ve todo lo que la persona tiene listo (fletes y locker en una sola lista), cobra si hay saldo y entrega bulto por bulto.

Seis pasos, una pantalla. Escanear → identidad → qué tiene listo → saldo → bultos → quién retira y firma → Entregado. Las entradas pasan a WITHDRAWN y el CBM se libera en la misma transacción que crea el Handover.

Reglas y decisiones

12 decisiones · 2026-08-21

Lo que quedó decidido con el usuario, y la consecuencia de cada regla en el sistema.

01Mogos ID universal
Un pase por cliente identifica a la persona para todo retiro: fletes READY_FOR_PICKUP y bultos del locker. Consecuencia: nuevo User.customerCode (MG- + 6 caracteres sin 0/O/1/I, @unique) con backfill de los clientes existentes.
02El pase es la credencial
Quien muestra el Mogos ID retira. No se inventa un registro de personas autorizadas: el pase se comparte desde la Wallet (Apple y Google lo soportan) y el operador siempre registra nombre + cédula de quien retira como rastro.
03Solo Caracas
El retiro es en WH-CCS-001 (La Florida), el único almacén con supportsStorage en producción. El pase lleva esa única ubicación en locations[].
04Mostrador = admin web + cámara
Nueva ruta /pickups en el admin, con la cámara del equipo. Sin app nueva, sin pistola: el QR se lee con cualquier webcam o teléfono del operador.
05El locker sale de Próximamente
nav-feature-flags.ts deja de esconder /account/storage con este proyecto. Reservar, guardar, retirar y pagar quedan a la vista del cliente.
06Bloqueo duro por saldo
Con deuda — mensualidad, fee de retiro $20, saldo del flete — «Entregar» queda deshabilitado hasta registrar el pago. El cliente puede pagar antes desde el portal y llegar al día.
07Retiro por bultos
El cliente selecciona entradas por entryCode; el operador las confirma una a una; al entregar pasan a WITHDRAWN y el CBM se libera. Nueva pivote StorageWithdrawalItem.
08Precio oficial = tiers del seed
Hasta 10 CBM $1.50 / día / CBM (por uso); 10–15 $400/mes · 15–20 $750 · 20–30 $1,000 · 30+ negociado; fee de retiro $20. El modal se corrige: «pagas por uso hasta 10 CBM; desde 10 CBM, plan mensual».
09QR = token opaco estable
MOG1.<22 chars base32 de Crockford>, nunca UUID ni cédula. Verificación en línea obligatoria en POST /wallet/verify (solo staff). Revocable: Apple voided + push, Google state: INACTIVE.
10Naming
El pase se llama Mogos ID. La etiqueta de caja renombra su campo «Mogos ID» a «Orden» (shipping-mark-label-spec.ts:36): un nombre, un concepto.
11Handover unificado
Una sola prueba de entrega, Handover (flete | retiro de locker), con receptor, cédula, receivedBy, firma, fotos, operador y almacén. La firma remota /f/<token> sigue viva para entregas sin mostrador.
12Fase 1 sin web service Apple
El pase se actualiza por re-descarga. El pase vivo — APNs, patch de Google, «N listos para retirar» en tiempo real — es la fase 4, cuando el mostrador ya esté rodando.

Lo que cambia en el sistema

apps/api · apps/client · apps/admin

Tres entidades nuevas, un estado nuevo y un ciclo de vida que hoy no existe. Todo lo demás es terminar y sanear lo que ya está escrito.

Modelo

Lo que se agrega al esquema

  • User.customerCodeMG-XXXXXX, @unique, backfill.
  • WalletPass — token, plataforma, serial, estado, revokedAt; WalletPassDevice en fase 4.
  • StorageWithdrawalItem — pivote retiro ↔ entrada; la entrada pasa a WITHDRAWN al entregar. Fase 2, con el mostrador.
  • Estado READY del retiro: los bultos están en mostrador. Fase 2.
  • Handover — receptor, cédula, firma, fotos, operador, almacén; apunta a flete o a retiro.
Ciclo de vida

La reserva por fin se mueve

  • activate / suspend / terminate — hoy nada pasa una reserva de PENDING a ACTIVE.
  • Cron mensual con TrackedCronService: escribe currentBalance, nextBillingDate, billingCycleDay.
  • PER_USE se cobra al retirar: días × CBM × $1.50, en la misma cotización que el fee.
  • calculatePerUseCharge y calculateProRataAdjustment consiguen caller (el pro-rata, solo para el cierre).
Saneamiento

Lo que se arregla antes de construir

  • IDOR: GET /storage/reservations* con scoping por actor; POST fuerza userId.
  • GET /withdrawals/code/:code deja de usar @UUIDParam (hoy siempre 400).
  • Keys de cache de React Query alineadas con queryKeys.storage en los 3 hooks de mutación.
  • Botones muertos («Ver facturas», «Historial», «Registrar nuevo pago») conectados o retirados.
  • Guards de estado en complete() y diálogo de confirmación en la aprobación inline.
Notificaciones

Cuatro avisos nuevos, tres canales

  • Reserva confirmada — tu locker está activo desde hoy.
  • Retiro listo — tus bultos están en mostrador; muestra tu Mogos ID.
  • Retiro entregado — nota de entrega PDF adjunta.
  • Mogos ID listo — agrégalo a tu Wallet.
  • Todos por email + WhatsApp + in-app, con las plantillas de la casa.
nuevoexistenteidentidaddesliza para ver el diagrama completo →

En palabras: un User tiene un WalletPass y varias StorageReservation; cada reserva guarda varias StorageEntry. Una StorageWithdrawalRequest lista sus bultos en StorageWithdrawalItem, uno por entrada. El Handover cierra un Freight o un retiro de locker — uno u otro — con receptor, cédula, firma y operador.

Fases

0 → 4

Cinco fases, cada una con una superficie de verificación propia. Las fases 0 y 3 no tocan el esquema; la fase 4 puede esperar a que el mostrador ya esté rodando.

  1. 0

    Saneamiento

    0 migraciones

    Scoping IDOR en /storage/reservations*, userId forzado al actor, /code/:code sin @UUIDParam, keys de cache alineadas, botones muertos resueltos, guard de estado en complete() y diálogo de confirmación en la aprobación. Solo código; nada de esquema.

  2. 1

    Mogos ID

    2 migraciones

    User.customerCode + backfill, WalletPass, pase Apple generic firmado con passkit-generator, GenericObject + JWT «Save to Wallet» en Google, página /account/mogos-id con detección, email + WhatsApp «Tu Mogos ID está listo», POST /wallet/verify.

  3. 2

    Mostrador

    2 migraciones

    Ruta /pickups en el admin con cámara, identidad verificada, lista unificada de fletes y locker, bloqueo por saldo con pago en el acto, Handover con receptor + cédula + firma + foto, nota de entrega PDF por WhatsApp y email. Entregar bultos exige la pivote: StorageWithdrawalItem y el estado READY del retiro entran acá, con el mostrador que los usa.

  4. 3

    Locker del cliente

    0 migraciones

    Sale de Próximamente. Reservar con precio real, el cliente elige sus bultos por entryCode, ciclo de vida activate / suspend / terminate, cron mensual con TrackedCronService, PER_USE cobrado al retirar y los cuatro avisos nuevos. Escribe columnas que ya existen (currentBalance, nextBillingDate, billingCycleDay): ninguna tabla nueva.

  5. 4

    Pase vivo

    1 migración

    Web service de Apple + APNs con WalletPassDevice, patch en tiempo real en Google, «N listos para retirar» que cambia solo cuando llega un flete o un retiro pasa a READY, revocación por push.

PrerrequisitoDueñoNota
Apple Developer ProgramMogosCuenta de la empresa, $99/año. Sin ella no se firma ningún pase.
Pass Type ID + certificado anualcrescōCon la cuenta de Mogos; el certificado vence cada 365 días y WWDR G4 acompaña.
Google Wallet Console + Business ProfileMogosDemo mode inmediato; publicar toma hasta 2 días hábiles.
Service account + secretos en RendercrescōClaves de Google, certificado Apple y passphrases en el Environment Group del API.
Assets del pasecrescōLogo, icono y hero a @1x/@2x/@3x desde los vectores de la casa; nada se dibuja a mano.
Política de mostradorMogosQuién puede entregar, qué pasa con un pase ajeno, horario de retiro y manejo de efectivo.

Qué no hacemos

alcance

Seis cosas que se discutieron y quedan fuera — con la razón, para que nadie las vuelva a abrir sin saber por qué se cerraron.

NFC Cambio de tier con pro-rata Valencia / Foshan Entrega a domicilio del retiro Personas autorizadas App nativa
  • NFC — Apple exige un entitlement que se aprueba caso por caso; el QR no pide permiso a nadie y funciona impreso.
  • Cambio de tier con pro-rataTIER_CHANGE_PLAN va al backlog; calculateProRataAdjustment solo se usa al cerrar.
  • Valencia / Foshan — solo Caracas WH-CCS-001 tiene supportsStorage; el pase lleva una sola ubicación.
  • Entrega a domicilio del retiro — el retiro es en mostrador; lo que sale a ruta sigue siendo flete con su propia prueba de entrega.
  • Personas autorizadas — el pase es la credencial: se comparte desde la Wallet y el operador registra quién retira.
  • App nativa — Wallet, web del cliente y admin con cámara. Cero instalaciones, cero tiendas.

Una persona, un pase, un mostrador.

El Mogos ID convierte el retiro en el momento más claro de la relación con Mogos: el cliente muestra, el operador escanea, el sistema sabe qué se llevó, quién y cuándo. Y el locker, por fin, deja de ser «Próximamente».