Sistema web para control de inventario físico, auditoría de conteos y validación multiusuario en tiempo real.
SIO-Control permite cargar el PDF diario de inventario, generar la estructura de categorías y productos, capturar conteos físicos por usuario, comparar resultados entre contadores, validar diferencias y exportar el inventario final en PDF.
SIO-Control es una aplicación interna orientada al conteo operativo de inventario. Su objetivo es centralizar el proceso de revisión física de productos, reducir errores de captura y conservar trazabilidad por usuario, producto y movimiento.
El sistema se usa principalmente en contextos de:
- Inventario diario o periódico.
- Auditoría de existencias.
- Conteo físico en almacén o CEDIS.
- Comparación de conteos realizados por distintos usuarios.
- Generación de un conteo final validado.
El flujo inicia con un PDF de inventario. A partir de ese documento, la aplicación detecta categorías, productos, stock registrado, cantidad no disponible y metadatos como fecha, semana y CEDIS. Después, los usuarios realizan conteos independientes y el auditor puede comparar, corregir y validar el resultado.
- Los usuarios autenticados pueden capturar cantidades físicas por producto.
- Cada captura se guarda como un movimiento dentro del historial del producto.
- El sistema recalcula automáticamente total contado, diferencia contra stock y avance del inventario.
- La interfaz muestra el estado del producto: pendiente, coincide, sobrante o faltante.
- El conteo puede consultarse por categoría, búsqueda global o filtros operativos.
Cada producto conserva un historial de movimientos de conteo con:
- Cantidad capturada.
- Estado u observación del producto.
- Comentario opcional.
- Usuario que registró el movimiento.
- Fecha/hora de creación.
- Usuario y fecha/hora de modificación cuando aplica.
Este historial permite auditar cómo se llegó al total físico de cada producto.
El sistema permite:
- Agregar nuevos registros de conteo.
- Editar cantidades, observaciones y comentarios.
- Eliminar movimientos incorrectos.
- Recalcular totales después de cada cambio.
En el flujo de comparación, el auditor también puede corregir registros de los conteos seleccionados.
SIO-Control permite comparar dos conteos independientes del mismo inventario. La pantalla de comparación muestra:
- Conteo del Usuario A.
- Conteo del Usuario B.
- Diferencia entre ambos conteos.
- Productos coincidentes.
- Productos con diferencias.
- Productos pendientes.
- Productos con observaciones.
- Productos ya validados por auditoría.
La comparación exige al menos dos usuarios con conteos registrados.
El auditor puede validar producto por producto cuando existen diferencias. Antes de generar el conteo final, el sistema verifica que no existan diferencias sin revisar.
La validación deja trazabilidad mediante:
- Producto validado.
- Usuario auditor que valida.
- Fecha de actualización.
- Estado del inventario.
El sistema genera un PDF exportable del inventario usando el conteo final validado cuando existe. Si todavía no existe conteo final, usa el conteo activo o el primer conteo guardado disponible.
El PDF incluye:
- Encabezado del inventario.
- Semana, fecha y CEDIS.
- Categorías.
- Productos.
- Stock del PDF.
- Cantidad no disponible.
- Conteo físico.
- Total contado.
- Diferencia.
- Observaciones.
- Totales por categoría.
- Total general.
La aplicación usa Firebase Firestore con suscripciones en tiempo real. Los cambios de conteo, comparación, validación e historial se reflejan automáticamente en las pantallas conectadas sin recargar el navegador.
SIO-Control maneja permisos por perfil:
contador: usuario operativo que realiza conteos.auditor: usuario con permisos de validación y comparación.admin_auditor: usuario auditor con privilegios administrativos.
Además, existe un correo administrador configurado en el sistema que obtiene permisos de auditoría automáticamente.
Los usuarios con permisos de auditoría pueden acceder a la administración de usuarios para:
- Consultar usuarios registrados.
- Buscar por nombre o correo.
- Filtrar por rol.
- Cambiar rol de usuario.
- Activar o desactivar acceso.
-
Subir PDF de inventario
- El usuario carga el PDF diario desde la pantalla de carga.
- El sistema lee el contenido real del archivo con
pdfjs-dist. - Se extraen metadatos como semana, fecha, CEDIS y total general.
-
Generación de categorías y productos
- El parser interpreta líneas del PDF.
- Las categorías se convierten en bloques principales.
- Los productos se asignan a su categoría correspondiente.
- Se conserva el orden original detectado en el PDF.
-
Conteo por usuario
- Cada usuario autenticado trabaja sobre su propio conteo individual.
- El sistema crea o asocia un registro dentro de
userCounts. - Las cantidades capturadas se almacenan como movimientos por producto.
-
Registro de historial por producto
- Cada captura queda registrada en
countEntries. - Un producto puede tener varios movimientos.
- El total contado se calcula sumando los movimientos del producto.
- Cada captura queda registrada en
-
Comparación de conteos
- El auditor selecciona dos conteos de usuarios.
- El sistema compara producto por producto.
- Se muestran coincidencias, diferencias y pendientes.
-
Corrección por auditor
- El auditor puede agregar, editar o eliminar movimientos dentro de los conteos comparados.
- Las correcciones actualizan Firestore y recalculan los totales.
- Los productos con diferencias pueden marcarse como validados.
-
Generación de conteo final
- Cuando las diferencias están revisadas, el auditor genera el conteo final.
- El sistema crea
finalCountcon estadovalidado. - El inventario cambia a estado validado.
-
Guardado en historial
- Los inventarios se listan en el historial por fecha de actualización.
- El historial muestra participantes, totales, diferencias, estado y conteo final cuando existe.
-
Exportación en PDF
- Desde historial o detalle de inventario se exporta el documento final.
- El archivo se genera localmente en el navegador mediante
jsPDF.
- React: construcción de la interfaz de usuario.
- Vite: servidor de desarrollo, build y empaquetado.
- Tailwind CSS: estilos utilitarios y diseño responsive.
- React Router DOM: navegación, rutas protegidas y rutas por rol.
- Lucide React: iconografía de la interfaz.
-
Firebase Authentication
- Inicio de sesión con correo y contraseña.
- Registro de usuarios.
- Acceso con Google.
- Control de sesión autenticada.
-
Cloud Firestore
- Almacenamiento de inventarios.
- Almacenamiento de usuarios y roles.
- Sincronización en tiempo real con
onSnapshot. - Persistencia de conteos, historial, validaciones y conteo final.
La configuración actual incluye datos del proyecto Firebase en SIO-Control-Frontend/src/firebase.js. La aplicación usa Firestore como base de datos operativa.
- pdfjs-dist: lectura y extracción de texto desde archivos PDF.
- jsPDF: generación del PDF exportable de inventario.
- chart.js / react-chartjs-2: soporte para visualización de métricas.
- core-js / regenerator-runtime: compatibilidad de ejecución en navegadores.
El repositorio está organizado en dos carpetas principales:
SIO Control/
├── README.md
├── vercel.json
├── SIO-Control-Frontend/
└── SIO-Control-Backend/
Contiene la aplicación web construida con React, Vite y Tailwind CSS.
Responsabilidades principales:
- Renderizar la interfaz de usuario.
- Gestionar rutas públicas, protegidas y por rol.
- Autenticar usuarios con Firebase Authentication.
- Leer y guardar datos en Firestore.
- Cargar y parsear PDFs de inventario.
- Capturar conteos físicos.
- Comparar conteos multiusuario.
- Administrar usuarios.
- Exportar inventarios a PDF.
Estructura relevante:
SIO-Control-Frontend/
├── public/
│ ├── manifest.webmanifest
│ └── sw.js
├── src/
│ ├── components/
│ ├── contexts/
│ ├── hooks/
│ ├── pages/
│ ├── services/
│ ├── utils/
│ ├── App.jsx
│ ├── firebase.js
│ └── main.jsx
├── package.json
└── vite.config.js
Contiene reglas de negocio y utilidades reutilizables. No es un servidor HTTP independiente en el estado actual; es una capa lógica neutral que el frontend importa mediante el alias @sio-backend.
Responsabilidades principales:
- Constantes de estado de inventario.
- Opciones de observación.
- Normalización de categorías, productos y conteos.
- Cálculo de totales, diferencias y progreso.
- Filtros de producto.
- Interpretación de líneas extraídas del PDF.
- Construcción de la estructura de inventario desde texto de PDF.
Estructura relevante:
SIO-Control-Backend/
├── src/
│ ├── index.js
│ ├── inventoryCore.js
│ └── pdfInventoryBuilder.js
└── package.json
El rol contador está orientado al trabajo operativo de inventario.
Permisos principales:
- Realizar conteo físico.
- Agregar registros de cantidad por producto.
- Editar o eliminar sus movimientos de conteo.
- Consultar su avance.
- Ver el historial asociado a los inventarios disponibles.
El contador trabaja sobre un conteo individual. Esto permite que varios usuarios capturen el mismo inventario sin sobrescribir el trabajo de otros.
El rol auditor está orientado a revisión y control.
Permisos principales:
- Comparar conteos de dos usuarios.
- Editar movimientos en ambos conteos durante la comparación.
- Validar productos con diferencias.
- Generar conteo final.
- Acceder a detalle e historial de inventarios.
- Administrar usuarios cuando tiene permisos de auditoría.
El rol admin_auditor tiene permisos de auditoría y administración. Puede gestionar roles y estado de acceso de usuarios.
SIO-Control usa Firestore para sincronización en tiempo real. Las pantallas principales se suscriben a documentos o colecciones con onSnapshot, por lo que cualquier cambio se propaga automáticamente.
Se sincronizan en tiempo real:
- Inventario actual.
- Conteos individuales.
- Movimientos por producto.
- Estado del inventario.
- Comparación entre usuarios.
- Productos validados.
- Conteo final.
- Historial de inventarios.
Esto permite trabajo multiusuario en simultáneo. Por ejemplo, un contador puede capturar productos mientras el auditor observa avances o diferencias desde otra sesión.
La exportación se realiza en el navegador con jsPDF. El servicio de exportación toma el inventario normalizado y genera un documento en formato carta.
El documento exportado contiene:
- Nombre del reporte: informe de inventario diario.
- Número de hoja y fecha/hora de generación.
- Semana, fecha y CEDIS.
- Tabla de productos por categoría.
- Columnas de cantidad, no disponible, conteo físico, total, diferencia y observación.
- Totales por categoría.
- Total general del inventario.
Prioridad de datos al exportar:
finalCount, si ya existe conteo final validado.activeUserCount, si se exporta desde una sesión de conteo activa.- Primer conteo guardado disponible.
- Categorías base del inventario.
El nombre del archivo sigue el formato:
inventario-{fecha}-{cedis}.pdf
- Node.js instalado.
- npm instalado.
- Proyecto Firebase configurado.
- Firebase Authentication habilitado para correo/contraseña y, si se usa, Google.
- Cloud Firestore habilitado.
- Dominio autorizado en Firebase Authentication para ambientes de despliegue.
Desde la raíz del repositorio:
npm --prefix SIO-Control-Frontend installTambién puede instalarse entrando directamente al frontend:
cd SIO-Control-Frontend
npm installDesde la raíz:
npm --prefix SIO-Control-Frontend run devO desde la carpeta del frontend:
cd SIO-Control-Frontend
npm run devVite mostrará la URL local para abrir la aplicación en el navegador.
npm --prefix SIO-Control-Frontend run buildEl resultado se genera en:
SIO-Control-Frontend/dist
npm --prefix SIO-Control-Frontend run previewnpm --prefix SIO-Control-Frontend run lintEn el estado actual, la configuración de Firebase está definida directamente en:
SIO-Control-Frontend/src/firebase.js
No existe un archivo .env obligatorio para ejecutar el proyecto localmente. Si el proyecto se prepara para producción empresarial, se recomienda mover la configuración de Firebase a variables de entorno de Vite, por ejemplo:
VITE_FIREBASE_API_KEY
VITE_FIREBASE_AUTH_DOMAIN
VITE_FIREBASE_PROJECT_ID
VITE_FIREBASE_STORAGE_BUCKET
VITE_FIREBASE_MESSAGING_SENDER_ID
VITE_FIREBASE_APP_ID
VITE_FIREBASE_MEASUREMENT_ID
El repositorio incluye configuración para Vercel en vercel.json.
La configuración indica:
- Framework: Vite.
- Instalación desde
SIO-Control-Frontend. - Build desde
SIO-Control-Frontend. - Carpeta de salida:
SIO-Control-Frontend/dist. - Rewrite a
index.htmlpara soportar rutas de React Router.
Estado actual:
- Prototipo funcional.
- En desarrollo.
- En pruebas operativas.
El sistema ya cuenta con flujo de carga de PDF, conteo, comparación, validación, historial, administración de usuarios y exportación PDF. Todavía debe considerarse como una base en evolución para uso empresarial controlado.
- SIO-Control está diseñado para uso interno empresarial.
- La información se sincroniza en tiempo real; los usuarios deben evitar trabajar con cuentas compartidas.
- Cada usuario debe ingresar con su propia cuenta para conservar trazabilidad.
- El PDF cargado debe corresponder al inventario diario esperado por el parser.
- Antes de generar conteo final, el auditor debe revisar todas las diferencias.
- El conteo final debe generarse únicamente cuando el inventario físico haya sido validado.
- Se recomienda revisar reglas de seguridad de Firestore antes de operar con datos reales.
- Se recomienda restringir los dominios autorizados en Firebase Authentication.
- Para operación en producción, se recomienda separar configuración sensible por ambiente.
La colección principal de inventarios se almacena en Firestore como inventory.
Campos relevantes de un inventario:
dateKey: fecha operativa del inventario.fecha: fecha mostrada al usuario.semana: semana detectada desde el PDF.cedis: centro de distribución detectado.sourcePdfName: nombre del PDF original.status: estado del inventario.categories: estructura base de categorías y productos.userCounts: conteos independientes por usuario.verifiedProducts: productos revisados por auditoría.finalCount: conteo final validado.createdAt,createdBy: trazabilidad de creación.updatedAt,updatedBy: trazabilidad de actualización.
Estados principales del inventario:
borradoren_procesoconteo_1_completoconteo_2_completopendiente_comparacionvalidadoguardadocerradoreabierto
La colección de usuarios se almacena como users.
Campos relevantes de usuario:
uidemaildisplayNameroleactivelastSeenAtupdatedAt
/login: acceso con correo/contraseña o Google./inicio: panel central del sistema./inventario/resumen: resumen del inventario del día./inventario/cargar: carga y previsualización del PDF./inventario/conteo: conteo en proceso./inventario/historial: historial de inventarios./inventario/:id: detalle del inventario./inventario/:id/editar: edición y captura de conteo./inventario/comparar: comparación de conteos./inventario/:id/comparar: comparación de un inventario específico./administracion/usuarios: administración de usuarios y roles.