Saltar al contenido
Todos los proyectos
Case StudyEn producción

ID Inventory — Operación sin conexión

Auditoría técnica y desarrollo de la capa offline de un sistema de inventario ya en producción, para que los bodegueros pudieran seguir trabajando en obras sin señal y nada se perdiera ni se duplicara al volver la conexión.

Cliente
Cliente del sector construcción · El Salvador
Año
2026
Rol
Auditoría técnica y desarrollo de la operación sin conexión
Stack
PWA · Supabase · PostgreSQL · IndexedDB · Service Worker · Vercel
Portada del proyecto ID Inventory: operación sin conexión para control de inventario en obra

01

Overview

ID Inventory ya existía y estaba en producción: una aplicación web instalable para controlar compras, recepciones y despachos en bodegas de construcción. Yo no la construí. Llegué a un sistema en uso para resolver el problema que lo estaba frenando.

El encargo tenía dos partes: auditar el sistema a fondo —base de datos, seguridad y lógica de negocio— y después desarrollar la operación sin conexión, para que un bodeguero en una obra sin señal pudiera seguir registrando movimientos con la certeza de que nada se perdería.

02

El problema

Las bodegas de obra están donde está la construcción, no donde está la cobertura. La aplicación necesitaba red para cada operación, así que cuando la señal caía el trabajo se detenía o volvía al papel, que es justo lo que el sistema había venido a eliminar.

El riesgo no era solo perder un registro. Un reintento mal resuelto es peor que un fallo: una recepción enviada dos veces duplica inventario que nadie recibió, y ese error se descubre semanas después en un conteo que no cuadra.

03

El reto

  • Trabajar sobre código que no escribí, en un sistema con usuarios reales. Cualquier cambio tenía que convivir con lo que ya existía sin romper la operación diaria.
  • Entender primero el modelo de seguridad: 27 tablas con control de acceso por fila, 40 políticas y 31 funciones de base de datos que debía comprender antes de tocar nada.
  • Garantizar que una operación encolada y reenviada varias veces produjera exactamente el mismo resultado que si se hubiera enviado una sola vez.
  • Dejar el trabajo mantenible por otra persona, no solo funcionando.

04

La solución

Empecé por la auditoría, no por el código: recorrí el esquema completo, las políticas de acceso y las funciones de negocio, documentando qué hacía cada pieza y dónde estaban los huecos. De ahí salieron seis defectos preexistentes que corregí y verifiqué en producción.

Para la operación sin conexión implementé una cola local en IndexedDB: cuando no hay red, la operación se guarda en el dispositivo en lugar de fallar, y el usuario sigue trabajando con una señal visible de que está offline.

Al recuperar la señal, la cola se sincroniza sola con reintentos escalonados —cada fallo espera un poco más que el anterior— para no golpear al servidor cuando la conexión vuelve inestable, que es como suele volver en una obra.

La idempotencia es lo que hace seguro ese reenvío: cada operación viaja con una clave única que el servidor usa para reconocerla. Si una recepción llega dos veces, la segunda no duplica nada. Al confirmarse, el sistema emite y archiva el comprobante correspondiente.

Cerré con documentación: manual de usuario, manual de administración y documentación técnica, para que el sistema no dependa de que yo esté disponible.

05

Arquitectura

  1. PWA instalable — Service Worker + app shell
  2. IndexedDB — cola local de operaciones pendientes
  3. Sincronización — reintentos escalonados al volver la red
  4. Supabase Auth + RLS — acceso por usuario y bodega
  5. PostgreSQL + funciones RPC — lógica de negocio
  6. Vercel — despliegue de la aplicación

06

Tecnologías

TecnologíaFunción
IndexedDBCola de operaciones pendientes en el dispositivo
Service WorkerApp shell disponible sin red y control de versión del cliente
SupabaseAutenticación, base de datos, funciones RPC y almacenamiento
PostgreSQL + RLSModelo relacional con control de acceso por fila
Claves de idempotenciaCada operación se identifica para que un reenvío no la duplique
VercelDespliegue y entrega de la aplicación

07

Funcionalidades

Trabajo sin conexión

Las operaciones se registran aunque no haya red, con indicación visible del estado de la conexión.

Cola de pendientes

Lo capturado sin señal queda en el dispositivo hasta confirmarse contra el servidor.

Sincronización automática

Al recuperar la conexión, la cola se envía sola con reintentos escalonados.

Operaciones idempotentes

Cada operación lleva una clave única: reenviarla no duplica inventario ni documentos.

Comprobantes

Al confirmarse la operación se emite y archiva su comprobante correspondiente.

Documentación de entrega

Manuales de usuario, de administración y documentación técnica del sistema.

08

Proceso de desarrollo

  1. 01

    Auditoría — Recorrido completo del esquema, las políticas de acceso y las funciones de negocio antes de escribir una línea.

  2. 02

    Diagnóstico — Documentación de lo encontrado, incluidos los defectos preexistentes y su impacto real en la operación.

  3. 03

    Correcciones — Resolución de seis defectos, verificados contra el sistema en producción.

  4. 04

    Diseño de la capa offline — Qué operaciones se encolan, cómo se identifican y cuándo se consideran confirmadas.

  5. 05

    Implementación — Cola en IndexedDB, sincronización con reintentos escalonados e idempotencia de extremo a extremo.

  6. 06

    Verificación — Pruebas del ciclo completo: perder la señal, seguir operando, recuperar la red y comprobar que no hay duplicados.

  7. 07

    Entrega — Manuales de usuario, administración y documentación técnica.

09

Decisiones y trade-offs

Auditar antes de programar

La tentación en un sistema ajeno es ir directo a la funcionalidad pedida. Dedicar la primera etapa a entender 27 tablas, 40 políticas y 31 funciones parecía tiempo perdido, pero fue lo que permitió construir la capa offline sin romper el control de acceso existente, y de paso sacó a la luz seis defectos que nadie había reportado todavía.

Encolar en vez de fallar

La alternativa fácil era bloquear la interfaz cuando no hay red y pedir al usuario que reintente. En una obra eso equivale a volver al cuaderno. Guardar la operación en el dispositivo y sincronizar después mantiene al bodeguero trabajando, al costo de asumir toda la complejidad de la reconciliación posterior.

Idempotencia en lugar de confiar en el reintento

Un reintento sin protección es una duplicación esperando ocurrir: el servidor puede haber procesado la operación aunque la respuesta nunca llegara al dispositivo. Darle a cada operación una clave única traslada la responsabilidad al servidor, que reconoce lo ya procesado. Es la diferencia entre una cola que funciona y una que corrompe el inventario en silencio.

Reintentos escalonados, no inmediatos

La conectividad en obra no vuelve de golpe: aparece y desaparece. Reintentar de inmediato con varios dispositivos a la vez habría generado ráfagas contra el servidor justo en el momento más frágil. Espaciar progresivamente cada reintento reparte la carga y aprovecha mejor una señal intermitente.

Integrarse en lugar de reescribir

Proponer una reescritura habría sido más cómodo para mí y mucho peor para el cliente: su sistema ya estaba en producción y funcionaba. El valor estaba en sumar la capa que faltaba respetando las decisiones existentes, aunque no fueran las que yo habría tomado desde cero.

10

Resultados

  • Los bodegueros pueden operar en obras sin cobertura y el sistema sincroniza solo al recuperar la señal.
  • Los reenvíos dejaron de ser un riesgo: una operación repetida no duplica inventario ni documentos.
  • Seis defectos preexistentes detectados en la auditoría quedaron corregidos y verificados en producción.
  • El sistema se entregó documentado en tres niveles —usuario, administración y técnico— para que su mantenimiento no dependa de una sola persona.

11

Qué aprendí

Entrar a un sistema ajeno en producción exige una disciplina distinta a empezar de cero: primero entender por qué está hecho así, después proponer. La auditoría no fue el preámbulo del trabajo, fue parte del trabajo.

«Sin conexión» no es una funcionalidad, es un modelo de consistencia. La parte difícil no es guardar datos en el dispositivo, sino decidir qué significa que una operación esté confirmada cuando el dispositivo y el servidor no se ponen de acuerdo.

Los errores más caros son los que no fallan de forma visible. Un inventario duplicado no lanza ninguna alerta: aparece meses después como un faltante que nadie sabe explicar.

Contacto

¿Construimos algo?

Estoy abierto a oportunidades profesionales, colaboraciones y proyectos donde la tecnología resuelva una necesidad concreta.