# Fórmula de Producto BewPro

> **Validada con 4 productos**: law-firm-digital, construction, corporative, foundations-ong
> **Audit automatizado**: `python3 scripts/audit-product.py <slug>` o `--all`
> **Última actualización**: 2026-04-29

---

## Las 8 capas que cambian por producto

Cuando creamos o pulimos un producto, **solo estas capas cambian**. Todo lo demás (cores técnicos, módulos, helpers, comandos, settings system) es transversal y NO se toca.

```
┌─────────────────────────────────────────────────────────────────┐
│ 1. CORE PRESET     database/seeders/products/core/{slug}.json   │
│    └─ demo, fonts, brand_defaults, CTA, módulos, schema_type    │
│                                                                 │
│ 2. CONFIG SEED     seeds/config-{slug}.json                     │
│    └─ welcome / about / contact (todos los textos del sitio)    │
│                                                                 │
│ 3. SEEDS MÓDULOS   seeds/{module}-{slug}.json (1 por módulo)    │
│    └─ services, projects, gallery, blog, faqs, references...    │
│                                                                 │
│ 4. ASSET PACK      public/cd-project/assets/{slug}/             │
│    └─ logo, favicon, manifest. Si no existe → fallback bewpro/  │
│                                                                 │
│ 5. ADMIN FORMS     admin/site-data/{welcome,about,contact}/     │
│                    {demo}.blade.php                             │
│    └─ inputs 1:1 con cada key del blade frontend                │
│                                                                 │
│ 6. BLADES FRONT    modules/cd-base/frontend/demos/{demo}/       │
│                    {welcome,about,contact}.blade.php            │
│    └─ TODO con config('site.X.Y') — 0 hardcoded                 │
│                                                                 │
│ 7. CATALOG ENTRY   database/seeders/products/catalog.json       │
│    └─ shop slug → core slug mapping                             │
│                                                                 │
│ 8. DOCS            docs/bewpro2.0/products/{slug}.md            │
│                    docs/bewpro2.0/demos/{demo}.md               │
└─────────────────────────────────────────────────────────────────┘
```

---

## Las 6 reglas duras del producto certificado

### 1. CERO datos hardcoded en welcome/about/contact

Cualquier texto VISIBLE al cliente final debe venir de `config('site.X.Y')`. Las únicas excepciones aceptables:
- Mensajes flash de session (`Hemos recibido tu mensaje`)
- Empty states neutros (`Aún no hay preguntas frecuentes cargadas`)
- Atributos técnicos (`data-plugin-options`, `class`, `style`)
- Fallbacks de `config(KEY, FALLBACK)` — si y solo si el seed siempre los sobreescribe

**Test**: ningún cliente debe ver "Compañía Digital", "John Doe", "Lorem ipsum", "Get a Quote", "calendly.com/lacompaniad", "porto@" ni texto en inglés sin `__()` o `config()`.

### 2. Paridad blade↔seed↔admin = 100%

```
Cada `site.welcome.X` que aparece en el blade frontend
  → debe estar en seeds/config-{slug}.json
  → debe tener un input correspondiente en admin/site-data/welcome/{demo}.blade.php
```

Lo mismo para about y contact. Si una key existe en blade pero NO en admin: el cliente no puede editarla = bug.

### 3. Brand defaults derivados del logo

Los 6 hex (`primary, secondary, tertiary, quaternary, dark, light`) deben coincidir con los colores reales del logo del producto. Si no hay logo propio → usar fallback BewPro (cyan teal #3FCFCF).

**Anti-patrón**: dejar la paleta cyberpunk Porto sin ajustar (`#00F0FF + #8A2BE2 + #0A0A1A`).

### 4. CTA Header en español

Nada de `"Get a Quote"`, `"Get Started"`, `"Donate"`, `"Contact"`. Siempre traducido al uso comercial argentino: `"Solicitar Presupuesto"`, `"Conversemos"`, `"Sumate"`, `"Contacto"`.

### 5. Módulos seeded con data demo coherente

Cada módulo activo del producto (services, projects, gallery, blog, faqs) debe:
- Tener su seed JSON con la **estructura que espera el seeder** (revisar):
  - `services-{slug}.json`: `service_categories` + `services`
  - `projects-{slug}.json`: `project_categories` + `project_tags` + `projects` (con `categories: [array]`)
  - `gallery-{slug}.json`: `gallery_categories` + `gallery_tags` + `galleries` (con `category` singular + `img`)
  - `blog-{slug}.json`: `categories` + `posts`
  - `faqs-{slug}.json`: `faqs_categories` + `faqs`
- Sembrar items reales coherentes con el espíritu del producto (no copy de marketing genérico para una ONG)
- Cantidades >= 3 (mínimo viable visual)

### 6. Demo CSS sin hex hardcoded brand-related

Las superficies (backgrounds, borders, accents) deben usar `var(--primary)`, `var(--secondary)`, `var(--tertiary)` — no hex literales. Solo se aceptan hex para neutros utilitarios (`#fff`, `#212529`, `#555`).

**Test**: si el cliente cambia su paleta desde `/brand-kit`, el sitio entero debe repintar runtime sin tocar archivos.

---

## Workflow paso a paso para certificar un producto

### Paso 1 — Verificar logo y derivar paleta
```bash
ls public/cd-project/assets/{slug}/  # ¿Existe asset pack propio?
# Si SÍ → leer logo.png para sacar hex
# Si NO → usar fallback bewpro (paleta cyan teal #3FCFCF)
```

### Paso 2 — Auditar core JSON
```bash
cat database/seeders/products/core/{slug}.json
# Validar:
#   - demo: existe en resources/views/modules/cd-base/frontend/demos/{demo}/
#   - tagline: en español, coherente con espíritu producto
#   - description: 1-2 oraciones en español
#   - cta_button.title: en español ("Sumate", "Conocé más", "Contacto")
#   - brand_defaults.colors: 6 hex coherentes con logo
#   - logo_pack: existe en assets/ (o fallback bewpro)
```

### Paso 3 — Verificar/crear seed config
```bash
ls database/seeders/products/core/seeds/config-{slug}.json
# Si falta → crearlo con TODAS las keys de los 3 blades (welcome/about/contact)
# Verificar paridad con:
python3 scripts/audit-product.py {slug}
```

### Paso 4 — Verificar/crear seeds de módulos
```bash
# Para cada módulo declarado en core.modules:
ls database/seeders/products/core/seeds/{module}-{slug}.json
# Validar estructura correcta (ver "Las 6 reglas duras" §5)
# Cantidad mínima: 3 items por módulo
```

### Paso 5 — Auditar blades frontend
```bash
python3 scripts/audit-product.py {slug}
# Detecta:
#   - Strings hardcoded legacy (Compañía Digital, John Doe, Lorem)
#   - CTAs en inglés
#   - Paridad blade↔seed↔admin
#   - calendly.com/lacompaniad fallbacks
```

### Paso 6 — Verificar admin forms
```bash
# Para cada tab (welcome, about, contact):
ls resources/views/admin/site-data/{tab}/{demo}.blade.php
# Validar:
#   - Existe el archivo
#   - Tiene input por cada key del seed
#   - Loops @for o @foreach correctamente expanden las keys dinámicas
```

### Paso 7 — Re-provisionar y smoke
```bash
php artisan bewpro:new admin@bewpro.com "Demo {Slug}" {slug} \
    --db=bp-demo-{slug} --fresh --no-email
sed -i '' "s/^DB_DATABASE=.*/DB_DATABASE=bp-demo-{slug}/" .env
php artisan cache:clear && php artisan view:clear

# Smoke 7-8 URLs
URL="http://127.0.0.1:8000"
for u in / /about /contact /services /blog /gallery /faqs; do
  printf "%s %s\n" "$(curl -s -o /dev/null -w '%{http_code}' $URL$u)" "$u"
done
# Esperado: 200 en todas
```

### Paso 8 — Documentar
```
docs/bewpro2.0/products/{slug}.md       — ficha de producto (~330 líneas)
docs/bewpro2.0/demos/{demo}.md          — ficha de demo (~150 líneas)
docs/bewpro2.0/products/README.md       — actualizar tabla de status
docs/bewpro2.0/demos/README.md          — actualizar tabla de status
```

### Paso 9 — Audit final automatizado
```bash
python3 scripts/audit-product.py {slug}
# Esperado: ✅ CERTIFICADO con 0 issues
```

---

## Estado actual del catálogo (2026-04-29)

| # | Producto | Demo | Audit | Doc |
|---|---|---|---|---|
| 1 | law-firm-digital | demo-law-firm-2 | ✅ CERTIFICADO | ✅ |
| 2 | art-design | demo-architecture-2 | ⏳ pendiente | ⏳ |
| 3 | construction | demo-construction | ✅ CERTIFICADO | ✅ |
| 4 | corporative | demo-marketing-1 | ✅ CERTIFICADO | ✅ |
| 5 | foundations-ong | demo-accounting-1 | ✅ CERTIFICADO | ✅ |
| 6 | personal-brand | demo-accounting-2 | ⏳ pendiente | ⏳ |
| 7 | real-estate | demo-real-estate | ⏳ pendiente | ⏳ |
| 8 | restaurant-bar | demo-restaurant | ⏳ pendiente | ⏳ |

---

## Particularidades por producto que NO podemos olvidar

Cada demo tiene **bloques únicos** que no comparten con otros. Hay que respetarlos al armar el seed y el admin form:

| Demo | Bloque único | Keys propias |
|---|---|---|
| demo-law-firm-2 | counters with explicit keys (no loop) | counter_years, counter_clients, counter_cases, counter_attorneys + labels |
| demo-construction | hero carousel con 2 slides hardcoded structure | hero_outline_top/bottom, hero_slide2_title |
| demo-marketing-1 | service items as textarea newline-separated | service_1_items, service_2_items, service_3_items + KPIs ×3 |
| demo-accounting-1 | counters as JSON array + author signature + Calendly CTA | counters[], author_name, author_location, image_1/2/3 |
| demo-architecture-2 | gallery-heavy con masonry grid | (pendiente analizar) |
| demo-accounting-2 | minimalista con timeline + values cards | (pendiente analizar) |
| demo-real-estate | módulo Tokko único + properties grid | (pendiente analizar) |
| demo-restaurant | módulo Menu único + sections con imagen alternada | (pendiente analizar) |

---

## Anti-patrones que DEBEN gatillar bug en el audit

```
🔴 Hex cyberpunk Porto sin ajustar: #00F0FF, #8A2BE2, #0A0A1A
🔴 CTA inglés: "Donate", "Get a Quote", "Get Started", "Learn More"
🔴 Personajes ficticios: "John Doe", "Anne Doe", "Monica Doe"
🔴 Marca legacy: "Compañía Digital", "Compania Digital"
🔴 URL externa hardcoded: "calendly.com/lacompaniad", "porto@", "lacompaniadigital.com"
🔴 Lorem ipsum SIN config() wrapping
🔴 Estructura seed incorrecta: "categories" + "image" en gallery (debe ser "gallery_categories" + "img")
🔴 Logo pack referenciado pero inexistente sin fallback bewpro/
```

---

## Cómo correr el audit

```bash
# Auditar 1 producto
python3 scripts/audit-product.py construction

# Auditar TODOS los certificados
python3 scripts/audit-product.py --all

# Output: ✅ CERTIFICADO o 🔴 BUGS DETECTADOS con lista detallada
```

El script verifica las 6 reglas duras automáticamente. Cualquier producto que pase el audit puede salir al mercado.
