# Product Assembly Checklist — BewPro 2.0

> Ultima actualizacion: 2026-04-02
> Productos validados: personal-brand, construction-2, restaurant-bar
> Demos validados: 4/17 (accounting-2, construction-2, restaurant, digital-agency-2)
> Este documento es la fuente de verdad para crear, validar y replicar productos.
> Ver tambien: `demo-dynamization-standard.md` para el estandar de dinamizacion de demos.

---

## Que es un producto

Un **producto** es la combinacion de:
- Un **demo** (template visual de Porto)
- Un conjunto de **modulos** activos
- **Config** pre-cargada (textos, labels, SEO)
- **Seeds** de contenido (FAQs, services, blog)
- **Assets** visuales (logos, imagenes, skin CSS)
- **Campos admin** condicionales por demo

Un producto nace de un **proyecto referencia** que se dinamiza al 100%.

```
Proyecto referencia (ej: bp-surnuevonorte)
    ↓ dinamizar todo
Producto (ej: construction-2)
    ↓ bewpro:new
N proyectos nuevos con la misma estructura
```

---

## Anatomia de un producto — 12 piezas

### PIEZA 1: Core JSON
**Archivo:** `database/seeders/products/core/{slug}.json`

Define la identidad tecnica del producto. Campos requeridos:

```
demo              → demo-{name}
modules           → [services, projects, gallery, blog, faqs, testimonials, ...]
modules_navigation → {module: {header: bool, footer: bool}}
skin              → "auto"
fonts             → {primary, secondary, tertiary}
seo.schema_type   → Person, HomeAndConstructionBusiness, etc.
header.cta_button → {active, title, url, style}
tagline           → texto corto
description       → descripcion del negocio
welcome.*         → config de homepage (headings, badges, CTAs)
about.*           → config de pagina empresa/sobre mi
contact.*         → config de contacto (phone, email, address, CTAs)
footer.*          → config del footer (tagline, copyright, nav)
```

### PIEZA 2: Demo Views (3 blades)
**Directorio:** `resources/views/modules/cd-base/frontend/demos/demo-{name}/`

| Archivo | Contenido |
|---------|-----------|
| `welcome.blade.php` | Homepage: hero, secciones, CTA |
| `about.blade.php` | Pagina empresa/sobre mi |
| `contact.blade.php` | Formulario + datos de contacto |

**Regla de oro:** CERO texto hardcodeado. Todo via `config('site.*')` o datos de modulos.

### PIEZA 3: Header
**Archivo:** `resources/views/layout/front/headers/demo-{name}.blade.php`

Usa componentes compartidos:
- `<x-header-nav>` — navegacion dinamica
- `<x-header-cta>` — boton CTA config-driven
- Datos de contacto via `config('site.contact.*')`
- Social media via `config('site.social_media')`

### PIEZA 4: Footer
**Archivo:** `resources/views/layout/front/footers/demo-{name}.blade.php`

Usa componentes compartidos:
- `<x-footer-nav>` — nav dinamica con limit
- `<x-social-icons>` — redes sociales
- `<x-newsletter-form>` — formulario AJAX
- `<x-footer-contact>` — datos de contacto

### PIEZA 5: Page Header Partial
**Archivo:** `resources/views/layout/front/partials/page-header-{name}.blade.php`

Breadcrumbs + titulo de pagina. Variables: `$pageTitle`, `$pageBreadcrumb`.

### PIEZA 6: CSS (2 archivos)
| Archivo | Funcion |
|---------|---------|
| `public/template/css/demos/demo-{name}.css` | Layout, tipografia, componentes del demo |
| `public/template/css/skins/skin-{name}.css` | Paleta de colores (6 custom properties) |

El skin se genera con `php artisan bewpro:skin --primary=#HEX ...`

### PIEZA 7: Seeds de contenido
**Directorio:** `database/seeders/products/core/seeds/`

| Archivo | Contenido |
|---------|-----------|
| `faqs-{slug}.json` | FAQs por categorias |
| `services-{slug}.json` | Servicios con icono/imagen |
| `blog-{slug}.json` | Posts de blog |
| `testimonials-{slug}.json` | Testimonios (PENDIENTE) |

### PIEZA 8: Campos admin condicionales
**Archivo:** `resources/views/admin/site-data/index.blade.php`

Bloques `@if(in_array($activeDemo, [...]))` que muestran campos especificos:

| Demo | Campos exclusivos |
|------|-------------------|
| `demo-accounting-2` | Hero CTAs, pilares/tabs, stats, gallery/projects headings |
| `demo-construction-2` | About inline (badge+heading+text), badges de secciones, split section, counters, team, testimonials |

### PIEZA 9: Catalogo de variantes
**Archivo:** `database/seeders/products/catalog.json`

Mapeo shop_slug → core_slug. Cada core tiene N variantes comerciales.

| Core | Variantes |
|------|-----------|
| personal-brand | 7 (personal-brand, portfolio, speaker, author, ...) |
| construction-2 | 8 (construction, architecture-firm, civil-engineering, ...) |

### PIEZA 10: Modulos activos
Cada producto define que modulos se activan y cuales no:

| Modulo | personal-brand | construction-2 |
|--------|:-:|:-:|
| services | - | ✓ |
| projects | ✓ | ✓ |
| gallery | ✓ | ✓ |
| blog | ✓ | ✓ |
| faqs | ✓ | ✓ |
| testimonials | - | ✓ |
| team | - | ✓ |
| references | - | - |
| menu | - | - |
| products | - | - |

### PIEZA 11: Provision pipeline
`bewpro:new` ejecuta 14 pasos automaticos. El producto debe funcionar end-to-end:

```
1. Switch DB → 2. Migrate → 3. cd-system config → 4. Base seeders
5. Site data → 6. Analytics → 7. Assets → 8. Resolve URLs
9. Content defaults → 10. Module seeders → 11. CdBase → 12. CdBase seed
13. Clear cache → 14. Restore JSONs
```

### PIEZA 12: Proyecto referencia
Un proyecto real que valida el producto. Todo cambio en el producto se prueba primero aca.

| Producto | Proyecto ref. | DB | URL |
|----------|---------------|-----|-----|
| personal-brand | COKE | bp-coke | coke.bewpro.com |
| construction-2 | Sur Nuevo Norte | bp-surnuevonorte | surnuevonorte.bewpro.com |

---

## QA Checklist — Validacion de producto

### A. Front-end (todas las paginas)

```
[ ] Home renderiza HTTP 200
[ ] About renderiza HTTP 200
[ ] Contact renderiza HTTP 200
[ ] Services/Projects/Gallery/FAQs/Blog (segun modulos activos)
[ ] Testimonials page (si modulo activo)
[ ] 0 texto hardcodeado (buscar texto del proyecto referencia en HTML)
[ ] 0 errores PHP en output
[ ] 0 imagenes rotas (src vacios o 404)
[ ] Titles SEO correctos ({pagina} | {site.name}, sin duplicar)
[ ] Meta OG y Twitter correctos
[ ] Nav header tiene items correctos y en orden
[ ] Nav footer tiene items correctos
[ ] Social media icons funcionan
[ ] CTA header aparece/oculta segun config
[ ] Responsive: mobile, tablet, desktop
```

### B. Contenido dinamico (cada seccion)

```
[ ] Hero: carousel desde DB (WelcomeCarousel)
[ ] Hero: textos desde config (tagline, CTA label)
[ ] Services: titulo + badge desde config, datos desde DB
[ ] Services: icon (campo icon) separado de image (campo image)
[ ] About inline: badge + heading + text desde config
[ ] About inline: counters desde config (JSON array)
[ ] Projects: badge + heading desde config, datos desde DB
[ ] Split section: badge + heading + text desde config (si aplica)
[ ] Testimonials: desde modulo Testimonials (NO references)
[ ] CTA final: titulo desde config
[ ] About page: descripciones, counters, team, testimonials
[ ] Contact page: datos, formulario, mapa, CTA
```

### C. Admin panel

```
[ ] Sidebar muestra modulos activos correctamente
[ ] Tab "Mi Marca/La Marca": nombre, tagline, descripcion, logos, colores, fonts, hero image
[ ] Tab "Inicio": campos condicionales por demo (ver Pieza 8)
[ ] Tab "Empresa/Sobre Mi": badge, titulo, subtitulo, descripciones, counters, team, testimonials
[ ] Tab "Contacto": datos, pagina, CTA, redes sociales
[ ] Banner Principal: link funcional desde tab Inicio
[ ] Logos Clientes: link funcional desde tab Inicio
[ ] Testimonios: CRUD completo (crear, editar, eliminar, toggle featured)
[ ] Services: CRUD con icon + image separados
[ ] Guardar → refleja en front (cache clear funciona)
[ ] Boton "Limpiar cache" funciona
```

### D. Provision (producto replicable)

```
[ ] Core JSON tiene TODOS los campos requeridos (ver Pieza 1)
[ ] Seeds existen: faqs-{slug}.json, services-{slug}.json, blog-{slug}.json
[ ] Seeds testimonials: testimonials-{slug}.json (PENDIENTE integrar)
[ ] catalog.json tiene las variantes mapeadas
[ ] bewpro:new funciona end-to-end con --dry-run
[ ] bewpro:new funciona end-to-end sin --dry-run
[ ] Proyecto resultante tiene todos los modulos activos
[ ] Proyecto resultante tiene contenido seeded
[ ] Admin funcional post-provision (login, editar, guardar)
```

### E. Branding (replicabilidad visual)

```
[ ] Skin CSS genera correctamente con bewpro:skin
[ ] Fonts se cargan desde Google Fonts
[ ] Colores se aplican via CSS custom properties
[ ] Logo se sube a Cloudinary y se resuelve
[ ] Favicon se procesa correctamente
```

---

## Gaps conocidos (2026-04-02)

### Testimonials module — NO integrado en provision
- `testimonials` NO esta en `allModules` de ProvisionProject
- NO existe `TestimonialSeeder` para provision
- NO esta en `moduleSeederMap`
- Requiere activacion manual post-provision

### Services icon vs image
- El campo `icon` guarda SVG paths para homepage carousel
- El campo `image` guarda foto real del servicio
- El admin de services debe mostrar ambos campos claramente

### Demo views con texto hardcodeado (fallbacks)
- Los fallbacks `__('TEXTO')` son aceptables como defaults
- Pero texto especifico del proyecto referencia NO debe quedar como fallback
- Ej: "Inversores extranjeros" como fallback de split_heading es OK (es el default del producto)

---

## Comparativa de productos validados

| Aspecto | personal-brand | construction-2 |
|---------|:-:|:-:|
| Demo | demo-accounting-2 | demo-construction-2 |
| Schema | Person | HomeAndConstructionBusiness |
| Voz | Personal, 1ra persona | Corporativo, empresa |
| Modulo services | ✗ | ✓ |
| Modulo testimonials | ✗ | ✓ |
| Modulo team | ✗ | ✓ |
| CTA header | OFF | ON |
| Banner carousel | ✓ (crossfade) | ✓ (owl-carousel) |
| Pilares/Tabs | ✓ (3 tabs) | ✗ |
| Stats welcome | ✓ (3 counters) | ✗ |
| Counters about | ✗ | ✓ (4 counters) |
| Split section | ✗ | ✓ |
| Seeds FAQs | ✓ | ✓ |
| Seeds Services | ✗ | ✓ |
| Seeds Blog | ✓ | ✓ |
| Seeds Testimonials | ✗ | PENDIENTE |
| Variantes shop | 7 | 8 |
| Admin tabs | 4 | 4 |
| Admin campos unicos | pilares, tabs, stats | split, counters, team, testimonials badges |

---

---

## PIEZA CLAVE: Mapeo Blade Sections → Admin Fields

Esta es la pieza mas critica. Cada seccion visual de las 3 blades debe tener sus campos editables en el admin.

### Welcome Blade — Secciones por producto

| Seccion | personal-brand | construction-2 | Config keys | Admin tab |
|---------|:-:|:-:|-------------|-----------|
| Hero (carousel) | ✓ crossfade bg | ✓ owl-carousel slides | `site.tagline`, `site.welcome.cta_label` | Welcome: nombre |
| Hero CTAs | ✓ (2 botones) | - | `welcome.cta_primary_label`, `cta_secondary_label` | Welcome: Hero botones |
| Glass Tabs/Pilares | ✓ (3 tabs) | - | `welcome.tab_1_label`, `tab_2_label`, `tab_3_label` | Welcome: Pilares |
| Stats/Counters inline | ✓ (3 stats) | - | `welcome.stat_N_value`, `stat_N_label` | Welcome: Estadisticas |
| Services preview | - | ✓ (3 cards bajo carousel) | — (datos de modulo) | — (CRUD services) |
| Services carousel | - | ✓ (SVG icons) | `welcome.services_badge`, `services_heading` | Welcome: Badges secciones |
| About inline | ✓ (badge+title+desc) | ✓ (imgs+text+counters) | `about.badge`, `welcome.about_heading`, `about.main_subtitle`, `about.secondary_text` | Welcome: Sobre nosotros |
| Counters about | - | ✓ (4 counters) | `about.counters` (JSON array) | About: Contadores |
| Gallery | ✓ (lightbox grid) | - | `welcome.gallery_heading` | Welcome: Galeria heading |
| Projects | ✓ (carousel) | ✓ (grid 3 cols) | `welcome.projects_badge`, `projects_heading` | Welcome: Proyectos |
| Blog | ✓ (carousel+pills) | - | `welcome.blog_badge`, `blog_title` | — (no editable aun) |
| Split section | - | ✓ (texto+imagen) | `welcome.split_badge`, `split_heading`, `split_text`, `split_text_2` | Welcome: Seccion split |
| Testimonials | - (disabled) | ✓ (carousel) | `about.testimonials_badge`, `testimonials_title` | About: Testimonios |
| CTA final | ✓ | ✓ | `welcome.cta_title`, `welcome.cta_label` | Welcome: CTA |

### About Blade — Secciones por producto

| Seccion | personal-brand | construction-2 | Config keys | Admin tab |
|---------|:-:|:-:|-------------|-----------|
| Page header | - | ✓ (breadcrumbs) | `about.page_title` | About: titulo |
| Hero/Badge | ✓ (badge+title+desc) | - | `about.badge`, `main_title`, `main_subtitle`, `main_description` | About: titulo+subtitulo |
| Intro text | - | ✓ | `about.main_subtitle`, `description_1` | About: descripciones |
| Descripciones bg | ✓ (bg-primary) | - | `about.description_1`, `description_2` | About: descripciones |
| Services cards | - | ✓ (featured-boxes) | — (datos de modulo) | — (CRUD services) |
| Gallery band | - | ✓ (3 imgs lightbox) | — (datos de modulo) | — (CRUD gallery) |
| Values/Pilares | ✓ (3 cards) | - | `about.value_N_title`, `value_N_description` | About: Pilares |
| Counters | - | ✓ (4 counters) | `about.counters`, `description_2` | About: Contadores |
| Team | - | ✓ (grid) | `about.team_badge`, `team_title` | About: Equipo |
| Testimonials | - | ✓ (carousel) | `about.testimonials_badge`, `testimonials_title` | About: Testimonios |
| Projects preview | - | ✓ (4 cards) | `welcome.projects_heading` | Welcome: Proyectos |
| CTA | - | ✓ | `about.cta_title`, `about.cta_label` | About: CTA |
| Contact/Social | ✓ (social links) | - | `about.team_title`, `social_media` | About: titulo |

### Contact Blade — Secciones por producto

| Seccion | personal-brand | construction-2 | Config keys | Admin tab |
|---------|:-:|:-:|-------------|-----------|
| Badge+Titulo | ✓ (inline) | ✓ (page-header) | `contact.page_badge`, `page_title` | Contact: pagina |
| Subtitulo | ✓ | ✓ | `contact.page_subtitle` | Contact: pagina |
| Formulario | ✓ (sin asunto) | ✓ (con asunto) | `contact.success_message`, `error_message` | — (no editable) |
| Card contacto | ✓ (location+social) | ✓ (address+hours) | `contact.address`, `phone`, `email`, `hours`, `card_subtitle` | Contact: datos |
| Google Maps | - | ✓ | `contact.address` | Contact: direccion |
| CTA final | - | ✓ | `contact.cta_badge`, `cta_title`, `cta_subtitle` | Contact: CTA |

### Regla para nuevos productos

Al crear un producto nuevo:
1. Listar CADA seccion visual de las 3 blades
2. Verificar que CADA texto/heading/badge tenga su `config()` key
3. Verificar que CADA config key tenga su campo en el admin (condicional por demo)
4. Verificar que el controller GUARDE cada campo nuevo
5. Verificar que las validation rules incluyan cada campo nuevo

**Formula:** `N secciones visuales = N bloques config = N campos admin`

---

## Proceso para crear un nuevo producto

### Fase 1: Proyecto referencia
1. Identificar proyecto real como referencia
2. Montar en local con `DB_DATABASE=bp-{nombre}`
3. Verificar que el front sea identico a la web live
4. Dinamizar: todo texto → config(), todo contenido → modulos DB

### Fase 2: Producto
5. Crear core JSON con todos los campos
6. Crear seeds (faqs, services, blog, testimonials)
7. Agregar campos admin condicionales por demo
8. Agregar variantes en catalog.json
9. Registrar modulo testimonials en provision (si aplica)

### Fase 3: QA
10. Ejecutar QA Checklist completo (seccion anterior)
11. Probar `bewpro:new` end-to-end
12. Verificar admin funcional post-provision
13. Documentar en catalogo-productos.md

### Fase 4: Deploy
14. Commit + push
15. Deploy a servidor
16. Verificar en produccion
