Sistema de Control de Stock — Especificación Técnica
Cámara Argentina de Instaladores Electricistas
Este documento define en detalle el alcance funcional y técnico del Sistema de Control de Stock propuesto para la Cámara Argentina de Instaladores Electricistas (ACyEDE). Su propósito es establecer de manera clara y precisa qué funcionalidades incluirá el sistema, cómo se estructurarán los datos, y cuáles serán los requerimientos técnicos para su implementación y operación.
Está dirigido tanto al equipo de desarrollo como a la comisión directiva de ACyEDE, por lo que se utilizan explicaciones accesibles sin sacrificar el rigor técnico necesario para la construcción del sistema.
Las secciones 1, 4 y 5 están pensadas para cualquier lector. Las secciones 2, 3 y 6 contienen
detalles más técnicos que sirven como referencia para el equipo de desarrollo. Los términos técnicos
aparecen explicados en el glosario (sección 1.3) y resaltados en este formato a lo largo del documento.
El sistema será una aplicación web accesible desde cualquier dispositivo con navegador (computadoras, tablets y celulares). Permitirá gestionar de forma integral el inventario de productos de ACyEDE, incluyendo:
Cantidad disponible de un producto en el inventario en un momento dado.
Stock Keeping Unit. Código único que identifica a cada producto en el sistema.
Grupo de productos recibidos en una misma compra o envío, identificado por un código.
Cualquier cambio en la cantidad de stock: entrada (ingreso), salida (egreso) o ajuste.
Alta, Baja y Modificación. Operaciones básicas para crear, editar y eliminar registros.
Interfaz de programación que permite la comunicación entre el frontend y el backend.
JSON Web Token. Mecanismo de autenticación seguro basado en tokens firmados digitalmente.
Single Page Application. Aplicación web que carga una sola página y se actualiza dinámicamente.
Clave foránea. Campo que vincula un registro con otro de una tabla diferente.
En lugar de eliminar un registro, se marca como inactivo. Los datos se preservan siempre.
El sistema sigue una arquitectura cliente-servidor clásica de tres capas. El usuario accede a través de un navegador web, que se comunica con el servidor a través de Internet:
Aplicación web de página única (SPA) desarrollada con React. Se adapta automáticamente a cualquier tamaño de pantalla (responsive), permitiendo su uso cómodo desde celulares, tablets y computadoras. Interfaz moderna e intuitiva.
Servidor de aplicaciones que procesa la lógica de negocio, gestiona la autenticación, y expone una API REST para comunicarse con el frontend. Node.js es reconocido por su alto rendimiento y eficiencia en recursos.
Motor de base de datos liviano y robusto. SQLite es ideal para esta escala de uso, no requiere servidor adicional, y los datos pueden migrarse fácilmente a PostgreSQL si la demanda crece en el futuro.
Servidor privado virtual (VPS) en la nube con nginx como proxy reverso. Garantiza disponibilidad 24/7, acceso desde cualquier lugar, y copias de seguridad automáticas diarias.
La elección del stack tecnológico prioriza tres factores: costo operativo bajo (Node.js y SQLite requieren mínimos recursos de servidor), velocidad de desarrollo (JavaScript en frontend y backend con un equipo reducido), y escalabilidad (la arquitectura REST y la migración a PostgreSQL permiten crecer sin reconstruir el sistema). Todas las tecnologías son open source, sin costos de licencia.
El modelo de datos define la estructura de la información que almacenará el sistema. Cada entidad representa un tipo de dato (productos, usuarios, etc.) y sus campos describen qué información se guarda de cada uno.
Representa a las personas que acceden al sistema. Cada usuario tiene un rol que determina sus permisos.
| Campo | Tipo | Descripción | Requerido |
|---|---|---|---|
id |
Entero | Identificador único del usuario | Sí (auto) |
username |
Texto | Nombre de usuario para iniciar sesión | Sí (único) |
password_hash |
Texto | Contraseña cifrada (nunca se almacena en texto plano) | Sí |
full_name |
Texto | Nombre completo del usuario | Sí |
role |
Texto | Rol asignado: admin, operator o readonly |
Sí |
active |
Booleano | Estado activo/inactivo del usuario | Sí |
created_at |
Fecha/hora | Fecha y hora de creación del registro | Sí (auto) |
Clasificación de los productos. Ejemplos: material didáctico, artículos de oficina, herramientas, merchandising.
| Campo | Tipo | Descripción | Requerido |
|---|---|---|---|
id |
Entero | Identificador único de la categoría | Sí (auto) |
name |
Texto | Nombre de la categoría | Sí (único) |
description |
Texto | Descripción opcional de la categoría | No |
Datos de contacto de los proveedores de productos de ACyEDE.
| Campo | Tipo | Descripción | Requerido |
|---|---|---|---|
id |
Entero | Identificador único del proveedor | Sí (auto) |
name |
Texto | Nombre del proveedor o empresa | Sí |
contact |
Texto | Persona de contacto | No |
phone |
Texto | Número de teléfono | No |
email |
Texto | Correo electrónico | No |
Entidad central del sistema. Contiene toda la información de cada artículo del inventario.
| Campo | Tipo | Descripción | Requerido |
|---|---|---|---|
id |
Entero | Identificador único del producto | Sí (auto) |
code |
Texto | Código único del producto (SKU) | Sí (único) |
name |
Texto | Nombre del producto | Sí |
description |
Texto | Descripción detallada del producto | No |
category_id |
Entero FK | Categoría del producto (referencia a Categorías) | No |
supplier_id |
Entero FK | Proveedor del producto (referencia a Proveedores) | No |
location |
Texto | Ubicación física en el depósito (ej: "Estante A3") | No |
price |
Decimal | Precio unitario de referencia | No |
current_stock |
Entero | Cantidad actualmente disponible en inventario | Sí (default 0) |
min_stock |
Entero | Stock mínimo para activar alerta de reposición | No (default 0) |
batch |
Texto | Número de lote del producto | No |
expiration_date |
Fecha | Fecha de vencimiento del producto | No |
photo_url |
Texto | Ruta al archivo de foto del producto | No |
active |
Booleano | Estado activo/inactivo (baja lógica) | Sí (default true) |
created_at |
Fecha/hora | Fecha y hora de creación | Sí (auto) |
updated_at |
Fecha/hora | Fecha y hora de última actualización | Sí (auto) |
Registra cada cambio en el inventario. Es la tabla de auditoría principal del sistema — cada vez que entra o sale un producto, queda registrado quién lo hizo, cuándo, y por qué motivo.
| Campo | Tipo | Descripción | Requerido |
|---|---|---|---|
id |
Entero | Identificador único del movimiento | Sí (auto) |
product_id |
Entero FK | Producto afectado (referencia a Productos) | Sí |
user_id |
Entero FK | Usuario que realizó el movimiento (referencia a Usuarios) | Sí |
type |
Texto | Tipo de movimiento: entry (entrada), exit (salida), adjustment (ajuste) |
Sí |
quantity |
Entero | Cantidad de unidades del movimiento | Sí |
stock_before |
Entero | Stock del producto antes del movimiento | Sí |
stock_after |
Entero | Stock del producto después del movimiento | Sí |
reason |
Texto | Motivo del movimiento (ej: "Compra a proveedor X") | No |
created_at |
Fecha/hora | Fecha y hora del movimiento | Sí (auto) |
Los movimientos nunca se eliminan ni modifican. Si hay un error, se registra un nuevo
movimiento de tipo adjustment que lo corrige. Esto garantiza la trazabilidad completa
y la integridad de los datos históricos.
Este diagrama muestra cómo se vinculan las entidades del sistema entre sí. Las flechas indican relaciones de referencia (claves foráneas).
El sistema está organizado en módulos independientes. Cada módulo agrupa funcionalidades relacionadas y puede ser implementado de forma incremental.
JWT con expiración de 8 horasadmin, operator, readonly| Acción | Admin | Operador | Solo Lectura |
|---|---|---|---|
| Ver dashboard | ✅ | ✅ | ✅ |
| Ver catálogo de productos | ✅ | ✅ | ✅ |
| Crear y editar productos | ✅ | ✅ | ❌ |
| Eliminar productos (baja lógica) | ✅ | ❌ | ❌ |
| Registrar movimientos de stock | ✅ | ✅ | ❌ |
| Ver reportes | ✅ | ✅ | ✅ |
| Exportar datos (Excel/CSV) | ✅ | ✅ | ❌ |
| Gestionar usuarios | ✅ | ❌ | ❌ |
| Gestionar categorías | ✅ | ✅ | ❌ |
| Gestionar proveedores | ✅ | ✅ | ❌ |
Los productos nunca se eliminan físicamente de la base de datos. Al dar de baja un producto,
se marca como inactivo (active = false). Esto permite recuperar la información en cualquier
momento y mantener la integridad de los movimientos históricos.
Ingreso de productos al inventario. Ejemplos: compras a proveedores, devoluciones de alumnos, donaciones recibidas. Suma la cantidad al stock actual.
Egreso de productos del inventario. Ejemplos: uso en cursos, préstamo a personal, venta de merchandising. Resta la cantidad al stock actual.
Corrección manual del stock. Se utiliza para reconciliar diferencias encontradas durante conteos físicos o para corregir errores de carga. Puede sumar o restar según corresponda.
Cada movimiento almacena automáticamente una "instantánea" del estado del stock:
| Reporte | Descripción | Exportable |
|---|---|---|
| Stock actual completo | Listado de todos los productos con su stock actual, categoría, proveedor y ubicación | Excel / CSV |
| Productos con stock bajo | Productos cuyo stock actual está por debajo del mínimo configurado | Excel / CSV |
| Movimientos por período | Detalle de todos los movimientos en un rango de fechas, con gráfico de tendencia | Excel / CSV |
| Ranking de productos | Productos ordenados por cantidad de movimientos (más activos primero) | Excel / CSV |
| Próximos a vencer | Productos con fecha de vencimiento cercana, ordenados por urgencia | Excel / CSV |
Crear, editar y desactivar categorías de productos. Incluye nombre y descripción.
Accesible para roles admin y operator.
Crear, editar y desactivar proveedores. Incluye datos de contacto (nombre, teléfono, email).
Accesible para roles admin y operator.
Crear nuevos usuarios, asignar roles, activar/desactivar cuentas, y restablecer contraseñas.
Este módulo es de uso exclusivo del rol admin por razones de seguridad.
Los usuarios no pueden eliminarse, solo desactivarse (baja lógica).
Especificaciones mínimas de infraestructura y entorno necesarias para la correcta operación del sistema.
Se configurará un proceso automatizado de respaldo que copiará la base de datos completa una vez al día. Los respaldos se almacenarán en el mismo servidor durante 30 días, con opción de configurar respaldo externo (Google Drive, Amazon S3, etc.) si ACyEDE lo requiere.
Google Chrome, Mozilla Firefox, Apple Safari y Microsoft Edge — últimas 2 versiones de cada uno. No se garantiza compatibilidad con Internet Explorer.
Diseño responsive que se adapta a computadoras de escritorio, notebooks, tablets y celulares. La interfaz se reorganiza automáticamente según el tamaño de pantalla.
La seguridad es un pilar fundamental del sistema. Se implementan múltiples capas de protección para resguardar los datos de ACyEDE y garantizar que solo usuarios autorizados puedan operar.
Las contraseñas se almacenan cifradas con el algoritmo bcrypt.
Ni siquiera los administradores del sistema pueden ver las contraseñas originales.
Cada sesión se gestiona mediante tokens firmados digitalmente (JWT)
que expiran automáticamente tras 8 horas de inactividad.
Toda la comunicación entre el navegador y el servidor viaja cifrada mediante protocolo HTTPS con certificado SSL/TLS.
Todas las consultas a la base de datos utilizan parámetros preparados, lo que previene ataques de inyección SQL.
Se configura CORS (Cross-Origin Resource Sharing) para permitir solo solicitudes desde el dominio autorizado de ACyEDE.
Los datos se validan tanto en el frontend (para UX) como en el backend (para seguridad). Nunca se confía solo en la validación del navegador.
Ningún dato se elimina físicamente de la base de datos. Los registros se desactivan, preservando la integridad y el historial completo.
Cada movimiento de stock queda registrado con el usuario que lo realizó, la fecha y hora exacta, y el motivo. Auditoría total.
ACyEDE es responsable de mantener las credenciales de administrador en un lugar seguro, comunicar al equipo de desarrollo cualquier incidencia de seguridad, y no compartir usuarios ni contraseñas entre personas. Cada persona que use el sistema debe tener su propia cuenta.
El sistema está diseñado con una arquitectura que permite crecer y evolucionar a medida que las necesidades de ACyEDE cambien, sin necesidad de reconstruirlo desde cero.
Si el volumen de datos o de usuarios simultáneos crece significativamente, la base de datos puede migrarse de SQLite a PostgreSQL sin cambios en la aplicación. PostgreSQL soporta consultas concurrentes, replicación y backups en caliente.
La API REST del sistema permite integrar el control de stock con otros sistemas que ACyEDE pueda usar en el futuro (contabilidad, CRM, sitio web institucional). Cualquier aplicación puede consumir los datos del inventario.
La arquitectura modular permite agregar funcionalidades sin afectar lo ya construido:
| Módulo futuro | Descripción | Prioridad |
|---|---|---|
| Órdenes de compra | Generar pedidos a proveedores automáticamente cuando el stock baje del mínimo | Media |
| Facturación básica | Generar comprobantes simples de venta de merchandising o materiales | Media |
| Notificaciones | Alertas por email o WhatsApp cuando un producto llega al stock mínimo | Alta |
| Múltiples sedes | Gestionar inventarios separados para distintas ubicaciones de ACyEDE | Baja |
| Código de barras / QR | Escaneo rápido de productos para agilizar entradas y salidas | Media |
| App móvil nativa | Aplicación nativa para Android/iOS con funcionalidades offline | Baja |
La separación entre frontend y backend permite reemplazar o actualizar cualquiera de las partes de forma independiente. La API REST documentada facilita la integración con sistemas externos. El modelo de datos normalizado evita duplicaciones y permite agregar nuevas entidades sin reestructurar las existentes. El uso de baja lógica en todas las entidades garantiza que los datos históricos siempre estarán disponibles para auditoría.
— Fin del Documento de Alcance Funcional —
Versión 1.0 · Junio 2026 · Documento preparado para la Comisión Directiva de ACyEDE