Arquitectura SaaS multi-tenant · Node.js · Express · EJS · MySQL · Redis

QUIPU Enterprise Framework

Documento guía para construir una plataforma empresarial reutilizable, segura y escalable, preparada para crear múltiples productos SaaS sin duplicar lógica ni perder control técnico.

Ver roadmap Ver checklists

1. Propósito del documento

Este documento define los fundamentos técnicos y conceptuales para construir el ecosistema QUIPU como una plataforma SaaS empresarial, no como una colección de aplicaciones aisladas.

Idea central: si cada aplicación se desarrolla desde cero, el tiempo y el mantenimiento crecen demasiado. Si construyes un núcleo común, cada nuevo producto aprovecha autenticación, usuarios, tenant, permisos, auditoría, reportes, notificaciones y APIs ya existentes.

Qué busca resolver

  • Evitar código duplicado entre balance.plus, logistica.plus, reserva.plus, SATD y futuros productos.
  • Mantener una arquitectura simple para un desarrollador individual, pero preparada para escalar.
  • Definir reglas claras de seguridad, multi-tenancy, APIs, base de datos, permisos y auditoría.
  • Separar conceptos: aplicación web, API, módulo, dominio, motor, monolito modular y microservicio.
  • Crear una guía permanente para revisar decisiones antes de programar.

Cómo debe usarse

Antes de crear un nuevo módulo, tabla, ruta o pantalla, revisa este documento. La pregunta principal debe ser: ¿esto pertenece al núcleo común, a un motor reutilizable o a un producto específico?

Volver arriba

2. Visión general de QUIPU

QUIPU debe evolucionar como una plataforma empresarial modular. Encima de ella pueden nacer múltiples SaaS, cada uno especializado en un problema concreto, pero todos compartiendo una misma infraestructura.

QUIPU Enterprise Framework │ ├── Núcleo SaaS común │ ├── Autenticación │ ├── Multi-tenancy │ ├── Usuarios, roles y permisos │ ├── Suscripciones y planes │ ├── Auditoría │ ├── Notificaciones │ ├── i18n, moneda, impuestos │ └── API REST versionada │ ├── Motores reutilizables │ ├── Inventory Engine │ ├── Pricing Engine │ ├── Document Engine │ ├── Workflow Engine │ ├── Reporting Engine │ ├── Notification Engine │ └── Intelligence Engine │ └── Productos SaaS ├── logistica.plus ├── balance.plus ├── reserva.plus ├── SATD └── futuros productos

La diferencia clave

Enfoque incorrecto Enfoque recomendado
Crear cada aplicación como proyecto independiente. Crear una plataforma común y productos encima.
Repetir login, usuarios, permisos y auditoría en cada app. Usar un núcleo SaaS compartido.
Mezclar reglas de negocio con vistas EJS y rutas. Separar rutas, controladores, servicios, repositorios y vistas.
Dejar que el frontend envíe tenant_id. Resolver el tenant solo desde autenticación, JWT y Redis.
Como tutor: piensa en QUIPU como una ciudad. Los productos son edificios distintos, pero todos usan las mismas carreteras, electricidad, seguridad, reglas municipales y servicios básicos.
Volver arriba

3. Principios rectores

Estos principios deben guiar todas las decisiones técnicas del proyecto.

1. Simplicidad primero

Como el desarrollo será llevado por una sola persona, la arquitectura debe ser clara, modular y mantenible. No se debe introducir complejidad antes de necesitarla.

2. Seguridad por defecto

Toda ruta, consulta, formulario, API y archivo debe diseñarse asumiendo que puede ser atacado.

3. Multi-tenancy estricto

Ningún dato puede cruzarse entre empresas. El aislamiento por tenant_id es una regla central.

4. API reutilizable

La web, PWA, Android, integraciones externas y futuros clientes deben consumir las mismas reglas del backend.

5. Monolito modular

Se empieza con un solo proyecto Node.js bien organizado. Los microservicios se dejan para una etapa futura.

6. Datos confiables

El sistema debe priorizar consistencia, trazabilidad, auditoría y reglas transaccionales claras.

Regla fundacional: primero se construye independencia lógica mediante módulos y APIs. Solo después, cuando el crecimiento lo justifique, se evalúa independencia física mediante microservicios.
Volver arriba

4. Conceptos base

Antes de programar, conviene diferenciar correctamente los conceptos que sostienen la arquitectura.

API

Una API es una puerta de entrada. Recibe solicitudes, valida datos, ejecuta reglas de negocio y devuelve respuestas. No significa necesariamente que exista un microservicio.

Ejemplo: GET /api/v1/products permite que una pantalla web, una app Android o una integración externa pidan productos sin acceder directamente a MySQL.

Monolito

Es una sola aplicación que contiene todos los módulos. Puede ser desordenado si todo se mezcla, o muy sólido si se organiza correctamente.

Monolito modular

Es una sola aplicación, pero separada internamente por módulos. Este es el enfoque recomendado para QUIPU.

Un solo proyecto Node.js │ ├── modules/auth ├── modules/products ├── modules/inventory ├── modules/sales ├── modules/reports └── shared

Microservicio

Es una aplicación independiente, con su propio proceso, despliegue, configuración y normalmente su propia responsabilidad. Los microservicios se comunican entre sí usando APIs, colas o eventos.

Concepto Qué es Cuándo usarlo
API Contrato de comunicación Desde el inicio
Módulo Parte organizada dentro del proyecto Desde el inicio
Monolito modular Un proyecto, muchos módulos claros Etapa inicial y media
Microservicio Proyecto separado que despliega aparte Cuando exista carga, equipo o necesidad real
Error común: crear microservicios demasiado pronto. Para un solo desarrollador y servidor compartido, aumenta la dificultad de despliegue, monitoreo, seguridad, logs, comunicación y pruebas.
Volver arriba

5. Arquitectura recomendada

La arquitectura recomendada es un monolito modular con APIs internas versionadas, preparado para evolucionar hacia servicios separados si en el futuro existe una razón real.

Cliente Web / PWA / Android / Integraciones │ ▼ API REST v1 │ ▼ Middlewares ├── Seguridad ├── Autenticación ├── Resolución de tenant ├── Permisos ├── Plan y módulos habilitados └── Rate limit │ ▼ Módulos de negocio ├── Auth ├── Users ├── Products ├── Inventory ├── Sales ├── Purchases └── Reports │ ▼ Servicios y repositorios │ ▼ MySQL + Redis

Stack obligatorio

Capa Tecnología Uso
Backend Node.js + Express Servidor web, APIs, reglas de negocio, acceso a datos.
Frontend inicial EJS SSR Vistas renderizadas desde servidor, ideales para SaaS administrativo.
Base de datos MySQL compartido Datos transaccionales multi-tenant.
Cache y control Redis Sesiones, revocación JWT, rate limit, cache, locks y colas.
Autenticación JWT corto + Redis Tokens de corta duración y revocación controlada.

Qué significa “preparado para escalar”

No significa usar microservicios desde el primer día. Significa que cada módulo debe tener límites claros, interfaces limpias y poca dependencia directa de otros módulos.

Regla práctica: un módulo no debe consultar directamente las tablas internas de otro módulo si puede hacerlo mediante un servicio compartido o una función pública del módulo correspondiente.
Volver arriba

6. Capas de la plataforma

QUIPU debe organizarse por capas para evitar mezclar infraestructura, reglas de negocio y productos comerciales.

Capa 1: Núcleo SaaS

Es la base común de todos los productos. No pertenece solo a logística ni solo a balance.plus. Pertenece a todo el ecosistema.

  • Autenticación y sesiones.
  • Tenants y configuración.
  • Usuarios, roles y permisos.
  • Suscripciones, planes y módulos habilitados.
  • Auditoría.
  • Notificaciones.
  • Catálogos globales: países, monedas, idiomas, impuestos, unidades.
  • Gestión de archivos.

Capa 2: Motores reutilizables

Son bloques de lógica que pueden ser usados por varios productos. Por ejemplo, un motor de documentos puede servir para logística, SATD, ventas, compras y balance.plus.

Capa 3: Productos SaaS

Son las aplicaciones visibles para el cliente final. Cada producto activa ciertos módulos y vistas, pero no debe duplicar la infraestructura.

Producto SaaS = Núcleo común + Motores necesarios + Vistas específicas + Configuración comercial
Como tutor: no confundas producto con motor. logistica.plus es un producto. Inventory Engine es un motor. El motor puede vivir dentro de logística, pero también podría ser usado por otro SaaS futuro.
Volver arriba

7. Dominios de negocio

Un dominio representa un área de negocio con sus propias reglas, datos y procesos. Pensar por dominios evita que el sistema se convierta en una mezcla desordenada de tablas y pantallas.

Dominio Plataforma

Tenant, usuarios, roles, permisos, planes, suscripciones, auditoría, configuración e i18n.

Dominio Comercial

Clientes, proveedores, precios, cotizaciones, pedidos, descuentos, condiciones comerciales.

Dominio Logístico

Productos, inventario, almacenes, ubicaciones, picking, despachos, trazabilidad.

Dominio Financiero

Caja, movimientos, pagos, cobros, monedas, cuentas, conciliación y reportes financieros simples.

Dominio Documental

Archivos, evidencias, fichas técnicas, certificados, PDFs, imágenes y control de acceso.

Dominio Inteligencia

Reportes, métricas, predicción de demanda, alertas inteligentes y asistentes por texto o voz.

Mapa conceptual

Dominio Plataforma │ ├── habilita acceso ├── controla permisos └── define módulos disponibles │ ▼ Dominio Comercial ─── solicita stock ───► Dominio Logístico │ │ │ └── genera movimientos ▼ Dominio Financiero ◄── genera importes ─── Ventas / Compras │ ▼ Dominio Inteligencia analiza datos históricos

Regla para identificar un dominio

Si un conjunto de funcionalidades tiene vocabulario propio, reglas propias y datos propios, probablemente pertenece a un dominio.

Ejemplo: “picking”, “rack”, “lote”, “serie”, “vencimiento” y “kardex” pertenecen al dominio logístico. “cotización”, “cliente”, “descuento” y “lista de precios” pertenecen al dominio comercial.
Volver arriba

8. Motores reutilizables

Un motor es una pieza de lógica reutilizable. No es solo una tabla ni una pantalla. Es un conjunto de reglas de negocio que puede servir a más de un producto.

Motor Responsabilidad Productos que podrían usarlo
Identity Engine Login, JWT, usuarios, roles, permisos, tenant activo. Todos.
Subscription Engine Planes, límites, módulos habilitados, bloqueo por vencimiento. Todos los SaaS comerciales.
Inventory Engine Stock, kardex, lotes, series, vencimientos, variantes, movimientos. logistica.plus, ventas B2B, producción ligera.
Pricing Engine Listas de precios, impuestos, monedas, descuentos y reglas comerciales. logística, ventas, B2B, cotizaciones.
Document Engine Subida, validación, clasificación, acceso y trazabilidad de archivos. SATD, logística, compras, ventas, balance.plus.
Workflow Engine Estados, aprobaciones, tareas, transiciones y reglas por módulo. Pedidos, compras, despachos, solicitudes, reservas.
Notification Engine Alertas internas, email, push PWA, recordatorios y eventos. Todos.
Reporting Engine Reportes, métricas, KPIs, consultas agregadas y exportaciones. Todos.
Intelligence Engine Predicciones, recomendaciones, consultas por lenguaje natural. Logística, ventas, compras, balance.plus.

Cómo reconocer si algo debe ser un motor

  • Será usado por más de un producto.
  • Contiene reglas de negocio propias.
  • Necesita configuración por tenant.
  • Puede tener API propia.
  • Puede evolucionar sin depender totalmente de una pantalla específica.
No conviertas todo en motor desde el primer día. Primero detecta patrones reales. El exceso de abstracción también vuelve lento el desarrollo.
Volver arriba

9. Estrategia API

Las APIs deben existir desde el inicio porque permiten que web, PWA, Android e integraciones compartan las mismas reglas de negocio.

Convención base

/api/v1/{resource}

/api/v1/auth
/api/v1/products
/api/v1/inventory
/api/v1/warehouses
/api/v1/sales
/api/v1/reports

APIs del núcleo SaaS

API Ruta Responsabilidad
Auth API /api/v1/auth Login, refresh, logout, usuario actual, revocación JWT.
Tenants API /api/v1/tenants Configuración del tenant actual, idioma, moneda, país, zona horaria.
Users API /api/v1/users Usuarios por tenant.
Roles API /api/v1/roles Roles, permisos y asignaciones.
Subscriptions API /api/v1/subscriptions Plan activo, módulos habilitados, límites y estado comercial.
Audit API /api/v1/audit Historial de acciones, IP, usuario, entidad y cambios.

APIs logísticas y comerciales

API Ruta Responsabilidad
Products API /api/v1/products Productos simples, lotes, vencimiento, seriales, variantes, packs, recetas.
Inventory API /api/v1/inventory Stock, kardex, movimientos, ajustes, transferencias.
Warehouses API /api/v1/warehouses Almacenes, zonas, racks, ubicaciones y capacidad.
Picking API /api/v1/picking Listas de picking, escaneo, preparación y validación.
Shipments API /api/v1/shipments Despachos, transportistas, evidencias y entregas.
Contacts API /api/v1/contacts Clientes, proveedores, direcciones, contactos y condiciones.
Sales API /api/v1/sales Cotizaciones, pedidos, aprobación y conversión.
Purchases API /api/v1/purchases Requerimientos, órdenes de compra, recepción e historial de precios.

Reglas de diseño API

  • Versionar desde el inicio: /api/v1.
  • Usar JSON como formato de intercambio.
  • No recibir tenant_id desde frontend.
  • Validar inputs antes de llegar al service.
  • Aplicar rate limit por IP, usuario y tenant según la ruta.
  • Registrar auditoría en operaciones críticas.
  • Usar respuestas de error consistentes.

Formato sugerido de respuesta

{
  "success": true,
  "data": {},
  "meta": {
    "requestId": "req_123",
    "version": "v1"
  }
}

Formato sugerido de error

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Los datos enviados no son válidos.",
    "details": []
  },
  "meta": {
    "requestId": "req_123",
    "version": "v1"
  }
}
Volver arriba

10. Multi-tenancy

El multi-tenancy es el fundamento más crítico del SaaS. En QUIPU se recomienda base de datos compartida, con aislamiento estricto mediante tenant_id.

Regla absoluta

El tenant_id nunca debe venir del frontend. El tenant se obtiene únicamente del usuario autenticado, el JWT validado y la sesión/cache segura en Redis.

Flujo correcto

Login │ ▼ Validar credenciales │ ▼ Resolver usuario + tenant + rol + permisos │ ▼ Validar suscripción activa │ ▼ Generar JWT corto │ ▼ Guardar estado/control en Redis │ ▼ Cada request resuelve tenant desde authContext

Middleware recomendado

request
  → securityMiddleware
  → authMiddleware
  → tenantResolverMiddleware
  → subscriptionMiddleware
  → permissionsMiddleware
  → moduleAccessMiddleware
  → controller

Reglas de base de datos

  • Todas las tablas transaccionales deben tener tenant_id.
  • Todas las consultas deben filtrar por tenant_id.
  • Los índices deben incluir tenant_id en tablas de alto uso.
  • Las relaciones deben evitar mezclar registros de tenants distintos.
  • La auditoría debe registrar siempre tenant_id.

Ejemplo conceptual de consulta correcta

SELECT id, sku, name
FROM products
WHERE tenant_id = ?
  AND id = ?
  AND deleted_at IS NULL;

Consulta peligrosa

SELECT id, sku, name
FROM products
WHERE id = ?;
Esa segunda consulta es peligrosa porque podría devolver datos de otro tenant si el ID existe. En SaaS multi-tenant, olvidar tenant_id en una query es una falla crítica.
Volver arriba

11. Seguridad

La seguridad no debe agregarse al final. Debe estar presente en rutas, middlewares, queries, vistas, formularios, APIs, archivos, sesiones y logs.

Controles base

Autenticación

JWT de corta duración, refresh controlado, revocación en Redis y validación de usuario activo.

Autorización

Permisos por tenant, rol, plan y módulo habilitado. No basta con estar logueado.

Protección contra SQL Injection

Siempre usar consultas parametrizadas mediante mysql2/promise. Nunca concatenar inputs.

Protección de vistas

Escapar datos al renderizar EJS, evitar inline JS innecesario y aplicar CSP.

Rate limit

Aplicar límites a login, recuperación de contraseña, APIs públicas y endpoints costosos.

Auditoría

Registrar quién hizo qué, cuándo, desde qué IP, sobre qué entidad y con qué resultado.

Headers y middlewares sugeridos

  • helmet para headers de seguridad.
  • express-rate-limit o Redis-based rate limit.
  • zod, joi o validadores propios para inputs.
  • bcrypt o argon2 para passwords.
  • Cookies seguras si se usan tokens en cookies: httpOnly, secure, sameSite.

Auditoría mínima

Campo Uso
tenant_idEmpresa afectada.
user_idUsuario que ejecutó la acción.
actionCREATE, UPDATE, DELETE, LOGIN, EXPORT, APPROVE.
entity_typeproducts, orders, inventory_movements, users.
entity_idID del registro afectado.
before_dataEstado anterior cuando aplique.
after_dataEstado nuevo cuando aplique.
ip_addressIP origen.
user_agentNavegador o cliente.
created_atFecha y hora.
Regla práctica: si una acción cambia dinero, inventario, permisos, usuarios, documentos críticos o estados de negocio, debe generar auditoría.
Volver arriba

12. Datos y MySQL

MySQL será el centro transaccional de QUIPU. El diseño debe priorizar consistencia, aislamiento por tenant, trazabilidad y performance.

Reglas de modelado

  • Usar tenant_id en toda tabla de datos empresariales.
  • Separar catálogos globales de catálogos por tenant.
  • Usar claves primarias internas y códigos visibles separados.
  • Usar timestamps estándar: created_at, updated_at, deleted_at.
  • Usar soft delete cuando el histórico sea importante.
  • No borrar movimientos de inventario: se corrigen con movimientos inversos o ajustes auditados.
  • Crear índices pensando en consultas reales, no por costumbre.

Campos estándar sugeridos

id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
tenant_id BIGINT UNSIGNED NOT NULL,
created_by BIGINT UNSIGNED NULL,
updated_by BIGINT UNSIGNED NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
deleted_at DATETIME NULL

Índices multi-tenant

En tablas grandes, los índices deben considerar que casi todas las consultas filtran por tenant.

INDEX idx_products_tenant_sku (tenant_id, sku),
INDEX idx_movements_tenant_date (tenant_id, movement_date),
INDEX idx_stock_tenant_product_location (tenant_id, product_id, warehouse_id, location_id)

Inventario: regla conceptual

El stock no debe ser solo un número editado manualmente. Debe ser el resultado de movimientos: ingreso, salida, ajuste, transferencia, devolución, inventario inicial.

Inventario inicial + compras recibidas + devoluciones de cliente - ventas despachadas - transferencias salientes + transferencias entrantes +/- ajustes auditados = stock actual
El stock actual puede guardarse en una tabla optimizada para consulta rápida, pero debe poder justificarse desde el kardex o movimientos históricos.
Volver arriba

13. Redis

Redis debe utilizarse para acelerar y controlar el sistema, no como reemplazo de MySQL.

Uso Ejemplo Beneficio
Sesiones o estado de sesión session:user:123 Control centralizado de acceso.
Revocación JWT jwt:blacklist:jti Permite invalidar tokens antes de expirar.
Rate limit rate:login:ip Reduce fuerza bruta y abuso.
Cache tenant:42:settings Evita consultas repetidas a MySQL.
Locks lock:inventory:product:99 Evita doble procesamiento en operaciones críticas.
Colas queue:emails Procesa tareas lentas fuera del request principal.

Regla de uso

MySQL es la fuente de verdad. Redis es velocidad, control temporal y coordinación.

Ejemplos de cache recomendada

  • Configuración del tenant.
  • Permisos del usuario.
  • Módulos habilitados por plan.
  • Catálogos globales de baja variación.
  • Preferencias de idioma y moneda.

Qué no guardar solo en Redis

  • Movimientos de inventario definitivos.
  • Órdenes de compra o venta finales.
  • Auditoría legal.
  • Datos que no puedan perderse.
Volver arriba

14. Web SSR, PWA y Android

La aplicación web debe ser el centro administrativo. PWA y Android deben complementar procesos operativos, no duplicar la plataforma.

Web con EJS SSR

Ideal para administración, configuración, dashboards, tablas, formularios, reportes y operaciones de oficina.

PWA

Permite mejorar la experiencia móvil desde la web: acceso tipo app, service worker, cache controlada, push notifications y mejor rendimiento percibido.

Android

Debe usarse donde realmente aporta valor operativo:

  • Picking en almacén.
  • Inventario físico.
  • Recepción de mercadería.
  • Despachos y evidencias.
  • Ventas de campo.
  • Lectura de QR, código de barras o NFC.

Principio clave

La app Android no debe contener reglas críticas de negocio duplicadas. Debe consumir la API.
Web SSR │ PWA │ Android │ Integraciones externas │ ▼ API REST v1 │ ▼ Reglas de negocio en Node.js │ ▼ MySQL + Redis

Windows de escritorio

Solo debe considerarse cuando exista integración fuerte con hardware local o una necesidad offline muy específica: cámaras industriales, básculas, microscopios, PLCs, impresoras especiales o instrumentos de medición.

Volver arriba

15. Estructura de proyecto

La estructura debe ser suficientemente ordenada para escalar, pero no tan compleja que dificulte el avance individual.

Estructura recomendada

quipu-saas/
├── docs/
│   ├── 00-project-vision.md
│   ├── 01-architecture.md
│   ├── 02-multi-tenancy.md
│   └── 03-api-guidelines.md
│
├── public/
│   ├── assets/
│   ├── css/
│   ├── js/
│   ├── manifest.json
│   └── service-worker.js
│
├── src/
│   ├── app.js
│   ├── server.js
│   │
│   ├── config/
│   │   ├── app.config.js
│   │   ├── database.config.js
│   │   ├── redis.config.js
│   │   └── security.config.js
│   │
│   ├── shared/
│   │   ├── database/
│   │   ├── redis/
│   │   ├── middlewares/
│   │   ├── validators/
│   │   ├── errors/
│   │   ├── utils/
│   │   └── services/
│   │
│   ├── modules/
│   │   ├── auth/
│   │   ├── tenants/
│   │   ├── users/
│   │   ├── roles/
│   │   ├── subscriptions/
│   │   ├── products/
│   │   ├── inventory/
│   │   ├── warehouses/
│   │   ├── sales/
│   │   ├── purchases/
│   │   ├── documents/
│   │   ├── reports/
│   │   └── notifications/
│   │
│   ├── routes/
│   │   ├── web.routes.js
│   │   └── api.v1.routes.js
│   │
│   ├── views/
│   │   ├── auth/
│   │   ├── dashboard/
│   │   ├── products/
│   │   ├── inventory/
│   │   └── errors/
│   │
│   ├── layouts/
│   │   ├── main.ejs
│   │   ├── auth.ejs
│   │   └── error.ejs
│   │
│   └── partials/
│       ├── head.ejs
│       ├── sidenav.ejs
│       ├── topbar.ejs
│       └── scripts.ejs
│
├── tests/
├── .env.example
├── package.json
└── README.md

Estructura interna de un módulo

modules/products/
├── products.routes.js
├── products.controller.js
├── products.service.js
├── products.repository.js
├── products.validator.js
├── products.policy.js
└── products.constants.js
Archivo Responsabilidad
routes Define endpoints y middlewares específicos.
controller Recibe request, llama services y devuelve response.
service Contiene reglas de negocio.
repository Accede a MySQL con queries parametrizadas.
validator Valida entrada de datos.
policy Reglas de autorización específicas del módulo.
Como tutor: el controller no debe decidir reglas complejas de negocio. El repository no debe decidir permisos. Cada capa tiene una responsabilidad.
Volver arriba

16. Flujos críticos

Los flujos críticos deben diseñarse antes de crear pantallas, porque definen seguridad, datos y responsabilidades.

Flujo de login

Usuario envía credenciales │ ▼ Rate limit por IP/cuenta │ ▼ Validar usuario activo │ ▼ Validar password │ ▼ Resolver tenant │ ▼ Validar suscripción activa │ ▼ Cargar rol y permisos │ ▼ Generar JWT corto │ ▼ Guardar control de sesión en Redis │ ▼ Registrar auditoría de login │ ▼ Responder al cliente

Flujo de request autenticado

Request con JWT │ ▼ Validar firma y expiración │ ▼ Verificar revocación en Redis │ ▼ Cargar authContext │ ├── user_id ├── tenant_id ├── role ├── permissions └── enabled_modules │ ▼ Validar acceso al módulo │ ▼ Ejecutar controller │ ▼ Service aplica reglas │ ▼ Repository consulta con tenant_id │ ▼ Responder

Flujo de movimiento de inventario

Solicitud de movimiento │ ▼ Validar permiso │ ▼ Validar producto y perfil de control │ ├── simple ├── lote ├── vencimiento ├── serial └── variantes │ ▼ Validar almacén / ubicación │ ▼ Aplicar lock Redis si es operación crítica │ ▼ Registrar movimiento en transacción MySQL │ ▼ Actualizar stock actual │ ▼ Registrar auditoría │ ▼ Liberar lock │ ▼ Responder

Flujo de pedido a despacho

Cotización ▼ Pedido ▼ Aprobación comercial ▼ Reserva de stock ▼ Lista de picking ▼ Validación por escaneo ▼ Preparación ▼ Despacho ▼ Entrega con evidencia ▼ Cierre
Volver arriba

17. Reportes e inteligencia

La inteligencia del sistema aparece cuando los datos están bien estructurados y auditados. No se empieza por IA; se empieza por datos confiables.

Reportes base por dominio

Dominio Reportes recomendados
Logístico Stock crítico, rotación, kardex, valorización, ocupación de almacén, vencimientos.
Comercial Ventas por cliente, pedidos pendientes, conversión de cotizaciones, márgenes.
Compras Histórico de precios, proveedores, tiempos de entrega, variación de costos.
Financiero Ingresos, egresos, saldos, cuentas, flujo de caja simple.
Operativo Productividad de picking, tiempos de despacho, errores, cumplimiento.

Inteligencia progresiva

  1. Reportes descriptivos: qué ocurrió.
  2. Indicadores: cómo estamos.
  3. Alertas: qué requiere atención.
  4. Predicción: qué podría ocurrir.
  5. Recomendación: qué conviene hacer.
  6. Asistente: consulta por texto o voz.
Ejemplo: antes de decir “compra 500 unidades”, el sistema debe saber ventas históricas, stock actual, tiempos de reposición, pedidos pendientes, estacionalidad y proveedor recomendado.

Uso futuro de Python

Node.js debe seguir siendo el núcleo transaccional. Python puede incorporarse después para tareas analíticas: predicción de demanda, modelos estadísticos, procesamiento de documentos o IA. La comunicación puede hacerse mediante colas, jobs o APIs internas.

Node.js gobierna el negocio. Python puede asistir en inteligencia cuando exista volumen de datos suficiente.
Volver arriba

18. Escalabilidad

Escalar no es solo soportar más usuarios. También significa mantener el código comprensible, la base de datos eficiente y los procesos controlados.

Escalabilidad técnica

  • Pool de conexiones MySQL.
  • Índices correctos.
  • Cache Redis para datos repetitivos.
  • Jobs para procesos lentos.
  • Paginación obligatoria en listados.
  • Evitar consultas N+1.
  • Rate limit en APIs.
  • Logs estructurados.

Escalabilidad organizacional

Aunque al inicio haya un solo desarrollador, el proyecto debe poder ser entendido por otro programador en el futuro. Por eso importan los comentarios iniciales por archivo, los nombres claros, los documentos .md y la consistencia de carpetas.

Cuándo considerar microservicios

Señal Interpretación
Un módulo consume la mayoría de recursos. Podría separarse para escalarlo aparte.
Un módulo necesita despliegues muy frecuentes. Podría aislarse para no afectar el resto.
Hay equipos diferentes por dominio. Los microservicios pueden organizar responsabilidades.
Un proceso pesado afecta la experiencia del usuario. Primero usar colas; si no basta, evaluar servicio separado.
En servidor compartido, prioriza eficiencia, cache, colas y buen diseño de queries antes de pensar en múltiples servicios.
Volver arriba

19. Roadmap recomendado

El roadmap debe reducir riesgo. Primero se construye el núcleo, luego los motores, después los productos.

Etapa 0: Documentación base

  • Visión del proyecto.
  • Arquitectura base.
  • Reglas multi-tenant.
  • Convenciones API.
  • Convenciones de carpetas.

Etapa 1: Núcleo SaaS

  • Login seguro.
  • JWT corto.
  • Redis para sesión/revocación.
  • Tenants.
  • Usuarios.
  • Roles y permisos.
  • Planes y módulos.
  • Auditoría.

Etapa 2: Base operativa

  • Catálogos globales.
  • Productos.
  • Almacenes.
  • Ubicaciones.
  • Inventario inicial.
  • Movimientos y kardex.

Etapa 3: Logística avanzada

  • Lotes.
  • Vencimientos.
  • Seriales.
  • Variantes.
  • Picking.
  • Despacho.
  • Evidencias.

Etapa 4: Comercial

  • Clientes y proveedores.
  • Listas de precios.
  • Cotizaciones.
  • Pedidos.
  • Compras.
  • Recepciones.

Etapa 5: Reportes e inteligencia

  • Dashboards.
  • KPIs.
  • Alertas.
  • Predicción de stock.
  • Sugerencias de compra.
  • Asistente por texto/voz.
El producto inicial no necesita tener todo. Necesita estar diseñado para no bloquear el crecimiento.
Volver arriba

20. Checklists

Usa estas listas antes de aprobar cualquier módulo, API o tabla.

Checklist de módulo nuevo

  • ¿Pertenece al núcleo, a un motor o a un producto específico?
  • ¿Tiene rutas, controller, service, repository y validator separados?
  • ¿Todas sus queries filtran por tenant_id?
  • ¿Valida permisos?
  • ¿Valida plan y módulo habilitado?
  • ¿Registra auditoría si cambia datos críticos?
  • ¿Tiene paginación si lista registros?
  • ¿Evita duplicar lógica existente?

Checklist de tabla nueva

  • ¿Necesita tenant_id?
  • ¿Tiene timestamps estándar?
  • ¿Necesita soft delete?
  • ¿Tiene índices acordes a las consultas?
  • ¿Tiene campos de auditoría si corresponde?
  • ¿Evita guardar datos calculados sin justificación?
  • ¿Sus relaciones respetan el tenant?

Checklist de endpoint API

  • ¿Está bajo /api/v1?
  • ¿Tiene rate limit si es sensible?
  • ¿Valida autenticación?
  • ¿Valida permisos?
  • ¿Valida inputs?
  • ¿Devuelve errores consistentes?
  • ¿No expone información interna?
  • ¿Registra auditoría si corresponde?

Checklist de seguridad

  • No concatenar SQL.
  • No confiar en datos del frontend.
  • No aceptar tenant_id enviado por cliente.
  • No guardar contraseñas sin hash fuerte.
  • No mostrar errores internos al usuario final.
  • No servir archivos privados sin autorización.
  • No permitir endpoints sin rate limit cuando puedan ser abusados.
Volver arriba

21. Glosario

Definiciones breves para revisar conceptos con rapidez.

Término Definición
Tenant Empresa cliente que usa el SaaS de forma aislada.
Multi-tenant Modelo donde varias empresas usan la misma aplicación y base compartida, pero con datos aislados.
API Interfaz para que clientes o sistemas interactúen con el backend.
Monolito modular Una sola aplicación organizada en módulos claros.
Microservicio Servicio independiente desplegado y escalado por separado.
Dominio Área de negocio con reglas y vocabulario propios.
Motor Componente reutilizable con reglas de negocio propias.
Repository Capa encargada de consultar o persistir datos.
Service Capa donde viven las reglas de negocio.
Middleware Función que procesa el request antes de llegar al controller.
JWT Token firmado para representar una sesión o identidad por tiempo limitado.
Redis Almacén en memoria usado para cache, sesiones, locks, rate limits y colas.
Kardex Histórico de movimientos que explica el stock de un producto.
PWA Aplicación web progresiva con experiencia similar a app móvil.

Conclusión fundacional

QUIPU debe construirse como una plataforma. Las APIs son contratos de comunicación. Los módulos son organización interna. Los motores son lógica reutilizable. Los productos son soluciones comerciales. Los microservicios son una etapa futura, no el punto de partida.
Volver arriba