← Acopio

Novedades

Cada cambio que llega a tu instalación, del más reciente al más antiguo. El soporte y las actualizaciones son la misma suscripción: cuando algo de aquí sale, ya lo tienes.

Septiembre 2026

Etiquetas que imprimes al recibir, en papel térmico de 4×6. Las entregas dispuestas como una semana en vez de como una lista, y marcar una como llegada ahora te llena su entrada. Un reporte que llega solo cada tarde. Manage Users rehecho para que se lea como la tabla de movimientos. Y dos tandas largas de trabajo sobre las mismas dos preguntas: cuando varias personas usan la app a la vez, ¿ven todas el mismo almacén — y cuando le das a guardar, ¿la pantalla cambia ahora o en once segundos? Borrar trece movimientos pasó de unos dos minutos y medio a cincuenta y cinco segundos por el camino.

v12.74 Nuevo

Escanear sí se puede — con una foto

Abre Scan label y pulsa «Take a photo of the label». Se abre la cámara del teléfono, haces la foto, y la app lee el código de ahí.

Lo que Google bloquea dentro de esta app es el visor en vivo. Una foto es otra cosa: la app no pide tu cámara, pide un archivo, y de la cámara se encarga el teléfono —exactamente como la app lleva meses haciendo fotos a los documentos—. Ésa fue la pista, y vino de la bodega, no de nosotros.

Lo de después no cambia: la app ofrece qué puedes hacer con esa etiqueta, rellena el formulario, y sigue sin guardar nada por su cuenta.

Y el punto de conexión deja de robar toques. Tenía un área invisible de 44 píxeles dibujada alrededor de un punto de 10, y en pantalla estrecha se superponía a las pestañas de al lado. El mismo punto y el mismo objetivo, pero ahora el sitio está reservado en vez de robado.

v12.73 Arreglo

Por qué no se abre la cámara, dicho claro

Escanear abría un recuadro negro que pedía apuntar la cámara a una etiqueta. No podía funcionar nunca, y el motivo no está en nuestro código: Google sirve esta app dentro de un marco que pertenece a otro sitio, y desde Chrome 64 un marco así no tiene cámara salvo que la página que lo rodea se la conceda. Esa página es de Google. Nada que tú o la app podáis hacer desde esa pantalla lo cambia.

El navegador ni siquiera llegó a pedir permiso de cámara —por eso parecía un problema del teléfono—. No lo era.

Ahora la app pregunta si la cámara está permitida antes de abrir nada. Donde está bloqueada, el botón no aparece y el mensaje dice qué es lo que estorba, en vez de mandarte a pelear con los ajustes del teléfono por un permiso que no iba a servir de nada.

El lector en sí —leer el código, decidir el movimiento, rellenar el formulario sin guardar— está hecho y funciona. Lo que necesita es otra puerta de entrada, y ése es el siguiente trabajo.

v12.72 Nuevo

Qué sobró, de qué obra, y dónde acabó

El material que vuelve de una obra y se usa en otra no es desperdicio ni es un traslado. Es material ya pagado que se va a otro sitio. Hasta ahora la app no tenía cómo decirlo: la devolución pedía el origen como texto libre en una casilla de ubicación, así que la respuesta existía y ningún informe podía agruparla.

Ahora la devolución pregunta de qué proyecto vuelve, de la lista de proyectos. Sobre esa única respuesta se construye todo lo demás.

Las sobras aparecen bajo el material en la tabla de existencias —28 left over from BLACK HOUSE 2— y el material sigue siendo lo que era. Un window screen que vuelve de una obra sigue siendo un window screen, así que tus existencias no se parten en dos y los totales siguen cuadrando.

Al mandar sobras a otra obra, la app las ofrece y dice cuántas hay disponibles antes de que escribas una cantidad. El movimiento se lee entonces en los dos sentidos: a qué proyecto fue, y de qué obra había sobrado. Qué sobró de dónde y dónde se usó son ya la misma fila leída por dos columnas.

Y nada se cuenta dos veces: una devolución no es una compra, así que el valor de tu inventario no se infla cuando el material vuelve a casa.

v12.71 Interfaz

Escanear desde donde se trabaja, y un aviso que cumple lo que dice

Scan label está ahora junto a Entry y Exit. Vivía sólo en el menú de la cuenta, que son dos toques y un objetivo pequeño para un dedo con guante —y los dos botones a los que lleva estaban en otra pantalla—. Escanear acaba siempre en una entrada o una salida, así que su sitio es ese. Sigue también en el menú de la cuenta.

En un ordenador sin cámara el botón no aparece, en vez de quedarse ahí sin poder hacer nada, y tampoco sale para las cuentas de sólo lectura: un atajo a un formulario que no se puede enviar es un camino que acaba en una puerta cerrada.

Y el aviso verde ya no se va antes que tus datos

Decía «back online» y desaparecía a los seis segundos —mientras los datos nuevos venían todavía a diez o veinte segundos de distancia—. Quien lo leía daba por buenas las cifras que tenía delante. No lo eran.

Ahora dice Updating y se queda hasta que las cifras nuevas están de verdad en pantalla. Sólo entonces dice que los datos están al día, y sólo entonces empieza a contar para irse. Si los datos no llegan nunca, sigue diciendo Updating, porque es lo que es verdad.

El aviso de sin conexión pasa a dos líneas —qué ha pasado arriba, qué hacer debajo— porque esas dos cosas no se leen en el mismo momento. La primera se lee desde el otro lado de la nave; la segunda sólo si la primera te hizo parar.

v12.70 Nuevo

Escanear una etiqueta con la cámara del teléfono

Scan está en el menú de la cuenta. Apunta la cámara a una etiqueta —la de un bulto o la de un estante— y la app ofrece lo que se puede hacer con ella: sacar ese material, moverlo, o ver todo lo que hay en ese estante. Escanea un bulto y un estante y ofrece el movimiento con el destino ya puesto.

Escanear no guarda nada por su cuenta. Rellena el formulario y ahí se para, para que lo leas y le des a guardar como siempre. Una cámara que se puede apuntar a la etiqueta equivocada sin querer no tiene por qué escribir sola en tu hoja.

Usa el lector de códigos del propio teléfono cuando lo hay y lee la imagen por su cuenta cuando no. Un código a la vez, no dos: con dos códigos en el mismo fotograma el lector de reserva no devuelve nada, así que la app los pide uno detrás de otro —lo que además le permite decirte cuál acaba de leer—.

Y cuando la app no arranca, ahora lo dice

Una pantalla de carga que espera para siempre es peor que un error. El 14 de octubre las dos instalaciones de Jose se quedaron en «Connecting to your spreadsheet…» y no dijeron nada más, en todos los ordenadores y todos los teléfonos. El servidor estuvo perfecto todo el rato: todas las ejecuciones completadas, y a los datos no les pasó nada.

La app ya tenía tres protecciones para exactamente esto, y las tres estaban escritas DENTRO del mismo bloque de código al que protegían. Un bloque que no compila no ejecuta ni una línea —ni la primera, ni la última—, así que se cayeron junto con lo que vigilaban y la pantalla de carga se quedó puesta diciendo conectando cuando quería decir me morí antes de empezar.

Ahora hay un vigilante pequeño y aparte que no se puede caer con el resto. A los ocho segundos sin señales de vida cambia el mensaje de carga por lo que ha pasado de verdad y qué hacer —y distingue las dos causas, porque las soluciones no se parecen en nada—: esta copia de la app no arrancó (vuelve a pegar el archivo, entero) o no se pudo llegar a Google (mira la conexión; a tus datos no les pasa nada). En los dos casos hay un botón de recargar en vez de una pantalla que espera sin fin.

Con ello se cerraron dos agujeros más de la misma clase: las gráficas se bajan de los servidores de Google, y si esa descarga fallaba se llevaba la app entera por delante —ahora sólo te quedas sin gráficas y el almacén sigue ahí—. Y abrir la app gastaba tres de sus propios topes por visita en vez de uno, lo que en una mañana movida podía hacer desaparecer la lista de entrantes sin explicar por qué.

v12.69 Interfaz

El aviso de sin conexión deja de empujar la app

Lo que estaba mal nunca fue el color. Los avisos rojo y verde de conexión ocupaban sitio arriba, así que la app entera saltaba hacia abajo al aparecer uno y volvía a subir al irse —dos veces en cinco segundos, por un mensaje que no te pide nada—. Ahora flotan por encima, como una píldora redondeada, y no se mueve nada.

Y lo que hay debajo se sigue pudiendo pulsar, que es la parte que importa. Una versión anterior de esta app ya puso el aviso a flotar y en un teléfono se comía la barra de navegación entera: las pestañas y el botón de la cuenta quedaban debajo y no se podían pulsar. Lo que lo arregla no es la posición, es que el aviso no intercepta el dedo en absoluto.

El aviso de que tus dos archivos no coinciden sigue ocupando su sitio, a propósito. Ése puede vivir meses y es la única señal de que se pegó media actualización: no puede taparse ni perderse.

v12.68 Nuevo

Etiquetas para tus estantes, no sólo para el material

Marca una ubicación, varias o todas en Ajustes → Locations, e imprime sus etiquetas. Tres por hoja, y te dice cuántas hojas son antes de imprimir —sesenta racks son veinte hojas, y el papel térmico viene en rollo y no vuelve.

No se parecen en nada a una etiqueta de material, y es a propósito. Éstas son apaisadas; las de material son verticales. Se distinguen desde el otro lado de la bodega sin leer una palabra, porque dos pegatinas blancas con un código acaban pegadas donde no van tarde o temprano.

Una etiqueta de rack lleva el nombre y el código, y nada más. Ni cantidad, ni fecha, ni PO. Se pega una vez y vive años, así que cualquier cosa que pueda caducar sería una etiqueta que miente mañana —justo lo contrario que la de material, donde lo importante es qué había en ese bulto ese día.

La hoja se dibuja en fracciones de la página y no en milímetros, así que llena el papel que le dé la impresora. Eso importa en el teléfono, donde algunos servicios de impresión ofrecen un solo tamaño de papel y luego encogen la página para meterla en la pegatina: en milímetros, la etiqueta se encogería dos veces y saldría diminuta.

v12.67 Arreglo

La ventana de impresión te dice el tamaño de papel

Una etiqueta que sale del tamaño correcto en medio de una hoja enorme no es un problema de impresión. Es un desplegable. El cuadro de impresión de Android suele abrirse en ISO A4, y como la etiqueta se dibuja a sus 4×6 pulgadas de verdad, lo que sale es una etiqueta correcta rodeada de papel desperdiciado. Ni la app ni Chrome estaban haciendo nada mal, y no había nada en pantalla que lo dijera.

La ventana de impresión dice ahora la medida antes de gastar una hoja —y en el teléfono dice además dónde cambiarla, porque es ahí donde el cuadro se pone en A4 y es ahí donde se gasta el papel.

v12.66 Nuevo

Cada etiqueta lleva ya su código QR

El recuadro de puntos que decía «QR / barcode» es ahora un código de verdad. Se genera dentro de la propia app —no se llama a ningún servicio, nada de tus materiales sale de tu instalación, y funciona con el wifi caído—. Una bodega también imprime etiquetas el día que no hay internet.

El código es NUESTRO, no del fabricante del material, y eso es lo que lo hace útil desde el primer día: nadie tiene que etiquetar lo que llega de fábrica, ni hace falta que exista un código de barras del producto. Lleva lo que la app ya sabe del bulto —categoría, material, estante y el movimiento del que viene.

Leerlo con la cámara del teléfono, para rellenar un material en una salida, es el paso siguiente. El código que se imprime hoy será el que se lea entonces: su primera línea es la versión del formato, así que una etiqueta pegada a un estante dentro de dos años se seguirá sabiendo leer.

v12.65 Nuevo

La app por fin te cuenta lo que cambió

Escribíamos dos notas por versión, publicábamos las dos, y dentro de la app no había ni un enlace que llevara a ellas. Un cliente no tenía forma de enterarse de lo que había mejorado salvo preguntando. Ahora, la primera vez que abres Acopio después de una actualización, una ventana te cuenta lo que cambió —y no vuelve a enseñarte esa versión nunca más.

Enseña el antes y el después de verdad, no un dibujo decorativo: la frase que salía antes y la que sale ahora, sacadas de la misma entrada que el texto, para que las dos no puedan separarse con el tiempo.

Se puede cerrar, y cerrarla no cuesta nada —que es justamente el objetivo—. Vive para siempre en el menú de la cuenta, bajo What's new, con un punto en tu círculo cuando hay algo sin leer. Un aviso que no se puede recuperar te obliga a leerlo; uno que sí, se puede cerrar tranquilo. Dentro de la app se guardan cuatro versiones, así que funciona sin internet y nadie tiene que salir para enterarse; el enlace a la nota entera está para quien lo quiera, y apunta sólo a esa versión.

Si renombraste el producto, ni el enlace ni el correo de soporte aparecen. Una app que ya no se llama Acopio no debería estar contándole a tu equipo de dónde salió.

v12.64 Arreglo

Una ubicación que no existe ahora lo dice mientras escribes

Escribías un estante que no está en tu bodega y la app no decía nada —ni al escribirlo, ni al poner la cantidad, ni siquiera cuando componía el correo de aviso nombrando ese estante—. Todo el formulario se comportaba como si el sitio fuera real, hasta el segundo en que pulsabas guardar. Ahora el campo lo dice en cuanto sales de él, propone la que probablemente querías (A1p → A1A) y ofrece crearla si tienes permiso. No bloquea guardar en ningún momento: la lista que tiene tu navegador puede llevar unos segundos de retraso, así que la última palabra sigue siendo del servidor.

Y cuando por fin se quejaba, se quejaba en código. Lo que salía era Error: UNKNOWN_LOCATION|P|B en una barra roja que desaparecía a los seis segundos. Eso parece que la app se rompió. No se había roto: rechazó bien y lo contó fatal. La app marca ciertos rechazos para que la pantalla pueda ofrecer una salida en vez de enseñar texto rojo —pero ese manejo estaba escrito tres veces, una por cada camino de guardado, y sólo uno de los tres lo tenía entero. La entrada con varios materiales, que es la que más se usa, tenía la lista más corta. Ahora está escrito una vez y los tres lo usan.

La explicación ya estaba en el código, palabra por palabra: «el día que el servidor marque un error de entrada, el usuario leerá SYSTEM_BUSY| en su pantalla». Llegó el día. No fue SYSTEM_BUSY.

v12.63 Seguridad

Seis puertas que miraban quién eres pero no cuántas veces llamas

Seis puertas de la app tenían cerradura y no tenían tope. Seis funciones —leer los entrantes, darlos de alta, cambiarlos, borrarlos, leer los materiales vigilados y preguntar si la instalación está configurada— comprobaban identidad bien pero no contaban llamadas, mientras las dos más pesadas sí lo hacían. Ninguna dejaba hacer nada indebido. Lo que dejaban hacer es agotar la cuota diaria de Google de la instalación, y eso deja la app muerta para todos hasta el día siguiente. Una pestaña olvidada reintentando en bucle podía conseguirlo sin querer.

Las seis tienen ya su techo, y cada número está dos órdenes de magnitud por encima del uso real medido: tiene que estorbar a un bucle, nunca a una persona. Las tres que escriben comparten un solo contador, para que alternarlas no triplique el cupo. El contador es por persona, para que una pestaña atascada no deje fuera a la bodega entera. Y el tope va después de la comprobación de identidad, para que a un desconocido se le siga diciendo que no está identificado y no que vuelva más tarde.

v12.63 Arreglo

El «+ Add it» deja de irse para siempre

Escribías un proyecto nuevo, volvías a pinchar en el casillero, y la opción de añadirlo desaparecía para siempre. No tardaba en volver: no volvía. Pinchar en el campo quitaba el cartel (correcto: mientras editas, estaría hablando de un valor que ya no es el que hay), pero lo único que podía reponerlo dispara cuando el texto cambia. Sales del casillero sin tocar una letra y no dispara nada. Y ya no volvería a disparar nunca.

Lo que lo hacía confuso es que la tarjeta de la esquina sí se quedaba, así que la app ofrecía el proyecto en un sitio y en el otro no, y parecía que se había creado a medias. Ahora el cartel se vuelve a mirar cada vez que sales del campo, haya cambiado el texto o no.

v12.62 Interfaz

La misma etiqueta deja de parecer dos etiquetas

«Arrived» es una etiqueta, y estaba dibujada de dos maneras. En la tabla de entrantes su cápsula verde llevaba un relleno; dentro del popup de la mañana, la misma etiqueta llevaba otro. Nada en la app obligaba a que coincidieran, así que no coincidían. Veinte reglas dibujan esa misma cosa —una palabra corta o una cifra dentro de una cápsula de color— y entre las veinte había catorce rellenos distintos, diez tamaños de letra y seis radios. Ahora hay una cápsula. El popup de la mañana sigue con la letra más grande, porque se lee de más lejos, pero la cápsula de alrededor es la misma que en todas partes.

Los radios salieron gratis. Estas cápsulas miden entre 16 y 22 píxeles de alto, y cualquier radio por encima de 10 ya las redondea del todo —así que 10, 16, 20 y 999 se veían igual—. Cuatro valores pasaron a ser uno y no se movió un píxel. Las tres que siguen cuadradas lo siguen a propósito: son contadores, no etiquetas, y es así como se distinguen de un vistazo.

Y la línea pequeña debajo de la grande. Catorce sitios ponen una segunda línea discreta bajo un título —una fecha bajo un nombre, un correo bajo un usuario, una nota bajo una tarjeta— con tres huecos distintos. Un trabajo, un hueco.

Y por debajo, el espaciado tiene escala. 697 rellenos, márgenes y huecos con 57 longitudes distintas entre ellos, y la misma enfermedad que tenían los tamaños de letra: entre 4,8 y 12 píxeles había diez valores usados treinta veces o más cada uno, separados ocho décimas de píxel. Nadie puede ver ocho décimas de píxel. Esta versión convierte sólo las 355 declaraciones que caen exactas en un peldaño, así que no se mueve nada —comprobado en un navegador de verdad: 504 reglas resueltas antes y después, cero diferencias—. Las que sí se moverían quedan contadas y anotadas para la siguiente.

Cambio visible en total: veinte cápsulas cuyo relleno de los lados se mueve como mucho dos píxeles, a cambio de que por fin coincidan todas.

v12.61 Interfaz

Cuatro alturas en vez de cuarenta y cinco sombras

Cada panel, tarjeta y menú que se levanta de la página tenía su propia sombra escrita a mano. Cuarenta y cinco distintas para sesenta y un sitios —casi una sombra a medida por uso—. Ninguna estaba mal por sí sola; lo que estaba mal es que dos tarjetas una al lado de la otra podían flotar a alturas visiblemente distintas sin que nadie lo hubiera decidido. Ahora hay cuatro alturas —apoyado en la página, flotando sobre ella, panel, y encima de todo— y los pasos entre ellas son proporcionales, porque el ojo lee el difuminado como una razón y no como una cuenta de píxeles.

Los anillos de foco resultaron ser un segundo sistema vestido con la ropa del primero. El anillo alrededor del campo en el que escribes se escribe igual que una sombra, pero no tiene difuminado y no es altura: dice cuál está seleccionado. Separarlos dejó cuatro anillos —neutro, bueno, malo y aviso— para que una fila seleccionada se vea igual en cualquier pantalla.

Veintiuna sombras se quedan fuera del sistema, cada una por un motivo escrito: las tres teñidas con el azul de la marca (una sombra teñida parece el mismo material; una negra parece cinta adhesiva), la que proyecta de lado porque el cajón entra desde el borde, las pequeñas y nítidas de los controles, las interiores, y los fotogramas de los pulsos animados. Quedan anotadas como excepciones en vez de quedarse como sobras.

Nada se movió, nada cambió de tamaño, ninguna pantalla cambió de forma. Si parece que no pasó nada, eso es el resultado.

v12.60 Arreglo

Las fotos dejan de llegar de lado, y un PO deja de ser dos POs

Las fotos se subían giradas, y eso causaba dos quejas que parecían distintas. Un teléfono casi nunca gira los píxeles al hacer una foto: guarda el mapa de bits apaisado tal como salió del sensor y le pega una marca que dice «gírala 90°». Google Docs ignora esa marca — así que la foto entraba al PDF de lado, y una foto de lado en una hoja vertical llena el ancho y deja el fondo en blanco. Una causa, dos síntomas. Ahora se enderezan en el navegador antes de subirlas, lo que arregla el PDF, la vista previa y la miniatura del estante a la vez.

La vista previa cortaba la parte de arriba del documento. La cabecera no tenía la culpa: centrar algo más alto que su caja empuja su principio fuera del alcance, y la barra de scroll no puede volver ahí. Ahora centra mientras cabe y deja de centrar cuando no.

«Amsco» un día y «AMSCO» otro dejaban dos proveedores donde hay uno. La categoría, el nombre y el proyecto ya se guardaban de una sola forma; el PO, el GC, el proveedor y el recibido-por, no. Ahora sí. Los guiones sobreviven — un PO como 07-6329 sigue siendo 07-6329. Lo ya guardado no se toca.

v12.59 Arreglo

Tres respuestas que no eran verdad

La app culpaba a un compañero que no existía. Sueltas una reserva, vuelves a pulsar Release, y decía «someone else got there first». No había nadie más — la habías soltado tú, segundos antes. Lo único que el código sabía es que ya no estaba activa; quién la soltó era una suposición. Ahora lee la columna UnlockedBy que llevaba ahí desde el principio y dice «la soltaste tú», o nombra a la persona, o simplemente dice que ya estaba suelta. Sin acusar a nadie por descarte.

Buscar decía «no hay nada» sin mirar en el archivo. Buscas un PO del año pasado y la única conclusión posible era que no existe. Sobre un sistema de inventario eso es peor que un error: es una respuesta falsa con cara de respuesta buena. Ahora dice que el archivo no se ha buscado y ofrece un botón para hacerlo.

Fusionar dos ubicaciones dejaba atrás las reservas y las fotos. Reescribía el archivo y la lista de ubicaciones —todo lo que se ve— y dejaba los candados y las fotos apuntando a un estante que ya no existe. Material apartado en un estante que el mapa no enseña, y fotos que el estante superviviente nunca hereda. Ahora se mueven los dos.

v12.58 Arreglo

Cuatro cosas encontradas grabando la app en un teléfono

No se podía leer qué estabas sacando. En el cajón del estante los nombres salían como «P…», «L…», «KA…». La causa era una línea: el nombre era lo único de la fila con permiso para encogerse, así que se encogía hasta desaparecer mientras el botón de reservar conservaba todo su ancho. Y ésa es la pantalla desde la que se pulsa Exit — salía material del almacén con el nombre ilegible. En pantalla estrecha el nombre ocupa ahora su propia línea entera.

El teclado tapaba el botón de guardar. La barra fija ya existía; el fallo era 90vh, que en Android no encoge cuando sale el teclado. La ventana seguía midiendo la pantalla completa y su barra quedaba debajo del teclado. Lo arregla una letra: dvh.

Las tarjetas entraban de dos formas y salían de una. Ahora entran de una sola, y salen de dos maneras que significan cosas distintas: la que aceptas sigue de largo hacia la izquierda, hacia dentro de la app — la que descartas se desvanece en su sitio. Moverse quiere decir que algo pasó; no moverse, que no pasó nada.

Pulsar una segunda tarjeta cancelaba el progreso de la primera. Registrar un proyecto redibujaba el mazo entero, lo que borraba el «Adding…» de cualquier tarjeta que siguiera trabajando — y permitía mandar la misma dos veces al servidor. Ahora el redibujo espera a que no quede ninguna en vuelo, y una línea abajo a la izquierda las va contando.

Y en el teléfono la cabecera se encoge al bajar, devolviendo cerca de un tercio de la pantalla, y vuelve al subir.

v12.57 Interfaz

El Delete ya es rojo, y exactamente del mismo tamaño

El botón Delete de Movements y de Manage Users era gris, igual que Edit y Labels a su lado. El único botón de esa barra que destruye algo se veía igual que los que no. Ahora es rojo.

Medido antes y después, porque «ponlo rojo» resultó no ser gratis: .btn-ghost lleva un borde de 1px y .btn-danger no llevaba ninguno, así que recolorearlo sin más lo habría dejado 2px más bajo y 2px más estrecho que los de al lado. Ahora lleva un borde transparente del mismo grosor, así que la caja es idéntica — 44×76 en pantalla táctil, 26×76 con ratón, antes y después.

Eso además alinea todos los demás botones rojos de la app con los grises que tienen al lado. Estaban 2px desparejos en cada barra donde conviven.

v12.56 Interfaz

Tablas: dos densidades de fila en vez de ocho casi iguales

Segunda tanda de la estandarización. Ocho reglas ponían el espaciado de una celda y entre ellas traían ocho valores distintos — pero al mirarlos no eran ocho decisiones. Eran dos que nadie había nombrado: la tabla normal y las compactas, con medio píxel de ruido alrededor de cada una.

El espaciado de celda es lo único de esta tanda que cambia algo que se ve: fija la altura de la fila, y con ella cuántas filas caben en la pantalla. Por eso los dos valores se eligieron para que nada se mueva más de 0,8 píxeles por lado, no para que salieran redondos.

Los tamaños de letra y las alturas de línea de las tablas salen ya de la misma escala que los botones. Lo que más se movió fue un tercio de píxel.

v12.55 Interfaz

Botones: una sola forma, y los de borrar al tamaño del dedo

La app tenía 147 reglas de botón y entre ellas 26 espaciados distintos, 9 radios de esquina y 16 tamaños de letra, mezclando unidades para lo mismo. Nadie decidió eso: se fue acumulando, una decisión razonable cada vez.

Y al medirlo apareció algo que no esperábamos: la app ya tenía los tokens de diseño escritos. --radius y --shadow llevaban versiones ahí. Los de color sí se usaban —--border en 135 sitios—; los de forma no: --radius aparecía en 5 de 224 esquinas. No faltaba un sistema. Faltaba usarlo.

Ahora los botones comparten un radio y una escala de trece tamaños. Los tres tamaños más usados de la app no se movieron ni un píxel, así que las pantallas se ven igual.

Y un cambio que no es de aspecto. Las alturas eran 34, 36, 38, 40 y 44 píxeles. El mínimo para que un dedo acierte son 44. Todo lo que borra algo mide ahora 44 en pantalla táctil, aunque esté dentro de una fila de tabla: fallar en «Edit» cuesta un toque más, fallar en «Delete» destruye algo, y el mismo tamaño para los dos era la decisión equivocada. Los demás botones de fila se quedan compactos, porque subirlos todos duplicaría la altura de cada fila.

v12.54 Datos

Cinco cosas calladas de la hoja, ahora vigiladas

El total ya tiene quien lo mire. Total Cost es Qty × Unit Cost, siempre, y era la única columna calculada que nadie vigilaba. Si alguien corregía un precio unitario a mano, el total se quedaba con el número viejo para siempre: quien suma esa columna —que es contabilidad— sumaba un número que ya no era verdad. Ahora se recalcula en cada reconstrucción y la corrección se anota con el número de fila, para poder ir a mirarla. Las filas sin coste unitario no se tocan: ahí el total vacío es deliberado, y un cero inventado en la columna de contabilidad sería un dato falso.

Cinco columnas que se escribían y no leía nadie se han ido. Dos no eran ni datos —Location_Type llevaba la palabra RACK en todas las filas, y Status llevaba “At Site” en todas—. Las otras tres llevaban la misma hora repetida una vez por material: con 400 materiales, el mismo minuto 400 veces. Nada fuera de la app lee esas hojas, y se reescriben enteras en cada guardado, así que no había nada que migrar.

CONFIG ahora dice lo que está ignorando. Dos de sus columnas —Admin Email y Archive Cutoff Months— son ajustes únicos que sólo se leen de la fila 2, en una hoja donde todas las demás columnas son listas que crecen hacia abajo. Escribir un segundo correo de administrador debajo del primero no hacía nada, y nada lo decía. Check this installation ahora nombra la columna, los números de fila y cuál es el valor que de verdad está en uso.

La pestaña RESERVATIONS deja de desinformar. Está vacía porque no la usa nada —las reservas viven en MATERIAL_LOCKS—, pero su propia nota decía que se “reconstruye desde el archivo y lo editado a mano se sobreescribe”. Ninguna de las dos cosas es verdad, y quien la abriera sólo podía concluir que la app le había borrado sus reservas. La pestaña se queda, por si alguna instalación antigua dejó datos ahí; la nota ahora dice lo que pasa.

Dos nombres de columna de AUDIT_LOG describían algo que no estaba ahí. Old Value y New Value: de los 56 sitios que escriben en el registro, 19 dejan las dos vacías y 17 llenan una con contexto en vez de con un valor anterior. Leído desde la hoja, eso parece un registro roto. Ahora son Detail 2 y Detail 3. No se movió ni una entrada —sólo el nombre, y sólo donde seguía diciendo las palabras viejas—.

v12.53 Interfaz

Usuarios: sin botones hasta elegir a alguien, y una advertencia que se lee

Editar, Borrar y Desactivar estaban ahí en gris, hubiera o no un usuario marcado. No actúan sobre la pantalla —actúan sobre una fila—, así que sin fila marcada no es que no estén disponibles: es que no hay nada sobre lo que puedan actuar. Ahora aparecen al marcar a alguien, y el que sale es Desactivar o Reactivar según cómo esté esa persona. Add User se queda, porque es el botón que crea la primera fila.

La advertencia de borrar eran tres viñetas y un párrafo final —y eso no se lee, se salta—. Ahora es una frase que nombra a la persona y dice qué pasa y qué no. El resto queda plegado tras una ⓘ: disponible para quien dude y fuera del camino de quien no.

Y las ventanas de confirmación llevan una ✕ en la esquina, que es donde la gente la busca. El botón seguro se queda igualmente: en una ventana que destruye algo, la salida segura no puede ser más pequeña ni estar más lejos que la peligrosa.

v12.52 Arreglo

Iniciar sesión podía devolverte a una copia de la app que ya no contesta

Pulsas Sign in with Google, se abre la ventana, eliges tu cuenta —y la ventana muere con un error de Google Drive mientras la página espera cuatro minutos para decir «Timed out. Please try again.». Volver a intentarlo hace exactamente lo mismo.

La dirección de vuelta se guarda, y puede acabar apuntando a un despliegue más viejo de la app: pasa al copiar la hoja, al crear un despliegue nuevo en vez de actualizar el que había, y al cambiar el proyecto de Cloud. Nada la comparó nunca con la app que de verdad está corriendo.

Ahora la página las compara antes de abrir la ventana. Si no son la misma app lo dice en el acto, enseña las dos, y nombra la opción del menú que lo repara —en vez de abrir una ventana que ya sabe que no va a poder volver—. Check this installation la corrige, y publicar una actualización la mantiene al día a partir de entonces.

v12.51 Arreglo

Una fila de usuario creada por error ya se puede quitar

Un correo registrado con una errata no se podía renombrar —el bueno ya existía en otra fila— y tampoco se podía quitar, porque lo único que había era Desactivar. Dos salidas tapiadas y ninguna puerta: el error quedaba encerrado.

Ahora hay Borrar definitivamente, dentro de la ficha del propio usuario, en rojo y lejos de Guardar. Es para una fila que nunca debió existir: una errata, un duplicado, algo que una migración trajo dos veces. Para alguien que sí trabajó aquí, lo correcto sigue siendo Desactivar, y el aviso lo dice.

La fila entera queda escrita en el registro de auditoría antes de desaparecer, y el correo se limpia a la vez de la lista vieja de CONFIG —si no, la cuenta vuelve a aparecer sola la próxima vez que esa lista se revisa.

v12.50 Arreglo

Borrar y editar actualizan las cifras en el momento en que terminan

Al borrar un movimiento la fila se iba de la pantalla en el acto, pero los totales de abajo se quedaban con el número viejo hasta la siguiente recarga —y eso se lee como que el borrado no contó—. Ahora las cifras vuelven con el propio borrado.

Vuelven sólo en el borrado que de verdad rehizo los totales: el último de la tanda. Calcularlas en cada borrado devolvería la ráfaga lenta que arregló la v11.96, y mandar las cifras de antes como si fueran las de después sería peor que no mandar nada.

Al editar un movimiento, el navegador rehacía por su cuenta la normalización del servidor para pintar la fila —dos cuentas que tenían que coincidir sin que nada lo obligara—. Ahora el servidor devuelve la fila exactamente como quedó escrita, y los totales de los dos materiales, porque cambiar la categoría o el nombre mueve existencias de uno a otro.

v12.49 Arreglo

Lo que acabas de guardar aparece en el segundo en que el servidor lo confirma

Guardando diez entregas, cronometrado fotograma a fotograma: la ventana se cerraba a los 14 segundos y la lista de movimientos tardaba dieciséis y medio más en enseñarlas. Dieciséis segundos mirando una tabla que no contiene lo que acabas de meter es justo cuando alguien decide que falló y vuelve a darle a guardar.

No era lentitud. El navegador pedía la foto entera otra vez para enterarse de unas filas que el servidor acababa de escribir y le estaba devolviendo en la misma respuesta. Ahora entran directas en la lista, con su identificador propio para que la recarga silenciosa de detrás no pueda enseñar nada dos veces.

Al abrirlo apareció algo más gordo: las cifras de existencias que el servidor calcula desde la v12.24 —para que la pantalla no tenga que preguntarlas— no las reenviaba ninguno de los tres caminos de guardado. El navegador las pedía y recibía nada. Arreglado en los tres, con una prueba que ahora sujeta el viaje de vuelta entero.

v12.48 Arreglo

Una errata en un correo sólo se podía arreglar en la hoja

Un correo con una letra de más —@ox-glasss.com en vez de @ox-glass.com— es un correo perfectamente válido, así que nada lo rechazó. Se quedó en la lista de usuarios con su aspecto de activo y simplemente no dejaba entrar a esa persona nunca. Y el campo del correo no se podía editar, así que corregir una letra obligaba a abrir la hoja de cálculo a mano.

Ahora un administrador lo corrige desde la app. Detrás hay tres guardas: se rechaza un correo que ya tenga otra persona, nadie puede cambiar el suyo propio (perdería el acceso en el acto), y el cambio queda escrito de dónde a dónde en el registro de auditoría.

Y antes de guardar, un correo cuyo dominio está a una o dos letras de uno que ya usan los demás pregunta si querías el otro. Parecido pero distinto es exactamente la pinta que tiene una errata; un dominio de verdad distinto —un contratista con Gmail— no dice nada.

v12.48 Arreglo

El respaldo nocturno podía pararse sin que nadie se enterara

El interruptor sigue en verde, la lista sigue llena, el último respaldo tiene su fecha y su enlace que abre. Nada decía que esa fecha era de la semana pasada. Un sistema de respaldo que falla en silencio es peor que no tener ninguno, porque el que no tiene ninguno lo sabe.

Ajustes → Sistema ahora lo dice en voz alta cuando la copia nocturna lleva más de día y medio sin correr, nombra la causa más frecuente y señala el botón de respaldar ahora. Se calla si el respaldo está apagado a propósito, y no da la alarma por una noche de retraso.

v12.47 Arreglo

«Google rechazó esa clave» cuando Google no había rechazado nada

Guardar una clave de IA mientras el servicio de Google estaba saturado daba «Google rejected that key (HTTP 503)». Un 503 significa que Google está sobrecargado: no mira la clave siquiera. Así que una clave perfectamente buena se daba por mala, y lo que uno hace entonces es ir a sacar otra, y otra.

Que Google esté ocupado ya no se toma como una sentencia sobre tu clave. La clave se guarda, y la app dice con claridad que no se pudo comprobar ahora y por qué. Sólo la rechazan los errores que sí hablan de la clave —mal copiada, o la Generative Language API apagada— y ahora dicen cuál de los dos es.

Comprobar una clave también dejó de probar cuatro modelos seguidos. Esa lista de respaldo existe para que el lector siga funcionando si Google retira un modelo; no demuestra nada sobre una clave, y hacía la espera cuatro veces más larga de lo necesario.

v12.46 Arreglo

Renombrar: de uno en uno, y sin tirar lo que escribiste

En Ajustes, pulsar el lápiz en varias categorías las abría todas para editar — pero guardar una repinta la lista y se llevaba por delante lo que hubieras escrito en las demás, sin avisar. La app ofrecía un trabajo que no podía entregar.

Ahora hay un renombre abierto a la vez. Si el que está abierto tiene algo escrito sin guardar, el nuevo no se abre y la app dice por qué — lo que tecleaste no se tira para hacer sitio. Si está sin tocar, se cierra y el otro se abre, porque pulsar el lápiz equivocado y corregirse es lo más común que hay.

Se guarda de uno en uno a propósito: renombrar una categoría reescribe cada movimiento que la usaba y después rehace la caché de existencias. Cinco de golpe son cinco de esas pasadas, y si la tercera falla queda media tanda aplicada y nadie sabe cuál.

v12.45 Seguridad

Dos guardias que decían que sí por omisión

Quién puede registrar movimientos es ahora una lista de quién sí, no de quién no. La app preguntaba "¿esta persona es VIEWER?" en vez de "¿esta persona puede escribir?". Con tres roles dan la misma respuesta — por eso nunca se notó. Pero cualquier rol nuevo habría pasado de largo, sólo por no llamarse VIEWER, y en un almacén eso es permiso para mover material. Hoy nadie podía hacerlo; habría sido cierto el día siguiente a que existiera un cuarto rol.

Y una categoría que no está en tu catálogo ya no puede entrar con el material. Aquí la categoría es la mitad de la identidad de un material: archivar algo como WINDOWS cuando el catálogo dice WINDOW no es el mismo material mal etiquetado, es un segundo material con sus propias existencias que nadie suma nunca.

Tecleada no se podía: la casilla de categoría es un desplegable cerrado. Lo que sí entraba es todo lo que no pasa por la pantalla — una importación, sobre todo. Las importaciones siguen trayendo sus categorías, porque importar es decir "esto es mi almacén tal como está", pero ahora se escriben en tu catálogo y se cuentan. Y eso importa más de lo que parece: un material cuya categoría no está en la lista no se puede ni seleccionar para sacarlo.

Sacar material nunca lo bloquea ninguna de las dos comprobaciones — lo que ya está dentro tiene que poder salir.

v12.44 Arreglo

El correo diario informaba de un día que no había pasado

Tres cosas estaban mal a la vez, y juntas significaban que los movimientos de un día de trabajo no los informaba nunca ningún correo. El correo llegaba, se veía bien, y siempre decía que no había pasado nada.

Salía a la hora equivocada. La app apuntaba en una nota la hora a la que había programado el trabajo, y después se fiaba de la nota en vez del trabajo — y Google no da forma de preguntarle a un trabajo programado a qué hora corre, así que esa nota no se podía comprobar. Cuando las dos se separaron, Ajustes decía 4:00 PM y el correo llegaba a las 2:53 AM. Ahora el trabajo despierta cada hora y es la app la que decide cuándo toca, así que no queda nada que pueda separarse. Cambiar la hora en Ajustes surte efecto sin tocar nada.

Y siempre informaba de "hoy", corriera cuando corriera. A las 2 de la mañana, "hoy" lleva tres horas y está vacío. La regla ahora: un correo de la mañana informa del día que acabó; uno de la tarde, del día que está acabando. El correo sigue diciendo de qué día habla, así que un día tranquilo se lee como un día tranquilo y no como una mentira.

La fecha va en formato de Estados Unidos. El 6 de octubre salía 06/10/2026, que se lee como 10 de junio.

Aparte: 🏭 Acopio → Check installation ahora rellena los nombres de columna que falten en tus pestañas. El código para hacerlo existía y no lo llamaba nadie fuera de la instalación inicial, así que una instalación que ya estaba funcionando no podía recibirlo — por eso RESERVATIONS y AUDIT_LOG tenían las cabeceras en blanco. Una columna sin nombre parece basura, y tarde o temprano alguien la borra.

v12.43 Arreglo

Ya no se puede meter material en un estante que no existe

Escribir un estante que no está en tu almacén —A1P cuando querías decir A1B— lo guardaba igual, y aparecía una ubicación nueva en tu mapa con material dentro. Eso es peor que un error de tecleo: un estante inventado no está en ninguna estantería, así que la app dice que el material está en un sitio al que nadie puede ir.

Ahora la app comprueba el estante al que llega el material y, si no es uno de los tuyos, lo dice — y te ofrece el que probablemente querías. Si puedes tocar el catálogo, lo creas ahí mismo y el movimiento se guarda sin volver a teclearlo.

Sacar material de un estante que no existe sigue permitido, a propósito. Lo que ya quedó en A1P antes de este arreglo tiene que poder salir, o el arreglo lo dejaría encerrado para siempre. Por eso la lista de donde el material sale sigue enseñando todos los sitios donde de verdad hay stock; la de a dónde va enseña sólo ubicaciones reales.

Importar un fichero sigue creando los estantes que nombra —importar es decir "esto es mi almacén tal como está"— pero ahora los añade a tu lista de ubicaciones y te dice cuántos, en vez de crearlos en silencio.

v12.42 Más fácil

El enlace a la app ahora es un enlace — se pulsa

Al publicar una actualización, la dirección salía como texto plano en una caja estrecha, cortada y con barra de scroll. Para usarla había que seleccionarla a ciegas, copiarla, irse al navegador y pegarla. Es que la caja de avisos que da Google sólo sabe enseñar texto: no puede enseñar un enlace.

Ahora tanto 🔧 Advanced → Push Update Live como Open App abren una ventana de verdad con un botón que lleva directo, la dirección entera en un campo que se puede seleccionar, y un botón de copiar que sólo dice Copied cuando de verdad copió.

Y a la gente nueva le llega el enlace por correo. Dar de alta a alguien en Manage Users le manda ahora una invitación con la dirección, con qué cuenta de Google entrar y qué le deja hacer su rol. Ya no hay que buscar la dirección y reenviarla a mano. Se puede desmarcar si estás preparando las cuentas por adelantado — y si el correo no sale, la app lo dice en vez de dar por hecho que salió.

Guarda esa dirección en marcadores una vez y la hoja de cálculo deja de pintar nada en el día de nadie.

v12.41 Seguridad

Una sola lista de usuarios, no dos

Las instalaciones que vienen de una versión antigua llevaban dos listas de usuarios: la que manejas en Manage Users y otra más vieja que seguía en la pestaña CONFIG. Las dos dejaban entrar — pero sólo una está en tu pantalla. Así que cualquiera que estuviera en la lista vieja podía entrar sin aparecer nunca en Manage Users, y eso significa que no había forma de quitarle el acceso desde la app.

La lista vieja no se borra: en una instalación a medio migrar esa gente es personal de verdad, y quitarla de un día para otro dejaría a alguien sin trabajar un martes por la mañana. En su lugar se ha convertido en un camino de ida. La próxima vez que una de esas personas entre, queda escrita en tu lista de usuarios de verdad en ese mismo momento —con su rol, activa, sin cambiarle nada— y desde entonces aparece en Manage Users con su interruptor, para que puedas apagarla.

🏭 Acopio → Check installation hace ahora el cruce entero de golpe, sin esperar a que nadie entre. Te dice cuánta gente se pasó, qué correos llevan un rol distinto en cada lista (manda Manage Users) y qué filas de tu lista de usuarios tienen algo que no es un correo donde va el correo — ésas no dan acceso, pero salen en pantalla. Nunca borra una fila.

v12.40 Seguridad

Los accesos rechazados quedan escritos — y te avisan

La puerta funcionaba: a alguien que no está en tu lista de usuarios se le rechazaba. Pero el rechazo no dejaba rastro en ninguna parte, así que desde dentro un intento de entrar y un día tranquilo se veían exactamente igual. Eso es una cerradura sin mirilla.

Ahora cada rechazo queda en la pestaña AUDIT_LOG de tu hoja, bajo ACCESS_DENIED, con quién lo intentó y por qué. Una línea por persona y minuto — una pestaña olvidada reintenta sola cada veinte segundos, y sin ese tope una sola pantalla abandonada enterraría la única línea que importaba.

Y a los diez rechazos en diez minutos recibes un correo, como mucho uno por hora: quién lo intentó, qué hacer si es alguien de los tuyos, y dónde está el registro completo. Un registro que nadie abre no avisa a nadie.

Que a alguien se le niegue una acción concreta —un usuario de sólo lectura pulsando guardar— no se apunta aquí. Esa persona está dentro y sólo le falta un permiso; mezclar las dos cosas escondería a los de fuera entre gente legítima.

v12.39 Seguridad

Desactivar a un usuario ahora sí le quita el acceso

Si tu instalación viene de una versión anterior, desmarcar a alguien en Manage Users podía no estar deteniéndole. La pantalla decía "desactivado"; el servidor le dejaba entrar igual.

La comprobación le buscaba en la lista de usuarios actual y, al encontrarle apagado, seguía hasta la lista antigua de la que se migró la app — y esa lista antigua sigue teniendo a todo el mundo. Así que el interruptor se leía, y acto seguido lo anulaba un resto del pasado.

Ahora la lista actual decide en los dos sentidos: encendido, entra con su rol; apagado, se queda fuera, y la lista antigua ni se mira. Quien nunca llegó a la lista actual sigue entrando igual que antes, que es el único caso para el que esa lista antigua está ahí.

Conviene comprobarlo hoy mismo en tu instalación: abre Manage Users y confirma que todo el que esté apagado es alguien que querías apagar.

v12.38 Seguridad

La app ya avisa cuando se queda sin conexión

Hasta hoy la única señal era un puntito de color en la esquina, y había que pasar el ratón por encima para leer por qué. Nadie pasa el ratón por encima de un punto. Sigues trabajando, sigues escribiendo — y nada de eso se está guardando.

Ahora una barra roja arriba dice que estás sin conexión, que lo que escribas no se puede guardar, y que la app lo sigue intentando sola. No se puede cerrar: mientras siga siendo verdad, el aviso sigue siendo verdad. Cuando vuelve la conexión se pone verde, dice Back online y se va sola a los cinco segundos — la regla contraria, porque para entonces ya dejó de ser noticia.

Al abrir la app nunca sale: arrancar no es recuperarse, y saludar con "Back online" sería contar una caída que no ocurrió.

v12.37 Arreglo

El botón de guardar ya no se va de la ventana

En un formulario más alto que la pantalla —Add Expected Material, Entry, Exit— los botones de abajo estaban al final del contenido que se desplaza. Había que bajar para llegar a Guardar, y en una pantalla corta el botón salía cortado por el borde de la ventana.

La fila de botones va ahora pegada abajo, igual que el título y la ✕ llevan meses pegados arriba. El formulario se desplaza por debajo; los botones se quedan.

Y pesa más que la comodidad: el aviso de error vive en esa fila. "Material 1 needs a name" sale justo al lado de Guardar. Con la fila fuera de la pantalla, pulsas guardar, no pasa nada, y el motivo está exactamente donde no estás mirando.

Y si la ventana cabe en tu pantalla, ahora cabe — el tope pasó del 82% al 90% del alto, que es lo que le faltaba a Add Expected Material para no tener que desplazarse en un portátil normal.

Además todos los botones de esa fila miden lo mismo. Un "Cancel" de 88 píxeles al lado de un "Save" de 120 eran dos tamaños en la misma fila; ahora son uno solo, venga cada botón con la clase que venga, y ninguno puede partirse en dos líneas y empujar la fila entera.

v12.36 Arreglo

Cada versión publicada dice ahora cuál es

Publicar desde el menú llamaba igual a todas las versiones, así que la lista del cuadro de implementaciones de Google era una columna de nombres idénticos sin forma de distinguir uno de otro. Ahora cada versión lleva sellada la versión de la app, su build y la fecha en que salió.

El nombre de la implementación en sí se queda igual a propósito, y no es un descuido: es la llave con la que la app encuentra su implementación y la actualiza en el sitio. Si cambiara, la siguiente publicación crearía una nueva — o sea una dirección nueva, con todos los marcadores del almacén apuntando a la vieja.

v12.35 Seguridad

Tus categorías y ubicaciones ya no se pueden borrar por un tropiezo

El código que guarda tus listas —categorías, proveedores, proyectos, ubicaciones— vaciaba la columna primero y escribía la lista después. Entre esos dos pasos cabe cualquier interrupción normal de Google: una cuota, un tiempo de espera, un error pasajero. Lo que cayera ahí dejaba esa lista vacía, sin nada que avisara. Te enterabas al abrir un desplegable y no encontrar nada.

Ahora escribe primero y limpia lo que sobra después. Si la escritura falla, tu lista de antes sigue ahí. Una lista desactualizada es un problema pequeño y visible; una lista vacía es uno grande e invisible.

Y un segundo fallo, encontrado al arreglar el primero. El nombre de una ubicación y su tipo viven en dos columnas pegadas y sólo significan algo juntas — y se escribían en dos operaciones separadas. Si la primera salía y la segunda no, los nombres y los tipos quedaban corridos: un estante tomaba el tipo de otro, uno aparecía archivado y otro dejaba de estarlo. Nada fallaba y nada lo decía. Ahora se escriben como un solo bloque, que para Google es una sola operación: el estado a medias ya no existe.

v12.34 Arreglo

"Load more" ya no te manda al final de la lista

Al pulsarlo traía los 75 movimientos siguientes y luego saltaba la vista más allá de todos ellos, hasta la última fila. Perdías el sitio por donde ibas y tenías que subir a buscarlo.

Medido: la fila que estabas mirando se iba unos 5.000 píxeles por encima de la pantalla. Ahora se queda exactamente donde estaba y las filas nuevas llegan debajo, que es para lo que sirve un botón de "más".

Y el otro botón que hace crecer la misma lista lleva el mismo arreglo. "Load Older History" devolvía la tabla a sus primeras 75 filas sin decir nada — así que quien había pulsado "Load more" diez veces perdía las diez, y tenía que volver a pulsarlo otras diez para llegar a los movimientos viejos que acababa de pedir. Un botón que trae cosas no puede esconder las que ya estaban.

v12.33 Arreglo

Tras archivar de verdad, el informe dice cómo quedó cada hoja

Archivar de verdad terminó bien y contó todos los pasos — pero faltaba la línea que dice con qué se queda ahora cada hoja. Los números estaban en el paso a paso, repartidos; el resumen que los pone juntos sólo salía en el ensayo.

Y no podía salir: las dos cifras se calculaban dentro de la rama del ensayo, así que una corrida de verdad nunca las tenía. Ahora se calculan en las dos — y en la corrida de verdad se leen de las hojas después de escribir, no se arrastran de lo que se iba a escribir. Cuando ya se ha escrito, "cuántas quería escribir" y "cuántas hay" son dos preguntas distintas, y la que merece imprimirse es la segunda.

v12.32 Arreglo

"Open WMS App" podía darte la dirección de otro

En una hoja copiada de otra que ya estaba publicada, Google contesta a la pregunta "¿cuál es la dirección de esta app?" con la del archivo original. La copia tiene la suya, en otro sitio. Seguir la que da Google lleva a "Sorry, unable to open the file at this time", y nada en esa página sugiere que el problema era el enlace.

La app ya lo sabía: guarda la dirección buena en un ajuste que gana sobre la suposición de Google, y el asistente de configuración lleva meses leyéndola así. La entrada del menú era el único sitio que no preguntaba.

Ahora pregunta. Y Push Update Live apunta la dirección en el momento de publicar, que es el único momento en que se conoce con certeza, así que a partir de ahí el menú acierta sin que nadie escriba nada.

De la misma comprobación salió otro. Al entrar con Google, la vuelta a la app usaba también esa suposición cuando no había nada guardado — así que el inicio de sesión podía devolver a la gente a la instalación de otra persona, fallando con un error que no se parece en nada a su causa. Ahora prefiere igualmente la dirección apuntada.

v12.31 Interno

Un índice para el código, y una prueba que lo obliga a no mentir

En la app no cambia nada. Ésta es para quien tenga que trabajar en ella — hoy una persona, y algún día no.

El archivo del servidor son 13.279 líneas repartidas en 68 secciones. Ahora empieza con un índice numerado de esas secciones, así que encontrar algo es leer una lista en vez de bajar y bajar. El índice se genera de las propias cabeceras del archivo, no se escribe, y una prueba lo vuelve a generar y lo compara línea a línea: si se renombra, se mueve, se añade o se quita una sección y el índice no lo refleja, la prueba falla.

Y eso es lo importante. Un índice escrito a mano es otra lista que tiene que coincidir con algo sin que nada lo obligue — exactamente la forma de fallo que este código ya se ha cazado dos veces a sí mismo. Un índice que miente es peor que no tenerlo: no tenerlo obliga a buscar, y tenerlo equivocado hace creer que ya se ha buscado.

v12.30 Nuevo

Archivar los movimientos viejos ahora, sin esperar a las 3 de la mañana

El trabajo que saca los movimientos viejos de la lista principal corre una vez por noche. Eso hacía que cada intento de comprobarlo costara veinticuatro horas: guardar, esperar, mirar mañana. Ahora hay un botón que corre el trabajo de verdad en el momento — el mismo trabajo, las mismas comprobaciones, no una copia de prueba — en Advanced → Archive old movements NOW.

Ensaya primero y te enseña los números: cuántos saldrían, cuántos volverían a entrar, cuántos se quedarían y con qué se quedaría cada hoja. No se escribe nada hasta que contestas que sí. El informe de después es el mismo, en pasado.

Y los últimos 30 días ya no se archivan nunca, diga lo que diga el corte. Con el corte en seis o doce meses eso ya se cumplía por aritmética — pero se cumplía por casualidad, porque dependía de un ajuste. Un ajuste puede estar mal, y un corte mal leído puede mandar todos los movimientos al archivo y dejar la lista principal vacía. Ahora es una regla, y cuando tiene que actuar el informe lo dice en voz alta.

v12.29 Arreglo

Cada corrida nocturna deja escrito de qué versión era

Ésta es la que explica las dos últimas semanas. El fallo del 1 de octubre dejó una pila, y la pila decía que la función que reventó estaba en la línea 2.148, veintidós por encima de su propio disparador. En la versión que puso las comprobaciones de seguridad, esa misma función está en la 4.371 y ocupa unas trescientas líneas.

O sea que las comprobaciones no estaban en el código que corrió. El trabajo nocturno llevaba semanas ejecutando una copia vieja del script mientras la nueva estaba en el editor — por eso tres arreglos seguidos parecían no cambiar nada. Y nada en la app podía contestar "¿pero esto es el código nuevo?", así que la pregunta no se hizo en dos semanas.

Ahora cada corrida lo deja escrito dos veces: al empezar, por si revienta en la primera línea, y al terminar. La versión viaja además dentro del registro del error. Una línea corta, y la pregunta ya no puede quedarse sin respuesta.

Y el botón de ensayo ahora sí arranca. Salió sin declarar quién es, así que lo único que llegó a decir fue "not authenticated". Un diagnóstico que no arranca es peor que no tener ninguno: le cuesta un día a quien contaba con él.

v12.28 Arreglo

Cuando el trabajo nocturno falla, el registro dice por dónde iba

Tres fallos seguidos dejaron exactamente la misma línea: "el número de columnas de los datos no coincide con el número de columnas del rango. Los datos tienen 23, y el rango, 20." Esa línea no dice qué hoja, ni en qué paso, ni de cuántas columnas era cada una. Es la forma del fallo sin el fallo.

Ahora el trabajo va dejando un rastro: de cuántas columnas es cada hoja frente a las que necesitan las filas, cuál es el corte, cuántas filas van a cada lado, cuál de las dos escrituras estaba intentando, y si la primera había terminado. Cuando revienta, todo eso va al registro de errores junto con la pila y sus números de línea.

Reponer las filas, que se añadió en la v12.27, es un cinturón de seguridad — no es el arreglo. Perder filas no puede convertirse en algo de lo que la app se recupera por rutina. Esto es lo que convierte el próximo fallo en algo que se puede diagnosticar en vez de adivinar.

Un detalle que vale la pena dejar escrito: el rastro estuvo a punto de no llegar nunca. El registro de errores descarta lo que no sea un objeto, así que la primera versión —que pasaba un texto suelto— se habría tirado en silencio, y habríamos tenido la misma línea inútil creyendo que esta vez sí decía algo.

v12.27 Arreglo

Si el trabajo nocturno pierde filas, las devuelve

Desde la v12.14 el trabajo cuenta los movimientos antes y después de escribir, así que sabía cuándo faltaban filas. Y lo único que hacía era decirlo — una línea en el registro de errores, un correo, y la hoja rota. Pasó tres veces, y las tres se supo horas después y se arregló a mano desde un backup.

Darse cuenta de que acabas de perder mil filas y no devolverlas es casi peor que no darte cuenta: todo lo necesario para repararlo está en memoria, a dos líneas. Las dos hojas siguen guardadas tal como estaban antes de tocar nada. Así que ahora se devuelven — en el acto y sin preguntar.

Esto no depende de saber por qué falló, y ésa es la razón de escribirlo así. La causa de los tres incidentes sigue sin establecerse. Una reparación que sólo funciona cuando entiendes la causa no es una red: es una esperanza.

El correo sale igual: una reparación silenciosa escondería la causa, y la causa sigue habiendo que encontrarla.

v12.27 Arreglo

El histórico carga de lo más nuevo hacia atrás, por tandas

Load Older History se traía el histórico entero de un golpe y después decía "ya está cargado". Con 56 filas eso parece que la app sólo sabe cargar 56; con veinte mil sería un viaje que no termina.

Ahora trae 300 cada vez, empezando por las más recientes y yendo hacia atrás, y cada pulsación continúa donde se quedó la anterior. Sólo se leen las filas de esa tanda, así que sigue siendo rápido por mucho histórico que haya.

Y lo que de verdad faltaba no era el paginado — era que el botón dijera si había terminado. "Older History (56)" no distingue "56 de 56" de "56 de 1.271", así que hay que adivinar. Ahora dice "Load 300 more — 56 loaded, 1.215 older still there", o "All older history loaded" cuando no queda nada.

v12.26 Nuevo

Ya puedes ensayar el archivado nocturno cuando quieras

El trabajo que ordena los movimientos viejos corre a las 3 de la mañana sin nadie delante, y escribe lo que hizo en una pestaña que nadie abre. Cuando salió mal se supo horas después y por casualidad. Un fallo que sólo se puede observar a las 3 AM no se puede investigar.

Ahora hay 🌙 Test the nightly archive en el menú Advanced. Corre el trabajo de esta noche entero —las mismas guardas, las mismas cuentas, el mismo reparto— y se para justo antes de las dos escrituras. Se puede pulsar en cualquier momento, con datos de verdad, y te dice qué haría esta noche: cómo de ancha es cada hoja frente al ancho que necesitan las filas, cuántos movimientos hay en cada una, cuál es tu corte y qué considera viejo, cuántos se moverían en cada sentido, qué dice cada guarda, y el error exacto si lo hay.

El ensayo vive dentro del trabajo de verdad en vez de ser una copia. Una copia sería una segunda versión que siempre se da la razón, y así es como una red de seguridad rota pasó diez días sin que se notara. Y está probado como todo lo demás — incluido que de verdad no escribe nada, lo cual cazó una primera versión que ensanchaba las hojas mientras decía que era un ensayo.

v12.25 Arreglo

Una lista de movimientos vacía ya dice de qué vacío se trata

El aviso que se añadió en la v12.14 no podía saltar nunca. Estaba escrito para detectar lo único que no puede pasar solo —un almacén con existencias y un archivo sin un movimiento— y recorría la lista de stock como si fuera un array. No lo es: es un mapa por material. El bucle daba cero vueltas y la respuesta era siempre no. Diez días con la red puesta y rota.

Es la misma forma que la copia de configuración que nunca funcionó: una protección escrita, dada por buena y jamás ejecutada ni una vez. Lo que las dos tienen en común no es el descuido — ninguna tenía prueba. Una protección sin prueba no es una protección: es una intención. Ésta ya tiene una que la ejecuta, y la versión vieja no la pasa.

Y hay tres vacíos, no dos. El tercero es el que provocó el susto: la lista reciente vacía porque el trabajo nocturno se llevó todo lo que pasó el corte al histórico. No se pierde nada — pero la pantalla se veía igual que el desastre. Decirle a alguien que su almacén se rompió cuando sólo tiene que pulsar un botón es casi tan malo como no decirle nada cuando sí se rompió.

Así que la lista dice ahora cuál es: un filtro no encontró nada, está todo en el histórico (con cuántos son y el botón que los trae), o el imposible, que sigue diciendo que pares y no toques nada. Y el propio trabajo nocturno escribe una línea y manda un correo cuando deja la lista reciente vacía — aunque las cuentas cuadren, porque en ese caso cuadran y por eso nadie se enteraba.

v12.24 Arreglo

El número cambia cuando la app dice que cambió

Guardabas un movimiento y la app decía listo — y luego tardaba unos segundos más en cambiar la cantidad, devolver el stock y pasar el badge de In Stock a All at Site. Cronometrado sobre un guardado de verdad.

Y lo que hacía era peor que esperar. Después de guardar repintaba desde su propio caché — y el caché es la foto de antes del movimiento que acababas de guardar. Así que la cifra que salía "al instante" era la vieja. Eso es peor que un esqueleto de carga: un esqueleto se ve como algo cargando, un número viejo se ve como un número. No había nada en pantalla que dijera que todavía no era verdad.

El arreglo NO fue rehacer la aritmética en el navegador. Era el camino obvio y era el equivocado: dos aritméticas pueden discrepar, y entonces la cifra parpadea a un valor incorrecto antes de corregirse — peor que esperar, y rompe la regla sobre la que está hecha esta app.

El servidor ya tenía las cifras de después. Recorre su propia foto del almacén movimiento a movimiento para comprobar que el guardado se puede hacer, así que cuando contesta sabe exactamente qué tienes — y lo tiraba. Ahora lo manda. No hay dos aritméticas: es la del servidor, contada. La foto completa se sigue pidiendo detrás, en silencio; esto adelanta lo que miras, no sustituye la verdad.

Y el badge sale gratis. Desde la v12.17 el estado se decide a partir de esos números en vez de guardarse al lado, así que corregir los números corrige In Stock → All at Site solo. Ése era el sentido de unificar los estados, y éste es el primer sitio donde se cobra.

v12.23 Nuevo

La hoja de cálculo detrás de la app parece parte del producto

Al abrir el archivo, tres pestañas estaban bien diseñadas —la de bienvenida y los dos documentos legales— y las otras diecisiete eran volcados de hoja de cálculo con la cabecera en negrita. El contraste hacía más daño que no tener ningún formato, porque enseñaba que sí sabíamos cómo.

El color de la pestaña dice ahora si se puede editar a mano, que es la pregunta de soporte más frecuente que hay y no estaba escrita en ningún sitio. Azul marino para las páginas que se leen, azul para los datos donde vive el sistema, gris para las hojas que la app reconstruye, gris claro para los registros a los que sólo se añade. Y cada hoja reconstruida lleva una nota en su primera celda: "Rebuilt by Acopio from MASTER_ARCHIVE_V3. Edits here are overwritten — change the movement instead." Esa línea le ahorra a alguien una tarde corrigiendo un total que vuelve solo.

Las cabeceras van en azul marino con letra blanca y la primera fila fija. Las hojas calculadas y los registros quedan protegidos —en modo aviso, no bloqueo, y a propósito: la app escribe en ellas con la misma cuenta, así que un bloqueo de verdad sería una forma nueva de que fallara de noche. El aviso frena a la persona y no frena al código.

Nada de lo que tú hayas puesto se pisa. Los anchos de columna, el orden de las pestañas y el formato de las celdas sólo se aplican a hojas que siguen vacías — una plantilla, o una instalación nueva. Sobre un sistema con meses de datos, la app pone los colores, las cabeceras y las notas y deja el resto tal como lo tengas, y dice qué hojas dejó en paz en vez de callárselo.

Corre al crear las hojas, al preparar una plantilla maestra, y como parte de Check this installation — así un sistema restaurado de un backup recupera su aspecto, porque una copia trae los datos y pierde el formato.

v12.22 Arreglo

Renombrar un material se lleva consigo todo lo suyo

Un material se identifica por su categoría y su nombre — y había otras cinco cosas guardadas bajo ese nombre: cuántas unidades trae una caja, su coste promedio, lo que esté apartado de él, su mínimo y si se vigila por stock bajo. Renombrarlo, moverlo de categoría o fusionarlo reescribía todos los movimientos y dejaba las cinco atrás.

Eso hace dos daños, y el segundo es el peor. Queda una línea huérfana apuntando a un material que ya no existe — que al menos se ve. Pero el material renombrado ha perdido sus cifras en silencio. La siguiente entrada por caja no se divide, así que el coste por unidad sale doce veces más alto y se mezcla en el promedio de ese material de ahí en adelante. Sin decir nada.

Las cinco se mueven ahora con el material, y lo que se movió queda escrito en el audit log. Al fusionar dos materiales que tienen cifras los dos, el que sobrevive conserva las suyas — el que la gente va a seguir usando no debería quedarse en silencio con los números del que desaparece — y lo descartado se cuenta en el registro en vez de esfumarse.

v12.22 Arreglo

Las columnas del Dashboard dejan de moverse al filtrar

Cada filtro desplazaba la tabla entera. Medido entre categorías: Stock empezaba 114px más allá en Window que en Shower, y Location 97px, sin cambiar más que el filtro.

No era el filtro: era el contenido. El navegador reparte el ancho por lo que hay dentro, y lo que hay dentro cambia por completo entre categorías: los nombres de Window son largos y los de Mirror cortos, las ubicaciones de Shower dicen MIRRORS/SHOWERS WAREHOUSE (234) y las de Window A3A (54). Así que cualquier filtro que cambiara la mezcla movía la tabla.

Ahora cada columna declara su propio ancho, como hace Movements desde la v12.11, y los anchos están medidos, no elegidos — dibujando la tabla con los peores casos reales y tomándolos de ahí. Name se queda elástica: es la que crece con la ventana, y absorbe los 200px que suelta Category al filtrar por una, así que nada a su derecha se mueve.

Incoming y Project View son lo siguiente.

v12.21 Arreglo

Devolver un movimiento ya no puede romperte el stock

El almacén puede cambiar mientras un movimiento está en la papelera, y nadie lo estaba mirando. Guardar una salida siempre se ha rechazado cuando el material no alcanza. Devolver una desde la papelera no pasaba por ninguna comprobación: metía la fila y ya. La misma puerta, con cerradura en un lado y sin cerradura en el otro.

La secuencia, y no hace falta ningún fallo en borrar ni en restaurar: sacas 37 de algo. Borras esa salida, así que vuelven los 37. Alguien saca 37 otra vez — perfectamente legal, hay 37. Y entonces devuelves la primera. Ahora han salido 74 de un estante que sólo recibió 37, y todas las cifras de ese material están mal.

Y no avisó nada, lo cual tiene su propia causa. La aritmética del stock recorta en cero —un estante no puede enseñar menos 37 ventanas— así que el estado imposible ni siquiera se podía representar. Lo que sobraba se iba a "dispatched", que no tiene techo. La app enseñaba un cero tranquilo y un total inflado en silencio.

Dos arreglos, porque eran dos fallos. Devolver un movimiento pasa ahora por la misma comprobación que guardarlo, contra los mismos números: restaurar nunca es más permisivo que guardar. Cuando ya no cabe, dice qué cambió y el movimiento se queda en la papelera — no se pierde nada, y decides tú.

Y Check my data tiene un tipo de hallazgo nuevo: Less than nothing, para cualquier material cuyos movimientos sumen por debajo de cero. Cuenta SIN el recorte — es lo único en la app que lo hace, y ésa es toda su razón de ser. Enseña lo que entró, lo que salió y el número de verdad, y no ofrece ningún botón: el arreglo es o un movimiento que sobra o uno que nunca se registró, y eso sólo lo sabe quien conoce el almacén.

v12.20 Arreglo

Cuatro cosas pequeñas que estaban mal en silencio

El aviso que gritaba sin motivo. Pasar de Entry o Exit a Adjust decía siempre "1 material was not carried over", incluso con el formulario completamente vacío. Contaba la tarjeta en blanco que Entry y Exit siempre tienen abierta, así que creía que había un material donde no se había escrito nada. Ahora cuenta materiales, o sea los que tienen nombre. Y sigue avisando cuando de verdad se pierde algo, que es la mitad que importa: ese aviso existe porque una vez se perdieron cuatro materiales al cambiar de pestaña sin que nada lo dijera.

Las listas iban en dos órdenes distintos. Categorías, proyectos y proveedores salían por orden alfabético en Settings y por orden de creación —lo que se escribió primero, hace meses— en el formulario de movimientos. Dieciséis categorías en un orden que nadie puede predecir obliga a leerlas todas para encontrar una. Ahora se ordenan una sola vez, al llegar los datos, así que las dos listas coinciden por construcción. Las ubicaciones se dejan como están a propósito: su orden se coloca a mano y ese orden es justamente el valor.

Ya se puede añadir las unidades por caja sin fingir una entrada. Corregirla ya se podía; añadirla no — la única forma era empezar una entrada, elegir el material, poner Box y contestar la pregunta. Un dato de catálogo escondido detrás de un movimiento. Settings → Materials tiene ahora + Add a pack. Sólo acepta un material que ya exista, sólo los cuatro envases que contienen cosas, y nunca un envase de uno — y si el material ya tiene su cifra te manda a Edit, que sigue preguntando dos veces, porque cambiar una cifra que ya existe cambia lo que van a costar las entradas futuras.

El título de Qty / Unit va centrado. Es el único título centrado de la tabla, y no es un capricho: en todas las demás columnas el valor empieza donde empieza el título, así que alinearlos a la izquierda los ata. Ésta no tiene un sitio donde empiece el valor — tiene dos mitades que se encuentran en una costura — así que ahora el título se apoya en la costura y deja de separarse de los números según se alargan.

v12.20 Nuevo

La papelera dice qué movimiento tiene guardado

Borras un movimiento, lo devuelves, lo vuelves a borrar — y la papelera mostraba dos renglones que decían exactamente lo mismo: mismo material, misma cantidad, mismo tipo, mismo estante. Sin nada que dijera si era UN movimiento listado dos veces o DOS movimientos que se parecen. Esas dos respuestas piden acciones opuestas, así que dejar la pregunta abierta era el fallo.

Cada renglón lleva ahora la fecha del propio movimiento, su PO y su ID debajo. El ID no está para leerlo: está para compararlo, con el otro renglón o con la hoja.

v12.19 Arreglo

La cantidad vuelve a estar en su propia fila

En la v12.18 la columna nueva de Qty / Unit estaba bien a lo ancho y mal a lo alto: la cifra flotaba por encima del centro de su fila mientras todas las demás celdas seguían centradas. En una tabla larga eso es peor de lo que parece — el ojo sigue una línea horizontal, y si una columna va unos pocos píxeles arriba acabas leyendo la cantidad de la fila de encima.

La causa estaba en la forma de unir las dos mitades. Partir una celda en dos mitades fijas se hace con una rejilla, y la rejilla estaba puesta en la celda misma — y eso hace que una celda de tabla deje de comportarse como celda, y con ello se pierde el centrado que todas las demás tienen de regalo. Ahora la rejilla vive en un envoltorio dentro de la celda, así que la celda vuelve a ser una celda normal y el reparto no cambia.

La tabla ya tiene una comprobación permanente para esto: compara el centro vertical de cada cantidad con otra celda de la misma fila y falla si alguna se desvía más de tres píxeles. También comprueba que la rejilla esté en el envoltorio y no en la celda, para que este error exacto no pueda volver en silencio.

v12.18 Nuevo

Qty y Unit son una sola columna

Siempre fueron juntas — una cantidad sin su unidad no significa nada. Ahora van en una columna, la cifra a la derecha y la unidad a la izquierda, encontrándose en el mismo punto en todas las filas: 14 │ UNIT, 150 │ BOX, 243 │ BAG. La barra no se dibuja; no hace falta.

Esa alineación sale de un reparto fijo dentro de la celda, no de dejar que cada mitad ocupe lo suyo. Si se deja suelta, el punto de encuentro baila de fila en fila, que es justo lo que hace ilegible una columna de números. Las dos mitades están medidas: la cantidad más larga y la unidad más larga del vocabulario de la app.

Y tapa un agujero que nadie había visto. Qty no se podía esconder, pero Unit sí — así que se podía acabar con una tabla que decía +25 sin decir veinticinco de qué. Unidas, la unidad ya no se puede perder. Y el par tampoco se puede esconder ni mover: el tipo, el material y la cantidad son lo que un movimiento es.

Si tenías Unit en otro sitio de tu propio orden de columnas, no se rompe nada — el orden guardado se traduce, y todo lo que no está bloqueado conserva el sitio que le diste.

v12.17 Arreglado

El filtro de estado conoce los cuatro — y uno de los dos que tenía estaba mal

Un material puede estar en cuatro estados, y la insignia de cada fila siempre lo ha dicho: In Stock, Reserved, All at Site, Zero Stock. El filtro ofrecía dos. Los dos que faltaban ya están.

Y la mitad más seria, que desde fuera no se veía. "In Stock only" no significaba lo mismo que la insignia verde: filtraba por "hay algo en el estante", que incluye el material que está en el estante pero apartado — material que no te puedes llevar. Así que quien filtraba para ver qué podía sacar, veía cosas que no podía sacar. Ése es el error que hace caminar hasta el estante para nada.

Los tres tenían la misma causa: la insignia se decidía en un sitio y el filtro hacía su propia cuenta en otro. Dos listas que tenían que decir lo mismo, sin nada que lo obligara. Ahora hay una sola — la insignia sale de ella, el desplegable se dibuja de ella, y el filtro compara contra ella. Añadir un quinto estado es añadir una línea; no hay una segunda copia que recordar.

v12.16 Arreglado

Una cantidad de tres cifras ya no se parte en dos

−300 se dibujaba como −30 con un 0 solo debajo, justo al lado de un −200 que cabía perfectamente. Las mismas cifras, distinto resultado.

La columna no era estrecha: el relleno era ancho. 58 píxeles menos 12 por lado dejan 34 para la cifra, y una cantidad de cuatro caracteres necesita 37. Con 4 por lado en vez de 12 quedan 50, y entra todo hasta cuatro cifras con sitio de sobra. Las de cinco bajan un punto de tamaño, que es la misma escalera que ya usa la tira de reservas: achicar sólo cuando hace falta y sólo lo que haga falta.

Y el motivo de que una entrara y otra no: en una letra normal el 0 y el 2 son más estrechos que el 3 y el 6, así que las mismas tres cifras pueden medir distinto. Las cantidades usan ahora cifras de ancho fijo, lo que además deja la columna alineada por unidades, decenas y centenas — en una columna de números eso no es adorno: es lo que permite compararlos sin leerlos.

Y van alineadas a la derecha, que es como se leen los números y como quedarán cuando Qty y Unit se junten en una sola columna.

v12.15 Arreglado

El cuadro de etiquetas respeta las casillas que marcaste

Marcabas 🏷 Label en dos de los diez materiales de una entrada y el cuadro se abría con los diez marcados igual — salvo que hubieras marcado al menos uno, y entonces sí respetaba tu elección. O sea que la única respuesta que ignoraba era "ninguna", que es justo la que más merece respetarse. Preguntar algo y después hacer lo que uno quiere enseña a no leer la pregunta.

Ahora las marcas son exactamente las que hiciste. Todos los materiales siguen apareciendo en la lista, por si cambias de idea. Y si no marcaste ninguna, el cuadro no se abre: sigues con lo tuyo. No se pierde nada por olvidarse: seleccionas cualquier movimiento en Movements, pulsas Labels y reimprimes lo que quieras, cuando quieras.

El contador de tarjetas deja de prometer nueve y enseñar cinco

La insignia del mazo de la esquina contaba todo lo que había esperando, mientras que el mazo sólo llega a tener un puñado de tarjetas —pintarlas todas hacía una escalera que se salía por arriba de la pantalla—. Las dos mitades decían la verdad y juntas mentían: el número prometía nueve cosas que atender sin forma de ver ni de alcanzar las otras cuatro.

Ahora la insignia dice las dos cosas: 5/9, y al pasar el ratón explica que al resolver una entra la siguiente. Cuando todo cabe sigue diciendo el total a secas, como antes. Cuántas tarjetas se dibujan no cambia: la escalera era un problema de verdad y esto no lo reabre.

v12.14 Arreglado

El trabajo nocturno ya no puede borrar tu historial de movimientos

La noche del 26 de septiembre de 2026, el trabajo de archivado de las 3am vació un historial de movimientos entero — todas las filas, tanto del archivo activo como del histórico antiguo. Se descubrió catorce horas después, por casualidad. La copia de seguridad diaria se hace a las 2am, una hora antes que este trabajo, y lo tenía todo: no se perdió nada. Esa hora de diferencia es la única razón.

Qué pasó. El trabajo borraba la hoja y después escribía las filas de vuelta. La escritura falló —la hoja tenía 20 columnas de ancho y una fila de movimiento tiene 23— y para entonces el borrado ya había ocurrido. Una hoja creada antes de que existieran las columnas de costo es el caso NORMAL en una actualización, no el raro, y había un ayudante escrito hace meses para exactamente esto al que aquí no se llamaba.

Cambiaron tres cosas, porque eran tres fallos y no uno. Las hojas se ensanchan antes de tocar nada. El trabajo ahora escribe primero y limpia después, así que un fallo a mitad deja las filas donde estaban — y eso habría importado igual con el ancho bien, porque una cuota agotada o un tiempo de espera entre esas dos líneas tenían el mismo efecto. Y se escribe antes la hoja que GANA filas que la que las pierde, de modo que lo peor que puede pasar es un duplicado que se ve, en vez de un agujero que no.

Ahora dos cuentas tienen que coincidir antes de escribir una sola celda. Este trabajo sólo mueve filas entre dos hojas, así que el total tiene que ser idéntico antes y después. Si no lo es, no se escribe nada en absoluto. Una segunda cuenta se hace al terminar, contra las hojas mismas, porque "la aritmética está bien" y "la escritura llegó" son preguntas distintas y la segunda no era tarea de nadie.

Y ahora avisa. El fallo se escribió en una pestaña de registro que nadie mira, y la app siguió diciendo "No movements match your filters" — la misma frase que dice cuando un filtro no encuentra nada. El trabajo manda ahora un correo al admin cuando falla o cuando las cuentas no cuadran, y la app se niega a callar: tener existencias en los estantes y cero movimientos registrados es imposible, y ahora lo dice con todas las letras en vez de enseñar una tabla vacía.

v12.13 Arreglado

El botón del ojo del editor de columnas se puede volver a pulsar

Abrías ⚙ Columns y el botón para esconder una columna no aparecía en las estrechas, o quedaba debajo de la cabecera de al lado. Y era literal: una cabecera en edición lleva asa, campo de nombre y ojo, y en Qty o Unit todo eso vivía en 58 píxeles. El ojo no se envolvía: se salía y la celda vecina lo tapaba. El mando para esconder una columna era invisible justo en las columnas que más ganas dan de esconder.

Ahora, mientras el panel está abierto, las cabeceras miden lo que miden sus mandos y no lo que mide su dato. La tabla se ensancha y se desplaza de lado mientras dure, que es el cambio correcto: un botón que no se puede pulsar es peor que una barra.

Y medirlo destapó algo que leyendo el código no se ve: una columna escondida dibuja 🚫 en vez de 👁, y 🚫 es dos píxeles más ancho. Con el primer valor que probamos, las cinco columnas que vienen escondidas se salían por un píxel y las otras once estaban bien — o sea que probar con una columna cualquiera habría dado verde.

Type, Name y Qty se quedan donde están

Esas tres llevan candado en el editor de columnas, y el candado sólo quería decir "no se puede esconder". Seguían teniendo asa, y arrastrarlas funcionaba de verdad — así que parecían movibles porque lo eran. Un movimiento sin tipo, sin material o sin cantidad no es una fila que diga nada, así que ahora son fijas de verdad: sin asa, no se les puede soltar nada encima, con la cabecera más oscura para que se lean como un bloque, y el candado explica por qué en vez de sólo decir que lo está.

Lo que cuesta, dicho claro: el nombre del material ya no se puede poner delante del tipo y la fecha. Antes se podía y puede que alguien lo tuviera así; su orden guardado se corrige solo en el siguiente dibujado. Todas las columnas que no llevan candado conservan el orden que su dueño les dio.

v12.12 Arreglado

Enseñar una columna más ya no deja el nombre del material sin sitio

Enseñabas una columna de más en Movements —Supplier, por ejemplo— y el nombre del material se quedaba sin apenas ancho: se dibujaba una letra por renglón y las filas pasaban de 83 píxeles de alto a 428. Bastaba con enseñar UNA columna, y estaba ahí desde que las columnas tienen ancho fijo.

La culpa era de un número escrito a mano. La tabla tenía un mínimo de 1.300 píxeles, pero los anchos de las dieciséis columnas suman 1.748. Un número escrito en la hoja de estilos no puede saber cuántas columnas has decidido ver, y eso lo elige cada persona con el ojo de ⚙ Columns. Con Supplier enseñada, los anchos declarados sumaban 1.296 y al material le quedaban cuatro píxeles.

Ahora el ancho de cada columna vive al lado de la columna, y no en un bloque de estilos aparte, y la tabla calcula su propio mínimo cada vez que se dibuja: los anchos que de verdad están en pantalla, más un suelo para el nombre del material. El suelo también está medido — 192 píxeles, que es lo que necesita la insignia de categoría más larga para no salirse de su celda. Por debajo de eso la tabla se desplaza de lado, que es lo correcto: dieciséis columnas no caben en una pantalla estrecha, y una barra es mejor que un texto que no se puede leer.

Una comprobación mide ahora el ancho del material con dos tamaños de ventana, en cuatro combinaciones de columnas y por los dos caminos que dibujan la cabecera. Devolver el número fijo la hace fallar diecisiete veces.

v12.11 Arreglado

La tabla de movimientos deja de saltar al cambiar el filtro

Elegías otra categoría y todas las columnas se corrían de lado. La columna Project empezaba a 476 píxeles del borde con un filtro, a 1.318 con otro y a 415 con un tercero — la misma columna, casi 900 píxeles de diferencia, porque la tabla se repartía el ancho según las filas que hubiera debajo. Así no se puede aprender dónde mirar.

Ahora cada columna tiene su ancho y lo conserva, filtres lo que filtres. Una sola queda elástica —el nombre del material, que es el que más varía y el que se lee— y es la que se queda con el hueco cuando escondes o enseñas otra columna. Lo demás no se mueve nada.

Los anchos están medidos, no elegidos a ojo: se dibujó la tabla con datos reales de almacén bajo siete filtros distintos y a cada columna se le dio el ancho que de verdad alcanzaba. Dos se quedaron cortas a la primera y se corrigieron — la insignia de TRANSFER y el correo más largo se salían. Una comprobación vuelve a medir cada columna con cada filtro y falla si una sola se mueve un píxel.

v12.10 Arreglado

La tira de reservas dice hacia dónde se abre

La lista de reservas del mapa decía click to hide incluso cuando ya estaba escondida — o sea que la única pista de lo que iba a hacer el clic se equivocaba la mitad de las veces. Ahora dice click to show cuando está plegada y click to hide cuando está abierta.

Y ya que estábamos, se reordenó el título: los tres números van seguidos —441 units · 8 reservations · in 8 racks— en vez de partidos por una frase, y esa frase se mudó a la i pequeña que va al lado. Es algo que se lee una vez en la vida y ocupaba media línea todos los días. Lo que sigue a la vista es lo único sobre lo que se puede actuar: cuántas reservas no están reteniendo nada.

v12.09 Arreglado

Cada ventana mide ahora lo que lleva dentro

Todas las ventanas de la app medían lo mismo —el 82% de tu pantalla— llevaran cuatro campos o veinte. Una corta, como Add User, dejaba un hueco enorme debajo del último campo. Una larga, como Edit Movement, había que desplazarla incluso en una pantalla grande, porque el límite no tenía nada que ver con el contenido.

Las dos cosas las causaba una sola línea, escrita así a propósito para que todas las ventanas fueran iguales. La regla ahora es la que de verdad sirve: una ventana mide lo que mide su contenido, y nunca más que tu pantalla. Add User pasó de 700 píxeles a 277. Edit Movement se abre entero, sin desplazar, en una pantalla normal.

Y Edit Movement es ahora tan ancha como la ventana donde se creó el movimiento — era 120 píxeles más estrecha, y por eso los mismos campos se apilaban más alto y había que desplazarlos. Una comprobación abre ahora todas las ventanas de la app y las mide contra su propio contenido, así que ninguna puede volver en silencio a ocupar la pantalla porque sí.

v12.08 Arreglado

El menú de tu cuenta se abre delante, y la app de atrás se queda quieta

En una pantalla ancha y baja —una tableta apaisada— abrir el menú de la cuenta lo ponía detrás de las tarjetas de avisos de la esquina. Y las tarjetas seguían vivas debajo: pasar el ratón por encima abría el mazo, y la página de atrás se movía.

Las tres están arregladas, y ahora son una sola cosa: un menú que abriste tú tiene prioridad sobre cualquier cosa que aparezca sola. Lo que no tiene es prioridad sobre una ventana que también abriste tú —un formulario a medio llenar te lo sigue tapando, que es el orden correcto.

Y por debajo, todas las capas flotantes de la app —las tarjetas, la campana, el cajón del estante, las ventanas, las confirmaciones, la vista de documentos, los avisos— toman su sitio de una sola lista ordenada en vez de llevar cada una su número. Eso es lo que hacía este fallo difícil de ver: el menú declaraba un número más alto que el de las tarjetas y aun así perdía, porque un número así sólo compite dentro de su propio grupo. Ahora una comprobación mide cuál está delante de verdad, en vez de comparar los números.

v12.07 Privacidad

El aviso de instalación manda exactamente lo que dice la Política de Privacidad

El aviso de instalación es lo único que tu instalación manda sin que se lo pidas: si a los tres y a los siete días no se ha registrado ningún movimiento, escribe a tu dirección de soporte para que alguien te contacte en vez de dejarte abandonar en silencio. Nuestra Política de Privacidad lo describe campo por campo y promete exactamente cuatro cosas —el nombre de tu empresa, el correo de tu administrador, cuántos usuarios hay registrados y cuántos días han pasado— y nada más.

Mandaba una quinta: un enlace a tu instalación. Nada salió de tu control que no debiera —ese correo va únicamente a la dirección de soporte configurada en tu propia instalación—, pero la promesa era más estrecha que el código, y la promesa es la promesa. El enlace se quitó. Cuatro cosas, como está escrito.

Y ahora corre en cada versión una comprobación que lee el correo que el código produce de verdad y falla si lleva algo que la política no enumera. Las dos que había no podían ver esto: una compara las dos copias del texto legal entre sí, y la otra comprueba cuándo se manda y cuántas veces. Ninguna miraba dentro.

v12.06 Nuevo

Incoming: un buscador, y un aviso antes de anotar la misma entrega dos veces

Las entregas esperadas eran la única lista larga de la app sin buscador. Ya lo tiene, en el mismo sitio y funcionando igual que el de Movements: escribes y la lista se estrecha. Mira en el nombre, el número de PO, el proveedor, el PM y las notas.

Y antes de guardar una entrega, la app comprueba si ya está en la lista. Manda el número de PO: un proveedor emite un PO nuevo por cada pedido nuevo, así que el mismo material con el mismo PO dos veces es casi siempre la misma entrega anotada dos veces — y dos PO distintos son dos pedidos de verdad, cosa que la app ya sabe y de la que no se queja. Cuando no hay PO que comparar, se apoya en el mismo material, del mismo proveedor, a menos de una semana de la misma fecha, y lo dice con menos seguridad.

El aviso enseña las dos entregas una al lado de la otra, campo a campo, con lo que difiere marcado — así la comparación ES la revisión, en vez de mandarte a buscar la otra. Desde ahí puedes abrir la que ya existe y editarla (no se crea una segunda), decidir que de verdad son distintas y crearla igual, o cancelar. El mismo material de dos proveedores distintos no se marca nunca: son dos entregas de verdad.

Debajo de las dos cosas: los nombres del Incoming se regularizan ahora como siempre se han regularizado los de un movimiento —mayúsculas y espacios de sobra colapsados—. Las entregas que ya estaban se quedan como se teclearon hasta que las edites, y tanto el buscador como el aviso comparan sin importar mayúsculas, así que no se escapa ninguna.

v12.05 Arreglado

Reservas: una lista que se pliega, columnas que no se mueven, y forma de soltar las que no retienen nada

La lista de reservas del mapa ahora empieza plegada. El título sigue diciendo lo que se lee de un vistazo —cuántas unidades hay retenidas, en cuántos estantes, cuántas no retienen nada— y la lista se abre al hacer clic. Con cien reservas, ese título es justamente lo que importa. Si la dejas abierta o cerrada, se recuerda.

Sus columnas ya no bailan. Cada una tiene un ancho fijo, así que añadir una reserva con un nombre más largo no mueve de lado a todas las demás filas. Lo que no cabe baja uno o dos tamaños y, si aún no cabe, pasa a una segunda línea — nunca se corta con puntos suspensivos, porque el final de un nombre de estante es donde están la letra y el número que lo distinguen.

Y una reserva que no retiene nada ya se puede soltar. Hasta ahora el único botón de soltar vivía dentro del cajón de un estante, en la fila del material — y una reserva que no retiene nada no tiene fila ahí, así que la app te avisaba del problema y no te daba forma de arreglarlo. Ahora cada fila de la lista tiene su propio Release, y cuando varias no retienen nada el título ofrece soltarlas todas de golpe, nombrándolas antes una por una. Soltarlas no cambia ninguna cantidad; sólo ordena la lista.

v12.04 Nuevo

Etiquetas: sólo las que quieres, una por pieza, y se imprimen después

Recibir diez materiales abría diez previsualizaciones de etiqueta, quisieras etiquetas o no. Ahora cada línea de material de una entrada tiene su propia casilla 🏷 Label. Marcas las que quieres y sólo salen ésas. Si no marcas ninguna no cambia nada respecto a antes: se ofrecen todas, como siempre.

Cinco door screens que van al mismo estante son cinco piezas, no un paquete de cinco. Cualquier fila con más de una unidad ofrece ahora una etiqueta por unidad: cinco etiquetas que dicen cantidad 1 y 1 of 5, 2 of 5, para que cada pieza lleve su propia etiqueta vaya donde vaya. La casilla de ×N copias sigue funcionando encima de eso.

Y las etiquetas ya no están atadas al momento de recibir. Selecciona los movimientos que quieras en la tabla y pulsa 🏷 Labels para volver a imprimirlos — con la fecha de ese movimiento, no la de hoy, así que la etiqueta de algo que llegó el martes sigue diciendo martes.

La etiqueta en sí se reordenó: la locación arriba, la cantidad debajo, cada una a todo el ancho y con su rótulo sobre el valor. Los nombres cortos como B1B o P4C tienen exactamente el tamaño que tenían. Los largos —WINDOW WAREHOUSE— se partían en dos líneas; ahora bajan lo justo para caber en una.

v12.03 Arreglado

El reporte de la tarde está en inglés, y dice quién hizo qué

El correo de la tarde salía en español. No era una configuración de tu bandeja — la app estaba escrita así, y llevaba meses en el único sitio donde nadie mira: un reporte que se manda solo a las ocho de la tarde. Ya está en inglés, y en cada versión corre una comprobación que falla si algún texto que la app muestra o envía no lo está.

La columna "Quién" contestaba dos preguntas distintas según la fila: normalmente la persona que recibió o se llevó el material, pero si ese campo estaba vacío enseñaba en su lugar el correo de quien registró el movimiento — otra persona. Ahora son dos columnas. Received by / Taken by es la persona de la bodega, y si no hay dato lo dice en vez de adivinar. User es quien lo registró, con su nombre sobre su correo.

Y el número junto a cada título ahora dice qué cuenta: "3 movements" en vez de "(3)".

v12.02 Arreglado

Un cero se dibujaba como un hueco

Una cantidad de cero salía como un espacio vacío en vez de un 0 —en cualquier sitio de la app que escribiera un número: el contenido de un estante, las tarjetas de llegada, el indicador de espacio. Un hueco parece un dato que se perdió; un 0 es una respuesta.

Jose lo encontró en una reserva que no retenía nada. Eso es una situación real —el material salió del estante, o se borraron sus movimientos— y ahora la app lo dice con palabras en vez de dejar el hueco, te dice dónde está el material si sigue en alguna parte, y avisa de que esa reserva se puede soltar. Soltarla no cambia ningún número; sólo ordena la lista.

v12.01 Arreglado

Bloquear un material ahora se llama reservarlo

La app tenía dos medias funciones que significaban lo mismo. "Bloquear un material" funcionaba —retiene material en un estante para que no salga de la bodega— pero se llamaba bloquear. Las "reservas" tenían el nombre bueno y ninguna forma de crear una: la pantalla nunca existió, y por eso el Reserved del tablero siempre decía cero.

Ahora son una sola cosa y se llama reservar. Nada de lo tuyo cambia: lo que bloqueaste es lo que está reservado. La diferencia es que el tablero por fin lo enseña, y puedes ver todas las reservas de la bodega desde tres sitios — una tarjeta en el Stock Dashboard, una tira sobre el Warehouse Map que te lleva al estante, y una marca en cada ubicación en Settings.

Una reserva retiene lo que haya en ese estante, así que la cifra se mueve con el stock sola. Y la comprobación que impide sacar material reservado ya estaba escrita — simplemente nunca había tenido nada que contar.

v12.00 Arreglado

La pantalla cambia en cuanto se guarda

Marcar una entrega como llegada tardaba unos once segundos en verse, mucho después de que el guardado ya hubiera pasado. Había dos cosas mal en la misma línea: nada actualizaba la copia de la que dibuja la pantalla, y el refresco que venía después leía del caché — así que pintaba la respuesta vieja por segunda vez y sólo se corregía cuando terminaba una recarga completa.

Ahora la pantalla cambia en el momento en que el guardado llega. No se dibuja nada antes de que el servidor lo acepte; se dibuja justo cuando lo hace. El mismo arreglo cubre adjuntar un documento a un movimiento y editar los datos de un movimiento. Una excepción que conviene saber: al editar una cantidad, la fila cambia al instante, pero el total del material sigue esperando el refresco — eso sólo lo puede calcular el servidor.

v11.99 Arreglado

El mazo de la esquina cuenta lo que tiene, y abre por la más nueva

La insignia del mazo contaba dos de las tres clases de tarjeta que lleva. Las entregas que llegaron sin registrar su entrada quedaban fuera, así que la insignia podía decir 4 con seis tarjetas debajo — y no coincidía con la campana de arriba, que sí las contaba desde el principio.

El mazo también abría por arriba, enseñando la más vieja, cuando la más nueva va abajo. Ahora abre por abajo y se queda ahí mientras se despliega. Si subes con la rueda, te suelta: leer las viejas es justamente para lo que está la barra.

v11.98 Nuevo

Manage Users funciona como la tabla de movimientos

De siete columnas a cuatro: el nombre va sobre el correo, y el rol sobre la fecha en que se añadió. El formulario de Add User ya no ocupa la parte de arriba — es un botón que lo abre cuando hace falta.

Editar y Desactivar salieron de las filas y están en una barra, y se encienden al marcar a alguien. Editar necesita exactamente uno; desactivar funciona con varios a la vez. Tu propia fila no se puede marcar, que es la misma regla que el servidor ya aplicaba, dicha antes de pulsar en vez de después.

Y ahora se puede devolver el acceso desde la app. Hasta ahora la ventana te mandaba a editar la hoja de cálculo a mano; el botón dice Reactivate cuando todo lo marcado está inactivo, y se apaga con una mezcla en vez de adivinar qué mitad querías.

v11.98 Nuevo

Dos cosas más pequeñas

El muro de tarjetas naranjas se detiene a dos tercios de la ventana en vez de crecer por encima de lo que estabas mirando. Si hay más tarjetas de las que caben, la pila se desplaza dentro de su hueco — no se esconde ninguna.

Y en el mapa del almacén, al tocar un material de un estante su nombre aparece en la cabecera mientras sus opciones están abiertas. En el teléfono el dedo tapa la fila, y la cabecera era lo único que quedaba para saber sobre qué vas a pulsar Exit.

v11.97 Arreglado

El último movimiento de una tanda llega a la otra cuenta

Al borrar trece movimientos desde una cuenta, el último no desaparecía nunca de la otra. No lento — nunca. Se quedaba en pantalla todo el tiempo que uno quisiera esperar.

La app le pregunta al servidor "¿ha cambiado algo?" comparando un sello. La carga que trae los datos leía los movimientos primero y ese sello al final, así que un borrado que cayera entre las dos lecturas dejaba al navegador con la lista vieja y el sello nuevo. A partir de ahí cada comprobación decía "no ha cambiado nada" y no volvía a preguntar.

Ahora el sello se lee antes que los datos. Cuando ocurre la misma carrera, al navegador le queda el sello viejo, nota la diferencia en su siguiente comprobación y vuelve a pedir. Cuesta una consulta de más; lo que evita es una pantalla equivocada para siempre.

v11.96 Arreglado

Borrar varios a la vez deja de ser lento

Una versión anterior hizo que una tanda de cambios reconstruyera las tablas de existencias dos veces en vez de una por cambio. Funcionaba — para los guardados. Los borrados tienen su propia cola desde hace tiempo y nunca pasaron por ese código, así que borrar trece movimientos seguía pagando trece reconstrucciones enteras.

Cronometrado sobre una grabación: tres hechos en 1:20, seis en 2:00, diez en 2:40. Unos doce segundos cada uno. Eso es también la mayor parte de lo que parecía "la otra cuenta tarda en actualizarse" — la otra ventana no puede enseñar la verdad hasta que el trabajo termine, y el trabajo tardaba dos minutos y medio.

Trece borrados cuestan ahora dos reconstrucciones. Dos y no una, y vale la pena decir por qué: la primera no puede esperar, porque cuando sale los otros doce todavía no se han encolado, y la última refresca sola porque detrás de ella ya no viene nadie.

v11.95 Arreglado

Los checks dejan de borrarse solos

Marcando varios movimientos para borrarlos, a veces desaparecían todos los checks de golpe. La tabla se plegaba a su primera página cada vez que llegaban datos nuevos —que trabajando entre dos es cada veinte segundos— así que lo marcado más allá de la primera página dejaba de dibujarse.

La mitad que no se veía era la que había que arreglar: la selección sí sobrevivía, así que Delete seguía armado sobre filas que ya no estaban en pantalla. Marcar ocho, ver cero y que borrar se lleve ocho es peor que perder la selección, porque perderla al menos se nota.

Los datos nuevos ya no cambian la página en la que estás — eso sigue pasando al cambiar de pantalla o de filtro, donde significa algo. Y la regla ahora es simple: lo marcado es lo que se ve. Una fila que sale de la vista, por lo que sea, se lleva su marca con ella.

v11.95 Nuevo

La tarjeta del nombre siempre mide lo mismo

Al pasar el ratón por un nombre en la columna User se abría una tarjeta cuyo ancho seguía al largo del correo — y como una tarjeta más ancha tiene que apartarse más para no salirse de la ventana, además aparecía en un sitio distinto cada vez. Una sola causa para las dos quejas.

Ahora es de ancho fijo, con el nombre y el correo en una línea. Lo que no cabe se acorta y se puede leer entero pasando el ratón por encima.

v11.94 Nuevo

Todo lo que desaparece se ve desaparecer

Un movimiento borrado se encoge y se va en vez de parpadear desde hace varias versiones, y lo mismo uno devuelto desde la papelera. En todos los demás sitios la fila seguía desapareciendo de un fotograma al siguiente, que se lee como una falla y no como algo que pasó.

Ahora hace lo mismo al vaciar la papelera, al fusionar ubicaciones, valores del catálogo, duplicados o materiales, al borrar una ubicación y al quitar un valor del catálogo o un contacto. En una fusión se ve exactamente cuáles se fueron, que era la parte difícil de seguir cuando se van tres de golpe.

A quien tenga el sistema puesto en "menos movimiento" no le llega nada de esto, y el trabajo se hace igual, al instante.

v11.93 Nuevo

Los avisos que se quedaron ahora duran menos

Diez avisos confirman algo que acabas de pulsar tú mismo — guardar un movimiento, editarlo, borrar una entrega esperada, cargar el historial viejo. Ésos se quedan, porque la confirmación sirve, pero ahora se van en dos segundos en vez de tres y medio. Bastante para leer cinco palabras; poco para que tres seguidos se apilen sobre la tabla.

Todo lo demás conserva su tiempo. Los errores y las advertencias hay que leerlos. Y también los dos avisos que parecen confirmaciones y no lo son: el que dice qué falta después de empezar una entrada desde una entrega, y el que explica por qué un ajuste de conteo no cambió nada.

v11.92 Nuevo

Menos avisos, y una línea de progreso donde se amontonaban

Se quitaron diez avisos del todo — fusionar cosas, guardar los datos de la empresa, añadir o quitar un contacto, renombrar columnas. En todos ésos la pantalla ya enseña el resultado en el momento, así que el aviso repetía algo que estabas mirando.

Otros cinco pasaron a la línea de progreso: vaciar la papelera, importar un archivo, subir la foto de un estante, añadir varios proveedores o proyectos de golpe, y marcar varias entregas como llegadas. Son los que tardan o se repiten, y ahora la línea gira mientras trabajan en vez de dejar la pantalla quieta hasta el final.

Dos que estaban en la lista de quitar se quedaron, y vale la pena decir por qué: guardar el mapa del almacén ya no dice "guardado", pero sigue nombrando la ubicación que se haya borrado — que es lo único de esa pantalla que no se deshace arrastrando de vuelta. Y un estante que se queda vacío sigue avisando, porque el cajón se cierra solo, y cerrarse sin decir nada parece una avería.

Los errores y las advertencias no se tocaron. Ésos hay que leerlos.

v11.92 Nuevo

El botón de Email abre Gmail

Antes se lo pasaba a la app de correo que tenga configurada la computadora. Eso es una configuración por computadora, y un clic en "Always" deja el botón atascado en una app que no usas, sin forma de volver atrás desde la app.

Ahora abre un correo nuevo de Gmail con la persona ya puesta — igual que los botones de Meet y Schedule que tiene al lado, que ya iban directo a Google. Y si tu app de escritorio está unida a Gmail, el correo llega a la misma bandeja.

v11.91 Nuevo

Devolver movimientos también los cuenta

Restaurar cinco movimientos de la papelera daba cinco avisos sobre la ventana de Ajustes que estabas usando — y las filas ya se iban solas de la lista, así que los avisos no contaban nada que no se viera.

Ahora los cuenta la misma línea de progreso, y al final dice cuántos volvieron. Además se movió a la izquierda, donde antes tapaba las tarjetas en pantalla ancha, se queda seis segundos en vez de menos de tres, y se cierra con un clic.

v11.90 Arreglado

Las filas borradas dejan de volver

Borrar varios movimientos a la vez se veía mal, y en un caso estaba mal. Las filas se iban de la pantalla enseguida, como toca. Y unos segundos después volvían —una por una, en gris, a irse otra vez—. Algunas volvían sin gris siquiera, y se podían seleccionar y borrar una segunda vez, que entonces fallaba con "ya está borrado".

Nunca se borró nada dos veces: la app reconoce cada movimiento por su nombre propio y rechaza el segundo intento, diciendo quién lo borró y cuándo. Pero la pantalla estaba enseñando filas que ya no existían, y eso también está mal.

La causa era un refresco que llegaba a mitad de la tanda con una foto del almacén tomada antes de que la tanda terminara. Un refresco ya no pinta mientras quede un borrado en el aire.

v11.90 Nuevo

Una línea de progreso en vez de una pila de avisos

Borrar trece movimientos ponía trece avisos en pantalla, uno encima de otro, sobre la misma tabla que estabas mirando — y ninguno decía lo único que interesa saber mientras esperas: cuánto falta.

Ahora una sola línea en la esquina los va contando —"4 of 13"— y termina en un check verde. Un borrado que falla sigue teniendo su aviso aparte, porque ése hay que leerlo.

v11.89 Arreglado

Una tanda de cambios deja de reconstruirlo todo, cada vez

Después de cada cambio —borrar un movimiento, aplicar un arreglo de "Check my data", fusionar dos cosas— la app reconstruía sus tablas de existencias desde cero. Eso son unos nueve viajes a la hoja de cálculo, y hacer diez cambios seguidos lo pagaba diez veces: unos cuarenta segundos de trabajo que sólo necesitaba unos pocos.

Ahora una tanda reconstruye dos veces en vez de diez — una al principio, porque todavía no hay nada detrás, y otra al final. Un cambio suelto se comporta exactamente igual que antes.

Esto no puede hacer que se saque material que ya no está: si alcanza o no para una salida se comprueba contra el historial de movimientos, no contra las tablas que se aplazan. Y si una tanda se corta —se cierra la ventana, se cae la conexión—, la siguiente persona que abra la app pone las tablas al día antes de enseñar ningún número.

v11.88 Más seguro

Las comprobaciones dejan de romperse por cosas que no son fallos

No cambia nada de la app. Esto es sobre las comprobaciones que corren antes de que algo te llegue.

Seis veces en una semana se pusieron rojas sin que nada estuviera mal: cada comprobación llevaba su propia lista, escrita a mano, de qué piezas de la app necesitaba, y esas listas se quedaban viejas cada vez que una pieza crecía una dependencia nueva. Ahora las deducen del código. Una comprobación que se pone roja sola enseña a dejar de leerlas, y el día que una roja es de verdad recibe el mismo encogimiento de hombros.

v11.87 Arreglado

La comilla otra vez — ahora al editar

La versión anterior arregló guardar un movimiento. Editar uno seguía metiendo una comilla, y sólo en los campos que de verdad cambiabas — por eso crear una entrada se veía bien y editarla no.

Aquí importa más que en el otro camino: cuando cambia la categoría o el nombre, la identidad del material se recompone a partir de ellos, así que una comilla ahí habría hecho que la fila dejara de coincidir con su propio material.

Tercera vez que el mismo fallo sale por otra puerta, así que deja de buscarse a mano: ahora lo cuenta una comprobación. La regla que exige cabe en una línea — una función que escribe la fila con el guardián de texto no cita además sus propios valores. Se cita una vez, en el borde.

v11.86 Arreglado

Una comilla delante de todo lo guardado

Los movimientos guardados con la versión anterior metían una comilla delante de cada texto — 'WINDOW, 'UNIT, '16598. Se estaban aplicando dos protecciones donde hacía falta una, y la hoja de cálculo se quedaba la segunda DENTRO del dato.

Y no era sólo feo: la identidad de un material se compone de su categoría y su nombre, así que una fila guardada así no coincidía con el mismo material guardado antes, y sus existencias se habrían partido en dos. El guardado está corregido, y la prueba que existe para esto ahora ejecuta el guardado de punta a punta en vez de leer el código — que es justamente por lo que lo había dejado pasar.

Además: la ventana de salida ya no se abre sólo para decir que no. Elegir un material trabado contesta con el motivo ANTES del formulario, en vez de abrirlo y enseñar "locked" en letra pequeña. Y el proveedor en la tarjeta de entrega es ahora una insignia, de un solo color para todos, en vez de texto detrás de un guion.

v11.85 Más seguro

Dos personas a la vez ya no pueden pisarse las entregas

Editar una entrega esperada y borrar otra no estaban coordinadas. Si alguien borraba una entrega mientras vos tenías otra abierta, tu guardado podía caer sobre una entrega distinta de la que editaste — y el compañero cuya entrega quedó pisada no se enteraba nunca.

Las tres acciones de entregas esperadas se turnan ahora como toca, y las pantallas esperan su turno y reintentan en vez de mostrar un error. La misma lección se aplicó a los movimientos en septiembre; aquí es donde no se había conectado.

Aparte: quitar un usuario por el camino de administración viejo borraba una fila entera de la hoja de ajustes —donde cada columna es una lista distinta— así que podía llevarse un proyecto, una categoría, un proveedor y una locación por delante. Ningún botón de la app llega a ese camino, así que nunca pasó; ahora vacía sólo las dos celdas del usuario.

v11.84 Arreglado

Los mensajes de error no enseñan el cableado de la app

Cuando algo falla, el servidor a veces marca el mensaje para que la app lo lea — texto como SYSTEM_BUSY| delante de la frase de verdad. Casi todas las pantallas quitaban esa marca antes de enseñarlo. Seis no, incluido el formulario de entrada, cuyo gemelo el de salida sí lo hacía.

Ninguna podía enseñarlo todavía —las acciones que llaman esas pantallas no producen hoy errores marcados— pero la trampa era el desajuste, no el síntoma. Los quince mensajes de error pasan ahora por el mismo filtro, y uno nuevo escrito sin él rompe las comprobaciones a propósito, para que la decisión se tome mientras alguien mira.

v11.83 Más seguro

El fallo de las entradas duplicadas ya tiene una prueba que lo habría cazado

En septiembre una tarjeta de entrega podía saldarse y volver, dejando guardar el mismo movimiento una y otra vez. Se arregló en la v11.70 — pero había una prueba pasando por encima de ese fallo todo el tiempo, porque comprobaba que el arreglo estuviera ESCRITO, no que se EJECUTARA.

Ahora ese camino de guardado se ejercita de verdad: el formulario de entrada corre contra un navegador y un servidor de mentira, y lo que se comprueba es lo que ocurrió — la tarjeta se salda sólo después de que el servidor aceptó el movimiento, un guardado fallido no salda nada, y la ventana de etiquetas sale antes del "¿también llegó esto?" en vez de las dos encima. No cambia nada de cómo se comporta la app; lo que cambia es que esta clase de fallo ya no puede pasar desapercibida.

v11.82 Nuevo

Las entregas dicen de quién vienen

Cada tarjeta de entrega —en la ventana de la mañana y en las tarjetas de día de la semana— dice ahora material - proveedor en una sola línea. Si el nombre del material es muy largo se acorta con puntos suspensivos para que el proveedor quepa al lado en vez de bajarse a la línea siguiente, y un proveedor larguísimo se acorta igual. Cede el que de verdad sobra: un proveedor corto no se recorta nunca para hacer sitio. Pasando el mouse se lee entero, porque acortar en pantalla no puede significar perder lo que se escribió. Una entrega sin proveedor anotado enseña sólo el material, sin un guion colgando.

v11.81 Más seguro

Renombrar un material ya no puede borrar otro

Renombrar, fusionar o cambiar de categoría cualquier cosa reescribe una columna entera del archivo — incluidas todas las filas que no tocaste. Al pasar, los valores con forma de fecha se convertían en fecha, y un material llamado "07-6329" dejaba de contar en el stock sin avisar. Siete acciones normales hacían esto, y el material que desaparecía no tenía por qué ser el que estabas editando.

Ahora el texto sigue siendo texto en esas reescrituras, y también en la hoja de packs, en la reparación de ids de movimiento y en el volcado de diagnóstico, que tenían el mismo hueco.

Por debajo, dos guardianes pasaron a ser uno. El viejo sólo protegía de las fórmulas, no de las fechas, y tener los dos significaba que cada trozo de código nuevo era una elección entre el fuerte y el débil — cuarenta y seis sitios habían elegido el débil. El débil ya no está. Una consecuencia visible: un PO escrito "12345" se guarda ahora como texto, así que se ve pegado a la izquierda de la celda en vez de a la derecha. Un PO es una etiqueta, no una cantidad.

Esto protege lo que se escriba de aquí en adelante. Lo que ya se convirtió en el pasado no se puede sacar de la celda — sólo de otras filas que todavía lo tengan.

v11.80 Arreglado

Un material trabado ahora lo dice donde estás mirando

Trabar un material a un estante lo trababa, pero el candado sólo se veía en dos sitios: el cajón del estante y el formulario de salida. A los dos se llega después de haber decidido ya mover el material. En la tabla de existencias —la pantalla que la mayoría tiene abierta— no había nada.

Ahora la columna Location lleva un candado, y al pasar el mouse dice en qué estante, quién lo trabó, por qué y qué se puede seguir haciendo con él: si se puede mover a otros estantes o sólo a unos concretos. Un candado sobre un estante del que el material ya salió no se enseña, porque ya no impide nada.

Y trabar o destrabar llega ahora a todos los que tengan la app abierta, en segundos, en vez de esperar a que recarguen. Antes un compañero podía intentar sacar material trabado minutos atrás y enterarse sólo por el error.

v11.79 Nuevo

Etiquetas, impresas al recibir

Guardás una entrada y Acopio te ofrece imprimir una etiqueta de 4"×6" de lo que acabás de meter — material, cantidad, estante y PO, cada cosa lo bastante grande para leerla de lejos, y con sitio reservado para un QR o un código de barras.

Una etiqueta por estante, no por material: si cuarenta y cuatro unidades fueron a dos estantes, son dos bultos en dos sitios y cada uno lleva su cantidad. Marcá las que necesiten etiqueta —no todo la necesita— y cuántas copias de cada una; una es el valor por defecto.

No se imprime nada más. La app desaparece para imprimir y al rollo sólo van las etiquetas.

v11.78 Nuevo

"¿También llegó esto?"

Llega un camión con cuatro cosas y tenés los papeles en la mano, así que entrás las cuatro de una vez. Hasta ahora sólo dejaba de esperarse la entrega por la que entraste — las otras tres seguían ahí, aguardando material que ya estaba en tus estantes.

Ahora, con la entrada ya guardada, Acopio enseña las entregas esperadas que coinciden con lo que acabás de entrar y ofrece marcarlas como llegadas. Vienen todas marcadas; desmarcá la que no haya llegado.

Pregunta en vez de decidir, y es a propósito. Nada une una entrega con un movimiento, así que la coincidencia se deduce del material, la fecha y el PO — y dar por recibida una entrega que sigue en la carretera significa dejar de esperar algo que nunca llegó. Una casilla cuesta un segundo.

v11.77 Arreglado

La campana decía 3 y enseñaba 2 — y las otras pantallas ya se enteran

El contador de avisos incluía los recordatorios naranjas de "llegó y falta su entrada". La lista que sale al abrir la campana no, así que el número y la lista no cuadraban. Ya están en la lista, y arriba del todo: material en el almacén del que tus cantidades no saben nada es lo más urgente que esa lista puede tener.

Y marcar una entrega como llegada ya llega a los demás. Las entregas esperadas estaban fuera de la señal que avisa a las sesiones abiertas de que algo cambió — así que una segunda ventana, o un compañero, seguían viendo la entrega como pendiente hasta recargar a mano.

v11.76 Arreglado

El PO de una entrega esperada se quedaba vacío

Escribías 08-4885 en el PO de una entrega esperada, guardabas, la volvías a abrir y el campo estaba en blanco. Lo escribías otra vez, lo mismo. Las hojas de cálculo leen 08-4885 como una fecha —mes 08, año 4885— y guardan eso en lugar de tu texto; al leerlo de vuelta, la app se negaba a enseñar una fecha destrozada donde va un PO, así que no enseñaba nada.

Las entregas esperadas ya guardan lo que escribes, igual que los movimientos desde hace tiempo. Las filas viejas cuyo PO se comió no se pueden recuperar de la celda —el texto ya no está ahí— así que hay que escribirlos una vez más, y esta vez se quedan.

Además: la ventana de la semana ya se actualiza mientras trabajas en ella. Marcar una entrega como llegada desde el popup y registrar su entrada dejaba el popup enseñando el estado viejo hasta cerrarlo y volverlo a abrir — sólo se refrescaba si la pestaña de Incoming resultaba ser la que estaba detrás.

v11.75 Nuevo

La fila borrada se va en el momento en que pulsas

Antes se quedaba ahí, atenuada, hasta que el servidor contestaba — que en un almacén real son unos cuatro segundos, porque cada borrado reconstruye tus totales desde el archivo entero. Ahora la fila se encoge al pulsar y las de abajo suben. Si el servidor dice que no, la fila vuelve exactamente a su sitio y te lo dice.

Lo de encogerse es la parte que importa. Una fila que sólo se desvanece deja su hueco, y las de abajo saltan cuando el hueco se cierra. Encogiéndose, suben — y ese movimiento es lo que se lee como "esto está pasando" en vez de como un parpadeo.

Restaurar desde la papelera usa el mismo movimiento. Los otros sitios donde una fila desaparece —los merges, vaciar la papelera, quitar un valor del catálogo— vienen después: varios repintan su lista entera hoy, y una lista que se repinta no puede enseñar una fila yéndose.

v11.74 Mejorado

Una espera menos en cada guardado

Cada guardado y cada borrado reconstruye tus totales, y parte de eso era leer la hoja de movimientos antiguos incluso cuando estaba vacía. En un almacén real esa lectura costaba medio segundo de no hacer nada, cada vez.

Ahora se salta cuando no hay nada. Las instalaciones cuya hoja de movimientos antiguos ya creció no cambian: se sigue leyendo, porque esas filas cuentan.

Y la medición detrás de esto vale la pena saberla si alguna vez te preguntas por qué Acopio se queda pensando: leer veinticuatro mil celdas cuesta lo mismo que no leer ninguna. Lo que una hoja de cálculo cobra es el viaje, no los datos.

v11.73 Nuevo

La columna User ya es una persona

Antes era una dirección de correo. Ahora enseña el nombre de la persona, con el correo en gris debajo. Al pasar el ratón sale una ficha pequeña que ofrece escribirle, abrir un Google Meet, o dejarle delante una invitación de calendario con su dirección ya puesta.

A quien no tenga el nombre escrito en Manage Users se le sigue viendo la dirección, igual que antes. Y el nombre nunca se adivina a partir del correo: que alguien escriba desde "j.castro@" no prueba que se llame J Castro, y un nombre inventado en el registro de quién movió material es peor que una dirección.

El nombre se busca al dibujar la fila, no se copia dentro. Corrige una letra en Manage Users y todas las filas que esa persona guardó pasan a decir el nombre nuevo — incluidas las de hace dos años.

v11.72 Mejorado

La ventana de la semana ya enseña la semana entera

Dos cosas se le caían en silencio. Una entrega que llegó el lunes y sigue sin su entrada desaparecía el martes: no está entre lo que se espera, porque ya llegó, ni entre lo de hoy, porque no es de hoy. Y una entrega que se esperaba el lunes y nadie marcó se iba igual, por la misma razón: las dos listas sólo miraban de hoy en adelante.

Ahora todo lo que la semana espera o ya recibió está en la ventana. Lo que se esperaba antes y nadie marcó va arriba, en ámbar; lo que llegó sale con el día que llegó y dónde se puso. Ninguna de las dos cambia cuándo se cierra la ventana: eso sigue pasando cuando no queda nada por atender de lo que viene.

v11.71 Arreglado

"Nada llegando hoy", una mañana en la que llegaron tres cosas

La ventana de la mañana listaba lo que seguía esperándose, y una entrega marcada como llegada no bajaba en la lista: se salía de ella. Así que la ventana podía decirte que hoy no llegaba nada con tres entregas recibidas antes de las nueve.

Lo que llegó hoy tiene ahora su propio bloque, y cada cosa dice dónde se puso. Si la entrada todavía no se hizo, no dice nada — y ese hueco es justo lo que importa: es como se ve el material que está en el almacén y del que las cantidades no saben nada.

El dónde se averigua emparejando la entrega con las entradas, porque nada une las dos directamente. Y se equivoca hacia el lado de callar: un estante equivocado diría que algo está registrado cuando no lo está, que es precisamente el error que esto existe para cazar.

v11.70 Arreglado

La tarjeta del recordatorio ya se salda al hacer la entrada

Al marcar una entrega como llegada, Acopio deja una tarjeta naranja en la esquina: llegó, falta su entrada. Guardar esa entrada tenía que quitar la tarjeta. En la pantalla de entrada de varios materiales —que es la que abre cualquier entrada— no la quitaba. La tarjeta se quedaba, y su botón volvía a abrir el mismo formulario relleno con la misma entrega, así que el mismo ingreso se podía guardar otra vez, y otra.

Eso es material que nunca llegó apareciendo en el almacén, y por eso se hizo antes que todo lo demás. Si te quedaron entradas repetidas de una tarjeta que pulsaste dos veces, borra las de más desde Movements: las cantidades se corrigen solas en cuanto la fila desaparece.

v11.69 Nuevo

Cinco cantidades se vuelven una barra

In Warehouse, Used, Available, Wasted y Reserved eran cinco columnas sueltas que el ojo tenía que sumar para entender un material. Ahora son una barra: lo que puedes tomar, lo que está apartado, lo que salió a una obra y lo que se dio de baja — cada trozo, su parte de todo lo que hoy se tiene contado de ese material.

El número se queda delante, porque en un almacén la pregunta es "¿me alcanza para cuarenta?", y una proporción no contesta eso. Pasa el ratón por la barra para ver las cifras exactas, y quién reservó qué y para qué obra.

Una cosa que conviene saber del total: es lo que el material tiene contado hoy, no todo lo que llegó alguna vez. Una corrección de conteo mueve existencias sin que llegue ni salga nada, así que "recibido" dejaría de cuadrar la primera vez que alguien ajusta un estante — y una barra cuyos trozos no llegan al final es peor que no tener barra.

v11.68 Nuevo

Elige una categoría y su columna se aparta

Con el dashboard filtrado a una sola categoría, todas las filas de la columna Category decían lo mismo. Eso no es información, es espacio desperdiciado — así que la columna se aparta y la categoría se dice una vez, en el título de la lista. En una pantalla estrecha son unos 130 píxeles menos de scroll lateral.

Vuelve sola en cuanto eliges All Categories otra vez, y tu orden de columnas no se toca. Si abres el editor de columnas ahí está, como siempre: no se puede reordenar lo que no está en pantalla.

v11.67 Arreglo

La cesta del dashboard enseña los números de hoy

Marcar materiales en el Stock Dashboard guardaba una copia de cada fila tal como estaba en ese momento. Si otra persona guardaba un movimiento mientras tanto, Exit Selected abría el formulario con las cantidades viejas — la cesta se veía perfectamente bien y ya no era verdad.

Ahora guarda sólo qué materiales elegiste y lee sus cifras actuales al usarlos. Un material que deja de existir mientras tienes la cesta abierta —fusionado con otro, renombrado— se cae de la cesta en vez de aparecer con números de antes.

v11.66 Arreglo

Devolver varios movimientos de una vez

Pulsar Put back en una tanda de movimientos borrados parecía haberlos olvidado: en cuanto terminaba el primero, todos los demás botones se rearmaban como si nadie los hubiera tocado. El trabajo siempre iba en marcha — la lista se redibujaba desde cero cada vez y perdía lo que seguía en camino. Ahora las filas se quedan marcadas como en camino hasta que de verdad vuelven.

Además van de una en una y piden una sola recarga al final, en vez de una lectura completa del almacén por movimiento.

v11.66 Más seguro

Las columnas añadidas después de instalar por fin tienen nombre

Una instalación escribía los títulos de sus columnas una sola vez, al montarse. Lo que llegó en versiones posteriores —las dos columnas de costo, el ID de movimiento— se escribía por posición y su título se quedaba en blanco. Una columna sin nombre parece basura sobrante, y alguien acaba limpiándola.

Volver a pasar por Setup rellena ahora los nombres que falten. Un título que ya tiene texto no se toca nunca, diga lo que diga: nada en la app lee esos nombres, así que renombrar el tuyo sería un cambio que nadie pidió.

v11.65 Arreglo

Las burbujas de ayuda salen donde estás mirando

Cada i pequeña de Ajustes ponía su explicación un par de centímetros por debajo de su icono y la dibujaba detrás de los recuadros de al lado. La causa era una línea: el título de cada recuadro se sube a su línea de borde con un transform de CSS, y un transform pasa a ser en silencio el marco de referencia de todo lo que se posicione dentro.

En vez de quitar esa subida, la burbuja vive ahora fuera de todos los recuadros. Nada de la página la puede recortar, mover ni tapar — ni este recuadro, ni el que se decore el año que viene. Además se acomoda sola en ventanas bajas en vez de salirse por abajo, y se aparta al hacer scroll.

v11.65 Arreglo

Check my data recuerda lo que encontró

Cerrar Ajustes y volver a abrirlo mostraba el recuadro vacío, como si el barrido no se hubiera hecho nunca. Los hallazgos nunca se perdieron — el panel simplemente se reconstruía sin dibujarlos. Ahora vuelven, sin volver a escanear.

Y aplicar una tanda de arreglos pide una sola recarga al final en vez de una por arreglo. Veinte arreglos eran veinte lecturas completas del almacén.

v11.64 Arreglo

"Sistema ocupado" deja de parecer algo que rompiste tú

Cuando dos personas guardan en el mismo momento, una espera. Eso es normal y el sistema siempre lo ha manejado — pero se rendía a los trece segundos y entonces escribía en pantalla su propia nota interna, con marca y código de referencia incluidos. Ahora espera unas tres veces más, en silencio, y el botón simplemente dice Waiting….

Todas las pantallas que escriben pasan ahora por una sola cola, así que tus propios dos clics ya no chocan entre sí. Seis de ellas no tenían ninguna espera — entre ellas Check my data, donde aplicar un arreglo fallaba sin más si alguien estaba guardando.

Y cuando algo de verdad no se puede hacer, el mensaje dice qué está mal en vez de repetir "ocupado". Las marcas internas y la referencia de soporte ya no aparecen en pantalla; la referencia se sigue guardando, donde el soporte la puede buscar.

v11.64 Arreglo

El check de un movimiento se va cuando terminas con él

Seleccionar un movimiento, editarlo y guardarlo dejaba la fila todavía marcada, y cambiar de pestaña y volver también. La selección se limpia ahora al guardar una edición y al salir de la pantalla — sólo sobrevive mientras sigues en la misma página mirando la misma lista.

v11.63 Arreglo

Un PO escrito 07-6329 se queda 07-6329

Google Sheets interpreta lo que se le da. Al recibir el texto 07-6329 decidió que eso significaba julio del año 6329, guardó una fecha y tiró la orden de compra. El número que salía después era uno que nadie había escrito nunca.

Apareció al borrar un movimiento y devolverlo desde la papelera, que es el camino que copia una fila de una hoja a otra. Pero la misma línea de código está en seis sitios — guardar, editar, la papelera, restaurar y las dos mitades de la rotación nocturna del archivo — más los resúmenes de existencias y las listas del catálogo. Todos escriben ahora el texto como texto.

Dos consecuencias que conviene saber. Una orden de compra escrita sólo con dígitos se guarda a partir de ahora como texto, así que queda a la izquierda de la celda en vez de a la derecha: un PO es una etiqueta, no una cantidad. Y las filas escritas antes de esta versión no se reparan con ella — un valor ya convertido perdió el original dentro de la celda, y la única fuente honesta para recuperarlo son las otras filas que todavía lo tienen.

v11.62 Nuevo

Varias locaciones de una vez, y una vacía se puede borrar

Montar un estante ya no son seis viajes por el mismo cuadro: escribe A1A, A1B, A1C y salen tres. Las que ya existan se saltan y se nombran, en vez de cancelar todo.

Una locación que no tiene nada guardado dentro se puede borrar del todo — aparece una papelera al lado. Los movimientos anteriores no cambian: cada uno se queda con el nombre de la locación con el que se grabó, la misma regla que ya sigue el renombrar. Una locación que todavía tiene material, tiene un candado encima, o está nombrada como destino permitido de un candado, se queda sólo con el botón de archivar, y al pasar el ratón dice cuál de las tres la retiene.

Por debajo: ahora la regla la aplica el servidor en vez de fiarse de la pantalla. Esta pantalla siempre ha mandado la lista entera de vuelta, así que una locación podía en principio desaparecer sin que nadie comprobara si estaba vacía. Ahora se comprueba donde no se puede saltar.

v11.61 Nuevo

Movements cabe en la pantalla: cuatro columnas son dos

El tipo va ahora encima de la fecha en una columna, y la categoría encima del nombre del material en otra. La misma información, dos columnas menos, y la tabla deja de irse por el lado de la pantalla — sobre todo con el editor de columnas abierto, que antes lo ensanchaba todo.

Lo que se pierde a cambio, y conviene saberlo: esas cuatro ya no se pueden reordenar por separado, porque ya no son cuatro. El orden que tuvieras puesto se conserva — la columna fusionada se queda con el sitio que tenía la primera de su pareja.

v11.60 Nuevo

Al desbloquear un material te dice quién lo cerró, y por qué

Antes de desbloquear algo, el aviso enseña ahora quién lo cerró, cuándo, la razón que dio con sus propias palabras, y a dónde se permitía moverlo. Todo eso ya estaba guardado — sólo vivía en una ayuda flotante sobre un icono pequeño, que se la enseña a quien pasa por al lado en vez de a quien va a tomar la decisión.

También se arreglaron dos mensajes que no ayudaban: que te falte un permiso ahora dice qué intentabas hacer, a quién pedírselo y dónde se enciende; y la ventana de llegadas ya no dice "Good morning" a las ocho de la tarde.

v11.59 Nuevo

Marca los movimientos que quieras y actúa sobre ellos

Movements tiene ahora casillas, igual que el Stock Dashboard, con una casilla general en la cabecera que marca lo que estás viendo — no el archivo entero. Edit y Delete están en la misma línea que Columns, apagados hasta que marques algo. Edit trabaja sobre un movimiento a la vez y lo dice; Delete sobre los que quieras, y todos van a la papelera.

Ya no se mueve nada en esa fila. Los botones están siempre, el texto largo de las columnas se fue al ⓘ, y la columna de acciones dejó de aparecer y desaparecer — esas tres cosas eran las que hacían saltar la tabla cada vez que pulsabas algo. Cambiar un filtro suelta lo que tenías marcado, así que nunca puedes borrar filas que ya no ves.

v11.58 Arreglado

Borrar varios movimientos a la vez ya no dice "System busy"

Pulsar cuatro papeleras seguidas le pedía al servidor cuatro reconstrucciones completas del stock en el mismo momento, y las últimas volvían ocupadas. Ahora salen de una en una, en el orden en que las pulsaste: la fila que espera su turno se ve atenuada, se reintenta sola si otra persona está guardando, y sólo habla si de verdad no pudo pasar.

v11.58 Nuevo

Vaciar la papelera, y Ajustes deja de volver a pedir lo que no cambió

La papelera tiene ahora su propio botón Empty the trash, dentro del cuadro que vacía. Es la única acción de la app que de verdad no se puede deshacer, así que sigue siendo sólo de administrador aunque borrar un movimiento ya no lo sea.

Y abrir Ajustes ya no vuelve a preguntarle al servidor por cosas que no han cambiado desde la última vez — la lista de borrados, los IDs de movimiento y la lista de usuarios se conservan hasta que algo las cambia de verdad. Ajustes también tiene ahora un filo inferior, en vez de terminar a ras del contenido.

v11.57 Arreglado

Cambiar de tipo de movimiento dejaba media fila atrás

Pasar de Exit a Transfer arrastraba la cantidad pero no el estante de donde salía, dejando una fila que decía "? unknown rack" con un número de verdad dentro — una fila que parece rellena y no lo está. El marcador de arriba contaba también esa fila, así que podía enseñar más unidades de las que existen.

Ahora el estante y la cantidad viajan juntos o no viaja ninguno. Si el material está en un solo estante, se rellenan los dos; si está repartido en varios, ninguno, porque la app no sabe a qué balda fuiste. La lista de estantes de origen también dejó de ofrecer todos los sitios del edificio y ahora enseña sólo los estantes donde ese material está de verdad, con cuánto hay en cada uno.

v11.56 Arreglado

El permiso de "puede borrar movimientos" nunca funcionó de verdad

Darle a un rol de almacén permiso para editar movimientos debía dejarle corregir o borrar un movimiento ya guardado — lo dice el propio interruptor. Corregir funcionaba; borrar seguía siendo sólo de administrador por debajo, así que el interruptor se veía encendido, el botón de borrar aparecía, y al pulsarlo decía "Admin only." Ya funciona, y el permiso sigue sin abrir las operaciones masivas que reescriben la historia entera de un material.

v11.56 Arreglado

"Load Older History" hacía desaparecer los botones de Entry y Exit

Mientras un botón trabaja, los de al lado se esconden para que una etiqueta que crece no se les monte encima. "Load Older History" termina con otro nombre, y cambiaba ese nombre sin avisar a sus vecinos de que había terminado — así que + Entry (IN) y − Exit (OUT) se quedaban escondidos hasta recargar la página. Arreglado en todos los sitios donde podía pasar, no sólo donde se veía.

v11.55 Nuevo

Borrar un movimiento se puede deshacer

Un movimiento borrado va ahora a la papelera en vez de destruirse. En Ajustes → System se ve lo que se ha borrado, quién lo borró y cuándo, y se puede devolver cualquiera de ellos tal cual estaba — misma cantidad, mismo estante, misma fecha — con los totales de stock recalculados en el momento.

Y la fila desaparece de la pantalla en cuanto se borra, no después de la siguiente recarga completa. El aviso ya no advierte de que esto no se puede deshacer, porque ahora sí se puede.

v11.55 Arreglado

Borrar podía llevarse un movimiento distinto del que elegiste

Los movimientos se identificaban por su posición en la lista, y las posiciones se mueven: al borrar uno, todos los de abajo suben. Así que si otra persona borraba algo mientras tu pantalla estaba abierta, el que elegías y el que se iba podían ser dos movimientos distintos — sin error, sin aviso, y sin nada en pantalla que hiciera sospechar que algo había salido mal.

Ahora cada movimiento lleva un identificador propio, y borrar señala ese identificador en vez de una posición. No puede equivocarse. Que dos personas borren el mismo movimiento también se trata con honestidad: a la segunda se le dice quién lo borró y cuándo, en vez de decirle que funcionó.

v11.54 Arreglado

Ya no aparece "GENERIC" donde va el nombre de un trabajo

El material que entraba al almacén sin asignar a ningún trabajo se anotaba como si perteneciera a uno llamado GENERIC. Era la palabra que usaba la app para decir "sin asignar", y todas las pantallas ya sabían ignorarla — pero en la hoja se leía exactamente como el nombre de un cliente, y eso es algo que un registro de movimientos no debe inventarse nunca.

Una entrada sin trabajo ya no anota ningún trabajo. Las filas escritas antes de esta versión siguen diciendo GENERIC y siguen significando lo mismo, así que nada cambia por debajo; se pueden limpiar cuando quieras.

v11.46 – v11.53 Nuevo

Todos ven el mismo almacén

Cuando dos o tres personas trabajan en la app al mismo tiempo, el cambio que hace una llega ahora a las demás por su cuenta, en unos veinte segundos — una entrada, una salida, un traspaso, un movimiento borrado. Nadie tiene que darle a actualizar, y no parpadea nada ni se interrumpe lo que estabas escribiendo.

Guardar en el mismo momento que otra persona ya no falla. La app espera su turno y lo vuelve a intentar sola, hasta cuatro veces, enseñando "Waiting…" mientras tanto. Lo que antes era un error que había que repetir es ahora una pausa corta.

Sacar más de lo que hay ahora corrige el número en pantalla y explica qué pasó, en vez de sólo negarse. Y si alguien se llevó lo último mientras tenías el formulario abierto, el formulario te lo dice en ese momento, no al darle a guardar.

v11.52 Arreglado

Un movimiento borrado podía reaparecer en la pantalla de otro

Cuatro movimientos borrados en una cuenta seguían viéndose en otra doce minutos después, con las dos pantallas conectadas y sin nada raro a la vista. Dos actualizaciones estaban corriendo una carrera, y cuando la más lenta se había pedido antes del borrado y llegaba después, pintaba el almacén viejo encima del nuevo.

No fallaba nada, y por eso no avisaba nada: las dos respuestas eran correctas, sólo llegaban en el orden equivocado. Una respuesta a la que ya adelantaron se descarta ahora en vez de dibujarse.

v11.51 Arreglado

Avisos fuera del borde del teléfono, y botones montados uno encima de otro

En el teléfono, los avisos de confirmación salían fuera de la parte visible — o sea que la app contestaba donde nadie podía leerlo. Y un botón que cambiaba de texto a mitad de la acción se hacía tan ancho que se montaba sobre el de al lado. Las dos cosas están arregladas, y que dos personas desbloqueen el mismo material a la vez ya no deja a una de ellas con un error por un trabajo que ya estaba hecho.

v11.42 – v11.45 Nuevo

Marca una entrega como llegada y su entrada ya viene llena

La app ya sabía qué llegaba, cuánto, de qué proveedor y con qué PO. Marcarla como llegada significaba volver a teclear todo eso en la pantalla de entrada — que es justo donde empiezan a diferir lo que se esperaba y lo que quedó registrado.

Ahora marcarla ofrece registrar la entrada, y la abre con todo lo que la entrega ya sabía. El estante se deja vacío a propósito: la app sabe cuánto llegó, no dónde lo pusieron, y un estante de relleno sería inventario que dice estar en un sitio donde nadie miró.

Si no la haces en ese momento, una tarjeta espera en la esquina de la pantalla hasta que la hagas. Se queda ahí aunque abras la entrada y la cierres sin guardar — sólo la borra una entrada guardada.

v11.44 Corregido

El encabezado se quedaba arriba en el teléfono y se iba en la computadora

Las pestañas y el menú de la cuenta tienen que quedarse en lo alto de la pantalla. En cualquier pantalla lo bastante ancha para mostrar el encabezado compacto —o sea, en toda computadora— se iban con el scroll. Dos reglas se peleaban por ello y ganaba la equivocada, justo en las pantallas que usa casi todo el mundo.

v11.43 Corregido

El aviso de la mañana nunca reconocía que ya lo habías atendido

La lista de llegadas de la semana que te recibe por la mañana se quedaba en pantalla enseñando entregas que acababas de marcar como llegadas. Decidía si una entrega seguía esperando comparándola con un estado que la app nunca ha producido, así que nada contaba como hecho.

Ahora se cierra sola cuando se atiende la última, y sigue enseñando las demás cuando quedan más.

v11.41 Nuevo

La semana de entregas, dispuesta como una semana

Las entregas esperadas eran una lista. Ahora son siete tarjetas —cuatro arriba y tres abajo— todas del mismo tamaño, como se ve una semana en un calendario. Un día cargado hace scroll dentro de su propia tarjeta en vez de estirarse y descuadrar a los demás, así que la forma de la semana se sigue leyendo por desigual que sea.

v11.40 Términos

Qué pasa si dejas de pagar, escrito con claridad

Los Términos dicen ahora exactamente qué pasa cuando una suscripción se vence y cuánto cuesta volver, en vez de dejarlo a decidir caso por caso. Las devoluciones se declaran con un solo plazo —de 5 a 10 días hábiles— en todos los documentos que las mencionan.

Lo que no ha cambiado, y vale la pena repetir: tus datos son tuyos y viven en tu propia hoja de Google. Dejar de pagar no te quita tu información ni la app que tienes instalada. Se pierde el soporte y las actualizaciones, nada más.

v11.39 Corregido

Ayudas que no se podían terminar de leer

Las explicaciones pequeñas de la ⓘ se cortaban en el borde de la ventana, y cerca del pie de la pantalla se abrían hacia abajo, hacia la nada. Ahora se quedan dentro de la ventana estén donde estén, y se voltean por encima del icono cuando no hay sitio debajo.

Ajustes también creció: en una pantalla grande usa el espacio que tiene en vez de quedarse del ancho de una laptop chica.

v11.37 – v11.38 Corregido

Abrir Ajustes dejó de parecer que la app se recargaba

Cada vez que abrías Ajustes —y cada vez que cambiabas de pestaña dentro— la página entera se ponía en blanco y se volvía a construir. Ahora enseña lo que ya sabe de inmediato y reemplaza en silencio sólo lo que de verdad cambió. Si no cambió nada, no se mueve nada. Y si estás escribiendo en un campo cuando llegan datos nuevos, espera a que termines en vez de redibujar bajo tus manos.

Cada área de Ajustes va ahora dentro de un recuadro con su nombre, así se lee como cosas separadas y no como una columna larga de controles.

v11.35 – v11.36 Nuevo

Un reporte diario de lo que se movió, cada tarde

A la hora que elijas, la app manda por correo un resumen del día: qué entró, qué salió, qué se corrigió y quién lo hizo. Si no se movió nada lo dice en una línea en vez de mandar una tabla vacía — un día tranquilo también es información.

La hora y quién más lo recibe se eligen en Settings → System. Los costos nunca van dentro, sea cual sea el rol de quien lo recibe: un reporte reenviado fuera de la empresa no debería ser la forma en que se escapa el precio de un proveedor.

v11.33 – v11.34 Corregido

Dos formas de perder trabajo, las dos cerradas

Seleccionar filas y abrir un formulario soltaba la selección, así que pulsar Guardar no registraba nada y decía que había funcionado. La selección sobrevive ahora al formulario y sólo se suelta al cerrar la ventana.

Y mientras un botón está trabajando, los de al lado se apartan en vez de seguir pulsables. Un segundo clic en un botón vecino a media guardada era una manera real de registrar algo dos veces.

v11.33 Seguridad

Un respaldo nocturno que fallaba en silencio ahora lo dice

Si la instalación del respaldo automático fallaba durante la instalación, no se escribía nada y no se enseñaba nada — la app simplemente no tenía respaldos y nadie lo sabía. El fallo ahora queda registrado, y Settings → System revisa las cuatro tareas automáticas y te dice cuáles están instaladas de verdad.

Agosto 2026

Una auditoría completa de la app, y las primeras correcciones que salieron de ella: la fecha de la tarde, la cantidad que no era entera, y una revisión que cuenta todas las puertas antes de cada publicación. Además, las ventanas de movimiento rehechas como una sola, los paquetes y respaldos que se llevan tu configuración.

v11.32 Corregido

Un resaltado que da tiempo a leerse

Cuando la app te lleva a los movimientos de los que habla un aviso, los marca en amarillo. Seis segundos sobran para uno o dos. Para ocho, el color desaparecía antes de que llegaras al tercero.

Ahora la marca dura en proporción a lo que hay que leer —seis segundos para uno, medio minuto como máximo— y mantiene el color antes de desvanecerse, en vez de irse borrando desde el primer instante. Si son más de un puñado, además te dice cuántos están marcados, para que no tengas que contar resaltados mientras haces scroll.

v11.31 Corregido

Los enlaces de esos avisos ya llevan a algún lado

Dos cosas que podías tocar en un aviso del sistema no hacían nada útil. Show the movements contestaba "esas filas están en el historial archivado — usa Load Older History", que era cierto siempre y no ayudaba a nadie: la app sabía qué filas faltaban y sabía cómo traerlas. Ahora las trae y te lleva directo a ellas.

Details abría Ajustes y no resaltaba nada. El resaltado sí existía, pero buscaba la entrada antes de que la página terminara de cargarla, y se rendía sin decir palabra. Ahora espera a la página en vez de adivinar cuánto va a tardar.

v11.30 Corregido

La app hacía su trabajo cada noche y nunca te lo dijo

Los respaldos corrían todas las noches. Los movimientos viejos se archivaban, los totales de stock se reconstruían, y todo eso quedaba registrado — hay 27 respaldos en Drive ahora mismo. Pero la esquina de la pantalla nunca mostró una tarjeta diciéndolo, y Ajustes → System decía que nada automático había corrido nunca. Las dos leían la misma lista, y esa lista llegaba vacía siempre.

Un carácter en una línea: el servidor pedía el usuario con un nombre que no existe en ese punto, el error se atrapaba y se convertía en una lista vacía, y nunca se anotaba en ningún lado. No se perdió nada ni se rompió nada — el registro simplemente no llegaba a la pantalla. Ahora llega, y el error que lo escondía ya no puede esconderse.

v11.29 Corregido

La ventana que se abría detrás de la ventana

Desde la lista de llegadas de la mañana, dar clic en Mark arrived abría la ventana de edición detrás — y el formulario de abajo no se podía tocar. La única salida era cerrar la lista y perder el lugar donde ibas.

La app desactiva a propósito todas las ventanas menos la de enfrente, para que un clic nunca caiga en un formulario medio tapado. Eso lo estaba haciendo bien; a la lista de la mañana simplemente le habían dicho que iba delante de todo, incluidas las ventanas que ella misma abre. Ahora va detrás de lo que abre.

v11.29 Corregido

Un rol renombrado ya se llama por su nombre en todas partes

Si le cambias el nombre al rol de bodega —a Supervisor, por ejemplo— el panel de cuenta mostraba el nombre nuevo en la tarjeta de perfil y el interno viejo en la fila de Active Users justo debajo. Misma persona, mismo panel, dos palabras distintas.

Ahora todas las pantallas que muestran un rol usan tu nombre. La única excepción es a propósito: el asistente de instalación sigue diciendo Warehouse, porque corre antes de que exista un nombre propio.

v11.28 Seguridad

Lo que un rol no puede ver ya no se le envía

Las cifras de costo llegaban a todos los navegadores y después las escondía la página que las dibujaba. Eso no es un permiso: es una preferencia, y no es lo que promete la página de características. El costo unitario, el costo total y el promedio ahora salen del servidor solo para los roles autorizados a verlos: los administradores siempre, el rol de bodega cuando un administrador activó See costs, y los usuarios de solo lectura nunca. En pantalla no cambia nada; la diferencia es que los números ya no se entregan.

Esa misma carga también estaba enviando la lista vieja de correos de los compañeros con su rol al lado, y la dirección del dueño, a todos los roles en cada carga — sin servir para nada, porque ninguna pantalla de la app lee esa lista desde que la gestión de usuarios tiene su propia página. Los administradores siguen recibiendo la lista real; los demás dejan de recibir un directorio del personal que nadie pidió.

v11.28 Corregido

Una categoría con un < adentro ya no corta la pantalla a la mitad

Los nombres de categoría, los nombres de archivos adjuntos y las unidades se estaban insertando en la página sin tratarlos como texto plano. Una categoría escrita como GLASS <5MM terminaba la pantalla justo ahí — sin mensaje de error, solo una página que se detiene y una persona que razonablemente supone que se perdieron sus datos.

Las categorías pasan por una sola pieza compartida de la app, así que esto fue una corrección en siete pantallas: la tabla de stock, la lista de movimientos, los paquetes, el selector de materiales, el monitor de stock bajo y las dos vistas de entregas esperadas.

v11.27 Corregido

Después de las seis de la tarde, la app escribía la fecha de mañana

Una entrega recibida a las 6:30 p.m. del día 14 quedaba registrada el 15. No se rechazaba ni se marcaba: la app misma la archivaba un día tarde, cada tarde. La casilla de fecha en la ventana de movimientos ya abría llena así, de modo que si nadie se daba cuenta y la cambiaba, esa era la fecha que se guardaba. Los totales de fin de mes quedaban corridos por todo lo que entró al muelle después de las seis.

La app estaba leyendo el reloj en UTC en vez de en tu zona horaria. Ahora lee el día en el que realmente estás parado, en todas partes: el formulario de movimientos, las llegadas de la semana y el nombre de los archivos que exportas. Las fechas que ya están en tu hoja no se tocan; corrige las de la tarde que quieras arreglar con Adjust o editando el movimiento.

v11.27 Corregido

Media lámina es una cantidad real, y se estaba redondeando

Escribir 2.5 en una casilla de cantidad guardaba 2. Escribir 0.75 no guardaba nada. No aparecía ninguna advertencia, así que la única forma de darse cuenta era volver a leer la fila después. Afectaba a cualquiera que trabaje en SQ FT, LN FT, láminas o rollos: justo las unidades que existen porque el material viene en mitades.

Las casillas de cantidad ahora aceptan decimales y los conservan, desde el formulario hasta la hoja. El cero se sigue rechazando, y la app lo dice con sus propias palabras. Los números enteros funcionan exactamente igual que antes.

v11.27 Seguridad

Una página de la actividad del sistema se podía leer sin iniciar sesión

La lista de lo que el sistema hizo por su cuenta —respaldos, mantenimiento, quién guardó qué y cuándo— la podía leer alguien que tuviera el enlace de tu app y una cuenta de Google, sin que la app comprobara nunca quién era. No exponía cifras de stock, ni costos, ni datos de materiales, y no hay señal de que alguien la haya leído. Está cerrada.

Lo que importa más que esa página: ahora hay una revisión automática que cuenta todas las entradas al sistema antes de cada publicación y se niega a publicar si alguna quedó abierta o sin explicación. Este hueco existía porque nadie las estaba contando. Ahora algo las cuenta.

v11.25 – v11.26 Corregido

Entregas esperadas: la categoría que desaparecía y la ventana que no volvía

Abrir una entrega para editarla mostraba la casilla de categoría vacía aunque ya se había elegido una — y guardar desde ahí escribía ese vacío de vuelta. La causa era un cambio de nombre: renombrar una categoría actualizaba tus movimientos y tu historial, pero dejaba las entregas esperadas apuntando al nombre viejo. Ahora también las renombra, y una entrega cuya categoría ya no está en tu lista lo dice en vez de quedarse en blanco.

La lista de llegadas de la mañana también se cerraba para siempre en cuanto marcabas el primer material, y la única forma de volver era recargar la página entera. Se reabre desde This week's arrivals en el menú del usuario, donde todos alcanzan a llegar en vez de solo en la pantalla de Incoming. Cada material lleva su propio botón Mark arrived, y la presentación pone la cantidad al lado del nombre con el estado debajo.

v11.24 Corregido

Una entrega esperada ya no llega con un 1 puesto

La casilla de cantidad de una entrega nueva abría con un 1 dentro, y ese es un número alrededor del cual la gente planifica, lo haya querido poner alguien o no. Ahora abre vacía, como todas las demás casillas de cantidad de la app.

Dejarla vacía está permitido a propósito: una entrega registrada desde una hoja de carga adjunta muchas veces no tiene cifra hasta que llega el camión. Donde nunca se indicó una cantidad, la app dice qty not stated en vez de imprimir un cero.

v11.23 Nuevo

Check my data — lo mismo escrito de dos formas, encontrado por ti

Escribe el nombre de un proveedor un poco distinto dos veces y ya tienes dos proveedores. Nada se rompe: los totales simplemente se parten en dos y los reportes dejan de cuadrar en silencio. Check my data, en Ajustes, lee todo tu archivo y te muestra lo que encontró: el mismo nombre escrito de dos formas, materiales sin proveedor o sin proyecto, y nombres lo bastante parecidos entre sí como para ser un error de tecleo.

Los dos primeros traen un botón de Merge que hace el trabajo en todas las filas afectadas de una vez. El tercero —posibles errores de tecleo— a propósito no lo trae: JJF 109 y JJF 110 se parecen casi por completo para una computadora y son dos obras distintas. Ese es solo para tus ojos.

v11.22 Nuevo

Corregir un conteo no es lo mismo que registrar merma

La app dice 40 y en el rack hay 38. Eso no significa que se rompieron dos: significa que el registro está mal, y anotarlo como merma convertiría tu cifra de desperdicio en "desperdicio más errores de conteo". Son dos problemas distintos con dos soluciones distintas.

Adjust es un tipo de movimiento propio, en la ventana de movimientos y en el cajón del rack. Escribes lo que contaste, no la diferencia —la app sabe lo que ella creía y hace la resta— y te dice qué va a pasar antes de guardar. No cuesta nada, no pertenece a ningún proyecto, exige un motivo, y puede subir el stock igual que bajarlo.

v11.21 Corregido

Una entrega esperada conserva el estado que le pusiste

Registrar una entrega como Arrived, o anularla en el momento, la guardaba igual como Pending y había que editarla una segunda vez para que pegara. Crear y editar no estaban de acuerdo sobre el mismo campo; ahora los dos pasan por el mismo lugar.

Borrar una tampoco decía nada mientras trabajaba, así que dar clic otra vez era lo razonable — y el segundo clic llegaba a una fila ya borrada y mostraba un error por un borrado que sí había funcionado. Ahora el botón muestra que está trabajando, el segundo clic se ignora, y una entrega que ya no está termina en éxito.

v11.17 Nuevo

Editar un movimiento llena lo que la app ya sabe

Un traslado o una merma se guardan con proveedor, contrato, orden de compra y proyecto vacíos, porque esas casillas están ocultas en esas pantallas. Al abrir uno para corregir algo te encontrabas cinco huecos de un material cuyo proveedor la app conocía desde siempre.

Esas casillas llegan llenas desde el historial de ese mismo material, del más reciente al más antiguo — y cada una que se sugiere queda marcada, para que siempre veas qué valores están registrados en ese movimiento y cuáles te está ofreciendo la app. Lo que la fila ya tiene no se toca nunca.

v11.16 Corregido

Un traslado ya no inventa un proyecto

Mover material entre dos racks no es un cambio de obra, pero al traslado se le estampaba GENERIC —la palabra de la app para "en bodega, sin asignar"— porque la casilla de proyecto está oculta en esa pantalla y nadie la llenaba. Al filtrar el historial de un material, la misma obra parecía dos historias distintas.

Un traslado conserva ahora la obra que el material ya tenía, y la app no afirma nada que no se le haya dicho.

v11.13 – v11.15 Seguridad

Tu respaldo se lleva tu configuración — y avisa cuando no puede

Un respaldo copia tu hoja, pero una parte de la instalación vive fuera de ella. Restaurar una copia sin esa parte se ve bien hasta que un adjunto se niega a abrir, meses después, sin nada que apunte al porqué.

Cada respaldo lleva ahora dentro una pestaña con exactamente qué hay que reponer y para qué sirve cada cosa, en palabras normales — incluidas las pocas que hay que reemplazar con valores nuevos después de restaurar en vez de copiarlas. Si no se puede escribir, el respaldo lo dice en el momento en lugar de verse completo.

v11.12 Nuevo

Los Términos y la Privacidad se pueden leer antes de aceptarlos

La casilla de consentimiento te pedía aceptar dos documentos que no tenías cómo abrir. Los dos viven ahora en pestañas propias dentro de tu propio archivo, enlazadas desde la casilla misma, y se quedan ahí después — así la versión que aceptaste es siempre la versión que puedes volver a leer.

v11.5 – v11.11 Nuevo

La app recuerda cuántas unidades vienen en una caja

La primera vez que recibes un material por caja, case, palet o bolsa, pregunta una sola vez: 1 caja de GE SILPRUF = ¿cuántas unidades? Después ya solo dice 12 unidades por caja, con un enlace para editarlo, y hace la cuenta — incluido el costo por unidad, que se actualiza mientras escribes.

No todos los materiales vienen en caja y no todas las cajas traen lo mismo, así que no se supone nada: un material sin respuesta registrada simplemente se cuenta en unidades, como antes. La lista completa se edita en Settings → Materials.

v11.9 Corregido

Una etiqueta de costo que podía hacer pasar el precio de una caja por el de una unidad

Durante cuatro versiones, elegir Box como unidad renombraba el campo de costo a "Cost per Box" sin que nada dividiera — así que un precio escrito para una caja de doce entraba al promedio como el precio de una unidad. El costo se lleva como promedio ponderado, así que una cifra mal ahí afecta todos los costos posteriores de ese material, no solo ese movimiento.

El campo nombra un paquete solo cuando la app sabe de verdad cuántas unidades trae, y divide por ese número exacto. Si pusiste precios por caja entre la v11.5 y la v11.8, vale la pena revisar el costo de ese material.

v11.6 – v11.8 Nuevo

Las cinco ventanas de movimiento son una sola ventana

Entrada, salida, traslado, devolución y merma se habían separado en cinco diseños distintos — campos en otro orden, la cantidad en otro lugar, y un "1" ya escrito en la cantidad en tres de ellas.

Ahora comparten una forma: el material en una caja neutra, el color del movimiento solo alrededor de la parte que dice dónde y cuántos, nada escrito al abrir la ventana, y el cursor en el nombre listo para escribir. Cambiar de una a otra conserva lo que ya escribiste en vez de hacerte escribirlo otra vez.

v11.3 – v11.4 Corregido

Dos cosas pequeñas que estaban mal en silencio

Destildar la casilla de consentimiento dejaba el consentimiento registrado. Y en una entrega con varios materiales, el autollenado llenaba la primera línea en vez de la línea en la que estabas trabajando.

v10.8 Nuevo

Tu propia llave de IA, puesta desde dentro de la app

Leer el correo de confirmación de un proveedor hacia tus entregas esperadas corre con una llave tuya, escrita en Settings — no una nuestra. Funciona con tu cuota, a tu costo, y se puede quitar cuando quieras.

v11.18 – v11.20 Términos

Qué cubre el soporte, y cómo funciona el cobro, está por escrito

La sección 5 de los Términos dice ahora qué incluye la suscripción, en cuánto se contesta un correo, qué se cotiza aparte y qué se espera de ti. La sección 9 cubre cancelar, devoluciones, cómo se envían las facturas y qué pasa si un pago no entra — incluida la única cosa que conviene saber de antemano: tus datos nunca se retienen por un pago, y la app sigue funcionando.

v10.0 – v10.4 Seguridad

Dos personas pueden cambiar lo mismo a la vez sin que se pierda uno de los dos cambios

El stock se calcula a partir de tu historial de movimientos, así que cualquier cambio que lo lea, lo ajuste y lo vuelva a escribir puede chocar con otro que ocurra en el mismo segundo — y el fallo era silencioso: los dos veían "guardado" y el número quedaba mal.

Guardar un movimiento ya estaba protegido. Ahora también lo están editar un movimiento guardado, renombrar una categoría, renombrar o fusionar un material, y fusionar proyectos, proveedores o ubicaciones. Si dos cambios llegan a encontrarse, al segundo se le pide reintentar en un momento en vez de pisar al primero.

v10.5 Nuevo

Ve cuánto espacio le queda a tu archivo

Settings → System muestra una barra con cuánto de tu hoja está usado y aproximadamente cuántos años de espacio quedan a tu ritmo actual. El estimado se mide sobre tus últimos 90 días y no aparece hasta que tengas 60 días de historial: las primeras semanas son sobre todo la carga inicial del inventario, y proyectar desde ahí sería equivocado.

v10.1 – v10.6 Corregido

Renombrar una categoría ahora actualiza todo, al instante

Renombrar una categoría actualiza cada movimiento que la usaba, tanto los recientes como los archivados, y toda la app muestra el nombre nuevo de inmediato en vez de después de recargar. El mismo arreglo llegó a fusionar ubicaciones, proyectos y proveedores.

Renombrar tardaba minutos en una bodega con mucho historial y sin ninguna señal de que estaba trabajando. Ahora tarda segundos, y el botón dice qué está haciendo.

v10.3 Corregido

Settings te dice qué renombrados alcanzan a tu historial

Renombrar una categoría actualiza tus movimientos existentes. Renombrar un proveedor, un proyecto o una ubicación no — esos son el registro de lo que era cierto en su momento, y ya están impresos en papeles que salieron. Cada pestaña dice cuál de los dos casos es, en vez de una sola frase que solo era cierta en una.

v9.93 – v9.95 Nuevo

Todas las copias de seguridad, en un solo lugar

Settings → System lista cada copia que realmente existe en tu carpeta de Drive, leída de Drive mismo. Además, ahora cada copia lleva dentro una instantánea de tu configuración, así que restaurar una recupera tus ajustes y no solo tus datos.

v9.94 Nuevo

Marca una entrega como recibida desde el aviso de la mañana

La tarjeta "Llega hoy" te lleva directo al lugar exacto para registrarlo. Solo administradores.

v9.87 Nuevo

Un aviso cuando un precio se mueve

Si escribes un costo unitario bastante distinto de lo que venías pagando, la app te lo dice antes de guardar, para que un error de tecleo no se convierta calladamente en tu costo promedio.

v9.78 – v9.81 Nuevo

Costos: cuánto vale tu inventario, por proyecto y en desperdicio

Costo promedio ponderado, opcional. Escribe lo que pagaste al entrar y la app lleva el promedio, muestra cuánto costó lo que salió a cada proyecto, y le pone cifra en dólares al desperdicio. Cada costo va detrás de su propio permiso: quien registra movimientos no tiene por qué ver dinero.

v9.76 – v9.79 Nuevo

Decide qué puede hacer el rol de bodega — y cómo se llama

Los permisos ahora son interruptores y no un muro fijo: dale al rol de bodega la capacidad de editar movimientos o administrar el catálogo si así funciona tu taller. Y si en tu empresa se llaman Recepción o Patio, renombra el rol para que coincida.

Antes

Las bases, antes de las versiones de arriba.

v9.82 Nuevo

El cajón de rack, rehecho

Toca una ubicación en el Mapa de Bodega y actúa sobre lo que hay dentro —salida, traslado o desperdicio— con el material, la categoría y el rack de origen ya puestos. Toca la cifra "available" para llenar la cantidad.

v9.73 Corregido

Usable con el pulgar

Una pasada completa por cada pantalla en tamaños de teléfono y tableta: nada se sale del borde, nada es demasiado chico para tocar, ninguna pantalla se desplaza de lado. Una bodega no se maneja desde un escritorio.

v9.74 Nuevo

Alertas de stock mínimo que de verdad configuras

Elige qué materiales importan y cuál es su mínimo. El tablero te dice qué está por debajo y qué llegó a cero.

v9.71 Nuevo

Copias de seguridad que corres y revisas desde la app

Enciende la copia nocturna, corre una ahora, y mira cuándo fue la última — sin abrir la hoja de cálculo ni el editor de scripts.

v9.61 Nuevo

Pega un correo del proveedor y saca las entregas esperadas

Pega la confirmación que te mandaron y la app extrae qué viene, cuánto y cuándo — a la lista de Incoming, para que lo revises antes de guardar.

v9.58 Nuevo

Un chequeo de salud para la parte que no se ve

Un solo comando que revisa la mitad de una instalación que nadie mira —carpetas, permisos, tareas programadas—, repara lo que puede sin riesgo, y te dice claramente qué falta.