Documentación Técnica

Manual del
Administrador

Sistema de Control de Stock — Guía Técnica

Versión v1.0
Fecha Julio 2026
Audiencia Administradores
Clasificación Confidencial
⚠ Este documento contiene información técnica confidencial. No distribuir sin autorización.
Manual del Administrador
Contenido

Tabla de Contenidos

Guía completa de administración del sistema de control de stock

Manual del Administrador
Sección 1
Sección 1

Arquitectura del Sistema

Visión general de los componentes técnicos, tecnologías utilizadas y estructura del proyecto.

1.1 Visión General

El sistema de Control de Stock de ACyEDE utiliza una arquitectura cliente-servidor de tres capas. El frontend es una aplicación de página única (SPA) construida con React que se ejecuta en el navegador del usuario. El backend es una API REST construida con Node.js y Express que gestiona la lógica de negocio y la autenticación. La base de datos es un archivo SQLite gestionado con la librería better-sqlite3.

Esta arquitectura permite que el sistema funcione en un único servidor, sin necesidad de instalar un motor de base de datos externo. Toda la información se almacena en un solo archivo .db, lo que simplifica enormemente el backup y la portabilidad.

1.2 Diagrama de Arquitectura

🖥️ Cliente (Browser) React 19 + Vite
HTTP/S ──────→ ←────── JSON
⚙️ Servidor API Node.js + Express
SQL ──────→ ←────── Datos
🗄️ Base de Datos SQLite (archivo)

1.3 Estructura del Proyecto

📁 acyede-stock/
├── 📁 client/ — Frontend React
│ ├── 📁 src/
│ │ ├── 📁 components/ — Componentes reutilizables
│ │ ├── 📁 pages/ — Vistas principales
│ │ ├── 📁 contexts/ — Estado global (Auth)
│ │ ├── 📁 services/ — Llamadas a la API
│ │ └── App.jsx — Componente raíz
│ ├── vite.config.js
│ └── package.json
├── 📁 server/ — Backend Node.js
│ ├── 📁 db/ — Archivo de base de datos
│ │ └── stock.db — Base de datos SQLite
│ ├── 📁 routes/ — Rutas de la API
│ ├── 📁 middleware/ — Auth, validación
│ ├── 📁 uploads/ — Fotos de productos
│ ├── index.js — Punto de entrada del servidor
│ ├── .env — Variables de entorno
│ └── package.json
├── package.json — Scripts raíz
└── README.md

1.4 Stack Tecnológico

Componente Tecnología Versión Propósito
Frontend React + Vite 19.x / 6.x Interfaz de usuario SPA, compilación rápida
Backend Node.js + Express 22.x / 4.x API REST, lógica de negocio
Base de datos SQLite (better-sqlite3) 3.x / 11.x Almacenamiento persistente en archivo
Autenticación JWT + bcrypt — Tokens de sesión, hash de contraseñas
Gráficos Chart.js 4.x Visualización de datos en dashboard
Exportación SheetJS (xlsx) — Exportación a Excel y CSV
Upload de archivos Multer — Subida de fotos de productos
ℹ️
Nota sobre SQLite SQLite es ideal para este tipo de aplicaciones con un volumen de datos moderado. No requiere instalar ningún servidor de base de datos adicional. Toda la información se almacena en un único archivo (stock.db), lo que simplifica enormemente las tareas de backup y migración.
Manual del Administrador
Sección 2
Sección 2

Instalación y Configuración

Requisitos previos, pasos de instalación, variables de entorno y configuración inicial del sistema.

2.1 Requisitos Previos

Requisito Mínimo Recomendado Notas
Node.js 18.x LTS 22.x LTS Descargar de nodejs.org
npm 9.x 10.x Incluido con Node.js
Sistema operativo Windows 10+, Linux, macOS Cualquier SO con soporte para Node.js
RAM 1 GB 2 GB+ Para el servidor en producción
Disco 500 MB 2 GB+ Depende del volumen de fotos

2.2 Instalación Paso a Paso

  1. Obtener el código del proyecto

    Cloná el repositorio o copiá la carpeta del proyecto al servidor:

    Terminal
    # Opción A: Clonar desde repositorio
    git clone https://github.com/tu-org/acyede-stock.git
    cd acyede-stock
    
    # Opción B: Copiar carpeta manualmente
    # Copiar la carpeta completa al servidor y navegar a ella
  2. Instalar todas las dependencias

    Ejecutá el comando de instalación unificado desde la raíz del proyecto:

    Terminal
    npm run install:all
    
    # Este comando instala las dependencias de:
    #   - Raíz del proyecto (scripts de gestión)
    #   - server/ (API backend + SQLite)
    #   - client/ (React frontend)
  3. Configurar variables de entorno

    Creá o editá el archivo server/.env con la configuración necesaria:

    server/.env
    # Puerto del servidor
    PORT=3001
    
    # Clave secreta para firmar tokens JWT
    # ¡CAMBIÁ ESTO EN PRODUCCIÓN!
    JWT_SECRET=tu_clave_secreta_super_segura_aqui
    
    # Ruta al archivo de base de datos
    DB_PATH=./db/stock.db
  4. Iniciar en modo desarrollo

    Para desarrollo local con hot-reload:

    Terminal
    npm run dev
    
    # Esto inicia simultáneamente:
    #   - Backend en http://localhost:3001
    #   - Frontend en http://localhost:5173 (con proxy al backend)
  5. Compilar y ejecutar en producción

    Para despliegue en producción, compilá el frontend y luego iniciá el servidor:

    Terminal
    # Compilar el frontend para producción
    npm run build
    
    # Iniciar el servidor (sirve el frontend compilado + API)
    npm start
    
    # El sistema completo queda disponible en:
    #   http://localhost:3001
🔴
¡Crítico para producción! Nunca uses el JWT_SECRET por defecto en producción. Generá una clave aleatoria segura de al menos 64 caracteres. Podés usar: node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"

2.3 Variables de Entorno

Variable Valor por Defecto Obligatoria Descripción
PORT 3001 No Puerto en el que escucha el servidor HTTP. Cambiá este valor si el puerto 3001 está ocupado por otra aplicación.
JWT_SECRET (auto-generado) Sí (prod) Clave secreta para firmar y verificar los tokens JWT de autenticación. Si no se define, el sistema genera una automáticamente (cambia en cada reinicio, cerrando todas las sesiones).
DB_PATH ./db/stock.db No Ruta al archivo de base de datos SQLite. Relativa a la carpeta server/. El directorio debe existir; el archivo se crea automáticamente si no existe.

2.4 Verificar la Instalación

Después de iniciar el sistema, verificá que todo funcione correctamente:

Terminal — Verificación
# Verificar que el servidor responde
curl http://localhost:3001/api/auth/me

# Respuesta esperada (sin token): {"error":"Token no proporcionado"}
# Esto confirma que la API está funcionando correctamente

# Probar login
curl -X POST http://localhost:3001/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'

# Respuesta esperada: {"token":"eyJ...", "user":{...}}
Manual del Administrador
Sección 3
Sección 3

Gestión de Usuarios

Usuarios predeterminados, creación y administración de cuentas, roles y permisos del sistema.

3.1 Usuarios Predeterminados

Al ejecutar el sistema por primera vez, se crean automáticamente tres usuarios con roles distintos. Estos usuarios permiten el acceso inicial al sistema y deben ser modificados inmediatamente después del primer inicio de sesión.

Usuario Contraseña Rol Descripción
admin admin123 Administrador Acceso completo a todos los módulos y configuraciones
operador operador123 Operador Puede gestionar productos, movimientos y ver reportes
consulta consulta123 Solo lectura Solo puede consultar información, sin modificar datos
🔴
¡ACCIÓN INMEDIATA REQUERIDA! Cambiá las contraseñas de todos los usuarios predeterminados inmediatamente después del primer inicio de sesión. Las credenciales por defecto son públicas (están en este documento y en el código fuente) y representan un riesgo de seguridad crítico si no se cambian.

3.2 Crear un Nuevo Usuario

Solo los usuarios con rol Administrador pueden crear nuevas cuentas.

  1. Acceder a la gestión de usuarios

    Navegá a la sección Usuarios desde el menú lateral (escritorio) o desde la navegación inferior (móvil).

  2. Iniciar la creación

    Hacé clic en el botón "Nuevo Usuario" ubicado en la parte superior de la página.

  3. Completar el formulario

    Ingresá los datos del nuevo usuario:

    • Nombre de usuario: Identificador único para el login (sin espacios)
    • Nombre completo: Nombre y apellido del usuario
    • Contraseña: Mínimo 6 caracteres
    • Rol: Seleccioná entre Administrador, Operador o Solo lectura
  4. Guardar

    Hacé clic en "Guardar". El usuario podrá iniciar sesión de inmediato con las credenciales asignadas.

3.3 Editar un Usuario

Desde la lista de usuarios, hacé clic en el botón de edición (ícono de lápiz) junto al usuario que querés modificar. Podés cambiar:

ℹ️
Sobre el cambio de rol Cuando cambiás el rol de un usuario, los permisos se actualizan la próxima vez que inicie sesión. Si el usuario tiene una sesión activa, el token JWT vigente seguirá reflejando el rol anterior hasta que expire o se cierre la sesión.

3.4 Desactivar un Usuario

Los usuarios no se eliminan del sistema, sino que se desactivan (soft-disable). Un usuario desactivado no puede iniciar sesión, pero su historial de movimientos se conserva para auditoría. Los usuarios desactivados pueden ser reactivados en cualquier momento por un administrador.

3.5 Matriz de Permisos por Rol

Funcionalidad Administrador Operador Solo Lectura
Ver dashboard y KPIs ✔ Sí ✔ Sí ✔ Sí
Ver catálogo de productos ✔ Sí ✔ Sí ✔ Sí
Crear / editar productos ✔ Sí ✔ Sí ✘ No
Eliminar / desactivar productos ✔ Sí ✘ No ✘ No
Registrar movimientos de stock ✔ Sí ✔ Sí ✘ No
Ver historial de movimientos ✔ Sí ✔ Sí ✔ Sí
Ver y exportar reportes ✔ Sí ✔ Sí ✔ Sí
Gestionar categorías ✔ Sí ✔ Sí ✘ No
Gestionar proveedores ✔ Sí ✔ Sí ✘ No
Gestionar usuarios ✔ Sí ✘ No ✘ No
Manual del Administrador
Sección 4
Sección 4

Base de Datos

Estructura de la base de datos SQLite, esquema de tablas, relaciones entre entidades y mecanismo de auto-seeding.

4.1 Ubicación del Archivo

La base de datos es un archivo SQLite ubicado en:

Ruta del archivo
server/db/stock.db

Este archivo contiene toda la información del sistema: usuarios, productos, categorías, proveedores y movimientos de stock. Al ser un único archivo, es extremadamente fácil de respaldar, migrar o clonar.

4.2 Esquema de Tablas

La base de datos consta de 5 tablas principales:

Tabla Descripción Campos Principales
users Cuentas de usuario del sistema id, username, password (hash bcrypt), fullName, role, active, createdAt
categories Categorías de productos id, name, description, active, createdAt
suppliers Proveedores de productos id, name, contact, phone, email, address, active, createdAt
products Catálogo de productos id, name, sku, description, categoryId, supplierId, stock, minStock, price, image, active, createdAt
stock_movements Registro de entradas, salidas y ajustes id, productId, type (entrada/salida/ajuste), quantity, reason, userId, createdAt

4.3 Relaciones entre Entidades

Diagrama de Relaciones

categories
1
──┤
products
N
├──
suppliers
1
│
N
stock_movements
N
├──
users
1
  • Un producto pertenece a una categoría y a un proveedor
  • Un movimiento referencia a un producto y al usuario que lo registró
  • Las categorías y proveedores pueden tener múltiples productos asociados

4.4 Auto-Seeding (Datos Iniciales)

La primera vez que se inicia el servidor, el sistema detecta que la base de datos está vacía y ejecuta automáticamente el proceso de seeding:

ℹ️
Reiniciar la base de datos Si necesitás volver al estado inicial, simplemente detenés el servidor, eliminás el archivo stock.db y reiniciás. El seeding se ejecutará nuevamente y se creará una base de datos limpia con los datos de ejemplo.

4.5 Notas Importantes sobre SQLite

⚠️
Concurrencia limitada SQLite permite múltiples lecturas simultáneas pero solo una escritura a la vez. Esto es adecuado para el volumen de uso esperado, pero no es recomendable para cientos de usuarios concurrentes escribiendo al mismo tiempo. Para esos escenarios, considerá migrar a PostgreSQL.
Manual del Administrador
Sección 5
Sección 5

Backup y Restauración

Procedimientos de respaldo manual y automatizado, restauración de la base de datos y buenas prácticas de protección de datos.

🔴
¡Nunca edites la base de datos manualmente mientras el servidor está en ejecución! Modificar el archivo stock.db con un editor externo mientras el servidor está corriendo puede causar corrupción de datos irrecuperable. Siempre detenés el servidor antes de manipular el archivo.

5.1 Backup Manual

El backup del sistema consiste en respaldar dos elementos: la base de datos y las fotos de productos.

  1. Detener el servidor

    Asegurate de que el servidor no esté en ejecución para evitar inconsistencias. Si usás PM2: pm2 stop acyede-stock. Si ejecutás directamente: presioná Ctrl+C en la terminal.

  2. Copiar el archivo de base de datos

    Copiá el archivo server/db/stock.db a una ubicación segura:

    Windows — CMD / PowerShell
    copy server\db\stock.db D:\backups\stock_2026-07-07.db
  3. Copiar la carpeta de fotos

    Las fotos de productos se almacenan en server/uploads/. Respaldá esta carpeta completa:

    Windows — CMD / PowerShell
    xcopy server\uploads D:\backups\uploads_2026-07-07\ /E /I
  4. Reiniciar el servidor

    Una vez completado el backup, reiniciá el servidor normalmente: npm start o pm2 start acyede-stock.

5.2 Backup Automatizado

Usá el siguiente script de Windows (.bat) para automatizar el backup diario. Programalo en el Programador de Tareas de Windows para que se ejecute automáticamente.

backup_acyede.bat — Script de Backup Automatizado
@echo off
REM ============================================
REM   ACyEDE Stock - Script de Backup Automático
REM   Programar en el Programador de Tareas
REM ============================================

REM Configuración - AJUSTAR ESTAS RUTAS
SET PROJECT_DIR=C:\acyede-stock
SET BACKUP_DIR=D:\backups\acyede
SET MAX_BACKUPS=30

REM Generar marca de tiempo
SET TIMESTAMP=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%-%time:~3,2%
SET TIMESTAMP=%TIMESTAMP: =0%

REM Crear directorio de backup si no existe
IF NOT EXIST "%BACKUP_DIR%" MKDIR "%BACKUP_DIR%"

REM Copiar base de datos
echo [%TIMESTAMP%] Iniciando backup...
copy "%PROJECT_DIR%\server\db\stock.db" "%BACKUP_DIR%\stock_%TIMESTAMP%.db"

REM Copiar carpeta de uploads
xcopy "%PROJECT_DIR%\server\uploads" "%BACKUP_DIR%\uploads_%TIMESTAMP%\" /E /I /Q

REM Registrar en log
echo [%TIMESTAMP%] Backup completado exitosamente >> "%BACKUP_DIR%\backup_log.txt"

echo Backup completado: %BACKUP_DIR%\stock_%TIMESTAMP%.db
💡
Programar ejecución automática Abrí el Programador de Tareas de Windows (taskschd.msc), creá una nueva tarea que ejecute este script diariamente (por ejemplo, a las 2:00 AM). Asegurate de que la tarea se ejecute incluso si el usuario no ha iniciado sesión.

5.3 Restaurar desde Backup

  1. Detener el servidor

    Detenés el servidor para liberar el archivo de base de datos.

  2. Reemplazar la base de datos

    Reemplazá el archivo actual con la copia de backup:

    Terminal
    # Renombrar el archivo actual (por seguridad)
    rename server\db\stock.db stock_corrupted.db
    
    # Copiar el backup
    copy D:\backups\acyede\stock_2026-07-05.db server\db\stock.db
  3. Restaurar fotos (si es necesario)

    Si también necesitás restaurar las fotos de productos:

    Terminal
    xcopy D:\backups\acyede\uploads_2026-07-05\ server\uploads\ /E /I /Y
  4. Reiniciar el servidor

    Iniciá el servidor normalmente. Verificá que los datos se hayan restaurado correctamente ingresando al sistema y revisando la información.

⚠️
Pérdida de datos Al restaurar un backup, se pierden todos los datos ingresados después de la fecha del backup. Asegurate de que la restauración sea realmente necesaria antes de proceder. Siempre conservá una copia del archivo actual antes de sobreescribirlo.
Manual del Administrador
Sección 6
Sección 6

Deploy en Producción

Opciones de despliegue, configuración para producción, gestión de procesos y checklist de seguridad.

6.1 Opción A: Servidor Local (Red Interna)

La opción más simple es ejecutar el sistema en una PC o servidor dedicado dentro de la red local de la organización. Los demás dispositivos acceden al sistema a través de la dirección IP del servidor.

  1. Preparar el servidor

    Instalá Node.js en la PC/servidor que va a alojar el sistema. Asegurate de que tenga una IP fija en la red local (o configurá una IP estática en la red).

  2. Instalar y compilar
    Terminal
    npm run install:all
    npm run build
    npm start
  3. Acceder desde otros dispositivos

    Los usuarios de la red acceden abriendo un navegador y visitando:

    URL de acceso
    http://IP_DEL_SERVIDOR:3001
    
    # Ejemplo: http://192.168.1.100:3001

Gestión de procesos con PM2

Para que el servidor se mantenga ejecutando en segundo plano y se reinicie automáticamente ante errores o reinicios del sistema, usá PM2:

Terminal — Configurar PM2
# Instalar PM2 globalmente
npm install -g pm2

# Iniciar el servidor con PM2
pm2 start server/index.js --name "acyede-stock"

# Configurar inicio automático con Windows
pm2 save
pm2-startup install

# Comandos útiles de PM2
pm2 status            # Ver estado del proceso
pm2 logs acyede-stock  # Ver logs en tiempo real
pm2 restart acyede-stock # Reiniciar
pm2 stop acyede-stock    # Detener
💡
Windows: Servicio automático Para que PM2 arranque con Windows, podés usar el paquete pm2-windows-startup: npm install -g pm2-windows-startup y luego pm2-startup install. Esto registra PM2 como un servicio de Windows.

6.2 Opción B: Hosting en la Nube

Para acceso desde internet (fuera de la red local), podés desplegar en un servicio de hosting en la nube.

Servicio Tipo Costo Notas
Railway PaaS Desde gratis Deploy simple desde Git. Ideal para empezar. Nota: SQLite se pierde al redeployar (usar volumen persistente).
Render PaaS Desde gratis Similar a Railway. Soporta discos persistentes en plan pago.
VPS (DigitalOcean, etc.) IaaS ~$5/mes Control total. Requiere configuración manual de Node.js, PM2, Nginx y SSL.

Pasos generales para hosting en la nube:

  1. Subir el código

    Subí el proyecto a un repositorio Git o usá el CLI del servicio elegido para deployar directamente.

  2. Configurar variables de entorno

    Definí PORT, JWT_SECRET y DB_PATH en el panel de configuración del servicio.

  3. Configurar el build y start

    Build command: npm run install:all && npm run build
    Start command: npm start

  4. Configurar dominio (opcional)

    Configurá un dominio personalizado y un certificado SSL en el panel del servicio de hosting.

6.3 Checklist de Seguridad para Producción

Antes de poner el sistema en producción, verificá cada punto de esta lista:

🔴
Seguridad obligatoria Los primeros tres ítems de esta lista (JWT_SECRET, contraseñas y HTTPS) son absolutamente obligatorios para cualquier sistema en producción. No poner el sistema en producción sin completarlos.
Manual del Administrador
Sección 7
Sección 7

Solución de Problemas

Guía de diagnóstico y resolución de los problemas más comunes del sistema.

7.1 Problemas Frecuentes y Soluciones

Problema Causa Probable Solución
El servidor no arranca El puerto configurado ya está en uso por otra aplicación Cambiá el valor de PORT en server/.env a otro puerto disponible (ej: 3002, 8080). Verificá puertos en uso con: netstat -ano | findstr :3001
Error de base de datos al iniciar El archivo stock.db está corrupto o la carpeta db/ no existe Verificá que exista la carpeta server/db/. Si el archivo está corrupto, restaurá desde un backup (Sección 5.3) o eliminá el archivo para que se recree.
No puedo iniciar sesión Contraseña incorrecta, usuario desactivado, o token JWT inválido Verificá usuario y contraseña. Si olvidaste la contraseña de admin, otro administrador puede reseteártela. Como último recurso, eliminá stock.db para recrear los usuarios predeterminados (se pierden datos).
Las fotos de productos no se ven La carpeta server/uploads/ no existe o no tiene permisos de lectura Creá la carpeta manualmente: mkdir server\uploads. Verificá que el servidor tenga permisos de lectura y escritura sobre esa carpeta.
Error better-sqlite3 El módulo nativo no está compilado para tu versión de Node.js Ejecutá: npm rebuild better-sqlite3 desde la carpeta server/. Si no funciona, eliminá node_modules y ejecutá npm install nuevamente.
El frontend no compila Dependencias faltantes o versión incompatible de Node.js Ejecutá npm install dentro de la carpeta client/. Verificá que tengas Node.js 18 o superior: node --version
Error CORS en el navegador El frontend y backend están en orígenes diferentes sin proxy configurado En desarrollo, verificá que vite.config.js tenga el proxy configurado hacia el backend. En producción, usá npm start que sirve el frontend desde el mismo servidor.
Sesiones se cierran al reiniciar El JWT_SECRET no está fijo (se autogenera en cada inicio) Definí un JWT_SECRET fijo en server/.env. Así los tokens firmados siguen siendo válidos entre reinicios del servidor.
El sistema está lento Base de datos muy grande, muchas fotos, o servidor con pocos recursos Verificá el tamaño de stock.db. Considerá limpiar movimientos antiguos. Asegurate de que el servidor tenga al menos 2 GB de RAM disponibles.
No se puede acceder desde otro dispositivo Firewall bloqueando el puerto, o dispositivo en otra red Asegurate de que el firewall de Windows permita conexiones entrantes al puerto del servidor. Ambos dispositivos deben estar en la misma red local.

7.2 Comandos de Diagnóstico

Terminal — Diagnóstico del Sistema
# Verificar versión de Node.js (requiere 18+)
node --version

# Verificar versión de npm
npm --version

# Verificar si el puerto 3001 está en uso (Windows)
netstat -ano | findstr :3001

# Ver procesos de Node.js en ejecución (Windows)
tasklist | findstr node

# Verificar tamaño de la base de datos (PowerShell)
Get-Item server\db\stock.db | Select-Object Name, Length

# Verificar contenido de la carpeta uploads
dir server\uploads | Measure-Object

# Ver logs de PM2 (si usás PM2)
pm2 logs acyede-stock --lines 50

# Verificar que la API responde
curl http://localhost:3001/api/auth/me

7.3 Reinicio Completo del Sistema

Si nada funciona, podés hacer un reinicio completo reinstalando las dependencias:

Terminal — Reinicio completo
# 1. Detener cualquier proceso en ejecución
pm2 stop all  # o Ctrl+C si ejecutás directamente

# 2. Eliminar dependencias
rmdir /s /q node_modules
rmdir /s /q server\node_modules
rmdir /s /q client\node_modules

# 3. Reinstalar todo
npm run install:all

# 4. Recompilar
npm run build

# 5. Reiniciar
npm start
⚠️
Antes de reinstalar Este proceso no afecta la base de datos ni las fotos (solo reinstala código y dependencias). Sin embargo, hacé un backup preventivo de server/db/stock.db antes de cualquier operación de mantenimiento.
Manual del Administrador
Sección 8
Sección 8

Referencia de API

Listado completo de endpoints de la API REST, métodos HTTP, parámetros y requisitos de autenticación.

Todos los endpoints devuelven respuestas en formato JSON. La autenticación se realiza mediante un token JWT que debe incluirse en el header Authorization: Bearer <token> de cada solicitud (excepto el login).

8.1 Autenticación

Método Endpoint Descripción Acceso
POST /api/auth/login Iniciar sesión. Body: {"username", "password"}. Retorna token JWT. Público
GET /api/auth/me Obtener datos del usuario autenticado actual. Todos

8.2 Productos

Método Endpoint Descripción Acceso
GET /api/products Listar todos los productos activos. Soporta query params: ?search=, ?category= Todos
GET /api/products/:id Obtener detalle de un producto por ID. Todos
POST /api/products Crear un nuevo producto. Soporta multipart/form-data para subir foto. Admin / Op
PUT /api/products/:id Actualizar un producto existente. Soporta cambio de foto. Admin / Op
DELETE /api/products/:id Desactivar un producto (soft-delete). No elimina datos. Admin

8.3 Movimientos de Stock

Método Endpoint Descripción Acceso
GET /api/movements Listar movimientos con filtros: ?type=, ?product=, ?from=, ?to= Todos
POST /api/movements Registrar un movimiento (entrada, salida o ajuste). Actualiza stock automáticamente. Admin / Op

8.4 Categorías

Método Endpoint Descripción Acceso
GET /api/categories Listar todas las categorías activas. Todos
POST /api/categories Crear una nueva categoría. Admin / Op
PUT /api/categories/:id Actualizar una categoría existente. Admin / Op
DELETE /api/categories/:id Desactivar una categoría. Admin

8.5 Proveedores

Método Endpoint Descripción Acceso
GET /api/suppliers Listar todos los proveedores activos. Todos
POST /api/suppliers Crear un nuevo proveedor. Admin / Op
PUT /api/suppliers/:id Actualizar un proveedor existente. Admin / Op
DELETE /api/suppliers/:id Desactivar un proveedor. Admin

8.6 Usuarios

Método Endpoint Descripción Acceso
GET /api/users Listar todos los usuarios del sistema. Admin
POST /api/users Crear un nuevo usuario. Body: {"username", "password", "fullName", "role"} Admin
PUT /api/users/:id Actualizar un usuario (nombre, rol, contraseña). Admin
DELETE /api/users/:id Desactivar / reactivar un usuario. Admin

8.7 Reportes

Método Endpoint Descripción Acceso
GET /api/reports/summary KPIs del dashboard: total productos, valor del inventario, alertas de stock bajo, movimientos recientes. Todos
GET /api/reports/stock Reporte de niveles de stock actuales con filtros por categoría. Todos
GET /api/reports/movements Reporte de movimientos con filtros por fecha, tipo y producto. Todos
GET /api/reports/low-stock Productos cuyo stock actual está por debajo del mínimo definido. Todos
GET /api/reports/valuation Valorización del inventario: cantidad × precio por producto. Todos

8.8 Ejemplo de Uso de la API

Terminal — Ejemplo: Login + Consulta de Productos
# Paso 1: Obtener token de autenticación
curl -X POST http://localhost:3001/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'

# Respuesta: {"token":"eyJhbGciOiJIUzI1NiIs..."}

# Paso 2: Usar el token para consultar productos
curl http://localhost:3001/api/products \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

# Paso 3: Crear un nuevo producto
curl -X POST http://localhost:3001/api/products \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Cable UTP Cat6","sku":"CAB-006","categoryId":1,"stock":100,"minStock":20,"price":850}'
ℹ️
Códigos de respuesta HTTP
200 — Solicitud exitosa  |  201 — Recurso creado  |  400 — Datos inválidos  |  401 — No autenticado  |  403 — Sin permisos  |  404 — No encontrado  |  500 — Error del servidor

Sistema de Control de Stock

Manual del Administrador — v1.0

ACyEDE
Asociación Cooperadora y de Estímulo
de la Escuela

Julio 2026

📧 contacto@acyede.org.ar
🌐 www.acyede.org.ar

🔒 Documento confidencial — Uso interno exclusivo