# US-MGN-010-001-001: CRUD Empleados

**RF Asociado:** [RF-MGN-010-001](../../02-modelado/requerimientos-funcionales/mgn-010/RF-MGN-010-001-gestión-de-empleados.md)
**Módulo:** MGN-010 - RRHH Básico
**Epic:** Empleados
**Prioridad:** P0
**Story Points:** 5
**Sprint:** Sprint 22
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** gerente de RRHH, **Quiero** gestionar información de empleados, **Para** mantener un registro centralizado del personal.

## Descripción Detallada
Empleado incluye:
- Datos personales (nombre, email, teléfono, dirección, fecha nacimiento)
- Datos laborales (puesto, departamento, manager, fecha ingreso, salario)
- Documentos (identificación, CV, foto)
- Estado (active, inactive, terminated)

## Criterios de Aceptación

### Escenario 1: Crear empleado
**Dado que** soy hr_manager,
**Cuando** creo empleado: name="Juan Pérez", email="juan.perez@company.com", job_id=1, department_id=1, hire_date="2024-01-15",
**Entonces** sistema crea empleado con state=active, genera employee_number único.

### Escenario 2: Email único
**Dado que** ya existe empleado con email="juan.perez@company.com",
**Cuando** intento crear otro con mismo email,
**Entonces** error 400 "Email ya registrado".

### Escenario 3: Actualizar datos
**Dado que** empleado existe,
**Cuando** actualizo job_id=5, manager_id=10,
**Entonces** sistema actualiza y registra cambio en audit_log.

### Escenario 4: Desactivar empleado
**Dado que** empleado está active,
**Cuando** cambio state=inactive, termination_date="2024-06-30", termination_reason="Renuncia",
**Entonces** empleado se desactiva, no aparece en selectores por defecto.

## Reglas de Negocio
- **RN-1:** Email único por empresa.
- **RN-2:** employee_number auto-generado secuencial.
- **RN-3:** state=terminated requiere termination_reason.
- **RN-4:** RLS filtra por empresa.
- **RN-5:** Permisos: hr_user (lectura), hr_manager (escritura).

## Tareas Técnicas

### Backend
- [ ] Endpoint: POST/GET/PUT/DELETE `/api/v1/hr/employees`
- [ ] Service: `EmployeeService` (CRUD)
- [ ] Generar employee_number único
- [ ] Validar email único
- [ ] Unit tests

### Frontend
- [ ] Página: `EmployeesPage.tsx`
- [ ] Formulario: `EmployeeForm.tsx` (multi-step)
- [ ] Vista: Foto, datos personales, laborales
- [ ] Filtros: Departamento, Puesto, Estado
- [ ] Component tests

### Database
- [ ] Tabla: `hr.employees` (name, email, phone, job_id, department_id, manager_id, hire_date, termination_date, state)
- [ ] Constraint: unique(company_id, email)
- [ ] Enum: employee_state
- [ ] Índices: idx_employees_department_id, idx_employees_manager_id

---

## Estimación Detallada
| Tarea | Horas |
|-------|-------|
| Backend | 2.5 |
| Frontend | 3 |
| Testing | 2 |
| **TOTAL** | **7.5 horas = 5 SP** |

## Definition of Done
- [ ] CRUD completo
- [ ] Validaciones aplicadas
- [ ] employee_number generado
- [ ] Tests >80%
- [ ] QA/PO aprobado

## Referencias
- [RF-MGN-010-001](../../02-modelado/requerimientos-funcionales/mgn-010/RF-MGN-010-001-gestión-de-empleados.md)
- [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-010.yaml)
