468 lines
16 KiB
Markdown
468 lines
16 KiB
Markdown
# _MAP: MAI-006 - RRHH, Asistencias y Nómina
|
|
|
|
**Épica:** MAI-006
|
|
**Nombre:** RRHH, Asistencias y Nómina
|
|
**Fase:** 1 - Alcance Inicial
|
|
**Presupuesto:** $25,000 MXN
|
|
**Story Points:** 50 SP
|
|
**Estado:** 🚧 Planificado
|
|
**Sprint:** Sprint 9-10 (Semanas 13.5-16)
|
|
**Prioridad:** P0 - Crítico
|
|
**Última actualización:** 2025-11-17
|
|
|
|
---
|
|
|
|
## 📋 Propósito
|
|
|
|
Implementar sistema completo de gestión de recursos humanos para obra con:
|
|
- Catálogo de empleados, cuadrillas y oficios
|
|
- **Asistencia biométrica desde app móvil** ⭐
|
|
- Costeo de mano de obra por obra/partida
|
|
- **Integración con IMSS e INFONAVIT** ⭐
|
|
- Exportación de archivos SUA para nómina
|
|
|
|
**Justificación:** RRHH es crítico para costeo de mano de obra y cumplimiento legal (IMSS/INFONAVIT) desde el inicio de cualquier obra.
|
|
|
|
**Reutilización GAMILIT:** 30% (concepto de tracking de usuarios, adaptado)
|
|
|
|
---
|
|
|
|
## 📁 Contenido
|
|
|
|
### Requerimientos Funcionales (5)
|
|
|
|
| ID | Archivo | Título | Estado |
|
|
|----|---------|--------|--------|
|
|
| RF-HR-001 | [RF-HR-001-empleados-cuadrillas.md](./requerimientos/RF-HR-001-empleados-cuadrillas.md) | Gestión de Empleados y Cuadrillas | 🚧 Planificado |
|
|
| RF-HR-002 | [RF-HR-002-asistencia-biometrica.md](./requerimientos/RF-HR-002-asistencia-biometrica.md) | Sistema de Asistencia con Biométrico | 🚧 Planificado |
|
|
| RF-HR-003 | [RF-HR-003-costeo-mano-obra.md](./requerimientos/RF-HR-003-costeo-mano-obra.md) | Costeo de Mano de Obra | 🚧 Planificado |
|
|
| RF-HR-004 | [RF-HR-004-integracion-imss.md](./requerimientos/RF-HR-004-integracion-imss.md) | Integración con IMSS | 🚧 Planificado |
|
|
| RF-HR-005 | [RF-HR-005-integracion-infonavit.md](./requerimientos/RF-HR-005-integracion-infonavit.md) | Integración con INFONAVIT | 🚧 Planificado |
|
|
|
|
### Especificaciones Técnicas (5)
|
|
|
|
| ID | Archivo | Título | RF | Estado |
|
|
|----|---------|--------|-------|--------|
|
|
| ET-HR-001 | [ET-HR-001-empleados-cuadrillas.md](./especificaciones/ET-HR-001-empleados-cuadrillas.md) | Implementación de Empleados y Cuadrillas | RF-HR-001 | 🚧 Planificado |
|
|
| ET-HR-002 | [ET-HR-002-asistencia-biometrica.md](./especificaciones/ET-HR-002-asistencia-biometrica.md) | Implementación de Asistencia Biométrica | RF-HR-002 | 🚧 Planificado |
|
|
| ET-HR-003 | [ET-HR-003-costeo-mano-obra.md](./especificaciones/ET-HR-003-costeo-mano-obra.md) | Implementación de Costeo de Mano de Obra | RF-HR-003 | 🚧 Planificado |
|
|
| ET-HR-004 | [ET-HR-004-integracion-imss.md](./especificaciones/ET-HR-004-integracion-imss.md) | Integración con API IMSS | RF-HR-004 | 🚧 Planificado |
|
|
| ET-HR-005 | [ET-HR-005-integracion-infonavit.md](./especificaciones/ET-HR-005-integracion-infonavit.md) | Integración con API INFONAVIT | RF-HR-005 | 🚧 Planificado |
|
|
|
|
### Historias de Usuario (6)
|
|
|
|
| ID | Archivo | Título | SP | Estado |
|
|
|----|---------|--------|----|--------|
|
|
| US-HR-001 | [US-HR-001-catalogo-empleados.md](./historias-usuario/US-HR-001-catalogo-empleados.md) | Catálogo de Empleados y Cuadrillas | 8 | 🚧 Planificado |
|
|
| US-HR-002 | [US-HR-002-asistencia-biometrica-app.md](./historias-usuario/US-HR-002-asistencia-biometrica-app.md) | Asistencia con Biométrico desde App | 15 | 🚧 Planificado |
|
|
| US-HR-003 | [US-HR-003-costeo-mano-obra.md](./historias-usuario/US-HR-003-costeo-mano-obra.md) | Costeo de Mano de Obra por Obra | 10 | 🚧 Planificado |
|
|
| US-HR-004 | [US-HR-004-integracion-nomina.md](./historias-usuario/US-HR-004-integracion-nomina.md) | Integración con Nómina Externa | 8 | 🚧 Planificado |
|
|
| US-HR-005 | [US-HR-005-exportacion-imss-infonavit.md](./historias-usuario/US-HR-005-exportacion-imss-infonavit.md) | Exportación IMSS/INFONAVIT | 12 | 🚧 Planificado |
|
|
| US-HR-006 | [US-HR-006-reportes-asistencia.md](./historias-usuario/US-HR-006-reportes-asistencia.md) | Reportes de Asistencia | 5 | 🚧 Planificado |
|
|
|
|
**Total Story Points:** 50 SP (12 SP más que GAMILIT por integraciones externas)
|
|
|
|
### Implementación
|
|
|
|
📊 **Inventarios de trazabilidad:**
|
|
- [TRACEABILITY.yml](./implementacion/TRACEABILITY.yml) - Matriz completa de trazabilidad
|
|
- [DATABASE.yml](./implementacion/DATABASE.yml) - Objetos de base de datos
|
|
- [BACKEND.yml](./implementacion/BACKEND.yml) - Módulos backend e integraciones
|
|
- [MOBILE.yml](./implementacion/MOBILE.yml) - Especificaciones de app móvil ⭐
|
|
- [INTEGRATIONS.yml](./implementacion/INTEGRATIONS.yml) - Integraciones IMSS/INFONAVIT ⭐
|
|
|
|
### Pruebas
|
|
|
|
📋 Documentación de testing:
|
|
- [TEST-PLAN.md](./pruebas/TEST-PLAN.md) - Plan de pruebas
|
|
- [TEST-CASES.md](./pruebas/TEST-CASES.md) - Casos de prueba
|
|
- [INTEGRATION-TESTS.md](./pruebas/INTEGRATION-TESTS.md) - Tests de integración IMSS/INFONAVIT ⭐
|
|
|
|
---
|
|
|
|
## 🔗 Referencias
|
|
|
|
- **README:** [README.md](./README.md) - Descripción detallada de la épica
|
|
- **Fase 1:** [../README.md](../README.md) - Información de la fase completa
|
|
- **Roadmap:** [../ROADMAP-DETALLADO.md](../ROADMAP-DETALLADO.md) - Sprints 9-10
|
|
|
|
---
|
|
|
|
## 📊 Métricas
|
|
|
|
| Métrica | Valor |
|
|
|---------|-------|
|
|
| **Presupuesto estimado** | $25,000 MXN |
|
|
| **Presupuesto target** | $25,000 MXN ±5% |
|
|
| **Story Points estimados** | 50 SP |
|
|
| **Duración estimada** | 2.5 semanas (12.5 días) |
|
|
| **Reutilización GAMILIT** | 30% |
|
|
| **Integraciones externas** | 2 (IMSS, INFONAVIT) |
|
|
| **RF a implementar** | 5/5 |
|
|
| **ET a implementar** | 5/5 |
|
|
| **US a completar** | 6/6 |
|
|
|
|
---
|
|
|
|
## 🎯 Módulos Afectados
|
|
|
|
### Base de Datos
|
|
- **Schemas:** `hr`, `attendance`, `payroll`
|
|
- **Tablas:** ~15 tablas
|
|
- `employees`, `crews`, `trades`, `attendance_records`
|
|
- `labor_costs`, `payroll_periods`, `imss_integration_log`, `infonavit_integration_log`
|
|
- **Funciones:** Cálculo de costeo, validaciones de asistencia
|
|
- **ENUMs:**
|
|
- `employee_status` (active, suspended, terminated)
|
|
- `trade_type` (mason, electrician, plumber, carpenter, etc.)
|
|
- `attendance_method` (biometric, qr, manual, gps)
|
|
|
|
### Backend
|
|
- **Módulo:** `hr`
|
|
- **Path:** `apps/backend/src/modules/hr/`
|
|
- **Services:**
|
|
- `EmployeeService` - CRUD de empleados
|
|
- `AttendanceService` - Registro y validación de asistencia
|
|
- `LaborCostService` - Cálculo de costeo
|
|
- `IMSSIntegrationService` - Integración con IMSS ⭐
|
|
- `INFONAVITIntegrationService` - Integración con INFONAVIT ⭐
|
|
- `BiometricService` - Validación de datos biométricos ⭐
|
|
- **APIs Externas:**
|
|
- IMSS SOAP/REST API
|
|
- INFONAVIT REST API
|
|
|
|
### Frontend Web
|
|
- **Features:** `hr`, `attendance`, `payroll`
|
|
- **Path:** `apps/frontend/src/features/`
|
|
- **Componentes:**
|
|
- Gestión de empleados y cuadrillas
|
|
- Dashboard de asistencias
|
|
- Reportes de costeo
|
|
- Exportación IMSS/INFONAVIT
|
|
- **Guards:** AuthGuard, RoleGuard (solo HR y Finance)
|
|
|
|
### App Móvil (React Native) ⭐
|
|
- **Features:** `attendance-capture`
|
|
- **Path:** `apps/mobile/src/features/attendance/`
|
|
- **Componentes:**
|
|
- Login de residente
|
|
- Selector de obra
|
|
- Scanner QR
|
|
- Captura biométrica (huella/facial)
|
|
- Lista de empleados
|
|
- Confirmación de asistencia
|
|
- Historial del día
|
|
- **Offline:** SQLite + sincronización automática
|
|
- **Biométrico:**
|
|
- `react-native-biometrics` (huella)
|
|
- `react-native-camera` (facial)
|
|
- **GPS:** `@react-native-community/geolocation`
|
|
|
|
---
|
|
|
|
## 📱 Funcionalidades de App Móvil
|
|
|
|
### Flujo de Asistencia
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
A[Residente abre app] --> B[Login]
|
|
B --> C[Selecciona obra]
|
|
C --> D{Tipo de registro}
|
|
D -->|Escanear QR| E[Scan QR del empleado]
|
|
D -->|Buscar empleado| F[Lista de empleados]
|
|
D -->|Biométrico| G[Captura huella/facial]
|
|
E --> H[Validar empleado]
|
|
F --> H
|
|
G --> H
|
|
H --> I{Validaciones}
|
|
I -->|GPS| J[Verificar ubicación en obra]
|
|
I -->|Horario| K[Verificar jornada laboral]
|
|
I -->|Estado| L[Verificar empleado activo]
|
|
J --> M{¿Todo OK?}
|
|
K --> M
|
|
L --> M
|
|
M -->|Sí| N[Registrar asistencia]
|
|
M -->|No| O[Mostrar error]
|
|
N --> P{¿Online?}
|
|
P -->|Sí| Q[Enviar a servidor]
|
|
P -->|No| R[Guardar en cola local]
|
|
Q --> S[Confirmación exitosa]
|
|
R --> S
|
|
S --> T[Vibración + sonido]
|
|
```
|
|
|
|
### Pantallas de App
|
|
|
|
1. **Login**
|
|
- Email/password
|
|
- Biométrico para login rápido (opcional)
|
|
|
|
2. **Selector de Obra**
|
|
- Lista de obras asignadas al residente
|
|
- Filtro por estatus
|
|
|
|
3. **Dashboard de Asistencia**
|
|
- Botones: Check-in / Check-out
|
|
- Resumen del día (empleados registrados)
|
|
- Alertas (empleados faltantes, retrasos)
|
|
|
|
4. **Captura de Asistencia**
|
|
- Tabs: QR | Lista | Biométrico
|
|
- Foto del empleado
|
|
- Timestamp y GPS
|
|
- Notas opcionales
|
|
|
|
5. **Historial**
|
|
- Asistencias del día
|
|
- Filtros por cuadrilla/oficio
|
|
- Estado de sincronización
|
|
|
|
### Validaciones en App
|
|
|
|
| Validación | Descripción | Acción si falla |
|
|
|------------|-------------|-----------------|
|
|
| **GPS** | Empleado debe estar dentro del radio de la obra (100m) | Advertencia, permitir override manual |
|
|
| **Horario** | Registro dentro de jornada laboral (6am-8pm típico) | Advertencia, permitir registro |
|
|
| **Estado empleado** | Empleado debe estar activo y asignado a obra | Bloquear registro |
|
|
| **Duplicado** | No permitir doble check-in sin check-out | Bloquear registro |
|
|
| **Biométrico** | Match con template almacenado (>70% confianza) | Fallback a foto |
|
|
|
|
### Modo Offline
|
|
|
|
**Capacidades:**
|
|
- Almacenar hasta 500 registros de asistencia en cola
|
|
- Cache de lista de empleados de la obra (actualizado diariamente)
|
|
- Cache de templates biométricos (encrypted)
|
|
- Indicador visual de registros pendientes de sincronización
|
|
|
|
**Sincronización:**
|
|
- Automática al detectar conexión
|
|
- Manual por botón "Sincronizar ahora"
|
|
- Resolución de conflictos (último gana)
|
|
|
|
---
|
|
|
|
## 🔌 Integraciones Externas
|
|
|
|
### 1. IMSS (Instituto Mexicano del Seguro Social)
|
|
|
|
**API:** SOAP/REST (depende de la región)
|
|
**Autenticación:** Certificado digital (.cer + .key)
|
|
|
|
**Funcionalidades:**
|
|
1. **Afiliación de trabajadores**
|
|
- Alta de trabajador
|
|
- Baja de trabajador
|
|
- Modificación salarial
|
|
- Reingreso
|
|
|
|
2. **Generación de SUA (Sistema Único de Autodeterminación)**
|
|
- Archivo .SUA mensual
|
|
- Cédulas de determinación
|
|
- Cálculo de cuotas obrero-patronales
|
|
|
|
3. **Consultas**
|
|
- Vigencia de derechos
|
|
- Semanas cotizadas
|
|
- Salario base de cotización
|
|
|
|
**Endpoints clave:**
|
|
```
|
|
POST /api/imss/afiliacion/alta
|
|
POST /api/imss/afiliacion/baja
|
|
POST /api/imss/afiliacion/modificacion
|
|
POST /api/imss/sua/generar
|
|
GET /api/imss/vigencia/:nss
|
|
```
|
|
|
|
**Formato de Archivo SUA:**
|
|
```
|
|
Layout de 80 caracteres por línea
|
|
Secciones:
|
|
- Encabezado (registro patronal, período)
|
|
- Trabajadores (NSS, nombre, salario, días trabajados)
|
|
- Totales (suma de cuotas)
|
|
- Cierre (checksum)
|
|
```
|
|
|
|
---
|
|
|
|
### 2. INFONAVIT (Instituto del Fondo Nacional de la Vivienda)
|
|
|
|
**API:** REST
|
|
**Autenticación:** OAuth 2.0 + API Key
|
|
|
|
**Funcionalidades:**
|
|
1. **Registro patronal**
|
|
- Alta de patrón
|
|
- Actualización de datos
|
|
|
|
2. **Aportaciones**
|
|
- Cálculo de aportaciones (5% del SBC)
|
|
- Generación de archivo de pago
|
|
- Pago referenciado
|
|
|
|
3. **Trabajadores acreditados**
|
|
- Consulta de trabajadores con crédito
|
|
- Descuentos de crédito INFONAVIT
|
|
|
|
**Endpoints clave:**
|
|
```
|
|
POST /api/infonavit/patron/registro
|
|
POST /api/infonavit/aportaciones/calcular
|
|
POST /api/infonavit/aportaciones/generar-archivo
|
|
GET /api/infonavit/trabajadores/acreditados/:rfc
|
|
POST /api/infonavit/descuentos/aplicar
|
|
```
|
|
|
|
**Cálculo de Aportaciones:**
|
|
```javascript
|
|
// Ejemplo simplificado
|
|
const aportacionINFONAVIT = (salarioBaseCotizacion, diasTrabajados) => {
|
|
const aportacionDiaria = salarioBaseCotizacion * 0.05; // 5%
|
|
return aportacionDiaria * diasTrabajados;
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 Testing
|
|
|
|
### Unit Tests (Backend)
|
|
|
|
```typescript
|
|
describe('AttendanceService', () => {
|
|
it('should register attendance with GPS validation')
|
|
it('should prevent duplicate check-in')
|
|
it('should calculate labor cost per work')
|
|
it('should validate biometric data')
|
|
})
|
|
|
|
describe('IMSSIntegrationService', () => {
|
|
it('should generate valid SUA file')
|
|
it('should calculate IMSS contributions correctly')
|
|
it('should handle API errors gracefully')
|
|
})
|
|
|
|
describe('INFONAVITIntegrationService', () => {
|
|
it('should calculate 5% contributions')
|
|
it('should fetch accredited workers')
|
|
it('should generate payment file')
|
|
})
|
|
```
|
|
|
|
### E2E Tests (App Móvil)
|
|
|
|
```typescript
|
|
describe('Attendance Capture E2E', () => {
|
|
it('should complete full check-in flow with QR')
|
|
it('should complete check-in with biometric')
|
|
it('should handle offline mode correctly')
|
|
it('should sync pending records when online')
|
|
it('should validate GPS within work radius')
|
|
})
|
|
```
|
|
|
|
### Integration Tests
|
|
|
|
```typescript
|
|
describe('IMSS Integration', () => {
|
|
it('should connect to IMSS sandbox API')
|
|
it('should register employee successfully')
|
|
it('should generate valid SUA file')
|
|
})
|
|
|
|
describe('INFONAVIT Integration', () => {
|
|
it('should connect to INFONAVIT sandbox API')
|
|
it('should calculate contributions correctly')
|
|
it('should fetch accredited workers list')
|
|
})
|
|
```
|
|
|
|
---
|
|
|
|
## 🚨 Riesgos Específicos
|
|
|
|
| Riesgo | Probabilidad | Impacto | Mitigación |
|
|
|--------|-------------|---------|------------|
|
|
| **APIs IMSS/INFONAVIT cambian** | Media | Alto | Monitoreo de cambios, abstracción de integraciones |
|
|
| **Biométrico no funciona en devices antiguos** | Media | Medio | Fallback a QR + foto |
|
|
| **GPS impreciso en obra** | Alta | Bajo | Radio amplio (100m), permitir override |
|
|
| **Sincronización offline falla** | Media | Alto | Cola persistente, retry automático |
|
|
| **Certificados IMSS expiran** | Baja | Alto | Alertas automáticas 30 días antes |
|
|
|
|
---
|
|
|
|
## 📋 Checklist de Implementación
|
|
|
|
### Backend
|
|
- [ ] CRUD de empleados, cuadrillas, oficios
|
|
- [ ] API de registro de asistencia con validaciones
|
|
- [ ] Servicio de cálculo de costeo de mano de obra
|
|
- [ ] Integración IMSS (sandbox → producción)
|
|
- [ ] Integración INFONAVIT (sandbox → producción)
|
|
- [ ] Generación de archivos SUA
|
|
- [ ] Exportación de reportes
|
|
|
|
### App Móvil
|
|
- [ ] Login y autenticación
|
|
- [ ] Selector de obra
|
|
- [ ] Scanner QR (react-native-qrcode-scanner)
|
|
- [ ] Captura biométrica (react-native-biometrics)
|
|
- [ ] GPS validation (@react-native-community/geolocation)
|
|
- [ ] Base de datos local (expo-sqlite)
|
|
- [ ] Cola de sincronización offline
|
|
- [ ] UI/UX optimizada para campo
|
|
|
|
### Frontend Web
|
|
- [ ] Gestión de empleados
|
|
- [ ] Dashboard de asistencias
|
|
- [ ] Reportes de costeo
|
|
- [ ] Exportación IMSS/INFONAVIT
|
|
- [ ] Logs de sincronización
|
|
|
|
### Database
|
|
- [ ] Schemas y tablas
|
|
- [ ] Funciones de cálculo
|
|
- [ ] Triggers de validación
|
|
- [ ] Índices optimizados
|
|
|
|
### Testing
|
|
- [ ] Unit tests >80% coverage
|
|
- [ ] E2E tests de flujo completo
|
|
- [ ] Integration tests con IMSS/INFONAVIT sandboxes
|
|
- [ ] Tests de app móvil (offline, GPS, biométrico)
|
|
|
|
### Despliegue
|
|
- [ ] Variables de entorno (API keys, certificados)
|
|
- [ ] Secrets management (certificados IMSS)
|
|
- [ ] Deploy de app a stores (TestFlight, Play Store)
|
|
- [ ] Configuración de monitoreo
|
|
- [ ] Documentación de integración
|
|
|
|
---
|
|
|
|
## 💡 Lessons Learned (a documentar post-implementación)
|
|
|
|
1. **Integraciones gubernamentales son complejas:** Requieren tiempo para validación y certificación
|
|
2. **Biométrico debe tener fallback:** No todos los dispositivos lo soportan
|
|
3. **Modo offline es crítico:** Obra no siempre tiene buena conexión
|
|
4. **UX simple es clave:** Residentes no son técnicos, UI debe ser intuitiva
|
|
|
|
---
|
|
|
|
## 🎯 Siguiente Paso
|
|
|
|
Completar documentos RF, ET y US de esta épica, con especial énfasis en:
|
|
- RF-HR-002: Especificaciones de biométrico
|
|
- ET-HR-004 y ET-HR-005: Detalles técnicos de integraciones
|
|
- US-HR-002: Flujos de usuario en app móvil
|
|
|
|
---
|
|
|
|
**Generado:** 2025-11-17
|
|
**Mantenedores:** @tech-lead @backend-team @mobile-team @integrations-team
|
|
**Estado:** 🚧 Planificado
|
|
**Prioridad:** P0 - Crítico para cumplimiento legal
|