📦 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.mden la raíz del monorepo.
Qué se construyó en F60
| Componente | Descripción |
|---|---|
TenantSettings.enabledModules | Feature flag real por tenant: industry (String libre) + enabledModules (String[]). Se lee/escribe vía GET/PATCH /api/v1/settings/tenant. |
@RequireModule + ModuleAccessGuard | Decorator + 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.HEALTHCARE | Extensión del enum RBAC por vertical. Costo aceptado: 1 migración por valor nuevo del enum. |
| Filtro de tools IA por módulo | Tool.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-archivo | prisma/schema/ con 17 archivos por dominio (Prisma 6, prismaSchemaFolder). Cada vertical futuro agrega su propio .prisma sin tocar el core. |
| Custom Fields generalizados | CustomFieldAppliesTo.ENTITY + entityType libre: personalización ligera de cualquier entidad core sin modelo Prisma nuevo. |
| Navegación condicional | En gestia-app, el sidebar oculta ítems con module declarado si el tenant no lo tiene habilitado (hook useEnabledModules). |
| Catálogo de industrias | packages/shared-types/src/industries.ts: SUGGESTED_INDUSTRIES (12 industrias) + VERTICAL_MODULES (6 verticales). |
Módulos verticales disponibles
| Código | Paquete futuro | Dominio |
|---|---|---|
HEALTHCARE | @gestia/healthcare | Salud / Clínicas |
ECOMMERCE | @gestia/ecommerce | E-commerce |
OIL_GAS | @gestia/oil-gas | Petróleo y Gas |
LOGISTICS | @gestia/logistics | Logística / Transporte |
CONSTRUCTION | @gestia/construction | Construcción |
EDUCATION | @gestia/education | Educación |
Ninguno de estos verticales está implementado todavía: son paquetes propuestos en
docs/BACKLOG.md. El controladorGET /api/v1/modules/healthcare/pingsolo valida el patrón end-to-end.
Cómo extender con un vertical nuevo
Resumen del contrato (detalle completo en docs/VERTICAL-MODULES.md):
- Schema: archivo
.prismapropio enprisma/schema/(todos los modelos contenantId). - Backend: módulo Nest registrado en
AppModule.importsde api-core +@RequireModule('HEALTHCARE')en sus controladores. - RBAC: valor nuevo en
PermissionModule(migración) + entrada enVERTICAL_MODULESdeindustries.ts. - IA: tools en archivo propio de
services/api-ai/src/tools/conmoduledeclarado. - Frontend: páginas agregadas al sidebar con
moduleen elNavItem+ROUTE_ROLE_MAPcon'SUPER_ADMIN'. - Activación: el tenant agrega el código del módulo a
enabledModulesvíaPATCH /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.