# Directiva: Extensión de Verticales ## Propósito Define las reglas para que las verticales (construcción, vidrio-templado, etc.) extiendan correctamente el ERP Core sin modificarlo. ## Principio Fundamental ``` Las verticales EXTIENDEN el core, NUNCA lo modifican. ``` --- ## Arquitectura de Extensión ``` erp-core (60-70% código base) │ ├── core_auth.* → Heredado por todas las verticales ├── core_users.* → Heredado por todas las verticales ├── core_tenants.* → Heredado por todas las verticales └── core_catalogs.* → Heredado por todas las verticales │ ▼ verticales/{nombre}/ (+30-40% código específico) │ ├── {nombre}_*.schemas → Schemas propios de la vertical ├── /backend/src/modules/ → Módulos específicos └── /frontend/src/ → Componentes específicos ``` --- ## Reglas de Extensión ### 1. Schemas de Base de Datos ```sql -- CORRECTO: Crear schema propio CREATE SCHEMA construccion_management; -- CORRECTO: Referenciar tablas del core CREATE TABLE construccion_management.projects ( id UUID PRIMARY KEY, tenant_id UUID NOT NULL REFERENCES core_tenants.tenants(id), created_by UUID REFERENCES core_auth.users(id), -- ... columnas específicas de construcción ); -- INCORRECTO: Modificar tablas del core ALTER TABLE core_auth.users ADD COLUMN campo_construccion TEXT; -- ❌ PROHIBIDO ``` ### 2. Backend - Servicios ```typescript // CORRECTO: Importar y extender servicios del core import { AuthService } from '@erp-core/auth'; import { BaseService } from '@erp-core/shared'; @Injectable() export class ProjectService extends BaseService { constructor( private authService: AuthService, // Usar del core ) { super(); } } // INCORRECTO: Duplicar lógica del core export class MyAuthService { } // ❌ PROHIBIDO - usar el del core ``` ### 3. Backend - Entidades ```typescript // CORRECTO: Extender entidad base import { BaseEntity } from '@erp-core/shared'; @Entity('construccion_management.projects') export class Project extends BaseEntity { // BaseEntity ya tiene: id, tenantId, createdAt, updatedAt @Column() nombre: string; // Referencia a usuario del core @ManyToOne(() => User) @JoinColumn({ name: 'project_manager_id' }) projectManager: User; } ``` ### 4. Frontend - Componentes ```typescript // CORRECTO: Usar componentes del core import { Button, Input, DataTable } from '@erp-core/ui'; import { useAuth, useTenant } from '@erp-core/hooks'; export const ProjectList = () => { const { user } = useAuth(); // Hook del core return ( // Componente del core ); }; // INCORRECTO: Reimplementar componentes base export const MyButton = () => { }; // ❌ PROHIBIDO - usar el del core ``` --- ## Estructura de Directorio para Verticales ``` verticales/{nombre}/ ├── backend/ │ └── src/ │ ├── modules/ # Módulos específicos │ │ ├── projects/ # Ejemplo: proyectos de construcción │ │ └── estimates/ # Ejemplo: estimaciones │ └── index.ts # Exporta módulos de la vertical │ ├── frontend/ │ └── src/ │ ├── components/ # Componentes específicos │ ├── pages/ # Páginas específicas │ └── index.ts # Exporta componentes de la vertical │ ├── database/ │ ├── ddl/ # Schemas específicos │ ├── migrations/ # Migraciones específicas │ └── seeds/ # Seeds específicos │ ├── docs/ # Documentación específica └── orchestration/ # Orquestación específica ``` --- ## Cómo Extender Funcionalidad ### Caso 1: Agregar campos a una entidad del core ```typescript // NO modificar core_auth.users // Crear tabla de extensión en la vertical CREATE TABLE construccion_management.user_extensions ( id UUID PRIMARY KEY, user_id UUID NOT NULL REFERENCES core_auth.users(id), cargo_obra VARCHAR(100), numero_imss VARCHAR(50), UNIQUE(user_id) ); // Crear vista que combina ambas CREATE VIEW construccion_management.users_complete AS SELECT u.*, ue.cargo_obra, ue.numero_imss FROM core_auth.users u LEFT JOIN construccion_management.user_extensions ue ON u.id = ue.user_id; ``` ### Caso 2: Agregar validación específica ```typescript // En la vertical, crear decorator que usa el del core import { ValidateTenant } from '@erp-core/validators'; // Agregar validación específica export const ValidateProject = () => { return applyDecorators( ValidateTenant(), // Del core ValidateProjectBudget(), // Específico de construcción ); }; ``` ### Caso 3: Agregar endpoint específico ```typescript // En la vertical @Controller('construction/projects') export class ProjectController { @Get() @UseGuards(AuthGuard) // Guard del core async findAll() { // Lógica específica de construcción } } ``` --- ## Validaciones Obligatorias ### Antes de crear código en vertical: - [ ] ¿El core ya tiene esta funcionalidad? → Usar del core - [ ] ¿Se puede extender algo del core? → Extender, no duplicar - [ ] ¿Es realmente específico de la vertical? → Ok crear nuevo ### Antes de modificar el core: - [ ] ¿Beneficia a TODAS las verticales? → Ok modificar core - [ ] ¿Es específico de una vertical? → Crear en la vertical - [ ] ¿Rompe compatibilidad? → Crear versión nueva, deprecar antigua --- ## Verticales Registradas | Vertical | Código | Módulos | SP | Estado | SPECS Aplicables | |----------|--------|---------|----:|--------|------------------| | **Construcción** | CONS | 18 (MAI/MAE/MAA) | 450+ | EN_DESARROLLO | 27 | | **Mecánicas Diesel** | MMD | 5 (MMD) | 150+ | DDL_IMPLEMENTADO | 25 | | **Vidrio Templado** | VT | 8 (VT) | 212 | PLANIFICACION_COMPLETA | 25 | | **Retail/POS** | RT | 10 (RT) | 322 | PLANIFICACION_COMPLETA | 26 | | **Clínicas** | CL | 12 (CL) | 395 | PLANIFICACION_COMPLETA | 22 | **Total:** 53 módulos | 1529+ Story Points | 30 SPECS transversales disponibles --- ## SPECS Obligatorias por Vertical ### Todas las Verticales (Obligatorias) - `SPEC-SISTEMA-SECUENCIAS` - Secuencias automáticas - `SPEC-SEGURIDAD-API-KEYS-PERMISOS` - API Keys y ACL - `SPEC-MAIL-THREAD-TRACKING` - Comunicación ### Por Tipo de Vertical | SPEC | CONS | MMD | VT | RT | CL | |------|:----:|:---:|:--:|:--:|:--:| | SPEC-VALORACION-INVENTARIO | ✓ | ✓ | ✓ | ✓ | ○ | | SPEC-TRAZABILIDAD-LOTES-SERIES | ✓ | ✓ | ✓ | ✓ | ✓ | | SPEC-PRICING-RULES | ✗ | ✓ | ✓ | ✓ | ✗ | | SPEC-PROYECTOS-DEPENDENCIAS | ✓ | ✗ | ✓ | ✗ | ✗ | | SPEC-INTEGRACION-CALENDAR | ✗ | ✗ | ✗ | ✗ | ✓ | | SPEC-FACTURACION-CFDI | ✓ | ✓ | ○ | ✓ | ✓ | | SPEC-INVENTARIOS-CICLICOS | ✗ | ✓ | ✗ | ✓ | ○ | | SPEC-RRHH-EVALUACIONES | ✓ | ○ | ○ | ○ | ✓ | **Leyenda:** ✓ Obligatoria | ○ Opcional | ✗ No aplica --- ## Documentación de Herencia por Vertical Cada vertical debe tener: 1. **`orchestration/00-guidelines/HERENCIA-SPECS-CORE.md`** - Lista de SPECS aplicables con estado - Adaptaciones específicas por SPEC - Módulos afectados 2. **`database/HERENCIA-ERP-CORE.md`** - Tablas del core heredadas - Schemas específicos - Extensiones planeadas 3. **`orchestration/inventarios/MASTER_INVENTORY.yml`** - Métricas de herencia - specs_aplicables / specs_implementadas - Referencias a core --- ## Mapeo Completo Ver matriz detallada de aplicabilidad: ``` apps/erp-core/docs/04-modelado/MAPEO-SPECS-VERTICALES.md ``` --- ## Referencias - ERP-Core: `../../../erp-core/` - Directiva Multi-Tenant: `DIRECTIVA-MULTI-TENANT.md` - Mapeo SPECS-Verticales: `../../../erp-core/docs/04-modelado/MAPEO-SPECS-VERTICALES.md` - Suite Master Inventory: `../../../orchestration/inventarios/SUITE_MASTER_INVENTORY.yml` --- *Directiva específica de ERP-Core* *Última actualización: 2025-12-08*