Saltar al contenido principal

📦 Módulos Verticales Internos

Última actualización: 2026-08-17

Gestia soporta módulos verticales — conjuntos de funcionalidad específicos de una industria (salud, retail, construcción, logística, educación, petróleo y gas, e-commerce) — construidos como paquetes del monorepo que se activan por tenant mediante un flag real en la base de datos.

La fase F60 construyó el andamiaje para que agregar un vertical nuevo sea "sumar un módulo", no "rediseñar el core". Antes de F60 este andamiaje no existía: TenantSettings no tenía campo de módulos habilitados, no había guard por módulo, las tools de IA solo se filtraban por rol, PermissionModule era un enum RBAC cerrado y el schema Prisma era un único archivo monolítico.

Contrato técnico completo (checklist de extensión): docs/VERTICAL-MODULES.md en la raíz del monorepo.


Qué se construyó en F60

ComponenteDescripción
TenantSettings.enabledModulesFeature flag real por tenant: industry (String libre) + enabledModules (String[]). Se lee/escribe vía GET/PATCH /api/v1/settings/tenant.
@RequireModule + ModuleAccessGuardDecorator + guard global en api-core. Devuelve 403 si el tenant no tiene el módulo habilitado. SUPER_ADMIN (cross-tenant) pasa siempre. Endpoint piloto: GET /api/v1/modules/healthcare/ping.
PermissionModule.HEALTHCAREExtensión del enum RBAC por vertical. Costo aceptado: 1 migración por valor nuevo del enum.
Filtro de tools IA por móduloTool.module?: string en tool-registry.ts de api-ai. Tools con módulo declarado solo se exponen a tenants con el módulo habilitado; tools sin módulo son cross-cutting.
Schema Prisma multi-archivoprisma/schema/ con 17 archivos por dominio (Prisma 6, prismaSchemaFolder). Cada vertical futuro agrega su propio .prisma sin tocar el core.
Custom Fields generalizadosCustomFieldAppliesTo.ENTITY + entityType libre: personalización ligera de cualquier entidad core sin modelo Prisma nuevo.
Navegación condicionalEn gestia-app, el sidebar oculta ítems con module declarado si el tenant no lo tiene habilitado (hook useEnabledModules).
Catálogo de industriaspackages/shared-types/src/industries.ts: SUGGESTED_INDUSTRIES (12 industrias) + VERTICAL_MODULES (6 verticales).

Módulos verticales disponibles

CódigoPaquete futuroDominio
HEALTHCARE@gestia/healthcareSalud / Clínicas
ECOMMERCE@gestia/ecommerceE-commerce
OIL_GAS@gestia/oil-gasPetróleo y Gas
LOGISTICS@gestia/logisticsLogística / Transporte
CONSTRUCTION@gestia/constructionConstrucción
EDUCATION@gestia/educationEducación

Ninguno de estos verticales está implementado todavía: son paquetes propuestos en docs/BACKLOG.md. El controlador GET /api/v1/modules/healthcare/ping solo valida el patrón end-to-end.

Cómo extender con un vertical nuevo

Resumen del contrato (detalle completo en docs/VERTICAL-MODULES.md):

  1. Schema: archivo .prisma propio en prisma/schema/ (todos los modelos con tenantId).
  2. Backend: módulo Nest registrado en AppModule.imports de api-core + @RequireModule('HEALTHCARE') en sus controladores.
  3. RBAC: valor nuevo en PermissionModule (migración) + entrada en VERTICAL_MODULES de industries.ts.
  4. IA: tools en archivo propio de services/api-ai/src/tools/ con module declarado.
  5. Frontend: páginas agregadas al sidebar con module en el NavItem + ROUTE_ROLE_MAP con 'SUPER_ADMIN'.
  6. Activación: el tenant agrega el código del módulo a enabledModules vía PATCH /api/v1/settings/tenant.

Regla transversal: si el vertical expone endpoints en api-core, las tools del api-ai deben actualizarse en el mismo cambio.