# QA Plan — RRHH Presentismo Fase 2 (Cierre)

**Fecha**: 2026-05-18  
**Objetivo**: validar que el cierre de brechas Fase 2 quedó estable en backend y frontend, sin regresiones críticas.

---

## 1) Alcance

Incluye únicamente Fase 2 cerrada:

- BullMQ automático (`rrhh-presentismo-queue`) para relojes API.
- Reprogramación automática de jobs al crear/editar/desactivar/eliminar reloj.
- Endpoint `PATCH /api/v1/rrhh/presentismo/marcaciones/limpias/:id`.
- Auditoría de ajustes en `rrhh_marcaciones_ajustes_manuales`.
- Migración legacy `AUSENCIA -> AUSENCIA_JORNADA` con `tipo_novedad_legacy`.
- Validación CI parser 5–9 dígitos.
- Frontend Presentismo (Relojes, Turnos, Marcaciones, Log Correcciones).

Fuera de alcance:

- Motor M19 (`/novedades/procesar`) y tolerancias/permisos de Fase 3/4.

---

## 2) Entorno y datos

- Backend: `npm run start:dev`
- Frontend: `npm run dev`
- Redis activo (obligatorio para BullMQ)
- Empresa de pruebas: `Demo RRHH`
- Usuarios:
  - `admin_rrhh` con `RRHH_PRESENTISMO_*`
  - `operador_rrhh` sin `RRHH_PRESENTISMO_AJUSTE`
- Datos base:
  - 20 empleados activos con CI válidos (5–9 dígitos)
  - 1 reloj PLANILLA, 1 reloj API
  - 2 turnos (SIMPLE y CORTADO)

---

## 3) Suite técnica (automatizada)

Ejecutar:

```bash
cd backend
npm test -- src/rrhh/services/marcaciones-parser.service.spec.ts \
  src/rrhh/services/marcaciones-dedup.service.spec.ts \
  src/rrhh/services/marcaciones.service.spec.ts \
  src/rrhh/services/presentismo-sync-scheduler.service.spec.ts \
  src/rrhh/services/presentismo-sync.processor.spec.ts
```

Criterio de aprobación:

- 100% de suites verdes.
- 0 tests flaky.

---

## 4) Suite funcional (manual)

### A. BullMQ automático

1. Crear reloj API con `intervalo_polling_min=10`.
   - Esperado: job repeatable creado para `reloj-sync:<id>`.
2. Editar reloj a `intervalo_polling_min=15`.
   - Esperado: job anterior removido y nuevo job creado.
3. Desactivar reloj.
   - Esperado: job repeatable removido.
4. Reactivar reloj con intervalo válido.
   - Esperado: job repeatable restaurado.

### B. PATCH de marcación limpia

1. Ajustar `hora_entrada` y `hora_salida` en una limpia.
   - Esperado: 200 OK, `procesado_novedades=false`.
2. Verificar fila en `rrhh_marcaciones_ajustes_manuales`.
   - Esperado: registro por cada campo modificado + motivo.
3. Probar usuario sin permiso `RRHH_PRESENTISMO_AJUSTE`.
   - Esperado: 403.
4. Probar turno de otra empresa.
   - Esperado: 400/validación multiempresa.

### C. Parser y deduplicación

1. Importar CSV con CI válido (5–9 dígitos).
   - Esperado: procesa normal.
2. Importar CSV con CI de 4 dígitos y de 10 dígitos.
   - Esperado: fila inválida, no aborta lote.
3. Reimportar mismo archivo.
   - Esperado: sin duplicados en limpias.

### D. Migración legacy

1. Consultar novedades históricas con tipo `AUSENCIA`.
   - Esperado: pasan a `AUSENCIA_JORNADA`.
2. Verificar `tipo_novedad_legacy`.
   - Esperado: conserva trazabilidad.

### E. Frontend Presentismo

1. RRHH muestra tab `Presentismo`.
2. Subtabs visibles: `Relojes`, `Turnos`, `Marcaciones`, `Log de correcciones`.
3. Flujo completo:
   - Crear reloj
   - Crear turno
   - Asignar turno a empleado
   - Importar planilla
   - Consultar raw/limpias/batches
   - Ajustar limpia
   - Ver log de correcciones
4. UX:
   - Confirmaciones con `ConfirmDialog`/`PromptDialog` (sin `window.alert/confirm`).
   - Selectores buscables.
   - Vista usable en móvil (`<600px`).

---

## 5) Criterios de salida (Go/No-Go)

Go si:

- Suite técnica 100% OK.
- 0 bloqueantes en seguridad/permisos/multiempresa.
- 0 defectos críticos en sincronización, ajuste manual o deduplicación.
- Flujo frontend Fase 2 operativo extremo a extremo.

No-Go si:

- Jobs repeatables no se crean/reprograman/remueven correctamente.
- PATCH no audita o no resetea `procesado_novedades`.
- Regresión en importación o deduplicación.

---

## 6) Evidencia obligatoria

Guardar en: `backend/docs/qa-presentismo-evidencia-YYYY-MM-DD.md`

Estructura mínima:

- Commit SHA probado.
- Entorno (dev/staging), fecha/hora.
- Resultado por caso (`PASS/FAIL`).
- Capturas UI (subtabs + ajuste + log).
- Extractos API (status code + payload breve).
- Hallazgos y decisiones.
