315 lines
9.0 KiB
Markdown
315 lines
9.0 KiB
Markdown
# 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:**
|
||
|
||
1. HR accede a "Configuración" → "INFONAVIT" → "Registrar Patrón"
|
||
2. Ingresa datos:
|
||
- RFC de la constructora
|
||
- Razón social
|
||
- Domicilio fiscal
|
||
- Actividad económica (construcción)
|
||
- Número de trabajadores
|
||
3. Sistema genera solicitud de registro
|
||
4. Envía a API INFONAVIT
|
||
5. Obtiene **Número de Registro Patronal INFONAVIT**
|
||
6. 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:**
|
||
|
||
1. Sistema determina período bimestral actual
|
||
2. 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
|
||
```
|
||
3. Suma aportaciones de todos los empleados
|
||
4. Genera archivo de pago (.txt o XML según formato INFONAVIT)
|
||
5. 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:**
|
||
|
||
1. Sistema consulta API INFONAVIT
|
||
2. Request:
|
||
```json
|
||
{
|
||
"registro_patronal": "1234567890",
|
||
"rfc_patron": "CON123456ABC"
|
||
}
|
||
```
|
||
3. Obtiene lista de empleados con crédito:
|
||
```json
|
||
{
|
||
"acreditados": [
|
||
{
|
||
"nss": "12345678901",
|
||
"numero_credito": "9876543210",
|
||
"descuento_mensual": 1500.00,
|
||
"saldo_pendiente": 150000.00,
|
||
"tipo_descuento": "VSM" // Veces Salario Mínimo
|
||
}
|
||
]
|
||
}
|
||
```
|
||
4. Actualiza tabla `infonavit_credits` con descuentos vigentes
|
||
5. Marca empleados con crédito activo
|
||
|
||
---
|
||
|
||
### UC-INF-004: Aplicar Descuento por Crédito en Nómina
|
||
|
||
**Trigger:** Cálculo de nómina
|
||
|
||
**Proceso:**
|
||
|
||
1. Al calcular nómina del empleado
|
||
2. Verifica si tiene crédito INFONAVIT activo
|
||
3. 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
|
||
4. Aplica descuento en nómina
|
||
5. Registra en tabla `payroll_deductions`
|
||
6. 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:**
|
||
|
||
1. HR accede a "INFONAVIT" → "Generar Archivo de Pago"
|
||
2. Selecciona bimestre
|
||
3. Sistema genera archivo con:
|
||
- Aportaciones patronales (5% del SBC)
|
||
- Descuentos de créditos de empleados
|
||
4. Formato del archivo:
|
||
```
|
||
HEADER|1234567890|CON123456ABC|BIMESTRE 01-2025
|
||
APORTACION|12345678901|1050.00|60
|
||
DESCUENTO|12345678901|9876543210|1500.00
|
||
TOTAL|250|350000.00|185000.00
|
||
```
|
||
- `250`: Total de empleados
|
||
- `350000.00`: Total aportaciones
|
||
- `185000.00`: Total descuentos
|
||
5. Permite descargar archivo .txt
|
||
6. Genera línea de captura para pago en banco
|
||
|
||
---
|
||
|
||
## 📊 Modelo de Datos
|
||
|
||
```sql
|
||
-- 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
|