# Module Checklist — qué debe pasar un módulo para certificarse production-ready

> **Pre-requisito:** [`DEMO-INTEGRATION-PATTERN.md`](DEMO-INTEGRATION-PATTERN.md) — patrón canónico de integración módulo↔demo entendido.

---

## 30 items en 6 bloques

| Bloque | Items | Si falla |
|--------|-------|----------|
| 1. Identidad y código | 4 | Módulo desconectado del sistema |
| 2. Defaults JSON | 6 | Productos con data esquelética |
| 3. Asset pack genérico | 5 | Imágenes rotas / placeholders feos |
| 4. Vistas | 6 | UX rota |
| 5. Integración con sistema | 5 | Variables undefined / dropdown vacío |
| 6. CRUD admin | 4 | Cliente no puede gestionar contenido |

**Total: 30 items**

---

## Bloque 1 — Identidad y código (4 items)

| # | Check | Cómo validar | Esperado |
|---|-------|--------------|----------|
| 1.1 | Módulo presente en `app/Modules/{Nombre}/` | `ls app/Modules/{Nombre}` | dir con Models/, Controllers/, etc. |
| 1.2 | Modelo principal + relacionados | `find app/Modules/{Nombre}/Models -name '*.php'` | Model + Category (mínimo) |
| 1.3 | Registrado en `config/cd-system.php` modules | `grep '{slug}' config/cd-system.php` | OK |
| 1.4 | Ruta del módulo registrada | `grep '{slug}' routes/cd-system.php` | `require __DIR__.'/modules/{slug}.php'` |

---

## Bloque 2 — Defaults JSON (6 items)

| # | Check | Cómo validar | Esperado |
|---|-------|--------------|----------|
| 2.1 | Archivo existe en `database/seeders/project-data/defaults/{slug}.json` | `ls database/seeders/project-data/defaults/{slug}.json` | OK |
| 2.2 | JSON válido | `php -r "json_decode(file_get_contents('...'), true); echo json_last_error_msg();"` | "No error" |
| 2.3 | ≥5 items principales (services, team, posts, etc.) | inspección | OK |
| 2.4 | ≥1 categoría (cuando el modelo soporta categories) | inspección | OK |
| 2.5 | Cero placeholders (`[NOMBRE]`, `Lorem ipsum`, `John Doe`) en textos | `grep -E '\[NOMBRE\|Lorem\|John Doe' defaults/{slug}.json` | vacío |
| 2.6 | Imágenes apuntan a `cd-project/img/defaults/{modulo}/...` o vacío (no a paths del template) | `grep -oE '"image":\s*"[^"]+"' defaults/{slug}.json` | paths a defaults/ o "" |

---

## Bloque 3 — Asset pack genérico (5 items)

| # | Check | Cómo validar | Esperado |
|---|-------|--------------|----------|
| 3.1 | Carpeta `public/cd-project/img/defaults/{modulo}/` existe | `ls public/cd-project/img/defaults/{modulo}/` | dir presente |
| 3.2 | ≥3 imágenes placeholder (cantidad acorde al módulo) | idem | OK |
| 3.3 | Dimensiones óptimas para el render esperado | `identify -format "%wx%h\n" *.jpg` (con ImageMagick) | acorde al uso (ver tabla) |
| 3.4 | Cada imagen ≤ 200KB | `du -k public/cd-project/img/defaults/{modulo}/*` | OK |
| 3.5 | Nomenclatura predecible (`{tipo}-{n}.{ext}`) | inspección | OK |

**Tabla de dimensiones óptimas por tipo**:
| Tipo | Aspect ratio | Dimensión sugerida |
|------|--------------|--------------------|
| team avatar | 1:1 cuadrado | 600×600 |
| blog cover | 3:2 horizontal | 1200×800 |
| gallery item | varios (cuadrado, horizontal, vertical) | 1200×800 / 800×800 / 800×1200 |
| project cover | 3:2 horizontal | 1200×800 |
| service icon | 1:1 SVG | 64×64 (vector) |
| reference logo | ~5:2 horizontal | 200×80 |
| menu item | 3:2 horizontal | 600×400 |
| news cover | 3:2 horizontal | 1200×800 |

---

## Bloque 4 — Vistas (6 items)

| # | Check | Cómo validar | Esperado |
|---|-------|--------------|----------|
| 4.1 | Vista standalone listing existe | `ls resources/views/modules/{slug}/frontend/{slug}.blade.php` | OK |
| 4.2 | Vista detail existe (si aplica) | `ls .../frontend/{slug}-detail.blade.php` | OK |
| 4.3 | `dynamic-header` partial con cases por demo (cuando aplica) | `ls .../frontend/partials/dynamic-header.blade.php` | OK |
| 4.4 | Cero hex hardcoded en blades del módulo | `grep -nE '#[0-9a-fA-F]{6}' .../frontend/*.blade.php \| grep -v 'stroke=\|fill='` | vacío |
| 4.5 | Cero strings inglesas comunes | `grep -oE '>READ MORE<\|>VIEW \|>LEARN \|Lorem ipsum' .../frontend/*.blade.php` | vacío |
| 4.6 | Fallback de imagen apunta a `defaults/{modulo}/` | inspección | OK |

---

## Bloque 5 — Integración con sistema (5 items)

| # | Check | Cómo validar | Esperado |
|---|-------|--------------|----------|
| 5.1 | ViewComposer pasa la(s) variable(s) del módulo | `grep -nE '{slug}\|{Variable}' app/Providers/ViewComposerServiceProvider.php` | OK |
| 5.2 | Variable está disponible en welcome/about/contact | abrir blade y verificar `$variable` se usa con `is_module_active` guard | OK |
| 5.3 | Si tiene categorías, header dropdown funciona | `curl {tenant}/ \| grep -c 'dropdown-item.*{slug}/'` | > 0 cuando hay categorías |
| 5.4 | Footer recent items (si aplica) | `curl {tenant}/ \| grep -E 'recent{Slug}\|latest{Slug}'` | OK |
| 5.5 | Comandos artisan `bewpro:clean-{slug}` y `bewpro:refresh-{slug}` existen | `php artisan list \| grep {slug}` | OK |

---

## Bloque 6 — CRUD admin (4 items)

| # | Check | Cómo validar | Esperado |
|---|-------|--------------|----------|
| 6.1 | `/admin/{slug}` accesible (listing con DataTable) | curl con auth | HTTP 200 |
| 6.2 | Create / edit / delete funcionan | manual o test | OK |
| 6.3 | Toggle `is_active` / `featured` en lista (si aplica) | manual | OK |
| 6.4 | Eliminado múltiple funciona | manual | OK |

---

## Cómo se reporta el resultado

En la ficha `{modulo}.md` sección "Auditoría":

```markdown
| Bloque | Items pasan | Items fallan | Estado |
|--------|-------------|--------------|--------|
| 1. Identidad | 4/4 | 0 | ✅ |
| 2. Defaults JSON | 5/6 | 1 (faltan items en categories) | 🟡 fix |
| 3. Asset pack | 0/5 | 5 (carpeta no creada) | ❌ |
| ... | ... | ... | ... |

**Veredicto:** ⏳ pending (faltan asset pack y completar defaults)
```

Y al final cuando todos OK:

```markdown
**Veredicto:** ✅ Production-ready (2026-04-XX)
```

---

## Workflow de pulido por módulo

```
1. cd-system $ ls database/seeders/project-data/defaults/{slug}.json   # confirmar existe
2. cd-system $ cat database/seeders/project-data/defaults/{slug}.json   # ver contenido
3. Si faltan items: completar a 5+ con textos genéricos en español
4. Si paths apuntan a img/demos/...: cambiar a img/defaults/{modulo}/
5. cd-system $ ls public/cd-project/img/defaults/{modulo}/   # asset pack
6. Si falta: crear carpeta + copiar imágenes neutras (de un demo válido o externas)
7. Verificar seeder mapea todos los campos del JSON al schema
8. Provisionar tenant test: php artisan bewpro:new test@x.com "T" {slug-core-que-use-el-modulo} --db=bp-mod-test --fresh
9. curl http://localhost/cd-system/public/{slug}  # vista standalone OK?
10. curl http://localhost/cd-system/public/  # bloque embebido en welcome OK?
11. Documentar en {slug}.md
12. Marcar ✅ en README.md de modules/
```
