# QA Plan — Presupuestos (Cierre Funcional + Build)

**Fecha**: 2026-05-27  
**Objetivo**: certificar el modulo de Presupuestos extremo a extremo (backend, frontend, PDF, portal, conversion a Orden de Venta y seguimiento), con contratos estables.

---

## 1) Alcance

Incluye:

- CRUD operativo de presupuestos (`BORRADOR` y transiciones validas).
- Validaciones obligatorias de nuevo presupuesto (`Moneda`, `Vigencia`).
- PDF end-to-end (preview + descarga) via backend y `generador-pdf`.
- Envio por email y portal publico (`accept/reject`, tracking de apertura).
- Aprobacion interna (`submit-review`, `approve`, `reject-approval`).
- Conversion a Orden de Venta (`convert-to-order`).
- Seguimiento en Dashboard (widget + expansion de graficos, sin duplicacion de KPIs).

Fuera de alcance:

- `convert-to-credit` (Solicitud de Credito, M42 diferido en el plan actual).
- Cambios de contrato no definidos en `plan-presupuestos.md`.

---

## 2) Entorno y precondiciones

- Backend y frontend levantados en rama actual.
- Base de datos con migraciones aplicadas.
- Microservicio `generador-pdf` disponible.
- Servicio SMTP/configuracion de correo operativa para pruebas de envio.
- Empresa de prueba con modulo `PRESUPUESTOS` activo y permisos provisionados:
  - `pnpm provision:presupuestos`.
- Datos base:
  - clientes, productos, monedas, condiciones de pago.

---

## 3) Gate 0 — Migracion, contratos y build base

### A. Migraciones

```bash
cd backend
npx prisma migrate status
```

Esperado:

- `Database schema is up to date!`
- Sin drift.

### B. Contratos API clave

Verificar que se mantengan:

- `GET /api/v1/presupuestos/:id/pdf`
- `POST /api/presupuesto/generate-pdf` (microservicio interno `generador-pdf`)
- `GET /api/v1/presupuestos/dashboard`

### C. Build

```bash
cd frontend && npm run build
cd backend && npm run build
```

Esperado:

- Ambos builds en verde.

---

## 4) Suite tecnica (automatizada)

### A. Calculo backend

```bash
cd backend
npm test -- src/presupuestos/presupuestos.calc.spec.ts --runInBand
```

Criterio:

- Suite en verde (6/6).

### B. Repetibilidad minima

- Ejecutar el test al menos 2 veces si hay sospecha de inestabilidad.

---

## 5) Suite API (integracion manual guiada)

### A. CRUD y reglas de estado

1. `POST /api/v1/presupuestos` crea `DRAFT`.
2. `PUT /api/v1/presupuestos/:id` solo permite editar `DRAFT`.
3. `DELETE /api/v1/presupuestos/:id` cancela con estado final esperado.

### B. PDF

1. `GET /api/v1/presupuestos/:id/pdf?download=0` devuelve PDF inline.
2. `GET /api/v1/presupuestos/:id/pdf?download=1` devuelve adjunto.

### C. Envio y portal publico

1. `POST /api/v1/presupuestos/:id/send-email`.
2. `GET /api/v1/pub/presupuesto/:token`.
3. `POST /api/v1/pub/presupuesto/:token/accept`.
4. `POST /api/v1/pub/presupuesto/:token/reject`.

### D. Aprobacion y conversion

1. `POST /api/v1/presupuestos/:id/submit-review`.
2. `POST /api/v1/presupuestos/:id/approve`.
3. `POST /api/v1/presupuestos/:id/reject-approval`.
4. `POST /api/v1/presupuestos/:id/convert-to-order`.
5. No esperar en este cierre endpoint `convert-to-credit` (fuera de alcance).

### E. Dashboard/seguimiento

1. `GET /api/v1/presupuestos/dashboard`.
2. Validar estructura: `resumen`, `funnel`, `por_estado`, `por_mes`.

---

## 6) Suite funcional UI (manual)

1. Crear presupuesto nuevo:
   - bloquear guardado sin `Moneda` y `Vigencia`.
2. Editar en BORRADOR, bloquear edicion en estados no permitidos.
3. PDF:
   - abrir vista previa,
   - descargar.
4. Enviar email y abrir portal publico.
5. Aceptar/rechazar desde portal y validar reflejo en lista/detalle.
6. Convertir ACEPTADO a OV y validar estado `CONVERTED`.
7. Dashboard:
   - widget visible solo con modulo `PRESUPUESTOS`,
   - boton `Ver seguimiento` expande/colapsa,
   - sin duplicacion de KPIs en expandido,
   - responsive en desktop y mobile.
   - no depende de pestana Pipeline en Presupuestos (seguimiento centralizado en Dashboard).

---

## 7) Pruebas de error controlado

1. Simular caida de `generador-pdf`:
   - validar mensaje de error controlado en UI.
2. Usuario sin permiso `PRES_APROBAR` intenta aprobar:
   - validar bloqueo.
3. Usuario sin modulo `PRESUPUESTOS`:
   - no ve widget de seguimiento en dashboard.

---

## 8) Go / No-Go

Go si:

- Suite tecnica verde.
- Builds backend/frontend en verde.
- Flujo E2E sin bloqueantes (crear -> enviar -> portal -> convertir).
- Seguimiento dashboard sin duplicaciones ni errores de render.
- Reglas de permisos respetadas.

No-Go si:

- Se permite editar fuera de BORRADOR.
- Fallan PDF/portal/envio.
- Conversion genera inconsistencias de estado.
- Duplicacion visual o errores JS en seguimiento.

---

## 9) Evidencia obligatoria

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

Incluir:

- Commit SHA probado.
- Resultado por caso (`PASS/FAIL`).
- Capturas UI (lista, nuevo, detalle, dashboard seguimiento, portal publico).
- Extractos API (request/response resumidos).
- Salida de `prisma migrate status`.
- Salida de test `presupuestos.calc.spec.ts`.
- Decision final (`GO`/`NO-GO`).
