Salida · carga de embarque · diseño esencial

Apunta. Dispara.
Cuadra.

La Salida es el espejo de la Entrada. Donde la entrada imprime y pega un tag, la salida apunta el Q3000 y reconcilia. Sesenta y dos cajas dejan de contarse de a una: el operador barre la estiba con la pistola y la pantalla sube como un Geiger. El número es el héroe, la red susurra, y lo único que importa es la diferencia — qué cuadra, qué falta, qué sobra.

Renderizado en el iData T1 Pro acoplado al Q3000 UHF RFID — el hardware real
Modo Embarque Dispara Cuadra Resuelve Sella Listo
0El hogar — dos modos

Una sola app, un solo lenguaje. Al abrir el turno el operador elige el modo y ahí vive a pantalla completa, sin un toggle robando cromo. Cambiar de Entrada a Salida es un gesto deliberado, no un accidente con guante.

1Salida — carga el embarque

El operador elige un embarque, barre la estiba con la pistola y la app reconcilia contra el manifiesto: qué cargó, qué falta, qué sobra. La pistola lee cientos de cajas en segundos; el trabajo humano ya no es contar, es cerrar la diferencia.

±Estados que el diseño contempla

La pistola se cae, la batería se agota y a veces el contenedor abierto es el equivocado. El diseño los trata como susurros recuperables —nunca pérdida de datos—, el mismo principio que la Entrada.

Pistola desconectada

El contador se congela y sube el chip Q3000 · reconecta. Lo ya leído vive en SQLite — desconexión ≠ pérdida.

Reanudar tras cierre

Si muere la batería o se cierra la app, el embarque a medias se reanuda: 58/62 ya leídas, continúa. Cada EPC se vacía a SQLite al instante.

Caja dañada

Una caja presente pero rota se marca dañada · no embarca con un toque — sale como una diferida, no reaparece como faltante.

Sello obligatorio

Sellar y despachar se desbloquea solo con precinto y foto — cadena de custodia, como “Pega” exige cada etiqueta en la Entrada.

Lectura baja

Sellar con muy pocas cajas (contenedor equivocado) pide confirmación: “vas a sellar con 2 de 62, ¿seguro?”

Tag sin dueño

Un EPC que no resuelve a ninguna orden local es desconocido · apartar y reportar, no se fuerza a un contenedor.

AEl otro camino — una caja que no es de aquí

La pistola es honesta: lee todo lo que tenga tag, también lo que no debía estar. Una caja de otro embarque cae en “Sobran”. El operador no se detiene —la aparta o la reasigna— y el contenedor sale limpio.

La Salida es el espejo de la Entrada

Entrada y Salida no son dos apps: son el mismo gesto en reversa. Lo que entró con una etiqueta sale con una lectura. Por eso comparten lenguaje, colores y calma — y por eso el operador no aprende dos productos, sino dos lados de uno.

Entrada    Salida
Busca el tracking    Elige el embarque
Encuentra la orden    Dispara la pistola
Cajas (cuenta +/−)    Cuadra (lee vs. manifiesto)
Imprime + Pega el tag    Sella el contenedor
Recibido (local)    Despachado (local)

Lo que un tag cuesta de menos

El mismo EPC codificado en recepción es la columna vertebral: en el almacén China lo lee la pistola para despachar; en Venezuela el repartidor lo lee para entregar. Una identidad por caja, tres momentos, cero transcripción manual. El QR impreso sigue ahí como respaldo de cámara y para la última milla.

BLa ingeniería — del gatillo al manifiesto

El mismo end-to-end, con cada referencia: qué módulo nativo habla con el Q3000, cómo el EPC se codifica en recepción y se lee en salida, y qué archivos de apps/warehouse se tocan. La Salida reusa el esqueleto offline-first de la Recepción (SQLite local + cola de sync); solo cambia el sensor: de impresora a pistola. El combo de campo es el iData T1 Pro + Q3000 con la iQ4R RFID.

El tag combo — UHF + QR, codificado en recepción
amplía recepción
EPC = código de cajala identidad que viaja
apps/warehouse/lib/print/epc.ts — mapea (N)-tracking-i ⇄ EPC 96-bit, esquema propio (no GS1): header + orderId (o trackingNumber si es huérfano) + índice de caja; puro y testeable sin hardware
Etiqueta sobre inlay RFIDuna etiqueta, dos tecnologías
la iQ4R (versión RFID) imprime el QR y el texto Y codifica el EPC en el inlay en una sola pasada — el QR queda de respaldo para cámara y última milla
Comando ZPL de encodese suma al ZPL actual
al lib/print/zpl-label.ts existente se le añade ^RFW,H ^FD{epcHex} ^FS antes del ^XZ manual RFID §4
Módulo nativo — Q3000 UHF (Android · PDA T1 Pro)
nuevo
Wrapper KotlinExpo Modules API
apps/warehouse/modules/idata-rfid/android/ — hermano de idprt-printer; envuelve el iData UHF SDK (RFIDManager)
connect()Bluetooth 5.3 / Pogopin
BT 5.3 → permisos BLUETOOTH_CONNECT + BLUETOOTH_SCAN (Android 12+); pogopin/USB-C → USB host, sin permisos BT datasheet BT/pogopin
startInventory()el gatillo = lectura masiva
modo batch IMPINJ Ex10 / Gen2 — hasta 100 000 tags en lote; cientos de lecturas/s según antena, potencia y densidad; el trigger físico arranca el stream datasheet RFID
onTagRead(epc, rssi)stream → de-dup
cada EPC único se emite una vez; el RSSI permite filtrar lecturas lejanas (otra estiba) — umbral configurable
Potencia y regiónconfig
setPower(dBm) para acotar el alcance (30 m abierto es demasiado en muelle); región 902–928 MHz / 920–925 según país datasheet freq
Estado de carga — hook y reconciliación
nuevo
useShipmentLoad(shipmentId)el draft de salida
apps/warehouse/hooks/shipment/use-shipment-load.tsx — espejo de use-reception-draft.tsx: { manifest[], scannedEpcs:Set, loaded[], missing[], extra[], deferred[], sealNumber, photo }
Manifiesto localoffline-first
pre-sincronizado a lib/local-db (SQLite) por las Sync Rules: solo embarques en estado “cargando” bajan al PDA — búsqueda EPC↔caja en ms, sin red
Reconcile (puro)3 conjuntos
cargadas = scanned ∩ manifest · faltan = manifest − scanned · sobran = scanned − manifest — set ops sobre EPCs, testeable sin hardware
Rutas Expo Routerespejo de recepción
app/shipments.tsx → load.tsx → reconcile.tsx → resolve.tsx → seal.tsx → dispatched.tsx (hoy: scan→found→…→done) · el cierre escribe a la cola de lib/sync

El encode que se suma a la etiqueta. El ZPL de recepción no cambia — solo gana una línea: el mismo orderId que ya va en el QR ahora también se graba en el inlay UHF.

^XA … ^FO216,160^BQN,2,10^FDQA,{orderId}^FS
QR real — ya existe (impresión)
^RS8,0,0,1
setup RFID · params exactos según firmware del iQ4R
^RFW,H^FD{epcHex}^FS
graba el EPC en el banco EPC del inlay
^XZ
fin — el printer anula (void) la etiqueta si el encode falla; sin reintento manual

Secuencia — del gatillo al contador. Un stream por barrido; cada EPC único se compara contra el manifiesto local y el contador sube sin tocar la red.

Operador Q3000 (gatillo) Módulo nativo useShipmentLoad() SQLite local Pantalla Dispara T1 ProUHF sled · BTmodules/idata-rfidhooks/shipmentlib/local-db · manifiestocontador vivo loop · por cada EPC único del barrido mantiene el gatillo startInventory() onTagRead(epc, rssi) addScan(epc) · de-dup en Set SELECT box WHERE epc = ? ∈ manifiesto → cargadas++ setState → contador 58 / 62 al soltar el gatillo: reconcile final (cargadas / faltan / sobran) — todo local, la cola sube el manifiesto sellado cuando hay red
Siguiente paso. Publicar en design.cresco.so/mogos/salida (junto a /recepcion, /impresion). El módulo modules/idata-rfid es el único bloque de hardware nuevo; todo lo demás —offline-first, cola, reconcile— reusa el esqueleto de Recepción. La etiqueta combo ya es imprimible con la iQ4R RFID que el almacén tiene.