
Son dos cosas separadas que hablan entre sí.
La app del teléfono es para el que camina el almacén. Escanea, cuenta, registra. Funciona sin señal.
El panel web es para el que mira desde una oficina y decide. No captura movimientos de almacén —eso solo pasa en el teléfono, con la mercadería delante—, pero sí escribe: da de alta el catálogo, registra compras, cierra el mes, firma ajustes, cierra conteos y administra cuentas y equipos.
La app del teléfono
1. Entrar

Se entra con señal, y no es un capricho: en este momento el teléfono se descarga el catálogo completo — artículos, ubicaciones y saldos — para poder trabajar después sin conexión.
Con qué cuenta entrar
Todas usan la clave secreto123.
| Cuenta | Rol | Qué puedes probar con ella |
|---|---|---|
superadmin@demo.test |
Superadministrador | Todo el sistema, sin toparte con un «no tienes permiso». Empieza por aquí |
operario@demo.test |
Operario | La app del teléfono, y comprobar qué NO ve en el panel |
jefe@demo.test |
Jefe de operaciones | Compras, costos, reposición, firma de ajustes |
contador@demo.test |
Contador | Cierre de mes, kardex y su exportación, bitácora |
admin@demo.test |
Administrador + Maestro de datos | Alta de cuentas y de artículos |
Las cuatro últimas sirven para lo contrario que la primera: comprobar qué no ve cada cargo. Los costos, por ejemplo, solo los ve quien tiene costo.ver — hoy el jefe de operaciones y el contador. Ni siquiera el administrador: administra cuentas, no dinero.
El reparto completo de permisos está en Quién puede hacer qué.
2. Dónde estás parado

Lo primero que pregunta es en qué estante estás. Puedes escanear la etiqueta del estante o elegirlo de la lista.
Todo lo que captures a partir de aquí se registra en esa ubicación, hasta que la cambies. Es el error más caro de esta clase de app: si la ubicación se perdiera entre lecturas, la mercadería quedaría registrada en el sitio equivocado y el descuadre aparecería semanas después.
Solo aparecen ubicaciones reales. Las contrapartes contables (LIM-VIRT-PROVEEDOR, LIM-VIRT-CLIENTE) quedan fuera porque nadie está parado ahí.
3. La cámara — aquí es donde capturas

Se abre sola al elegir la ubicación. No hay que buscarla en ningún menú.
Arriba te recuerda qué estás haciendo y dónde: Entrada · LIM-A01-R01-N01-P01. El recuadro se pone verde cuando una lectura entra — en un almacén ruidoso el pitido no se oye.
Lee códigos de barras (EAN, UPC, Code 128, Code 39, ITF-14), QR y DataMatrix. Si el mismo código sigue encuadrado, lo ignora durante segundo y medio: sin ese filtro un escaneo se convertiría en veinte capturas.
Escanear la etiqueta de otro estante te mueve a ese estante, que es lo que hace cualquier pistola de almacén. Al hacerlo la cámara se cierra a propósito y aparece un aviso «Ahora estás en LIM-…»: escanear una ubicación no es capturar, es decir dónde estás parado, y con el visor abierto la lectura siguiente entraría en un estante que nadie confirmó. También puedes cambiarlo tocando «Cambiar», junto al código de la ubicación.
Si apuntas a una contraparte contable te lo dice y no te deja capturar ahí: nadie está parado en LIM-VIRT-PROVEEDOR.
4. Si prefieres teclear

Con Cerrar la cámara se aparta y puedes escribir el código a mano. Una etiqueta rota no puede dejar a nadie sin poder trabajar.
Arriba eliges Entrada o Salida.
5. Qué es y cuánto había

Esto es lo que hace útil escanear sin señal. La app no te muestra un número de código de barras: te dice qué tienes en la mano.
- El SKU y el nombre del artículo.
- Cuánto decía la última sincronización en esa ubicación — no el total del artículo.
- Un teclado numérico para la cantidad.
- Y, solo en las entradas, un costo unitario opcional. Si lo dejas vacío, el servidor valoriza al promedio del artículo y marca la capa para revisar — eso es exactamente lo que el Tablero cuenta como «capas con un costo que nadie confirmó». No se borra entre capturas, porque una caja suele venir toda al mismo precio y volver a teclearlo por artículo son cientos de pulsaciones por turno.
La captura de arriba es el ciclo completo cerrándose: se escaneó el código 07501031311309, que se dio de alta desde el panel unos minutos antes, y el teléfono responde GTAS30 · Gotas humectantes 30ml.
Si escaneas algo que el catálogo no reconoce, lo dice claramente en vez de quedarse mudo.
6. Guardar y seguir

Guardar y seguir encola la captura y vuelve solo al escáner. En un almacén se capturan cientos de artículos seguidos: un toque de más por artículo son cientos de toques por turno.
Al pie de la pantalla de captura, cuántas capturas llevas sin subir. Con la cámara abierta el visor ocupa todo, así que el contador aparece al cerrarla — que es cuando hay algo que decidir.
7. Contar el inventario

Desde la pantalla de captura, «Contar esta ubicación» abre un conteo cíclico.
Aquí hay una diferencia esencial con la pantalla anterior: la app no te dice cuánto debería haber. Ni al abrir, ni al escanear, ni al terminar.
Es a propósito. Si vieras «deberían ser 85», contarías hasta 85 y pararías — el dato dejaría de medir lo que hay y pasaría a confirmar lo que el sistema ya creía, que es justo el error que un conteo existe para detectar.

Escaneas y anotas cuántas hay. Si el estante está vacío, escribes 0: un cero contado vale tanto como cualquier otra cifra, y a menudo es el dato más importante.
Abrir el conteo necesita señal — el servidor congela el saldo en ese instante exacto, y es contra ese momento que reconcilia después. Contar sí funciona sin conexión.
Cerrar el conteo exige el permiso conteo.cerrar, que el operario no tiene. La app te lo dice al abrir el conteo, antes de que recorras el almacén: nadie debería contar cuatrocientos artículos para descubrir al final que no puede cerrarlos. Quien sí lo tiene —supervisor, jefe de operaciones, superadministrador— cierra con «Cerrar y reconciliar» desde el propio teléfono, o desde la bandeja del panel.
Ojo con lo que esto no es: una separación por persona. A diferencia de la firma de ajustes, el servidor solo comprueba el permiso y nunca compara quién abrió la sesión con quién la cierra, así que quien puede cerrar y además cuenta sí cierra lo que contó él mismo.
8. Recibir mercadería

Desde la pantalla de captura, «Recibir mercadería».
Primero eliges contra qué orden recibes — el número sale en la guía del transportista. Ves el número y el proveedor, y nada de lo que trae: ni artículos ni cantidades.
También puedes recibir «Sin orden», que es la opción que viene marcada: entonces no hay contra qué comparar y todo lo que cuentes entra marcado como no pedido. Sirve para que una entrega que nadie pidió no se quede fuera del sistema, pero pierde justo el control que hace valiosa esta pantalla.
Es la misma razón que en el conteo, y aquí pesa más. Si vieras «vienen 40», contarías hasta 40 y firmarías: la recepción dejaría de ser una verificación y pasaría a ser un trámite. Recibir a ciegas es lo único que convierte al almacén en un control independiente de lo que dice el papel del proveedor.

Escaneas y anotas cuántas llegaron. El costo no se pregunta: viene de la orden, donde lo pactó quien compró. Pedírtelo en el muelle invitaría a copiar lo que diga la guía — justo el papel que habría que contrastar.

Al cerrar, el servidor compara y te dice qué pasó. Si algo no cuadra, la mercadería entra en cuarentena en vez de al stock disponible: no se puede despachar hasta que alguien la revise.
Recibir necesita señal de principio a fin. La conciliación la hace el servidor, y traerse la orden al teléfono para poder trabajar sin conexión acabaría con el recibir a ciegas.
9. La cola

Lo pendiente sube solo cuando vuelve la señal. Este botón es para forzarlo.
Lo importante de esta pantalla es lo que aparece cuando algo sale mal: si el servidor rechaza una captura, queda aquí con su motivo y no desaparece sola. Es trabajo real que alguien hizo, y un contador que no baja sin explicación es la forma más rápida de que un operario deje de confiar en la app.
Solo se va si una persona pulsa «Descartar los N rechazados». Para entonces el motivo ya se leyó, y lo que se borra es una tarea imposible de reintentar, no información: un aviso que no se puede resolver deja de leerse a los dos días, y entonces tampoco se leen los que sí importan.
https://inventario.hivebundle.com — mismas credenciales.
Aquí no se registran movimientos de almacén —eso solo pasa en el teléfono, delante de la mercadería—, pero sí se escribe: aquí nace el catálogo, se registran las compras, se cierran conteos y el mes, se firman ajustes, se trabaja el triaje y se administran cuentas y equipos. Lo que no se decide desde una oficina es cuántas unidades hay en un estante.
10. La cola sube sola
No hace falta pulsar nada. El botón «Sincronizar ahora» está para forzarlo y para ver qué pasó, pero la cola sube por su cuenta en cuatro momentos:
| Cuándo | Para qué |
|---|---|
| Al recuperar la red | Sales de la zona sin cobertura y lo capturado sube en uno o dos segundos |
| Al volver a la app | Abres el teléfono en la oficina, donde hay señal |
| Cada minuto, si queda algo pendiente | Si no hay nada pendiente no se despierta: consultar la red sin motivo es batería |
| Justo después de capturar | Con señal, el contador de pendientes ni llega a crecer |
El tercero parece redundante con el primero y no lo es. El sistema puede decir «hay red» cuando la petición todavía no cursa —una barra de 4G dentro de una nave, un portal cautivo, el DNS sin responder—. Ese aviso llega una vez y ya; el temporizador vuelve a intentarlo.
Lo que no hace: no sincroniza con la app cerrada. Eso exige un módulo de tareas en segundo plano que Android estrangula de forma impredecible según el fabricante, y prometer algo que a veces no ocurre es peor que no prometerlo — el operario dejaría de comprobar.
11. Salir
El botón Salir está en la pantalla principal, debajo de la cola.
Si quedan capturas sin subir no cierra a la primera: avisa cuántas son y ofrece sincronizar antes. No es cortesía — esa cola vive en ese teléfono y va firmada por quien la capturó, así que si sale un operario y entra otro, esos movimientos ya no se pueden subir sin que vuelva el primero.
Cierra primero en el servidor y después en el teléfono. Al revés, el servidor seguiría aceptando la sesión hasta que caduque, y en un equipo compartido eso significa que quien lo encuentre opera en nombre de quien lo dejó. Si no hay señal se sale igual: quedarse dentro por falta de cobertura sería lo peor de los dos mundos.
12. El botón «atrás»
Cada capa se ocupa del suyo:
- Con la cámara abierta → cierra la cámara
- Tecleando una cantidad, o viendo un código no reconocido → vuelve al paso de escaneo
- En cola, conteo o recepción → vuelve a captura
- En captura, que es la pantalla principal → sale de la app, como se espera
Funciona porque Android atiende los manejadores en orden inverso al de registro: el de la cámara, montado después, se atiende primero. Ninguna capa necesita conocer a las otras.
Quién puede hacer qué
El sistema no tiene un único tipo de usuario. Cada cargo ve y hace lo suyo, y algunas ausencias son el control: no es que falte darle un permiso a alguien, es que dárselo rompería una separación que existe a propósito.
| Rol | Permisos | Para qué |
|---|---|---|
| Operario de almacén | 4 | Captura, cuenta y concilia recepciones. No ve costos ni cierra nada |
| Supervisor de almacén | 9 | Lo del operario, más cerrar conteos y trabajar la bandeja de triaje |
| Jefe de operaciones | 12 | Compras, costos, firma de ajustes y políticas de reposición |
| Contador | 4 | Cierra el mes, exporta el kardex y lee la auditoría. No firma ajustes |
| Maestro de datos | 4 | Único que da de alta artículos. También trabaja la bandeja de triaje: toma códigos, los resuelve como alias y los descarta. Lo único que no puede es «pedir el alta», porque esa petición va dirigida a él |
| Administrador | 4 | Cuentas, dispositivos, políticas de reposición y lectura de la bitácora. No firma ajustes |
| Superadministrador | 19 | Todos. Ver abajo qué cuesta |
Las dos ausencias que son controles
El contador no firma ajustes. Si además firmara, podría aprobar el ajuste que da de baja un faltante, sellar el período que lo congela y emitir el libro que lo reporta: el ciclo completo de una transacción en una sola persona.
El administrador tampoco. Si quien crea cuentas y revoca dispositivos pudiera además aprobar el ajuste que tapa un faltante, la segregación sería cosmética.
Por eso la matriz vive en el código y no en una pantalla de configuración: un control que se puede activar desde un formulario no es un control.
El superadministrador
Existe un rol que lo tiene todo. Es útil —el dueño de una óptica de tres personas no puede repartir seis cargos, y para recorrer el sistema entero hace falta una cuenta que llegue a todo—, pero conviene saber qué se pierde: en esa cuenta las dos ausencias de arriba dejan de ser un control.
Lo que NO se pierde: el superadministrador tampoco puede firmar un ajuste que registró él. Esa no es una casilla de la matriz, es un hecho sobre quién hizo qué, y ningún permiso la levanta. Si un rol pudiera saltársela, bastaría con asignarse ese rol —que es justo lo que haría quien quiere saltársela—.
Las cuentas de prueba, con la clave de cada una, están arriba en 1. Entrar — donde hacen falta.
Tablero

Lo primero que se mira es si el libro cuadra, y es lo primero por una razón: en doble partida cada salida tiene su contraparte, así que la suma de todos los movimientos vale exactamente cero. Si dejara de valerlo, habría stock que apareció de la nada y ningún otro número de la pantalla sería confiable.
Cuando cuadra dice «Cuadra» y ya está — no hay nada que leer en seis ceros. Cuando no cuadra muestra la cifra exacta con todos sus decimales, porque ahí cada dígito importa: un descuadre de una millonésima delata un redondeo y uno de cuarenta unidades delata otra cosa muy distinta.
Al lado, lo que necesita atención: tuplas en negativo, diferencias de conteo sin resolver y recepciones que no cuadraron con su orden.
Debajo, si tienes costo.ver, cuánto vale el inventario; y ahí sí siempre, incluso cuando son cero, cuántas capas tienen un costo que nadie confirmó: entró mercadería sin decir cuánto costó y se valorizó al promedio del artículo. Un total limpio que esconde eso parece más firme de lo que es.
Quien no ve costos no recibe esta sección en absoluto: el servidor ni siquiera envía esos dos números y la pantalla no dibuja el bloque. No aparece en cero — no aparece. Un cero diría «no vale nada», que es una afirmación, y aquí no hay ninguna que hacer.
Existencias

El saldo no es «cuánto hay de este artículo». Es cuánto hay de este artículo, en esta ubicación, de este lote y en este estado. Esa combinación es la unidad real del inventario; el total por artículo es una suma que oculta dónde está el problema.
Cada fila lleva su costo unitario y su valor. El costo se lleva por artículo y almacén, no por ubicación: mover una caja de un estante a otro no la encarece. Una salida consume las capas más antiguas primero (PEPS), así que el costo de lo que sale es el de lo que realmente salió, no un promedio conveniente.
Las cantidades se muestran con los decimales que la unidad de medida usa: los armazones se cuentan en unidades y salen como 5, no como 5.000000. El libro sigue guardando seis decimales porque los necesita para que las conversiones cuadren sin resto, pero eso es precisión de almacenamiento, no de lectura.
Libro de movimientos (en el menú, Libro)

Todo lo que pasó, en orden, y nada se puede editar ni borrar. Una corrección es un movimiento nuevo con su motivo, igual que un asiento contable.
Cada movimiento tiene al menos dos líneas y sus deltas suman cero. Aquí aparecen las capturas que suben desde el teléfono.
Códigos sin identificar (en el menú, Triaje)

La bandeja donde cae todo lo que un teléfono leyó y el catálogo no conoce.
Antes de esto, el operario escaneaba una caja sin dar de alta, la app decía «no reconocido» y ahí terminaba todo: la evidencia de que ese código existe desaparecía al cambiar de pantalla, nadie en la oficina se enteraba, y al día siguiente pasaba otra vez.
Cómo llega aquí
El aviso viaja por la misma cola que los movimientos. Es lo que hace que sirva: el caso que produce códigos desconocidos —mercadería nueva de un proveedor— pasa en el almacén, que es justo donde no hay señal. Un aviso que solo funcionara conectado se perdería siempre que hiciera falta.
El operario ve «queda anotado» y sigue capturando. No tiene que hacer nada más.
Una fila por código, no por escaneo
Cuarenta lecturas de la misma caja sin etiquetar son un problema, no cuarenta. Una bandeja con cuarenta filas idénticas no se trabaja: se ignora.
Por eso lo que crece es un contador, y el contador manda el orden: lo que más se repite es lo que más está frenando a alguien ahora mismo.
La cadena se guarda tal cual la entregó el lector, sin recortar ni normalizar. Es la única evidencia de lo que pasó, y ahí un espacio de más o una «O» donde iba un cero cambia el diagnóstico. Para agrupar sí se ignoran los espacios de borde, porque los lectores de teclado añaden un salto de línea que no cambia el código.
Tomar antes de resolver
Es obligatorio, y no es burocracia. Sin ese paso, dos supervisores trabajan el mismo código a la vez: uno lo resuelve como alias del armazón que ya existe y el otro pide dar de alta uno nuevo. El catálogo termina con dos artículos para la misma caja, las existencias se parten entre los dos y nadie lo descubre hasta el inventario anual.
Si alguien lo tiene tomado, lo ves y puedes tomarlo tú —queda registrado—. Bloquear para siempre dejaría códigos congelados cada vez que un supervisor se va de vacaciones.
Los tres desenlaces
| Cuándo | Qué pasa | |
|---|---|---|
| Dar de alta el código | Es un artículo que ya existe con otro código impreso | Se escribe en el catálogo y baja a los teléfonos: el próximo escaneo ya lo reconoce |
| Pedir el alta | No está en el catálogo | Se marca para el maestro de datos. No crea el artículo |
| Descartar | No es un artículo: etiqueta del transportista, código de la caja de cartón | Se cierra con un motivo escrito |
Pedir el alta no crea el artículo a propósito. Quien trabaja la bandeja ve códigos sueltos, no el catálogo entero, y desde ahí no puede saber si ese armazón ya existe con otro nombre. Si pudiera crear artículos, cada etiqueta mal impresa nacería como artículo nuevo.
Descartar exige decir por qué. Sin motivo, la bandeja se vacía a golpe de descartar y se pierde la única señal que tenía valor: qué se estaba escaneando de más.
Lo ya resuelto no desaparece
Un código descartado que se sigue escaneando doscientas veces no es ruido: es alguien que no entendió algo. Y un código ya dado de alta que vuelve a reportarse significa que hay teléfonos con el catálogo viejo.
Por eso reportar algo ya resuelto suma en su contador pero no reabre la tarea. La información se conserva sin volver a ocupar el tiempo de nadie.
Catálogo

Aquí es donde una empresa deja de usar los datos de ejemplo y carga los suyos: almacenes, ubicaciones y artículos con sus códigos de barras.
Entra con admin@demo.test o con superadmin@demo.test: ningún otro rol tiene catalogo.administrar, y con razón — quien captura movimientos no debería poder inventar un artículo para justificar un faltante.
Tres cosas que el formulario rechaza y conviene saber por qué:
- El SKU no admite las letras I, L, O ni U. En una etiqueta impresa y leída bajo mala luz,
L0TE1yLOTE1son el mismo garabato, y el error solo aparece cuando el inventario ya no cuadra. - El código de barras se comprueba con su dígito de control. Un EAN-13 mal tecleado se detecta al escribirlo, no meses después en un pasillo.
- El código de la ubicación tiene estructura (
LIM-A01-R01-N01-P01= almacén, pasillo, rack, nivel, posición). Eso es lo que permite ordenar una ruta de conteo para recorrer el almacén una sola vez.
Lo que des de alta aquí llega a los teléfonos en su próxima sincronización.
Compras

Proveedores y órdenes de compra. La orden no es un pedido de mercadería: es el documento contra el que se recibe.
Cada línea lleva el artículo, la cantidad y el costo pactado. Ese costo es el que valoriza la mercadería cuando entra, sin que nadie lo teclee en el almacén.
Abajo, las recepciones y cómo quedaron. Una marcada con_discrepancia es una que no cuadró con su orden.
Reposición

La única pantalla que mira hacia adelante. Todas las demás cuentan lo que pasó; esta propone gastar plata, y por eso dice siempre de dónde salió cada número.
Responde a una sola pregunta: ¿qué tengo que comprar hoy?
Cómo decide
Para cada artículo calcula el punto de pedido: el saldo por debajo del cual hay que volver a pedir.
punto de pedido = lo que se consume mientras llega el pedido + un colchón
Lo primero es aritmética: si salen 10 al día y el proveedor tarda 7, hacen falta 70 para no quedarse sin nada mientras viene.
El colchón cubre lo que esa cuenta no cubre: que la demanda de esos días sea mayor que el promedio. Y no es un número fijo. Dos artículos pueden vender exactamente lo mismo al mes y tener riesgos completamente distintos:
| Sale al día | Cómo sale | Colchón que necesita | |
|---|---|---|---|
| Estuches | 10 | 10 todos los días | pequeño |
| Armazones de gala | 10 | 0 casi siempre, 70 los sábados | grande |
Una regla del tipo «ten siempre dos semanas de stock» sobra en el primero e inmoviliza plata, y falta en el segundo, que se agota igual. Por eso el colchón se calcula con cuánto varía la demanda, no con su promedio.
La barra de Aguanta muestra eso mismo de un vistazo: la barra son los días de cobertura al ritmo actual y la marca vertical es lo que tarda en llegar el pedido. Si la marca cae fuera de la barra, el artículo se agota antes de que llegue lo que pidas hoy.
De dónde sale el plazo de entrega
Cada fila lo dice, porque no todos valen lo mismo:
- Medido — de tus compras cerradas: del día en que se emitió la orden al día en que se cerró la recepción. Es lo que de verdad tardó.
- Declarado — lo que el proveedor dice que tarda. Se usa mientras no haya compras que medir, y rara vez coincide con lo anterior.
- Supuesto — 14 días, cuando no hay ni lo uno ni lo otro.
Hacen falta al menos dos compras cerradas, y con demora real, para que el sistema se fíe de su propia medición. Una orden emitida y recibida el mismo día mediría un plazo de cero, y con plazo cero el punto de pedido también sería cero: el artículo dejaría de avisar para siempre.
Cuándo el sistema calla
Con menos de 14 días de movimientos registrados no estima nada y lo dice. El promedio de tres días puede ser cualquier cosa, y devolver un número igualmente sería peor que no devolverlo: alguien compraría contra él.
Por eso la pantalla separa «no hace falta comprar» de «no lo sé». Un punto de pedido en cero se leería como tranquilidad, y no es lo mismo.
La ventana tampoco se estira más allá de lo que la empresa lleva operando. Si registras movimientos desde hace tres semanas, el cálculo usa tres semanas —no noventa días con sesenta y nueve en blanco, que dividirían tu consumo entre tres.
Cuando tú sabes algo que los datos no
Fijar un mínimo a mano escribe una regla que gana sobre el cálculo: una promoción que arranca, un contrato que obliga a tener stock, un artículo nuevo sin historia. Requiere el permiso politica.editar, que hoy tienen el jefe de operaciones y el administrador.
Se fijan dos cosas: el punto de pedido («Pedir en») y el colchón. El consumo observado se sigue mostrando debajo, para que puedas contrastar tu criterio contra lo que dicen los datos. Y dejar vacío el punto de pedido borra la regla y devuelve el control al cálculo: sin esa salida, una regla escrita un día quedaría congelada para siempre y nadie recordaría por qué el sistema sugiere lo que sugiere.
Contabilidad

La pantalla del contador: cerrar el mes y ver el kardex. Van juntas porque cerrar sin poder mirar antes lo que se congela es firmar a ciegas.
Cerrar el mes
Sin cierre, alguien puede registrar hoy un movimiento con fecha de enero. El inventario de enero que se declaró deja de coincidir con lo que el sistema dice de enero, y nadie se entera hasta que alguien compara dos papeles.
Al cerrar, el saldo de cada artículo queda congelado y el mes deja de admitir movimientos. Cuatro reglas, y cada una evita un problema concreto:
| Regla | Qué evita |
|---|---|
| Solo se cierra un mes que ya terminó | Congelar movimientos que aún no han pasado. El operario que despacha esta tarde vería su trabajo rechazado sin saber por qué |
| Los meses se cierran en orden, sin huecos | Cerrar marzo con febrero abierto crea un mes que nadie volverá a cerrar: hacerlo después cambiaría el saldo inicial de un marzo ya declarado |
| No se cierra con entradas valorizadas a ojo | Congelar como definitivo un valor que el sistema mismo sabe que es una estimación |
| Se puede reabrir, pero solo el último | Reabrir enero teniendo marzo cerrado cambiaría el saldo de apertura de febrero bajo un marzo que ya se dio por bueno |
Las reaperturas quedan contadas y a la vista. Un mes reabierto tres veces es un número del que hay que desconfiar, y quien lo lea tiene derecho a saberlo.
El bloqueo vive en la base de datos, no solo en la aplicación. Un movimiento con fecha en un mes cerrado se rechaza aunque llegue por un script, una corrección a mano o un camino que todavía no existe. Si el control estuviera solo en la pantalla, el cierre sería una promesa.
El kardex
Para cada artículo: con cuánto abrió el mes, cada movimiento en orden con lo que entró y lo que salió —en unidades y en plata—, y con cuánto cerró.
saldo inicial + entradas − salidas = saldo final
Es exactamente lo que alguien va a comprobar con una calculadora. Si no cuadra, el kardex no sirve para nada, así que el saldo corre acumulado fila a fila.
Un traslado entre estantes aparece con sus dos piernas: la que sale de un estante y la que entra en el otro, cada una en su columna. Lo que se cancela es el saldo —el final no cambia y la identidad de arriba sigue cuadrando—, no la actividad: las columnas de entradas y salidas del mes cuentan también ese movimiento interno.
Se muestran las dos porque el movimiento ocurrió y hay que poder verlo. Pero si comparas «lo que entró este mes» con lo que compraste, recuerda que ahí dentro hay traslados: para medir consumo real, el cálculo de reposición sí agrupa por movimiento antes de sumar, y el kardex no.
Quién ve qué
- Ver el kardex no exige permiso especial, pero quien no tiene
costo.verlo recibe sin una sola cifra de dinero. Las columnas no vienen en cero: no vienen. Un cero significa «no vale nada», y el inventario parecería no valer nada. - Descargar el CSV exige
kardex.exportar, que solo tiene el contador. Mirar un dato lo deja donde estaba; bajarlo a un archivo lo saca del sistema, y a partir de ahí ningún control de aquí lo alcanza.
El CSV usa punto y coma y lleva BOM. Son los dos motivos por los que un contador devuelve un export diciendo que está mal: con comas, Excel en configuración peruana parte los decimales en dos columnas; sin BOM, «Armazón» sale roto.
Auditoría

Quién hizo qué, y quién lo revisó.
La bitácora registra también lo DENEGADO
Se anota todo lo que pasa por el bus, salga bien o salga mal, y la pantalla trae un filtro para quedarse solo con lo denegado. Ese es el evento que de verdad se audita: alguien pidiendo algo que no le tocaba. Un registro que solo guardara lo que salió bien no serviría para nada, porque justo lo que se busca es lo que no debía pasar.
Eso obliga a escribir fuera de la transacción del comando: dentro, el rechazo la revierte y se llevaría por delante su propia constancia.
No se puede editar ni borrar, ni desde la base de datos. Una bitácora que su propio administrador puede reescribir no prueba nada.
Si la bitácora falla, el comando no falla. El operario ya registró su movimiento y hacerle ver un error le haría repetirlo: se pierde una línea de auditoría, que es malo, frente a duplicar inventario, que es peor.
La firma de ajustes
Un ajuste es el único movimiento que crea o destruye inventario sin contrapartida en el mundo real. Alguien escribe que hay 3 donde el libro decía 5 y dos unidades desaparecen sin que nadie las haya comprado, vendido ni roto.
Por eso lo firma otra persona, y por eso un mes con ajustes sin firmar no se puede cerrar: cerrar congela el faltante como definitivo y el período deja de admitir cambios, así que la revisión que faltaba deja de ser posible.
Tres reglas:
- Nadie firma su propio ajuste. Ni el superadministrador, que tiene los diecinueve permisos. No es una casilla de la matriz de acceso: es un hecho sobre quién hizo qué. Si un rol pudiera saltárselo, bastaría con asignarse ese rol —que es exactamente lo que haría quien quiere saltárselo—.
- El contador no firma. Si además firmara, podría aprobar el ajuste que da de baja un faltante, sellar el período que lo congela y emitir el libro que lo reporta: el ciclo completo en una sola persona.
- Firmar exige decir qué se comprobó. Una firma sin motivo no es una revisión: es un clic.
Equipos

Desde qué teléfonos hay sesión abierta, de quién, y cuándo se vieron por última vez. Se les puede dar de baja con un motivo.
Dar de baja corta el par completo
Al entrar, el servidor entrega dos llaves: una de trabajo que dura un día y una de renovación que dura un mes. Las dos cuelgan del mismo equipo por una relación real en la base, no por su nombre —el nombre lo manda el teléfono y sería falsificable—.
Apagar solo una habría dejado el equipo «dado de baja» operando treinta días. Corta en la petición siguiente, no cuando caduque.
Lo que NO hace
No bloquea a la persona. Quien conserva su contraseña vuelve a entrar y obtiene un equipo nuevo. Para bloquear a alguien se da de baja la cuenta, en Usuarios.
Son dos decisiones distintas y la pantalla lo dice, porque confundirlas deja a alguien creyendo que cerró una puerta que sigue abierta.
Tres detalles que importan
- Salir desde la app no exige permiso. Ese botón cierra la sesión del equipo en el que estás, y quien trabaja en uno compartido tiene que poder salir al terminar el turno sin depender de nadie. Dar de baja un equipo desde esta pantalla es otra cosa y sí exige
dispositivo.revocar, sea el equipo tuyo o de otro. - Quien no puede revocar equipos ajenos ve solo los suyos, y no recibe un «no tienes permiso». La lista de la flota ya es información: quién trabaja, desde cuántos equipos y cuándo se vio cada uno.
- Un equipo de otra empresa responde «no existe», nunca «no puedes». Un «no puedes» confirmaría que ese identificador es real, y la pantalla se convertiría en un buscador de la flota ajena.
- Los equipos dados de baja no se borran. Su identificador queda sellado en cada movimiento que registraron, y tiene que seguir resolviendo un nombre dentro de un año.
Desde el teléfono
La app tiene su propio botón Salir, y ese sí corta las llaves de su propio equipo sin pedir permiso a nadie. Tampoco cierra a la primera si quedan capturas sin subir: está contado arriba, en «12. Salir».
Usuarios

Crear cuentas con sus roles y sus almacenes, cambiarlos, dar de baja y rehabilitar.
La contraseña inicial la escribes tú, así que la conoces. La cuenta nace marcada para que su dueño la cambie al entrar; hasta entonces podrías operar en su nombre y el libro lo registraría a él.
Y hoy esa marca es solo una etiqueta. El cambio de contraseña existe en la API (POST /api/v1/auth/password), pero ninguna pantalla lo ofrece todavía —ni el panel ni la app— y nada obliga a hacerlo para seguir operando. Mientras eso no exista, quien crea la cuenta sigue sabiendo la clave con la que su dueño firma cada movimiento, así que conviene tratar la lista de cuentas creadas como lo que es: una lista de identidades prestadas.
Tres cosas que el sistema no te deja hacer, y conviene saber por qué:
- Darte de baja a ti mismo. Si eres el único administrador, no quedaría nadie que pudiera rehabilitarte.
- Quitarte a ti mismo el permiso de administrar cuentas. Mismo problema por otra puerta.
- Borrar a alguien. Cada movimiento del libro lleva quién lo registró; borrar la cuenta dejaría asientos firmados por alguien que ya no existe. Se da de baja, y deja de operar de inmediato aunque su teléfono tenga sesión abierta.
Bandeja de conteo (en el menú, Conteos)

Aquí el supervisor cierra los conteos que el operario dejó hechos. Al cerrar, el servidor reconstruye el libro al instante del conteo, compara y decide: lo que cabe en la tolerancia se ajusta solo, lo que la supera escala a esta bandeja.
Solo llegan las diferencias que no explican los movimientos y que superan la tolerancia de su clase ABC.
Las pequeñas se ajustan solas y quedan registradas en el libro. Si llegara todo, el supervisor revisaría todo en vez de excepciones, y a las dos semanas estaría resolviendo en masa sin mirar.
El ciclo completo, probado
Esto no es una descripción: es lo que se verificó contra el servidor de producción.
| Paso | Qué pasó |
|---|---|
Crear GTAS30 en el panel |
Con el código de barras 7501031311309 |
| Escanearlo en la app | Respondió «GTAS30 · Gotas humectantes 30ml» |
| Orden de 40 armazones a S/ 118 | Registrada en el panel |
| Recibir en el teléfono, sin ver la orden | Se contaron 38 |
| Al cerrar | «1 discrepancia» · mercadería en cuarentena |
| La orden | Quedó parcial, con 38 de 40 recibidos |
| El costo | La capa entró a S/ 118, el pactado — no al promedio |
| Contar una ubicación a ciegas | La diferencia superó la tolerancia y escaló a la bandeja |
| Crear una cuenta y entrar con ella | Entró con la contraseña inicial. Cambiarla desde una pantalla todavía no se puede: ver abajo |
Lo que todavía no existe
Tres cosas, y conviene saber cuáles son antes de contar con ellas.
El aviso de reposición
El cálculo está entero —punto de pedido, colchón, plazo medido— y tiene su pantalla. Lo que no hay es que el sistema avise por su cuenta cuando un artículo cae por debajo de su punto de pedido: no existe ningún correo ni ninguna notificación en el código. Hay que entrar a Reposición a mirarlo.
Es la diferencia entre una herramienta que se consulta y una que interrumpe, y mientras no exista conviene mirar esa pantalla con la misma rutina con la que se mira el tablero: un punto de pedido que nadie lee no evita ninguna rotura de stock.
La pantalla para cambiar la contraseña
La API la tiene (POST /api/v1/auth/password) y la cuenta nace marcada para que su dueño la cambie, pero ni el panel ni la app ofrecen todavía dónde hacerlo, y la marca no bloquea el acceso mientras tanto. Es lo primero que hay que cerrar antes de dar cuentas a gente que no sea del equipo que instala.
El lector UHF por Bluetooth
Para leer RFID en volumen.
Lo que va detrás ya está: el sistema decodifica el EPC de una etiqueta UHF a su artículo y número de serie —está en el núcleo, con pruebas— y la cadena de resolución lo tiene enganchado. Lo que falta es el puente hasta el aparato.
Y falta a propósito. Un lector RFID de mano no se comporta como un teclado: habla por su propio canal y cada fabricante —Zebra, Chainway, Honeywell, CipherLab— tiene su SDK, que no son intercambiables. Escribir el puente para un lector imaginario significaría rehacerlo el día que llegue el real. Con la marca y el modelo delante son unas horas.
A la pistola láser Bluetooth clásica le falta menos, pero también le falta. Se empareja como un teclado y lo que dispare cae en el campo «o escribe el código», que identifica igual que la cámara; lo que no hay es el disparo redondo: todavía hay que pulsar «Buscar», porque nada envía la lectura al terminar la ráfaga. La regla que separa una ráfaga de lector de una persona escribiendo —un lector emite cada pocos milisegundos, una persona tarda decenas— está escrita y probada, pero ninguna pantalla la usa aún.
Un aviso para cuando llegue el UHF: lee todo lo que tiene delante, incluidos los estantes de al lado. La parte difícil no será leer las etiquetas sino decidir cuáles cuentan, y eso conviene diseñarlo con el almacén real delante.