8.3 KiB
8.3 KiB
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
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
// 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
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
// 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
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
-- 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
@Injectable()
export class InfonavitComplianceService {
constructor(
@InjectRepository(RegisteredProjectEntity)
private projectRepo: Repository<RegisteredProjectEntity>,
@InjectRepository(RequirementEntity)
private requirementRepo: Repository<RequirementEntity>,
private alertService: AlertService,
) {}
// Calcular cumplimiento
async calculateCompliance(
projectId: string,
tenantId: string
): Promise<ComplianceResult> {
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<ExpiringDocument[]> {
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
tenantIdyprojectId - 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