# Proceso Q/A desde cero — Nuevo proyecto incoming

Este documento es el **runbook** para levantar un proyecto nuevo siguiendo el proceso de Q/A (Pasos 1, 2 y 3). Sirve para validar el flujo completo y para dar de alta el proyecto incoming.

## Método rápido: `bewpro:provision` (recomendado)

Un solo JSON + un solo comando = proyecto listo:

```bash
# 1. Copiar template y completar con datos del proyecto
cp database/seeders/project-data/provision-template.json database/seeders/project-data/provision-miproyecto.json

# 2. Colocar assets en public/cd-project/assets/ (logos, favicon, og-image...)

# 3. Ejecutar (crea DB, migra, configura todo, seedea contenido)
php artisan bewpro:provision database/seeders/project-data/provision-miproyecto.json

# 4. Apuntar .env al nuevo proyecto
# DB_DATABASE=bp_miproyecto
```

**Opciones:** `--dry-run` (ver plan sin ejecutar), `--skip-assets`, `--skip-content`, `--skip-migrate`.

**Ejemplo:** `provision-muma.json` (proyecto Muma como referencia completa).

---

## Método manual: paso a paso

Si preferís controlar cada fase por separado (editar 4 JSON + ejecutar seeders individuales), seguir el proceso detallado a continuación.

## Visión rápida

| Fase | Qué hacemos | Docs QA |
|------|-------------|---------|
| **0. Preparación** | DB + .env + datos del proyecto recopilados | — |
| **1. Brand Assets** | Archivos en `public/cd-project/assets/` + `assets.json` → AssetsSeeder → SiteDataSeeder | [01-brand-assets.md](01-brand-assets.md) |
| **2. Site Data + GA** | `site-data.json` + `analytics.json` → SiteDataSeeder + AnalyticsSeeder | [02-site-data.md](02-site-data.md) |
| **3. Módulos activos** | `cd-system.json` (demo + módulos) → CdSystemSeeder | [03-modulos-activos.md](03-modulos-activos.md) |
| **Ejecución** | Migrar (si DB nueva) + Project_Seeder (o seeders por paso) + cache | — |
| **Validación** | DB + front según criterios de cierre de cada paso | — |

Todo el sistema usa **un solo codebase**. Por proyecto cambian: base de datos (`.env` → `DB_DATABASE`), archivos en `public/cd-project/assets/` y los cuatro JSON en `database/seeders/project-data/`.

---

## Datos que necesitamos del proyecto incoming

Antes de empezar, conviene tener esto definido (podés completar la plantilla y usarla como checklist).

### Plantilla — Completar con el proyecto

```
PROYECTO: [Nombre del proyecto]
DEMO: [demo-restaurant | demo-law-firm-2 | demo-insurance | demo-business-consulting | …]
MÓDULOS ACTIVOS: [ej: menu, blog, faqs | o: services, faqs | etc.]
  Header: [qué módulos en el menú superior]
  Footer: [qué módulos en el footer]

BASE DE DATOS
  DB_DATABASE= [ej: bp-nuevocliente o nuevocliente_db]
  (Resto .env: DB_USERNAME, DB_PASSWORD según entorno)

IDENTIDAD Y SITIO
  name: [Nombre del sitio]
  tagline: [Eslogan]
  url: [URL pública, ej: www.ejemplo.com]
  author: [Autor o empresa]
  description: [Descripción corta / meta]

CONTACTO
  phone: [Teléfono]
  email: [Email]
  address: [Dirección]
  hours: [Horarios]

REDES SOCIALES (URL + active true/false)
  instagram, facebook, linkedin, youtube, whatsapp, tripadvisor, …

SEO
  keywords: [Palabras clave]
  description: [Meta description]
  title: [Título SEO]
  schema.type: [Organization | LocalBusiness | Person | …]

GOOGLE ANALYTICS
  tracking_id: [G-XXXXXXXXXX] o enabled: false

ASSETS (archivos que tendremos en public/cd-project/assets/)
  logo.png, logo-alternative.png, logo-2.png (según uso)
  favicon.ico, favicon.svg, apple-touch-icon.png
  og-image.png (1200x630), twitter-image.png (1200x630)
  (Otros: favicon-96x96.png, web-app-manifest si aplica)
```

Con eso se pueden rellenar los cuatro JSON y la carpeta de assets.

---

## Paso 0: Preparación (DB + .env)

1. **Crear la base de datos** del proyecto (ej. en MySQL: `CREATE DATABASE bp_nuevocliente;`).
2. **Configurar `.env`** (o copia para este proyecto):
   - `DB_DATABASE=nombre_de_la_bd`
   - `DB_USERNAME` y `DB_PASSWORD`
   - `APP_NAME="Nombre del proyecto"` (opcional pero recomendado)
   - No hace falta `GOOGLE_ANALYTICS_ID` en .env; GA va en `analytics.json` (Paso 2).
3. **Migraciones** (solo si la DB está vacía):
   ```bash
   php artisan migrate
   ```
   Si preferís partir de tablas limpias:
   ```bash
   php artisan migrate:fresh
   ```
   No ejecutar todavía los seeders si querés seguir el proceso paso a paso; si no, podés usar `migrate:fresh --seed` al final del Paso 3.

---

## Paso 1 — Brand Assets

1. **Poner en `public/cd-project/assets/`** los archivos de marca del proyecto (logo, favicon, og-image, twitter-image, etc.) con los nombres que vayan a referenciarse en los JSON.
2. **Alinear `database/seeders/project-data/assets.json`** con esos archivos: una entrada por asset con `path` = `cd-project/assets/nombre-del-archivo`, `type`, `name`.
3. **Alinear `site-data.json`** en las claves que referencian assets (`assets.main_logo`, `assets.favicon`, `seo.schema.logo`, `og.image`, `twitter.image`) para que usen las mismas rutas que `assets.json` (ej. `cd-project/assets/logo.png`). Así SiteDataSeeder podrá resolverlas contra la tabla `assets` después.
4. **Ejecutar:**
   ```bash
   php artisan db:seed --class=AssetsSeeder
   php artisan db:seed --class=SiteDataSeeder
   ```
   Orden obligatorio: primero AssetsSeeder (llena tabla `assets` y Cloudinary), después SiteDataSeeder (resuelve URLs en site_data).
5. **Validar:** Tabla `assets` con `secure_url` para los subidos; en front: logo, favicon, og/twitter correctos. Refrescar caché si hace falta: `php artisan cache:clear` y `php artisan view:clear`.

Detalle completo: [01-brand-assets.md](01-brand-assets.md).

---

## Paso 2 — Site Data + Analytics

1. **Completar `database/seeders/project-data/site-data.json`** con los datos del proyecto: name, tagline, url, contact, social_media, header (CTA si aplica), footer, seo, og, twitter, assets (rutas ya alineadas en Paso 1), auth, blog, modules (títulos por módulo). Las rutas de assets se resuelven a Cloudinary si ya corriste AssetsSeeder + SiteDataSeeder en Paso 1.
2. **Ejecutar** (si no lo hiciste en Paso 1 o cambiaste site-data):
   ```bash
   php artisan db:seed --class=SiteDataSeeder
   ```
3. **Completar `database/seeders/project-data/analytics.json`**: `google_analytics.enabled`, `tracking_id` (ej. G-XXXXXXXXXX), `track_in_local` según necesidad.
4. **Ejecutar:**
   ```bash
   php artisan db:seed --class=AnalyticsSeeder
   ```
5. **Refrescar caché** y validar en el sitio: nombre, contacto, footer, redes, meta tags y script de GA (si está habilitado).

Detalle: [02-site-data.md](02-site-data.md).

---

## Paso 3 — Módulos activos

1. **Definir** qué módulos lleva el producto (ej. menu, blog, faqs para Restaurant; services, faqs para otro).
2. **Editar `database/seeders/project-data/cd-system.json`**:
   - `theme.demo`: nombre del demo (ej. `demo-restaurant`).
   - `theme.skin`: normalmente `"auto"`.
   - `modules`: cada módulo con `active` true/false y `navigation.header` / `navigation.footer` según corresponda. Incluir los que existan en `config/cd-system.php` para no depender de defaults.
3. **Ejecutar:**
   ```bash
   php artisan db:seed --class=CdSystemSeeder
   ```
4. **(Opcional)** Si querés contenido inicial de los módulos activos (menú, blog, FAQs, etc.):
   ```bash
   php artisan db:seed --class=Project_Seeder
   ```
   Project_Seeder ya incluye CdSystemSeeder, AssetsSeeder, SiteDataSeeder, AnalyticsSeeder y luego solo los seeders de los módulos con `active: true`. Si hacés esto, no hace falta correr los seeders de los pasos 1 y 2 por separado (salvo que quieras ejecutar solo uno).
5. **Refrescar caché** y validar: demo correcto, header/footer con los enlaces de los módulos activos, rutas de módulos accesibles.

Detalle: [03-modulos-activos.md](03-modulos-activos.md).

---

## Ejecución en un solo golpe (tras tener todo listo)

Si ya tenés:

- DB creada y `.env` apuntando a ella,
- Archivos en `public/cd-project/assets/`,
- `assets.json`, `site-data.json`, `analytics.json` y `cd-system.json` completos para el proyecto,

podés hacer:

```bash
php artisan migrate:fresh --seed
```

Eso ejecuta todas las migraciones y el `DatabaseSeeder`, que incluye `Project_Seeder`. El orden interno de Project_Seeder es: CdSystemSeeder → AssetsSeeder → SiteDataSeeder → AnalyticsSeeder → ProjectsUsersSeeder → seeders de módulos activos → CdBaseSeeder.

Después:

```bash
php artisan cache:clear
php artisan view:clear
```

y validar en DB y en el front.

---

## Orden de seeders (referencia)

El orden que respeta el sistema es:

1. **CdSystemSeeder** — demo y módulos (cd-system.json)
2. **AssetsSeeder** — tabla assets + Cloudinary (assets.json)
3. **SiteDataSeeder** — site data y resolución de URLs de assets (site-data.json)
4. **AnalyticsSeeder** — GA (analytics.json)
5. **ProjectsUsersSeeder** — usuarios del proyecto
6. **Seeders de módulos activos** — MenuSeeder, BlogSeeder, FaqsSeeder, etc. (según cd-system.json)
7. **CdBaseSeeder** — contenido base

---

## Validación final (checklist)

- [ ] **Paso 1:** Logo, favicon, og/twitter en front; tabla `assets` con URLs; SiteDataSeeder ejecutado después de AssetsSeeder.
- [ ] **Paso 2:** Nombre, tagline, contacto, redes, footer y meta tags correctos; GA con el ID esperado si aplica.
- [ ] **Paso 3:** Demo correcto; header y footer muestran solo los módulos activos; rutas de módulos (ej. /menu, /blog, /faqs) responden.
- [ ] **DB:** phpMyAdmin (o cliente) muestra datos coherentes en `settings` y `assets`.
- [ ] **Caché:** `cache:clear` y `view:clear` ejecutados tras cambios.

---

## Escalar a otros proyectos

- **Mismo codebase:** Para otro cliente, otra DB (y otro .env), otra carpeta de assets (o reemplazar la de `public/cd-project/assets/`), y otros cuatro JSON. Luego migrar + seed + cache.
- **Otro producto (otro demo):** Cambiar solo `theme.demo` y los módulos en `cd-system.json`; el resto del flujo es igual.
- **Otros módulos:** Activar/desactivar en `cd-system.json` y, si hay contenido inicial, tener los JSON correspondientes (faqs.json, services.json, etc.) y dejar que Project_Seeder ejecute sus seeders.

Cuando tengas la plantilla del proyecto incoming completada (nombre, demo, módulos, contacto, redes, SEO, GA, lista de assets), se puede seguir este runbook paso a paso o usar el comando único al final.
