# US-MGN-011-001-001: CRUD Proyectos

**RF Asociado:** [RF-MGN-011-001](../../02-modelado/requerimientos-funcionales/mgn-011/RF-MGN-011-001-gestión-de-proyectos.md)
**Módulo:** MGN-011 - Proyectos Genéricos
**Epic:** Proyectos
**Prioridad:** P0
**Story Points:** 5
**Sprint:** Sprint 24
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** gerente de proyectos, **Quiero** crear y gestionar proyectos, **Para** organizar trabajo y recursos.

## Descripción Detallada
Proyecto incluye:
- Nombre, código, descripción
- Cliente (partner_id)
- Fechas inicio/fin
- Presupuesto total
- Gerente del proyecto
- Estado (draft, in_progress, on_hold, done, cancelled)
- Cuenta analítica vinculada (opcional)

## Criterios de Aceptación

### Escenario 1: Crear proyecto
**Dado que** soy project_manager,
**Cuando** creo proyecto: name="Desarrollo App Mobile", code="MOB-001", customer_id=1, budget=100000, start_date="2024-01-01",
**Entonces** sistema crea proyecto state=draft, genera cuenta analítica automáticamente.

### Escenario 2: Código único
**Dado que** ya existe proyecto con code="MOB-001",
**Cuando** intento crear otro con mismo código,
**Entonces** error 400 "Código ya existe".

### Escenario 3: Actualizar proyecto
**Dado que** proyecto existe,
**Cuando** actualizo end_date="2024-12-31", budget=120000,
**Entonces** sistema actualiza y registra en audit_log.

### Escenario 4: Vincular a cuenta analítica
**Dado que** proyecto se crea,
**Cuando** se completa creación,
**Entonces** sistema crea cuenta analítica con code=proyecto.code para trackeo de costos.

## Reglas de Negocio
- **RN-1:** Código único por empresa.
- **RN-2:** Budget >= 0.
- **RN-3:** start_date <= end_date (si ambos existen).
- **RN-4:** Crea cuenta analítica automáticamente.
- **RN-5:** RLS filtra por empresa.

## Tareas Técnicas
### Backend
- [ ] Endpoint: POST/GET/PUT/DELETE `/api/v1/projects`
- [ ] Service: `ProjectService` (CRUD)
- [ ] Crear cuenta analítica al crear proyecto
- [ ] Unit tests

### Frontend
- [ ] Página: `ProjectsPage.tsx`
- [ ] Formulario: `ProjectForm.tsx`
- [ ] Vista: Dashboard de proyecto

### Database
- [ ] Tabla: `projects.projects` (code, name, customer_id, manager_id, budget, start_date, end_date, state, analytical_account_id)
- [ ] Constraint: unique(company_id, code)
- [ ] Enum: project_state

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

## Definition of Done
- [ ] CRUD completo
- [ ] Cuenta analítica creada automáticamente
- [ ] Validaciones aplicadas
- [ ] Tests >80%
- [ ] QA/PO aprobado

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