# Sprint 1.3 · Criterios de Aceptación

> **Para vos, Ricci.** Esta es la checklist al cierre del sprint.
> Como este sprint es schema-only sin UI nueva, la mayoría de checks son por consola.

---

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

### 1.1 · Migraciones aplicadas

```bash
mysql -u root -e "SHOW TABLES" innovium_demo | grep -E "categorias|niveles|productos|planes_lineas|precios_uf|tenant_config|producto_variantes|producto_imagenes"
```

- [ ] Las 8 tablas nuevas existen en `innovium_demo`
- [ ] Las 8 tablas nuevas existen en `innovium_infinia` (mismo comando con `innovium_infinia`)

### 1.2 · Foreign keys correctas

```bash
mysql -u root -e "
  SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME 
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
  WHERE TABLE_SCHEMA = 'innovium_demo' 
    AND REFERENCED_TABLE_NAME IS NOT NULL 
    AND TABLE_NAME IN ('productos', 'producto_variantes', 'producto_imagenes', 'planes_lineas', 'precios_uf', 'tenant_config')
  ORDER BY TABLE_NAME;
"
```

- [ ] `productos.categoria_id` → `categorias.id`
- [ ] `productos.nivel_id` → `niveles.id`
- [ ] `productos.imagen_principal_id` → `producto_imagenes.id`
- [ ] `producto_variantes.producto_id` → `productos.id`
- [ ] `producto_imagenes.producto_id` → `productos.id`
- [ ] `planes_lineas.plan_id` → `productos.id`
- [ ] `planes_lineas.producto_id` → `productos.id`
- [ ] `planes_lineas.categoria_id` → `categorias.id`
- [ ] `planes_lineas.nivel_id` → `niveles.id`
- [ ] `precios_uf.actualizado_por` → `users.id`
- [ ] `tenant_config.actualizado_por` → `users.id`

### 1.3 · Seeders aplicados

```bash
mysql -u root -e "SELECT clave, valor, tipo FROM tenant_config" innovium_demo
```

Esperás ver:
```
valor_uf_actual | 38500 | decimal
iva_porcentaje | 19    | decimal
moneda_default | CLP   | string
```

- [ ] Los 3 settings iniciales sembrados en `tenant_config` de demo
- [ ] Los 3 settings iniciales sembrados en `tenant_config` de infinia

```bash
mysql -u root -e "SELECT * FROM precios_uf" innovium_demo
```

- [ ] Una fila en `precios_uf` con la fecha de hoy y valor 38500

### 1.4 · Tests pasan

```bash
cd /c/proyectos/innovium && vendor/bin/phpunit
```

- [ ] Tests previos siguen verdes (34 anteriores)
- [ ] Tests nuevos pasan (al menos 6 nuevos)
- [ ] Total: ~40+ tests, 100% verde

### 1.5 · Tablas vacías excepto config

```bash
mysql -u root -e "SELECT 'categorias' as t, COUNT(*) as c FROM categorias UNION SELECT 'niveles', COUNT(*) FROM niveles UNION SELECT 'productos', COUNT(*) FROM productos UNION SELECT 'planes_lineas', COUNT(*) FROM planes_lineas" innovium_demo
```

- [ ] `categorias` = 0 filas (esperado, vacío)
- [ ] `niveles` = 0 filas (esperado, vacío)
- [ ] `productos` = 0 filas (esperado, vacío)
- [ ] `planes_lineas` = 0 filas (esperado, vacío)

---

## ✅ Bloque 2 · Funcional (vos lo validás)

### 2.1 · Servidor sigue funcionando

```bash
php scripts/innovium serve
```

- [ ] Server arranca sin errores
- [ ] `http://demo.innovium.test:8000/login` carga normal
- [ ] `http://infinia.innovium.test:8000/login` carga normal

### 2.2 · Login sigue funcionando

- [ ] Login con `vendedor@demo.cl` en demo → entra al dashboard
- [ ] Login con `vendedor@infinia.cl` en infinia → entra al dashboard
- [ ] Audit log de Sprint 1.1 sigue registrando

**O sea: este sprint NO debe romper nada de los anteriores.**

### 2.3 · Probar TenantConfig manualmente

Test rápido por consola PHP:

```bash
cd /c/proyectos/innovium
php -r "
require 'bootstrap.php';
\$_SERVER['HTTP_HOST'] = 'demo.innovium.test';
App\Core\Bootstrap::run();
echo 'UF actual: ' . App\Models\TenantConfig::get('valor_uf_actual') . PHP_EOL;
echo 'IVA: ' . App\Models\TenantConfig::get('iva_porcentaje') . '%' . PHP_EOL;
echo 'Moneda: ' . App\Models\TenantConfig::get('moneda_default') . PHP_EOL;
"
```

- [ ] Devuelve los 3 valores correctos

### 2.4 · Probar PrecioUf

```bash
php -r "
require 'bootstrap.php';
\$_SERVER['HTTP_HOST'] = 'demo.innovium.test';
App\Core\Bootstrap::run();
echo 'UF: \$' . number_format(App\Models\PrecioUf::getValorActual(), 0, ',', '.') . PHP_EOL;
"
```

- [ ] Devuelve `UF: $38.500` (o similar)

---

## ✅ Bloque 3 · Aislamiento sigue intacto

```bash
mysql -u root -e "
  INSERT INTO innovium_demo.categorias (slug, nombre, tipo, orden_visual, activo, creado_en, actualizado_en) 
  VALUES ('test-demo', 'Test Demo', 'producto', 1, 1, NOW(), NOW());
  
  SELECT 'demo' as tenant, COUNT(*) as count FROM innovium_demo.categorias 
  UNION ALL 
  SELECT 'infinia', COUNT(*) FROM innovium_infinia.categorias;
"
```

- [ ] demo = 1 fila, infinia = 0 filas (datos aislados)

Después limpiá:

```bash
mysql -u root -e "DELETE FROM innovium_demo.categorias WHERE slug='test-demo'"
```

---

## Lo que NO esperar en este sprint

- 🚫 NO hay UI para gestionar productos (es Sprint 1.4)
- 🚫 NO hay productos cargados (las tablas están vacías intencionalmente)
- 🚫 NO hay subida real de imágenes (Sprint 1.4)
- 🚫 NO hay pantalla de configuración del tenant (Sprint 1.4)
- 🚫 NO hay integración API real de UF (Sprint 2.x)
- 🚫 Visual sigue igual que antes — este sprint es invisible al usuario final

---

## Cierre del sprint

Cuando todos los checks de arriba estén ✅:

1. Tomá screenshot de la salida del SHOW TABLES en ambas BDs (demo + infinia)
2. Tomá screenshot de la salida de PHPUnit con todos verdes
3. Pegámelos acá
4. Confirmo "Sprint 1.3 cerrado, vamos al 1.4"
5. Hacés commit final: `chore: sprint 1.3 cerrado - schema catálogo`

---

## Si algo falla

No improvises. Volvé acá y me decís:
- En qué bloque estás
- Qué esperabas
- Qué pasó

Yo te ayudo a debuguear con Claude Code.
