# Producto: Corporative

> **Estado:** ✅ Production-ready (validado 2026-04-29)
> **Tenant demo público:** `bp-demo-corporative`
> **Última auditoría:** 2026-04-29 — paridad admin↔front 100% (78/78 keys)
> **3er producto certificado** después de law-firm-digital y construction.

---

## 1. Identidad

| Campo | Valor |
|-------|-------|
| **Core slug** | `corporative` |
| **Demo asignado** | `demo-marketing-1` |
| **Tagline** | Soluciones Corporativas |
| **Descripción** | Empresa con servicios profesionales y soluciones a medida para cada cliente corporativo |
| **Schema.org type** | `Organization` |
| **Idioma SEO** | `es_AR` |
| **Demo de referencia** | https://distritotucuman.com |
| **Industria (alias-matrix)** | `corporate` |

---

## 2. Catálogo — shop products que mapean a este core

Definido en `database/seeders/products/catalog.json`:

| Shop slug | Nombre comercial |
|-----------|------------------|
| `corporative` | Corporative |
| `corporate-website` | Corporate Website |
| `corporate-brand` | Corporate Brand |

→ Cualquiera de estos 3 slugs en `bewpro:new` resuelve al mismo core preset.

---

## 3. Módulos activos

7 módulos totales (4 declarados + 3 auto-activos del sistema):

| Módulo | Header label | Header | Footer | Origen |
|--------|--------------|--------|--------|--------|
| `services` | "Servicios" | ✅ | ✅ | declarado |
| `projects` | "Proyectos" | ✅ | ✅ | declarado |
| `gallery` | "Galería" | ✅ | ✅ | declarado |
| `faqs` | — | ❌ | ✅ | declarado |
| `about` | "Nosotros" | ✅ | ✅ | auto (cd-base) |
| `contact` | "Contacto" | ✅ | ✅ | auto (cd-base) |
| `project-setup` | — | — | — | auto (sistema) |

Header titles overrides definidos en `seeds/config-corporative.json` → bloque `footer.navegacion_principal.*.title`.

---

## 4. Branding

### Brand defaults

Definidos en `database/seeders/products/core/corporative.json` → `brand_defaults`. **Paleta derivada del logo del producto** (badge estrella verde forest + wordmark verde menta pastel):

| Slot | Hex | Uso visual |
|------|-----|-----------|
| `primary` | `#0E5430` | **Verde forest oscuro** del badge estrella del logo — CTAs, highlights, KPIs, marker del mapa |
| `secondary` | `#9BD89F` | **Verde menta pastel** del wordmark "CORPORATIVE" — acentos, badges suaves |
| `tertiary` | `#E8F5EA` | Verde muy claro — superficies (borders, backgrounds, cards) |
| `quaternary` | `#062817` | Verde casi negro — overlays profundos |
| `dark` | `#212529` | Gris oscuro neutral — texto principal |
| `light` | `#FFFFFF` | Blanco — fondos, texto sobre dark/forest |

**Racional**: el logo del producto (`logo.png`, `logo-2.png`, `logo-alternative.png`) usa verde forest + verde menta pastel — paleta institucional limpia, transmite seriedad corporativa con acento contemporáneo. Misma estructura visual "badge estrella + wordmark" que construction (burgundy/rosa) para coherencia del catálogo BewPro.

`SkinColorService` deriva ~120 variables CSS de estos 6 hex (escalas hover/lighter/darker, opacities, etc.). El demo CSS usa `var(--tertiary)` (36 ocurrencias) y `var(--primary)` (25 ocurrencias) → cualquier `/brand-kit` del cliente repinta todo en runtime sin tocar archivos.

### Fonts

| Slot | Font | Pesos | Uso |
|------|------|-------|-----|
| `primary` | Lexend | 300, 400, 500, 600, 700 | Body + headings (sans-serif moderna, geometría limpia) |
| `secondary` | Lexend | 700, 800 | Big text del hero |
| `tertiary` | Open Sans | 400, 600 | Body alternativo, capítulos largos |

### Logo pack

Asignado vía `brand_defaults.logo_pack = "corporate-website"` → resuelve a `public/cd-project/assets/corporate-website/`.

| Asset | Archivo | Uso |
|-------|---------|-----|
| `main_logo` | `logo.png` | Header light |
| `main_logo_sticky` | `logo.png` | Header sticky |
| `footer_logo` | `logo-alternative.png` | Footer dark |
| `loader_logo` | `logo.png` | Loader inicial |
| `favicon` | `favicon.ico` + `favicon-96x96.png` + `favicon.svg` | Browser tab |
| `apple_touch_icon` | `apple-touch-icon.png` | iOS home |
| `manifest` | `web-app-manifest-192x192.png` + `web-app-manifest-512x512.png` | PWA |

---

## 5. Asset pack físico

`public/cd-project/assets/corporate-website/` — 9 archivos:

```
logo.png                       logo-alternative.png       logo-2.png
favicon.ico                    favicon.svg                favicon-96x96.png
apple-touch-icon.png           web-app-manifest-192x192.png  web-app-manifest-512x512.png
```

### Imágenes del demo (no editables, son del template)

`public/cd-project/img/demos/marketing-1/` — assets del demo Porto Marketing:

```
generic/generic-1.png ... generic-3.png        (transparent PNG concept)
generic/generic-4.jpg ... generic-10.jpg       (7 photos para projects/gallery/about)
concept/concept-1.png ... concept-13.jpg       (13 imágenes conceptuales)
svg/generic-2.svg, generic-3.svg               (SVG decorativos para hero highlights)
icons/icon-1.svg ...                           (íconos para about/services)
```

---

## 6. CTA del Header

Definido en `core/corporative.json`:

```json
{ "cta_button": { "title": "Contacto", "url": "/contact" } }
```

Editable post-entrega en `/site-data?tab=welcome` → "Botón CTA del Header".

---

## 7. Seeds de contenido

| Archivo | Contenido | Ubicación |
|---------|-----------|-----------|
| `services-corporative.json` | 4 servicios + 2 categorías (Consultoría Corporativa, Capacitación) | `seeds/` |
| `projects-corporative.json` | 7 proyectos + 3 categorías (Branding, Comunicación, Estrategia) + 2 tags | `seeds/` |
| `gallery-corporative.json` | 6 imágenes + 3 categorías (Trabajo, Equipo, Eventos) + 1 tag | `seeds/` |
| `faqs-corporative.json` | 10 FAQs + 3 categorías (La Empresa, Servicios, Proceso) | `seeds/` |
| `config-corporative.json` | welcome (38 keys) + about (26 keys) + contact (14 keys) + footer.navegacion_principal | `seeds/` |

Total contenido seedeado: **27 ítems** + **78 keys de config**.

---

## 8. Vistas blade del producto

### Frontend (visitante)

| Archivo | Líneas | Contenido |
|---------|--------|-----------|
| `resources/views/modules/cd-base/frontend/demos/demo-marketing-1/welcome.blade.php` | ~580 | Home: Hero con highlight HTML, KPIs counters (3), Marquees ×2, Services GSAP scroll-linked (3 categorías + items), Projects, Testimonials carousel, CTA final |
| `resources/views/modules/cd-base/frontend/demos/demo-marketing-1/about.blade.php` | ~330 | Page header, Intro hero, Counters dark, Parallax, Sticky scroll Cultura/Valores con paragraphs, Testimonials |
| `resources/views/modules/cd-base/frontend/demos/demo-marketing-1/contact.blade.php` | ~190 | Page header, Info Office 1 + Office 2 (opcional), Form + Map |

### Layout

| Archivo | Contenido |
|---------|-----------|
| `resources/views/layout/front/headers/demo-marketing-1.blade.php` | Header con logo + nav (5 items) + CTA "Contacto" |
| `resources/views/layout/front/footers/demo-marketing-1.blade.php` | Footer dark con logo + nav + datos contacto |
| `resources/views/layout/front/partials/page-header-marketing-1.blade.php` | Page header de about/contact con gradient + breadcrumb |

### Admin (`/site-data`)

| Archivo | Tab | Inputs |
|---------|-----|--------|
| `resources/views/admin/site-data/welcome/demo-marketing-1.blade.php` | Welcome | 38 inputs en 7 secciones (Hero, Marquees, KPIs ×3, Services ×3 + items textarea, Projects, Testimonials ×3, CTA final) |
| `resources/views/admin/site-data/about/demo-marketing-1.blade.php` | About | 26 inputs en 8 secciones (Page header, Intro, Parallax, Counters ×4, Gradient, Cultura paragraphs ×2, Valores paragraphs ×2, Testimonials ×3) |
| `resources/views/admin/site-data/contact/demo-marketing-1.blade.php` | Contact | 11 inputs propios + 3 vía `_common` (page header, Office 1, Office 2 opcional) |

---

## 9. Editabilidad — paridad admin↔front

| Tab admin | Keys del front | Inputs admin | Cobertura |
|-----------|---------------:|-------------:|-----------|
| `/site-data?tab=welcome` | 38 | 38 (incluye loops kpi×3, service×3, testimonials×3) | ✅ 100% |
| `/site-data?tab=about` | 26 | 26 (incluye loops counters×4, paragraphs×2+2, testimonials×3) | ✅ 100% |
| `/site-data?tab=contact` | 14 | 14 (11 propios + 3 `_common`) | ✅ 100% |
| `/site-data?tab=branding` | colors, fonts, logos | sistema base | ✅ |
| `/site-data?tab=seo` | meta tags, OG, Twitter | sistema base | ✅ |
| **TOTAL textos vista** | **78** | **78** | ✅ 0 gaps |

### Lo que el cliente puede personalizar post-entrega

- **Brand kit wizard** (`/brand-kit`): logos × 3 + 6 colores + 3 fonts → repinta toda la vista en runtime via CSS variables (incluye 36 superficies y 25 acentos del demo CSS)
- **`/site-data`**: 78 textos editables de welcome/about/contact + datos de contacto + CTA del header + SEO + redes sociales + analytics
- **CRUD admin** de cada módulo: `/admin/services`, `/admin/projects`, `/admin/gallery`, `/admin/faqs` (incluye títulos, descripciones, imágenes, íconos, categorías, tags)
- **Header navigation**: titles + orden + activo/inactivo en `/site-data?tab=footer-nav`
- **Service items dinámicos**: cada uno de los 3 servicios del home tiene un textarea con items uno-por-línea (no requiere agregar inputs CRUD)
- **Testimonios y Counters as arrays**: editables como secciones repeatable en el form admin

---

## 10. Comando de provisión

```bash
php artisan bewpro:new EMAIL "Nombre Empresa" corporative --db=bp-CLIENTE [--fresh] [--no-email]
```

Acepta cualquiera de los 3 shop slugs (`corporative`, `corporate-website`, `corporate-brand`) — todos resuelven al mismo core.

**Steps que ejecuta** (`ProvisionProject::doProvision()` + `ProvisionNew::handle()`):
1. Resuelve shop slug → core preset → escribe `users.json` temporal con admin
2. Conecta/crea DB del tenant
3. Migrate fresh (si `--fresh`) o incremental
4. Escribe `cd-system.theme.demo = demo-marketing-1` + módulos activos
5. Seed permissions/roles/users
6. Aplica `brand_defaults` → `site.theme.colors.*` (verde forest) + `cd-system.theme.fonts.*` (Lexend + Open Sans) + `brand_kit.core_defaults.*`
7. Escribe `site.*` data (welcome 38 + about 26 + contact 14 + header + seo)
8. Escribe analytics (vacío por defecto)
9. Sube asset pack a Cloudinary tenant + reescribe paths a URLs absolutas
10. Seed contenido módulos (services 4, projects 7, gallery 6, faqs 10)
11. Seed CdBase
12. Clear caches
13. Email credenciales (skip con `--no-email`)

---

## 11. Changelog del pulido (2026-04-29)

### Bugs específicos del producto arreglados

| Archivo | Bug | Fix |
|---------|-----|-----|
| `core/corporative.json` `brand_defaults` | Paleta tonos tierra/oliva (`#ADA181` arena + `#6C8366` verde oliva + grises) no coincidía con el logo del producto (badge verde forest + wordmark verde menta) → clash visual en cada provisión | Paleta realineada al logo: primary `#0E5430` forest + secondary `#9BD89F` menta + tertiary `#E8F5EA` + quaternary `#062817` |
| `core/corporative.json` `logo_pack` | Apuntaba a `corporative` (carpeta inexistente) | Corregido a `corporate-website` (carpeta real con 9 assets) |
| `core/corporative.json` CTA Header | `"Contact"` (en inglés) | `"Contacto"` |
| `core/corporative.json` tagline | `"Soluciones Empresariales"` | `"Soluciones Corporativas"` (alineado al espíritu del producto) |
| `seeds/config-corporative.json` | Solo 35 keys cargadas + en inglés + placeholders `[tu@email.com]`, `[TU CIUDAD]` → fallbacks Lorem en blade se renderizaban | Reescrito con 78 keys completas en español (welcome 38 + about 26 + contact 14 + footer.navegacion_principal) |
| `seeds/projects-corporative.json` | Estructura `categories`/`category` (singular) — el seeder espera `project_categories`/`project_tags`/`projects` con `categories: []` array → projects=0 en BD a pesar de tener 5 items en el seed | Reescrito con estructura correcta + 7 proyectos coherentes con marca corporativa + 3 categorías + 2 tags |
| `seeds/gallery-corporative.json` | Estructura `categories`/`category` + key `image` — el seeder espera `gallery_categories`/`gallery_tags`/`galleries` con `category` (singular) e `img` → gallery=0 en BD | Reescrito con estructura correcta + 6 imágenes en español + 3 categorías |
| `seeds/services-corporative.json` | Defaults en inglés (Strategy/Marketing/Design) | Servicios en español: Consultoría de Gestión, Capacitación Empresarial, Planificación Estratégica, Gestión del Cambio |
| `seeds/faqs-corporative.json` | Ya estaba bien estructurado y en español | Sin cambios |
| `welcome.blade.php` L218 (services GSAP) | `@foreach(config('site.welcome.service_X_items'))` — si llega como string newline-separated rompía con warning PHP | Helper `$normalizeItems` tolerante a string o array + defaults en español |
| `welcome.blade.php` L347 | `__('Learn More')` hardcoded en botón de cada servicio | `__('Conocé más')` |
| `welcome.blade.php` L499-501 (testimonials defaults) | "John Doe", "Robert Doe", "Monica Doe" + `'company' => 'Porto Theme'` (Fase 0 transversal) | Reemplazados por "Cliente Satisfecho" + `config('site.name')` |
| `about.blade.php` L169 | `Undefined array key "description"` cuando counters no tenían description → HTTP 500 | Wrap en `@if(!empty($counter['description']))` + `?? ''` en label |
| `about.blade.php` culture_paragraphs | Default array literal en inglés ("At our core, culture is the heart...") | Helper tolerante string/array + defaults en español |
| `about.blade.php` values_paragraphs | Default array literal en inglés con HTML `<strong>Integrity:</strong>...` | Helper tolerante string/array + defaults en español |
| `contact.blade.php` L33-36 | `__("Let's Go")` + `__('Ready to elevate your brand?')` + `__("We're excited to hear...learn more about our services")` (inglés hardcoded) | Leído de `site.contact.page_badge` / `page_heading` / `page_subtitle` con fallback en español |
| `admin/site-data/welcome/demo-marketing-1.blade.php` | 19 inputs (5 obsoletos `about_*`, faltaban kpi×3, service×3 items, marquee_text_2, cta_label, testimonials array) | Reescrito con 38 inputs en 7 secciones, alineado 1:1 con el blade welcome |
| `admin/site-data/about/demo-marketing-1.blade.php` | 9 inputs (faltaban page_title, breadcrumb×2, intro details, image_parallax, counters×4 array, paragraphs×2, image_culture/values, testimonials×3) | Reescrito con 26 inputs en 8 secciones |
| `admin/site-data/contact/demo-marketing-1.blade.php` | No existía — gap crítico de paridad | Creado con 14 inputs (page header + Office 1 + Office 2 opcional) |
| `template/css/demos/demo-marketing-1.css` ×31 | Hex hardcoded de paleta tierra/oliva (`#e8e5df` ×19, `#f8f8f6` ×3, `#f0ede8` ×3, `#e0dbd3`, `#f3f2ee`, `#f7f7FF`, `#8a7d5a` ×2) → no respondían a brand_kit del cliente | Reemplazados por `var(--tertiary)` (36 ocurrencias) y `var(--primary)` (25 ocurrencias) → repintan runtime con cualquier paleta |

### Bugs transversales aprovechados (ya resueltos en law-firm + Fase 0)

Corporative se beneficia de los fixes que se hicieron antes, sin trabajo adicional:
- `SkinColorService` greys scale invertida + `--default` ilegible → arreglado globalmente
- `ProvisionProject::buildSiteData` ignoraba subdir del producto → resuelto con `prefixAssetPath()`
- `AssetsSeeder` path canónico con subdir → resuelto
- `header-nav.blade.php` sin auto-fetch de service categories → arreglado
- **Fase 0**: cero referencias Porto/Okler/personajes ficticios en demo-marketing-1 (welcome.blade L499-501 ya despersonalizado)

---

## 12. QA checklist (verificado 2026-04-29)

```bash
# 1. Provisionar tenant fresco
php artisan bewpro:new admin@bewpro.com "Demo Corporative" corporative --db=bp-demo-corporative --fresh --no-email

# 2. Verificar Cloudinary
mysql bp-demo-corporative -e "SELECT \`key\`, value FROM settings WHERE \`key\` LIKE 'site.assets.%' AND value LIKE 'https://res.cloudinary.com%'"
# Esperado: 6+ filas (main_logo, footer_logo, loader_logo, favicon, apple_touch_icon, main_logo_sticky)

# 3. Verificar brand colors (verde forest)
mysql bp-demo-corporative -e "SELECT \`key\`, value FROM settings WHERE \`key\` LIKE 'site.theme.colors.%'"
# Esperado: primary #0E5430, secondary #9BD89F, tertiary #E8F5EA

# 4. Verificar conteo de seeds
mysql bp-demo-corporative -e "SELECT (SELECT COUNT(*) FROM services) AS services, (SELECT COUNT(*) FROM projects) AS projects, (SELECT COUNT(*) FROM gallery) AS gallery, (SELECT COUNT(*) FROM faqs) AS faqs"
# Esperado: services 4, projects 7, gallery 6, faqs 10

# 5. Smoke test front (7 URLs)
for url in / /about /contact /services /projects /gallery /faqs; do
  curl -s -o /dev/null -w "%{http_code} $url\n" http://demo-corporative.bewpro.com$url
done
# Esperado: 200 en las 7

# 6. Cero placeholders/inglés residual en home
curl -s http://demo-corporative.bewpro.com/ | grep -oE "Lorem ipsum|John Doe|Let's Go|Learn More|Impact Numbers|What We Do|Featured Projects"
# Esperado: vacío

# 7. KPIs counter renderizados (3)
curl -s http://demo-corporative.bewpro.com/ | grep -c 'data-plugin-counter'
# Esperado: 3+

# 8. Servicios scroll-linked (3 categorías con items)
curl -s http://demo-corporative.bewpro.com/ | grep -c 'gsap-content-marker'
# Esperado: 3

# 9. Header CTA "Contacto" presente
curl -s http://demo-corporative.bewpro.com/ | grep -c 'Contacto'
# Esperado: 5+ (header CTA + nav + footer)

# 10. Editabilidad admin↔front (paridad)
# Abrir /site-data?tab=welcome , ?tab=about , ?tab=contact y verificar que cada
# texto del front tiene un input correspondiente. Total esperado: 78 inputs.
```

---

## 13. Problemas conocidos / fuera de scope

- **String "View More Questions" en JavaScript de `/faqs`** — aparece en código JS dentro de la rama condicional `isRestaurant` (cd-base/faqs/frontend/index.blade.php L1072) que nunca se ejecuta para corporative. Es ruido de grep, no afecta render. No se elimina porque otros productos (restaurant-bar) lo usan.
- **Service items se editan como textarea newline-separated** — para mayor flexibilidad y para no requerir un CRUD complejo de items por servicio. El blade tolera tanto array (desde JSON) como string (desde textarea admin).
- **Counters de about con 4 elementos hardcoded** — el admin form expone los 4 slots pero si el cliente quiere más/menos, requiere editar el blade. Trade-off intencional para mantener UI simple.
- **Testimonials estáticos en welcome y about** (3 cada uno) — además existe el módulo `references` que toma prioridad si está poblado. El cliente puede cargar más testimonios reales desde `/admin/references`.
- **CTA del Header vive en el tab "Welcome" del admin** pero aparece en TODAS las páginas. Compartido con law-firm + construction. Refactor a tab "Header" propio queda pendiente.

---

## 14. Referencias cruzadas

- Demo: [`../demos/demo-marketing-1.md`](../demos/demo-marketing-1.md)
- Productos referencia: [`law-firm-digital.md`](law-firm-digital.md), [`construction.md`](construction.md)
- Bugs transversales beneficiados: ver [`law-firm-digital.md` §11](law-firm-digital.md#11-changelog-del-pulido-2026-04-27) "Bugs transversales arreglados"
- Despersonalización Porto: [`PORTO-DEPERSONALIZATION-AUDIT.md`](PORTO-DEPERSONALIZATION-AUDIT.md)
- Patrón de provisión: `docs/bewpro2.0/branding/pipeline-provision.md`
- Patrón de vistas: `docs/bewpro2.0/arquitectura-vistas-base.md` (este demo está en **Patrón A** — config-heavy, 78 keys de site.* + ViewComposer para módulos + service_items como textarea)
- Catálogo completo: `database/seeders/products/catalog.json`
- Checklist canónico: [`PRODUCT-CHECKLIST.md`](PRODUCT-CHECKLIST.md)
- Estado de productos: `docs/bewpro2.0/product-readiness/estado-productos.md`
