9.0 KiB
RF-HR-005: Integración con INFONAVIT
Epic: MAI-007 - RRHH, Asistencias y Nómina Tipo: Requerimiento Funcional Prioridad: Crítica (Cumplimiento Legal) Estado: 🚧 En Definición Última actualización: 2025-11-17
📋 Descripción
El sistema debe integrarse con el Instituto del Fondo Nacional de la Vivienda para los Trabajadores (INFONAVIT) para cumplir con obligaciones patronales: registro patronal, cálculo y pago de aportaciones (5% del SBC), consulta de trabajadores con crédito, y aplicación de descuentos por crédito INFONAVIT.
🎯 Objetivo Legal
Obligación Legal: Ley del INFONAVIT
- Art. 29: Obligación de aportación del 5% del SBC
- Art. 29 Bis: Pago bimestral de aportaciones
- Art. 30: Descuento de mensualidades de crédito
Sanciones por incumplimiento:
- Multas de 250 a 5,000 veces la UMA (~$26K a $520K MXN)
- Actualización de adeudos con recargos del 2% mensual
- Embargo de cuentas bancarias
✅ Casos de Uso Principales
UC-INF-001: Registro Patronal en INFONAVIT
Pre-requisito: Primera vez que constructora usa el sistema
Proceso:
- HR accede a "Configuración" → "INFONAVIT" → "Registrar Patrón"
- Ingresa datos:
- RFC de la constructora
- Razón social
- Domicilio fiscal
- Actividad económica (construcción)
- Número de trabajadores
- Sistema genera solicitud de registro
- Envía a API INFONAVIT
- Obtiene Número de Registro Patronal INFONAVIT
- Guarda en
constructoras.infonavit_reg_number
Resultado: Constructora registrada ante INFONAVIT
UC-INF-002: Cálculo de Aportaciones Bimestrales
Periodo: Bimestral (Ene-Feb, Mar-Abr, May-Jun, Jul-Ago, Sep-Oct, Nov-Dic) Fecha límite: Día 17 del mes siguiente al bimestre
Proceso:
- Sistema determina período bimestral actual
- Para cada empleado activo en el período:
- Obtiene Salario Base de Cotización (SBC)
- Calcula días cotizados en el bimestre
- Calcula aportación:
Aportación INFONAVIT = SBC × Días Cotizados × 0.05
- Suma aportaciones de todos los empleados
- Genera archivo de pago (.txt o XML según formato INFONAVIT)
- Muestra total a pagar
Ejemplo:
Empleado: Juan Pérez
SBC: $350/día
Días cotizados: 60 días (bimestre completo)
Aportación = $350 × 60 × 0.05 = $1,050 MXN
UC-INF-003: Consulta de Trabajadores con Crédito
Trigger: Mensual (antes de calcular nómina)
Proceso:
- Sistema consulta API INFONAVIT
- Request:
{ "registro_patronal": "1234567890", "rfc_patron": "CON123456ABC" } - Obtiene lista de empleados con crédito:
{ "acreditados": [ { "nss": "12345678901", "numero_credito": "9876543210", "descuento_mensual": 1500.00, "saldo_pendiente": 150000.00, "tipo_descuento": "VSM" // Veces Salario Mínimo } ] } - Actualiza tabla
infonavit_creditscon descuentos vigentes - Marca empleados con crédito activo
UC-INF-004: Aplicar Descuento por Crédito en Nómina
Trigger: Cálculo de nómina
Proceso:
- Al calcular nómina del empleado
- Verifica si tiene crédito INFONAVIT activo
- Calcula descuento:
- VSM (Veces Salario Mínimo): Descuento = X veces el salario mínimo
- Porcentaje: Descuento = X% del salario bruto
- Cuota fija: Descuento = $X MXN
- Aplica descuento en nómina
- Registra en tabla
payroll_deductions - Al pagar INFONAVIT, incluye estos descuentos en archivo de pago
Ejemplo VSM:
Empleado: María López
Salario Mínimo General: $248.93/día (2025)
Descuento: 2.5 VSM
Descuento mensual = $248.93 × 2.5 × 30 = $18,669.75 MXN
UC-INF-005: Generación de Archivo de Pago
Trigger: Cierre de bimestre (antes del día 17)
Proceso:
- HR accede a "INFONAVIT" → "Generar Archivo de Pago"
- Selecciona bimestre
- Sistema genera archivo con:
- Aportaciones patronales (5% del SBC)
- Descuentos de créditos de empleados
- Formato del archivo:
HEADER|1234567890|CON123456ABC|BIMESTRE 01-2025 APORTACION|12345678901|1050.00|60 DESCUENTO|12345678901|9876543210|1500.00 TOTAL|250|350000.00|185000.00250: Total de empleados350000.00: Total aportaciones185000.00: Total descuentos
- Permite descargar archivo .txt
- Genera línea de captura para pago en banco
📊 Modelo de Datos
-- Créditos INFONAVIT de empleados
CREATE TABLE hr.infonavit_credits (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
employee_id UUID NOT NULL REFERENCES hr.employees(id),
credit_number VARCHAR(20) UNIQUE NOT NULL,
discount_type VARCHAR(20) CHECK (discount_type IN ('VSM', 'percentage', 'fixed')),
discount_value DECIMAL(10, 2) NOT NULL, -- VSM: número de veces, Percentage: %, Fixed: monto
outstanding_balance DECIMAL(12, 2),
start_date DATE NOT NULL,
estimated_end_date DATE,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_infonavit_credits_employee ON hr.infonavit_credits(employee_id);
CREATE INDEX idx_infonavit_credits_active ON hr.infonavit_credits(is_active) WHERE is_active = true;
-- Log de integración INFONAVIT
CREATE TABLE hr.infonavit_integration_log (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
constructora_id UUID NOT NULL REFERENCES auth_management.constructoras(id),
operation_type VARCHAR(50) NOT NULL, -- registro, aportaciones, consulta_creditos, pago
request_payload JSONB NOT NULL,
response_payload JSONB,
status VARCHAR(20), -- pending, success, failed
infonavit_folio VARCHAR(50),
error_message TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Archivos de pago generados
CREATE TABLE hr.infonavit_payment_files (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
constructora_id UUID NOT NULL REFERENCES auth_management.constructoras(id),
period_number INTEGER NOT NULL CHECK (period_number BETWEEN 1 AND 6), -- Bimestre
period_year INTEGER NOT NULL CHECK (period_year >= 2025),
file_content TEXT NOT NULL,
file_hash VARCHAR(64) NOT NULL,
total_employees INTEGER NOT NULL,
total_contributions DECIMAL(12, 2) NOT NULL, -- Aportaciones 5%
total_discounts DECIMAL(12, 2) NOT NULL, -- Descuentos por crédito
total_payment DECIMAL(12, 2) GENERATED ALWAYS AS (total_contributions + total_discounts) STORED,
payment_reference VARCHAR(50), -- Línea de captura bancaria
payment_status VARCHAR(20) DEFAULT 'pending', -- pending, paid
generated_by UUID REFERENCES auth_management.profiles(id),
generated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(constructora_id, period_number, period_year)
);
-- Agregar campo a constructoras
ALTER TABLE auth_management.constructoras
ADD COLUMN IF NOT EXISTS infonavit_reg_number VARCHAR(20) UNIQUE;
🔐 Reglas de Negocio
RN-INF-001: Aportación Obligatoria
- 5% del Salario Base de Cotización (SBC)
- Mismo SBC que se usa para IMSS
- Pago bimestral obligatorio
RN-INF-002: Descuento por Crédito
- Descuento máximo: 30% del salario bruto
- Se descuenta en nómina quincenal/semanal
- Se paga bimestralmente a INFONAVIT junto con aportaciones
RN-INF-003: Trabajadores Acreditados
- Empleados con crédito INFONAVIT vigente
- Descuento obligatorio (ley protege al trabajador)
- Patrón no puede no descontar
RN-INF-004: Plazos de Pago
- Bimestre 1 (Ene-Feb): Pago antes del 17 de marzo
- Bimestre 2 (Mar-Abr): Pago antes del 17 de mayo
- Bimestre 3 (May-Jun): Pago antes del 17 de julio
- Bimestre 4 (Jul-Ago): Pago antes del 17 de septiembre
- Bimestre 5 (Sep-Oct): Pago antes del 17 de noviembre
- Bimestre 6 (Nov-Dic): Pago antes del 17 de enero (año siguiente)
RN-INF-005: Actualización
- Recargos del 2% mensual sobre saldo vencido
- Actualización con INPC (inflación)
🧪 Criterios de Aceptación
- ✅ Permite registrar número patronal INFONAVIT de constructora
- ✅ Calcula aportaciones del 5% correctamente
- ✅ Consulta trabajadores con crédito mensualmente
- ✅ Aplica descuentos por crédito en nómina
- ✅ Descuento no excede 30% del salario bruto
- ✅ Genera archivo de pago con formato correcto
- ✅ Archivo incluye aportaciones + descuentos
- ✅ Genera línea de captura para pago en banco
- ✅ Logs de integración registran operaciones
- ✅ Alertas si pago no se realiza antes del día 17
📐 Dependencias
- ✅ RF-HR-001: Empleados (requiere NSS, SBC)
- ✅ RF-HR-004: IMSS (usa mismo SBC)
- 🔜 RF-HR-004: Nómina (aplica descuentos)
📝 Notas Adicionales
Tipos de Descuento VSM
- VSM (Veces Salario Mínimo): Más común
- Ejemplo: 2.5 VSM = $248.93 × 2.5 × 30 = $18,669.75/mes
- Porcentaje: Poco común
- Ejemplo: 15% del salario bruto
- Cuota Fija: Raro
- Ejemplo: $2,000 MXN/mes
API INFONAVIT
- Entorno de pruebas (sandbox) disponible
- Producción requiere certificado digital
- OAuth 2.0 para autenticación
- Rate limiting: 100 requests/minuto
Fecha de creación: 2025-11-17 Versión: 1.0