# Sprint 1.5a · Criterios de Aceptación

> **Para vos, Ricci.** Es el sprint más crítico del proyecto. Tomate **2-3 horas tranquilo**.

---

## ✅ Bloque 1 · Técnico (Claude Code lo confirma)

- [ ] 10 migraciones nuevas aplicadas en demo e infinia
- [ ] Catálogos chilenos sembrados en demo e infinia (verificar con `SELECT COUNT(*) FROM entidades_previsionales` debería dar 30)
- [ ] 15 models nuevos creados
- [ ] DomPDF instalado vía composer
- [ ] Tests pasan: 230+ totales (159 anteriores + ~70 nuevos), 100% verde
- [ ] No hay warnings de PHP en logs

---

## ✅ Bloque 2 · Catálogos sembrados

```bash
mysql -u root -e "
USE innovium_demo;
SELECT 'entidades' AS tabla, COUNT(*) FROM entidades_previsionales
UNION SELECT 'parentescos', COUNT(*) FROM parentescos
UNION SELECT 'estados_civiles', COUNT(*) FROM estados_civiles
UNION SELECT 'nacionalidades', COUNT(*) FROM nacionalidades
UNION SELECT 'regiones', COUNT(*) FROM regiones
UNION SELECT 'comunas', COUNT(*) FROM comunas
UNION SELECT 'capillas', COUNT(*) FROM capillas
UNION SELECT 'tipos_carroza', COUNT(*) FROM tipos_carroza;
"
```

Esperás:
- entidades: 30
- parentescos: 19
- estados_civiles: 5
- nacionalidades: 160
- regiones: 16
- comunas: ~346
- capillas: 3
- tipos_carroza: 4

---

## ✅ Bloque 3 · Pantallas admin de catálogos

Logueate como `admin@demo.cl`:

- [ ] `/admin/sucursales` carga, modal funciona, "Casa Matriz" visible
- [ ] `/admin/velatorios` carga, modal funciona (vacío inicial)
- [ ] `/admin/convenios` carga, modal funciona (vacío inicial)
- [ ] Crear "Velatorio Las Condes" en /admin/velatorios → toast verde
- [ ] Crear "Funcionarios Públicos" 10% en /admin/convenios → toast verde

---

## ✅ Bloque 4 · Wizard de venta NI completo

Recorré `/admin/contratos/nuevo` end-to-end:

### Paso 1 · Cliente

- [ ] Buscar por RUT con auto-formato (escribís 10231996 → muestra 10.231.996)
- [ ] Si no existe, "+ Crear cliente nuevo"
- [ ] RUT con dígito verificador inválido → error inline
- [ ] Crear "Juan Carrasco" RUT 10.231.996-6, parentesco "Hijo(a)"

### Paso 2 · Fallecido

- [ ] Form con todos los campos
- [ ] Estado civil y nacionalidad cargan opciones del catálogo
- [ ] CHILENA aparece arriba (orden_visual menor)
- [ ] Fecha defunción no permite futuro
- [ ] Crear "Francisco Garrido" RUT 3.647.988-4, viudo, CHILENA

### Paso 3 · Plan + cofre

- [ ] Lista de planes (vacía si no creaste, eso es OK para test)
- [ ] Click "Configurar manual" 
- [ ] Llenar cofre: "SOBREMEDIDA TERCIADO LISO", color CAFÉ, medidas 48/61/193, valor $1.200.000
- [ ] Avanza

### Paso 4 · Servicio funerario

- [ ] Capilla: CIRIOS
- [ ] Carroza: BLANCA
- [ ] Cruz: SI, Libro condolencias: SI, Tarjeta condolencias: SI
- [ ] Arreglo: SI, Tramitación: SI, Cafetería: SI
- [ ] Cert. Médica: NO
- [ ] Agregar servicio extra: "TRASLADO" $180.000

### Paso 5 · Complemento

- [ ] Lugar de velación: vacío o algún velatorio
- [ ] Lugar de sepultación: "Cementerio General"
- [ ] Marcar "Por confirmar" funeral

### Paso 6 · Pagos

- [ ] Total auto-calculado: $1.200.000 + $180.000 = $1.380.000
- [ ] Agregar entidad: HABITAT por $595.000
- [ ] Abono cliente: $0
- [ ] Pendiente calculado: $785.000

### Paso 7 · Firma + Confirmar

- [ ] Canvas funciona con mouse/dedo
- [ ] Firma confirmada → habilita botón
- [ ] Resumen muestra todo correctamente
- [ ] Click "Confirmar contrato"
- [ ] Toast verde "Contrato Nº 1149 creado"
- [ ] Redirige a `/admin/contratos/<id>`

---

## ✅ Bloque 5 · Vista de contrato

- [ ] La vista muestra todos los datos del contrato
- [ ] Botón "Descargar PDF" → descarga el PDF
- [ ] El PDF se ve **idéntico al de Infinia (CT-1149)**:
  - Header con número, fecha, hora
  - Logo del tenant a la derecha
  - Marca de agua del logo (centrada, opacidad 12%)
  - 5 cards numeradas
  - Datos completos del contratante con RUT formateado
  - Datos del fallecido con estado civil
  - Detalles del servicio con TODOS los toggles SI/NO
  - Medidas del cofre
  - "OTROS SERVICIOS: TRASLADO = $ 180.000"
  - Resumen de valores (2 columnas)
  - APORTE PREVISIONAL (HABITAT $595.000)
  - 5 notas legales
  - Firmas con la del titular escaneada

---

## ✅ Bloque 6 · Verificación BD

```bash
mysql -u root -e "
USE innovium_demo;
SELECT numero, tipo, total_servicios_clp, aporte_previsional_total_clp, pendiente_pago_clp, estado, fecha_firma
FROM contratos
ORDER BY id DESC LIMIT 5"
```

- [ ] El contrato existe con número 1149
- [ ] Total = 1.380.000
- [ ] Aporte = 595.000
- [ ] Pendiente = 785.000
- [ ] Estado = `firmado`
- [ ] Fecha firma con timestamp correcto

```bash
mysql -u root -e "
SELECT a.nombre_snapshot, a.monto_clp, a.fecha_verificada
FROM innovium_demo.contrato_aportes_previsionales a
JOIN innovium_demo.contratos c ON c.id = a.contrato_id
WHERE c.numero = '1149'"
```

- [ ] Aparece HABITAT $595.000

---

## ✅ Bloque 7 · Storage R2

- [ ] Andá al panel Cloudflare R2 → bucket innovium-storage
- [ ] Encontrás `tenants/demo/firmas/CT-NI-1149.png` (la firma)
- [ ] Encontrás `tenants/demo/contratos/CT-NI-1149.pdf` (el PDF)
- [ ] El PDF descargado desde Cloudflare se abre y se ve igual

---

## ✅ Bloque 8 · Aislamiento

- [ ] Login en `infinia.innovium.test:8000` como admin@infinia.cl
- [ ] Ir a `/admin/contratos` → NO debe aparecer el contrato 1149 de demo
- [ ] Crear un contrato en infinia → tampoco aparece en demo

---

## ✅ Bloque 9 · Audit log

```bash
mysql -u root -e "
SELECT accion, datos_json, creado_en
FROM innovium_demo.audit_log
WHERE accion LIKE 'contrato.%' OR accion LIKE 'cliente.%' OR accion LIKE 'fallecido.%'
ORDER BY id DESC LIMIT 15"
```

- [ ] Aparecen `cliente.creado`, `fallecido.creado`, `contrato.creado`
- [ ] Datos clave en JSON

---

## ✅ Bloque 10 · Permisos

- [ ] `vendedor@demo.cl` puede crear contratos
- [ ] `vendedor@demo.cl` NO ve botón "Anular" (eso es Sprint 1.5c)
- [ ] `gerente@demo.cl` puede ver contratos pero NO crear
- [ ] `contador@demo.cl` puede ver contratos pero NO crear

---

## Cierre

Cuando todos los checks estén ✅:

1. **Crear 2 contratos NI reales** (uno con plan, otro manual)
2. **Screenshots:**
   - Listado con los 2 contratos
   - Vista detalle de uno
   - PDF descargado y abierto (debe verse como Infinia)
   - El bucket R2 con los archivos
3. **Pegámelos acá**
4. Si OK, commit `chore: sprint 1.5a cerrado - NI funcional`
5. Arrancamos **Sprint 1.5b** (NF con cuotas en UF)

---

## Si algo falla

Pegame:
- Bloque
- Pantalla / acción
- Esperado vs real
- Errores PHP / consola browser

Yo ayudo a debuguear.
