# Directiva: Integración INFONAVIT ## Metadatos | Campo | Valor | |-------|-------| | **ID** | DIR-CONST-001 | | **Versión** | 1.0.0 | | **Ámbito** | Vertical Construcción | | **Módulo** | MAI-011 | | **Estado** | Activa | ## Propósito Define las reglas y patrones obligatorios para la integración con programas de INFONAVIT en el ERP de Construcción. ## Alcance Esta directiva aplica a: - Registro de proyectos bajo programas INFONAVIT - Gestión de requisitos normativos - Checklists de cumplimiento - Repositorio de evidencias - Auditorías y verificaciones - Reportes de cumplimiento ## Programas INFONAVIT Soportados ```yaml programas: - codigo: COFINAVIT descripcion: Crédito cofinanciado INFONAVIT + Banco - codigo: INFONAVIT_TOTAL descripcion: Crédito 100% INFONAVIT - codigo: SEGUNDO_CREDITO descripcion: Segundo crédito para mejora o ampliación - codigo: CONSTRUYO_INFONAVIT descripcion: Construcción en terreno propio - codigo: LINEA_III descripcion: Reparación, ampliación o mejora ``` ## Reglas Obligatorias ### 1. Registro de Proyectos ```typescript // Toda entidad relacionada con INFONAVIT debe incluir: interface InfonavitProjectEntity { // Identificadores obligatorios id: string; tenantId: string; projectId: string; // INFONAVIT específico infonavitProgramId: string; // Programa vinculado infonavitProjectNumber: string; // Número de proyecto INFONAVIT registrationDate: Date; // Fecha de registro status: InfonavitProjectStatus; // Estado de cumplimiento // Requisitos totalRequirements: number; // Total de requisitos completedRequirements: number; // Requisitos cumplidos compliancePercentage: number; // % de cumplimiento // Auditoría lastAuditDate: Date | null; nextAuditDate: Date | null; auditStatus: AuditStatus; } type InfonavitProjectStatus = | 'REGISTRO_PENDIENTE' | 'EN_PROCESO' | 'CUMPLIMIENTO_PARCIAL' | 'CUMPLIMIENTO_TOTAL' | 'OBSERVACIONES' | 'SUSPENDIDO'; ``` ### 2. Checklists de Cumplimiento ```yaml checklist_structure: categorias: - codigo: DOC_LEGAL nombre: Documentación Legal requisitos: - Escrituras del terreno - Permisos de construcción - Licencias municipales - Registro RUV - codigo: DOC_TECNICA nombre: Documentación Técnica requisitos: - Planos arquitectónicos autorizados - Memoria de cálculo estructural - Especificaciones técnicas - Programa de obra - codigo: CALIDAD nombre: Control de Calidad requisitos: - Pruebas de laboratorio - Bitácora de obra - Reportes fotográficos - Actas de verificación - codigo: NORMATIVA nombre: Cumplimiento Normativo requisitos: - NOM-020-ENER (eficiencia energética) - NOM-001-CONAGUA - Normas sísmicas locales - Certificación ecológica ``` ### 3. Gestión de Evidencias ```typescript // Toda evidencia debe tener metadatos completos interface EvidenceDocument { id: string; tenantId: string; projectId: string; requirementId: string; // Metadatos del documento documentType: EvidenceType; fileName: string; filePath: string; mimeType: string; fileSize: number; // Validación uploadedAt: Date; uploadedBy: string; validatedAt: Date | null; validatedBy: string | null; validationStatus: ValidationStatus; // Versionamiento version: number; previousVersionId: string | null; // Expiración (si aplica) expirationDate: Date | null; isExpired: boolean; } type EvidenceType = | 'DOCUMENTO_LEGAL' | 'PLANO_TECNICO' | 'REPORTE_LABORATORIO' | 'FOTOGRAFIA' | 'ACTA_VERIFICACION' | 'CERTIFICADO' | 'OTRO'; ``` ### 4. Workflow de Auditorías ```yaml workflow_auditoria: estados: - PROGRAMADA - EN_PROCESO - PENDIENTE_EVIDENCIAS - REVISION - APROBADA - CON_OBSERVACIONES - RECHAZADA transiciones: PROGRAMADA: - to: EN_PROCESO requiere: fecha_inicio EN_PROCESO: - to: PENDIENTE_EVIDENCIAS requiere: hallazgos_registrados - to: REVISION requiere: evidencias_completas PENDIENTE_EVIDENCIAS: - to: EN_PROCESO requiere: evidencias_cargadas REVISION: - to: APROBADA requiere: sin_observaciones_criticas - to: CON_OBSERVACIONES requiere: observaciones_menores - to: RECHAZADA requiere: incumplimiento_critico ``` ## Patrones de Implementación ### Schema de Base de Datos ```sql -- Schema específico para INFONAVIT CREATE SCHEMA IF NOT EXISTS infonavit_management; -- Tabla de programas CREATE TABLE infonavit_management.programs ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), tenant_id UUID NOT NULL, code VARCHAR(50) NOT NULL, name VARCHAR(200) NOT NULL, description TEXT, requirements_template JSONB, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), UNIQUE(tenant_id, code) ); -- Tabla de proyectos registrados CREATE TABLE infonavit_management.registered_projects ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), tenant_id UUID NOT NULL, project_id UUID NOT NULL REFERENCES project_management.projects(id), program_id UUID NOT NULL REFERENCES infonavit_management.programs(id), infonavit_number VARCHAR(50), registration_date DATE NOT NULL, status VARCHAR(50) NOT NULL DEFAULT 'REGISTRO_PENDIENTE', compliance_percentage DECIMAL(5,2) DEFAULT 0, last_audit_date DATE, next_audit_date DATE, notes TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), created_by UUID, updated_by UUID ); -- RLS obligatorio ALTER TABLE infonavit_management.registered_projects ENABLE ROW LEVEL SECURITY; CREATE POLICY "tenant_isolation" ON infonavit_management.registered_projects USING (tenant_id = current_setting('app.current_tenant_id')::uuid); ``` ### Servicio de Cumplimiento ```typescript @Injectable() export class InfonavitComplianceService { constructor( @InjectRepository(RegisteredProjectEntity) private projectRepo: Repository, @InjectRepository(RequirementEntity) private requirementRepo: Repository, private alertService: AlertService, ) {} // Calcular cumplimiento async calculateCompliance( projectId: string, tenantId: string ): Promise { const requirements = await this.requirementRepo.find({ where: { projectId, tenantId } }); const total = requirements.length; const completed = requirements.filter(r => r.status === 'CUMPLIDO').length; const percentage = total > 0 ? (completed / total) * 100 : 0; // Actualizar proyecto await this.projectRepo.update( { id: projectId, tenantId }, { compliancePercentage: percentage, updatedAt: new Date() } ); // Alertas automáticas if (percentage < 70) { await this.alertService.createAlert({ type: 'INFONAVIT_LOW_COMPLIANCE', projectId, tenantId, message: `Cumplimiento INFONAVIT bajo: ${percentage.toFixed(1)}%` }); } return { total, completed, percentage }; } // Verificar documentos próximos a vencer async checkExpiringDocuments(tenantId: string): Promise { const thirtyDaysFromNow = new Date(); thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30); return this.evidenceRepo.find({ where: { tenantId, expirationDate: LessThanOrEqual(thirtyDaysFromNow), isExpired: false } }); } } ``` ## Validaciones Pre-Commit - [ ] Todas las entidades INFONAVIT incluyen `tenantId` y `projectId` - [ ] Evidencias tienen metadatos completos - [ ] Workflow de estados correctamente implementado - [ ] RLS habilitado en todas las tablas del schema - [ ] Alertas configuradas para cumplimiento bajo - [ ] Documentos con fecha de expiración monitoreados ## Referencias - Documentación: `/docs/01-fase-alcance-inicial/MAI-011-infonavit-cumplimiento/` - Especificaciones: `/docs/01-fase-alcance-inicial/MAI-011-infonavit-cumplimiento/especificaciones/` - Core directivas: `../../erp-core/orchestration/directivas/` --- *Directiva específica de Vertical Construcción*