# Producto: Foundations / ONG

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

---

## 1. Identidad

| Campo | Valor |
|-------|-------|
| **Core slug** | `foundations-ong` |
| **Demo asignado** | `demo-accounting-1` |
| **Tagline** | Fundación con Impacto Social |
| **Descripción** | Organización dedicada al desarrollo comunitario, programas sociales y el impacto positivo en comunidades vulnerables |
| **Schema.org type** | `NGO` |
| **Idioma SEO** | `es_AR` |
| **Demo de referencia** | https://fundacionchaka.org |
| **Industria (alias-matrix)** | `nonprofit` |

---

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

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

| Shop slug | Nombre comercial |
|-----------|------------------|
| `foundations-ong` | Foundation / NGO |
| `fundacion` | Fundación |
| `ong` | ONG |

→ 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` | "Programas" | ✅ | ✅ | declarado |
| `blog` | "Novedades" | ✅ | ✅ | declarado |
| `gallery` | — | ❌ | ✅ | declarado |
| `faqs` | — | ❌ | ✅ | declarado |
| `about` | "Nosotros" | ✅ | ✅ | auto (cd-base) |
| `contact` | "Contacto" | ✅ | ✅ | auto (cd-base) |
| `project-setup` | — | — | — | auto (sistema) |

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

---

## 4. Branding

### Brand defaults

Definidos en `database/seeders/products/core/foundations-ong.json` → `brand_defaults`. **Paleta derivada del logo BewPro** (fallback de marca, ya que este producto no tiene asset pack propio):

| Slot | Hex | Uso visual |
|------|-----|-----------|
| `primary` | `#3FCFCF` | **Cyan teal** del logo BewPro — CTAs, contadores, highlights, links |
| `secondary` | `#1F4E5F` | **Cyan oscuro** complementario — acentos profundos, títulos |
| `tertiary` | `#E0F7F8` | Cyan muy claro — superficies (cards, fondos suaves) |
| `quaternary` | `#0E2730` | Cyan ultra dark casi negro — overlays profundos |
| `dark` | `#212529` | Gris oscuro neutral — texto principal |
| `light` | `#FFFFFF` | Blanco — fondos, texto sobre dark |

**Racional**: el producto no tiene asset pack propio → el sistema cae al fallback `bewpro/` (logo cyan/teal del paraguas BewPro). La paleta del core se deriva de ese logo para mantener coherencia visual hasta que el cliente personalice su identidad desde `/brand-kit`.

**Antes del fix (paleta cyberpunk Porto)**: `#00F0FF` cyan eléctrico + `#0A0A1A` casi negro + `#8A2BE2` púrpura — completamente desalineada con el espíritu de fundación/ONG.

`SkinColorService` deriva ~120 variables CSS de estos 6 hex. El demo CSS de `demo-accounting-1` ya viene limpio (solo 4 hex hardcoded, todos neutros).

### Fonts

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

### Logo pack

Asignado vía `brand_defaults.logo_pack = "foundations-ong"`. **Como ese pack no existe físicamente**, el `ProvisionAssetResolver` cae al fallback `bewpro/` (resuelto vía `app/Services/ProvisionAssetResolver.php`):

```
Cadena de prioridades:
1. demos/demo-accounting-1            → no existe
2. demo-accounting-1                  → no existe
3. foundations-ong (core slug)        → no existe
4. {product-slug} y aliases           → no existe
5. bewpro                             ← ✅ activo (branded fallback)
6. raíz plana                         (último recurso)
```

| Asset | Archivo (de bewpro/) | Uso |
|-------|---------|-----|
| `main_logo` | `logo.png` | Header light (logo BewPro cyan) |
| `main_logo_sticky` | `logo-alternative.png` | Header sticky |
| `footer_logo` | `logo.png` | Footer dark |
| `loader_logo` | `logo-2.png` | Loader inicial |
| `favicon` | `favicon.png` + `favicon.ico` + `favicon.svg` | Browser tab |
| `apple_touch_icon` | `apple-touch-icon.png` | iOS home |
| `manifest` | `web-app-manifest-192x192.png` + `web-app-manifest-512x512.png` + `site.webmanifest` | PWA |

---

## 5. Asset pack físico

**No tiene pack propio.** Hereda de `public/cd-project/assets/bewpro/` (11 archivos):

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

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

`public/cd-project/img/demos/accounting-1/` — assets del demo Porto Accounting:

```
generic/generic-1.jpg ... generic-12.jpg     (12 photos genéricas)
generic/generic-1-{4be296,61CCEF,DABDA9...}.jpg  (variantes con tinte de color para concept)
about/, blog/, bg/, icons/, process/, projects/, services/, slides/  (carpetas categorizadas)
logo.png                                       (logo placeholder demo)
```

---

## 6. CTA del Header

Definido en `core/foundations-ong.json`:

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

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

**Antes del fix**: `"Donate"` (en inglés). Decisión de copy: "Sumate" en lugar de "Donar" porque incluye voluntariado + donación + alianza institucional, no solo aporte monetario.

---

## 7. Seeds de contenido

| Archivo | Contenido | Ubicación |
|---------|-----------|-----------|
| `services-foundations-ong.json` | 4 programas + 2 categorías | `seeds/` |
| `blog-foundations-ong.json` | 3 posts + categorías | `seeds/` |
| `gallery-foundations-ong.json` | 6 imágenes + 3 categorías + 1 tag | `seeds/` |
| `faqs-foundations-ong.json` | FAQs + categorías | `seeds/` |
| `config-foundations-ong.json` | welcome (24 keys) + about (14 keys) + contact (25 keys) + footer.navegacion_principal | `seeds/` |

Total contenido seedeado: **23 ítems** + **63 keys de config**.

---

## 8. Vistas blade del producto

### Frontend (visitante)

| Archivo | Líneas | Contenido |
|---------|--------|-----------|
| `resources/views/modules/cd-base/frontend/demos/demo-accounting-1/welcome.blade.php` | ~480 | Home: Hero limpio con CTAs duales, Features (3 pilares), Programas, Portfolio, FAQs section, CTA final + WhatsApp |
| `resources/views/modules/cd-base/frontend/demos/demo-accounting-1/about.blade.php` | ~280 | Page header, Story (4 párrafos), Approach (3 pilares), CTA + WhatsApp |
| `resources/views/modules/cd-base/frontend/demos/demo-accounting-1/contact.blade.php` | ~360 | Page header, Phone+Email+Address+Hours, Calendly embed, Form completo con subjects dropdown, sidebar con WhatsApp |

### Layout

| Archivo | Contenido |
|---------|-----------|
| `resources/views/layout/front/headers/demo-accounting-1.blade.php` | Header limpio con logo + nav (5 items) + CTA "Sumate" |
| `resources/views/layout/front/footers/demo-accounting-1.blade.php` | Footer con logo + nav + datos contacto |
| `resources/views/layout/front/partials/page-header-accounting-1.blade.php` | Page header limpio (typography + breadcrumb sin overlay agresivo) |

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

| Archivo | Tab | Inputs |
|---------|-----|--------|
| `resources/views/admin/site-data/welcome/demo-accounting-1.blade.php` | Welcome | 24 inputs (hero CTAs, features, services, portfolio, faqs, CTA final) |
| `resources/views/admin/site-data/about/demo-accounting-1.blade.php` | About | 14 inputs (page heading, 4 stories, approach 3 pilares, CTA) |
| `resources/views/admin/site-data/contact/demo-accounting-1.blade.php` | Contact | 22 inputs propios + 3 vía `_common` (phone, email, address) |

---

## 9. Editabilidad — paridad admin↔front

| Tab admin | Keys del front | Inputs admin | Cobertura |
|-----------|---------------:|-------------:|-----------|
| `/site-data?tab=welcome` | 24 | 24 (incluye features array, faqs section, CTA dual) | ✅ 100% |
| `/site-data?tab=about` | 14 | 14 (story×4 + approach×3) | ✅ 100% |
| `/site-data?tab=contact` | 25 | 25 (22 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** | **63** | **63** | ✅ 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 reemplazar el logo BewPro fallback por el suyo propio)
- **`/site-data`**: 63 textos editables de welcome/about/contact + datos de contacto + CTA del header + SEO + redes sociales + analytics
- **CRUD admin** de cada módulo: `/admin/services` (programas), `/admin/blog` (novedades), `/admin/gallery`, `/admin/faqs`
- **Header navigation**: titles + orden + activo/inactivo en `/site-data?tab=footer-nav`
- **Calendly embed**: heading + subtitle + button label editables (la URL del embed se setea aparte)
- **Subjects del form de contacto**: array editable directamente desde admin (cada opción del dropdown del form)

---

## 10. Comando de provisión

```bash
php artisan bewpro:new EMAIL "Nombre Fundación" foundations-ong --db=bp-CLIENTE [--fresh] [--no-email]
```

Acepta cualquiera de los 3 shop slugs (`foundations-ong`, `fundacion`, `ong`) — 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-accounting-1` + módulos activos
5. Seed permissions/roles/users
6. Aplica `brand_defaults` → `site.theme.colors.*` (cyan teal) + `cd-system.theme.fonts.*` (Lexend + Open Sans) + `brand_kit.core_defaults.*`
7. Escribe `site.*` data (welcome 24 + about 14 + contact 25 + header + seo)
8. Escribe analytics (vacío por defecto)
9. **`ProvisionAssetResolver` detecta que no existe `foundations-ong/` → cae al fallback `bewpro/`** y sube los 11 archivos del pack BewPro a Cloudinary del tenant
10. Seed contenido módulos (services 4, blog 3, gallery 6, faqs 10)
11. Seed CdBase
12. Clear caches
13. Email credenciales (skip con `--no-email`)

Log de evidencia del fallback (durante step 9):
```
[INFO] ProvisionAssetResolver: usando fallback bewpro/
       demo: demo-accounting-1
       core: foundations-ong
       product: foundations-ong
       tried_candidates: [demos/demo-accounting-1, demo-accounting-1, foundations-ong, foundations-ong]
```

---

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

### Bugs específicos del producto arreglados

| Archivo | Bug | Fix |
|---------|-----|-----|
| `core/foundations-ong.json` `brand_defaults` | Paleta cyberpunk Porto (`#00F0FF` cyan eléctrico + `#0A0A1A` casi negro + `#8A2BE2` púrpura + `#A0A0B0` gris violáceo) — completamente fuera del espíritu fundación/ONG | Paleta derivada del logo BewPro (cyan teal): primary `#3FCFCF` + secondary `#1F4E5F` + tertiary `#E0F7F8` + quaternary `#0E2730` |
| `core/foundations-ong.json` CTA Header | `"Donate"` (en inglés) | `"Sumate"` (incluye voluntariado + donación + alianza, no solo aporte monetario) |
| `core/foundations-ong.json` tagline | `"Organización Social"` (genérico) | `"Fundación con Impacto Social"` |
| `core/foundations-ong.json` description | Genérico de un párrafo | Expandido con foco en programas, comunidades vulnerables y desarrollo |
| `core/foundations-ong.json` SEO keywords | `"fundación, ONG, organización social..."` | Agregado `"donaciones"` y `"voluntariado"` |
| Falta `seeds/config-foundations-ong.json` | Sin seed → 53 keys fallback en blade (Lorem/inglés) | Creado con 63 keys completas en español (24 welcome + 14 about + 25 contact + footer.navegacion_principal) |
| `seeds/gallery-foundations-ong.json` | Estructura `categories`/`images` — el seeder espera `gallery_categories`/`gallery_tags`/`galleries` → gallery=0 en BD | Reescrito con estructura correcta + 6 imágenes en español + 3 categorías + 1 tag |
| `app/Services/ProvisionAssetResolver.php` | El asset pack `foundations-ong` no existía → caía a la raíz plana donde estaban los logos de "Olympus Group" (cliente histórico) | Implementado fallback chain `bewpro/` antes de la raíz: cualquier producto sin pack propio recibe identidad BewPro hasta que el cliente personalice |
| `public/cd-project/assets/bewpro/` | No existía como pack | Creado con 11 archivos descargados de Cloudinary del tenant `bp-bewpro` (logo cyan teal de BewPro) + favicon variantes + manifests |

### Mejoras transversales aprovechadas (Fase 0 + previos)

- Cero referencias Porto/Okler/personajes ficticios en demo-accounting-1 (Fase 0 transversal)
- `SkinColorService` deriva ~120 vars CSS desde los 6 hex del brand_defaults
- `ProvisionAssetResolver` con cadena de prioridades que ahora incluye `bewpro` antes de la raíz plana

---

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

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

# 2. Verificar Cloudinary (assets BewPro como fallback)
mysql bp-demo-foundations-ong -e "SELECT \`key\`, value FROM settings WHERE \`key\` LIKE 'site.assets.%' AND value LIKE 'https://res.cloudinary.com%'"
# Esperado: 6+ filas, todas apuntando al folder demo-foundations-ong/assets con imágenes BewPro cyan

# 3. Verificar log del fallback bewpro
tail -50 storage/logs/laravel.log | grep "fallback bewpro"
# Esperado: "ProvisionAssetResolver: usando fallback bewpro/"

# 4. Verificar brand colors (cyan teal)
mysql bp-demo-foundations-ong -e "SELECT \`key\`, value FROM settings WHERE \`key\` LIKE 'site.theme.colors.%'"
# Esperado: primary #3FCFCF, secondary #1F4E5F, tertiary #E0F7F8

# 5. Verificar conteo de seeds
mysql bp-demo-foundations-ong -e "SELECT (SELECT COUNT(*) FROM services) AS services, (SELECT COUNT(*) FROM posts) AS posts, (SELECT COUNT(*) FROM gallery) AS gallery, (SELECT COUNT(*) FROM faqs) AS faqs"
# Esperado: services 4, posts 3, gallery 6, faqs 10

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

# 7. Cero placeholders/inglés residual
curl -s http://demo-foundations-ong.bewpro.com/ | grep -oE "Lorem ipsum|John Doe|Donate|Let's Go|Learn More"
# Esperado: vacío

# 8. Header CTA "Sumate" presente
curl -s http://demo-foundations-ong.bewpro.com/ | grep -c 'Sumate'
# Esperado: 1+

# 9. Editabilidad admin↔front (paridad 63/63)
# Abrir /site-data?tab=welcome , ?tab=about , ?tab=contact y verificar que cada
# texto del front tiene un input correspondiente.

# 10. Logo BewPro fallback presente (cliente puede reemplazarlo desde /brand-kit)
curl -s http://demo-foundations-ong.bewpro.com/ | grep -oE 'res\.cloudinary\.com[^"]+logo[^"]+\.png'
# Esperado: URLs apuntando al folder demo-foundations-ong/assets con imágenes BewPro
```

---

## 13. Problemas conocidos / fuera de scope

- **String "View More Questions" en JS** de cd-base/faqs/frontend/index.blade.php L1072 — código muerto en este demo (rama `isRestaurant` no se ejecuta). Ruido de grep, no afecta render.
- **Asset pack propio pendiente** — el producto usa el fallback BewPro hasta que se diseñe un pack visual específico para fundaciones (verde social + dorado, o azul institucional + naranja cálido — ver decisión pendiente con el equipo de marca). El cliente final puede personalizar desde `/brand-kit` sin esperar.
- **Calendly embed sin URL configurada por defecto** — el cliente debe completar la URL del embed desde admin tab `welcome` (campo aparte del texto). Trade-off intencional para no hardcodear cuenta de Calendly de demo.
- **CTA del Header vive en el tab "Welcome" del admin** — compartido con todos los productos. Refactor a tab "Header" propio queda pendiente.
- **Subjects del form de contacto como array editable** — funciona como string newline-separated o array desde JSON. El blade usa `is_array($subjects) ? $subjects : explode("\n", $subjects)` para tolerar ambos formatos (mismo patrón que service_items en marketing-1).

---

## 14. Referencias cruzadas

- Demo: [`../demos/demo-accounting-1.md`](../demos/demo-accounting-1.md)
- Productos referencia: [`law-firm-digital.md`](law-firm-digital.md), [`construction.md`](construction.md), [`corporative.md`](corporative.md)
- **Innovación clave de este producto**: implementación del fallback `bewpro/` en `ProvisionAssetResolver` — ahora es transversal a todo el catálogo
- Despersonalización Porto: [`PORTO-DEPERSONALIZATION-AUDIT.md`](PORTO-DEPERSONALIZATION-AUDIT.md)
- Patrón de provisión: `docs/bewpro2.0/branding/pipeline-provision.md`
- 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`
