# Provisionamiento — Guía técnica completa

> Última actualización: 2026-04-10
> Cómo se crean sitios nuevos en el sistema BewPro.

---

## Resumen

El proceso de provisionar un proyecto tiene 3 pasos:

```
1. bewpro:new   → Crea la estructura (DB, demo, módulos, colores, admin)
2. bewpro:seed  → Carga el contenido del cliente (servicios, equipo, blog, FAQs, etc.)
3. El reseller verifica y entrega
```

---

## Paso 1: `bewpro:new` — Crear estructura

### Comando

```bash
php artisan bewpro:new EMAIL "NOMBRE" CORE [opciones]
```

### Argumentos

| Argumento | Requerido | Ejemplo |
|-----------|-----------|---------|
| `email` | Sí | `cliente@email.com` |
| `title` | Sí | `"Mi Negocio"` |
| `product` | Sí | `law-firm-digital` |

### Opciones principales

| Opción | Qué hace | Default |
|--------|----------|---------|
| `--db=nombre` | Nombre de la base de datos | `bp-{slug-del-titulo}` |
| `--colors="#HEX1,#HEX2,..."` | 6 colores de marca (primary,secondary,tertiary,quaternary,dark,light) | Colores del demo |
| `--modules=a,b,c` | Override de módulos del core | Los que define el core |
| `--clean` | Provisión limpia — sin contenido ni textos del preset | — |
| `--skip-assets` | No subir assets a Cloudinary | — |
| `--no-email` | No enviar email con credenciales | — |
| `--dry-run` | Ver el plan sin ejecutar | — |
| `--fresh` | Drop tables + re-migrate | — |
| `--password=xxx` | Password del admin | Auto-generado (12 chars) |

### Ejemplo para cada producto

```bash
# Law Firm
php artisan bewpro:new email "Nombre" law-firm-digital \
    --clean --colors="#1A325D,#B8960C,#F5F5F0,#6B7280,#0F1923,#FFFFFF" \
    --db=bp-xxx --skip-assets --no-email

# Construction
php artisan bewpro:new email "Nombre" construction-2 \
    --clean --colors="#0D47A1,#FF6F00,#F5F5F5,#616161,#1A1A2E,#FFFFFF" \
    --db=bp-xxx --skip-assets --no-email

# Corporative
php artisan bewpro:new email "Nombre" corporative \
    --clean --colors="#HEX,#HEX,#HEX,#HEX,#HEX,#HEX" \
    --db=bp-xxx --skip-assets --no-email

# Personal Brand
php artisan bewpro:new email "Nombre" personal-brand \
    --clean --colors="#HEX,#HEX,#HEX,#HEX,#HEX,#HEX" \
    --db=bp-xxx --skip-assets --no-email

# Real Estate
php artisan bewpro:new email "Nombre" real-estate \
    --clean --colors="#HEX,#HEX,#HEX,#HEX,#HEX,#HEX" \
    --db=bp-xxx --skip-assets --no-email

# Art & Design
php artisan bewpro:new email "Nombre" art-design \
    --clean --colors="#HEX,#HEX,#HEX,#HEX,#HEX,#HEX" \
    --db=bp-xxx --skip-assets --no-email

# Restaurant & Bar
php artisan bewpro:new email "Nombre" restaurant-bar \
    --clean --colors="#HEX,#HEX,#HEX,#HEX,#HEX,#HEX" \
    --db=bp-xxx --skip-assets --no-email

# Institutional
php artisan bewpro:new email "Nombre" foundations-ong \
    --clean --colors="#HEX,#HEX,#HEX,#HEX,#HEX,#HEX" \
    --db=bp-xxx --skip-assets --no-email
```

### Override de módulos

Si el cliente necesita módulos diferentes a los del core preset:

```bash
php artisan bewpro:new email "Nombre" bp-dinamic \
    --modules=team,blog,gallery \
    --clean --colors="#..." --db=bp-xxx
```

### Qué genera `--clean`

- DB con todas las tablas (migraciones)
- Demo configurado (header, footer, page-headers)
- Módulos activos según core o `--modules`
- Colores de marca en la DB (si `--colors`)
- Admin con credenciales
- **Cero contenido** — sin servicios, sin blog, sin FAQs, sin textos del preset
- **Cero textos de welcome/about/contact** del preset

---

## Paso 2: `bewpro:seed` — Cargar contenido

### Comando

```bash
php artisan bewpro:seed RUTA_JSON --db=NOMBRE_DB
```

### Opciones

| Opción | Qué hace |
|--------|----------|
| `--db=nombre` | Base de datos destino (no necesita cambiar .env) |
| `--dry-run` | Ver el plan sin ejecutar |

### Estructura del JSON de contenido

```json
{
    "site": {
        "name": "Nombre del negocio",
        "tagline": "Frase corta",
        "description": "Descripción de 1-2 oraciones",
        "contact": { "email": "", "phone": "", "address": "", "hours": "" },
        "social_media": { "instagram": { "url": "", "active": true }, ... },
        "welcome": { /* config keys del demo */ },
        "about": { /* config keys del demo */ },
        "seo": { "title": "", "description": "", "keywords": "" },
        "og": { "title": "", "description": "" }
    },
    "service_categories": [ { "name": "", "slug": "" } ],
    "services": [ { "title": "", "slug": "", "description": "", "category_slug": "" } ],
    "team_categories": [ { "name": "", "slug": "" } ],
    "team": [ { "name": "", "position": "", "description": "", "category_slug": "" } ],
    "blog_categories": [ { "name": "", "slug": "" } ],
    "blog": [ { "title": "", "slug": "", "content": "", "category_slug": "" } ],
    "faq_categories": [ { "name": "", "slug": "" } ],
    "faqs": [ { "question": "", "answer": "", "category_slug": "" } ],
    "reference_categories": [ { "name": "", "slug": "" } ],
    "references": [ { "name": "", "company": "", "description": "", "category_slug": "" } ],
    "project_categories": [ { "name": "", "slug": "" } ],
    "projects": [ { "title": "", "slug": "", "description": "", "category_slug": "" } ],
    "gallery_categories": [ { "name": "", "slug": "" } ],
    "gallery": [ { "title": "", "image": "", "category_slug": "" } ],
    "testimonial_categories": [ { "name": "", "slug": "" } ],
    "testimonials": [ { "name": "", "company": "", "description": "", "rating": 5 } ],
    "menu_categories": [ { "name": "", "slug": "" } ],
    "menu": [ { "name": "", "slug": "", "description": "", "price": 0 } ]
}
```

Solo se incluyen las secciones que el producto usa. Los módulos no incluidos se ignoran.

### Módulos soportados por `bewpro:seed`

| Módulo | JSON key | Categorías key |
|--------|----------|----------------|
| Services | `services` | `service_categories` |
| Team | `team` | `team_categories` |
| Blog | `blog` | `blog_categories` |
| FAQs | `faqs` | `faq_categories` |
| References | `references` | `reference_categories` |
| Projects | `projects` | `project_categories` |
| Gallery | `gallery` | `gallery_categories` |
| Testimonials | `testimonials` | `testimonial_categories` |
| Menu | `menu` | `menu_categories` |

---

## Los 8 productos market-ready

### Tabla de productos

| # | Producto | Core slug | Demo | Módulos | Template |
|---|----------|-----------|------|---------|----------|
| 1 | **Law Firm** | `law-firm-digital` | demo-law-firm-2 | services, team, blog, references, faqs | `template-law-firm.json` |
| 2 | **Construction** | `construction-2` | demo-construction-2 | services, projects, gallery, blog, faqs, testimonials, team | `template-construction.json` |
| 3 | **Corporative** | `corporative` | demo-marketing-1 | services, gallery, projects, faqs | `template-corporative.json` |
| 4 | **Personal Brand** | `personal-brand` | demo-accounting-2 | gallery, blog, projects, faqs | `template-personal-brand.json` |
| 5 | **Real Estate** | `real-estate` | demo-real-estate | services, gallery, blog, faqs, projects, team | `template-real-estate.json` |
| 6 | **Art & Design** | `art-design` | demo-architecture-2 | services, gallery, projects, blog, faqs | `template-art-design.json` |
| 7 | **Restaurant & Bar** | `restaurant-bar` | demo-restaurant | menu, gallery, blog, faqs, testimonials | `template-restaurant.json` |
| 8 | **Institutional** | `foundations-ong` | demo-accounting-1 | services, blog, gallery, faqs | `template-institutional.json` |

### Colores sugeridos por rubro

| Producto | Primary | Secondary | Estilo |
|----------|---------|-----------|--------|
| Law Firm | `#1A325D` | `#B8960C` | Azul institucional + dorado |
| Construction | `#0D47A1` | `#FF6F00` | Azul + naranja industrial |
| Corporative | Según marca | Según marca | Adaptable |
| Personal Brand | Según marca | Según marca | Adaptable |
| Real Estate | `#1C5FA8` | `#00A4F2` | Azul confianza |
| Art & Design | `#223A70` | `#C8A897` | Azul + beige elegante |
| Restaurant | `#8B0000` | `#556B2F` | Bordo + verde oliva |
| Institutional | `#00F0FF` | `#0A0A1A` | Cyan + negro |

### Templates de contenido

Ubicación: `database/seeders/project-data/templates/`

Cada template es un JSON con:
- Todos los config keys del demo (welcome, about, contact, SEO) con `[PLACEHOLDERS]`
- Todas las secciones de módulos con registros de ejemplo
- Listo para ser completado por un reseller o por IA

---

## Flujo completo end-to-end

### Opción A: Via form-reseller (recomendado)

> Disponible en `/form-reseller` del admin panel. Requiere login como System Admin.

1. **Solicitar producto** en `/form-reseller`
   - Nombre del negocio/cliente
   - Email de contacto (opcional)
   - Elegir demo + core (ej: demo-law-firm-2 / law-firm-digital)
   - Marcar "Provisión limpia" (recomendado)
   - Colores de marca (opcional)
   - Submit → recibirás email de confirmación

2. **Esperar provisión** (~5-10 minutos)
   - BewPro provisiona automáticamente
   - Recibirás email con credenciales + URL + deadline de onboarding

3. **Cargar contenido del cliente**
   ```bash
   # Copiar template y completar con datos reales
   cp database/seeders/project-data/templates/template-law-firm.json \
      database/seeders/project-data/content-mi-cliente.json

   # Editar el JSON reemplazando [PLACEHOLDERS] con datos reales

   # Cargar contenido
   php artisan bewpro:seed database/seeders/project-data/content-mi-cliente.json \
       --db=bp-mi-cliente
   ```

4. **Verificar y entregar**
   - Revisar el sitio en la URL pública
   - Capacitar al cliente en el uso del admin
   - Asegurar suscripción activa antes del deadline (15 días)

### Opción B: Via línea de comandos (avanzado)

```bash
# 1. Provisionar estructura limpia
php artisan bewpro:new email@cliente.com "Nombre Cliente" law-firm-digital \
    --clean \
    --colors="#1A325D,#B8960C,#F5F5F0,#6B7280,#0F1923,#FFFFFF" \
    --db=bp-mi-cliente \
    --skip-assets \
    --no-email

# 2. Cargar contenido
php artisan bewpro:seed database/seeders/project-data/content-mi-cliente.json \
    --db=bp-mi-cliente

# 3. Verificar en el admin
# Cambiar .env → DB_DATABASE=bp-mi-cliente
# Abrir http://127.0.0.1:8000

# 4. Entregar al cliente
# → URL + credenciales + guía de uso
```

### Para self-service (futuro)

```
1. Cliente elige producto en bewpro.com
2. Paga con Stripe
3. Sistema ejecuta bewpro:new automáticamente
4. Cliente recibe email con credenciales
5. Cliente carga contenido desde el admin
```

---

## Período de gracia

- Al provisionar, BewPro asigna **15 días de gracia**
- Dentro de ese plazo, CD debe completar el onboarding y asegurar suscripción activa
- Si vence sin suscripción → el sitio se **pausa automáticamente**
- CD recibe email de aviso cuando la gracia está por vencer
- El sitio se reactiva automáticamente al activar la suscripción

---

## Pruebas realizadas

| Proyecto | Producto | Resultado | Records |
|----------|----------|-----------|---------|
| Estudio Andreozzi | Law Firm | ✅ | 112 |
| Parajón & Asociados | Law Firm | ✅ | 108 |
| RIICA Constructora | Construction | ✅ | 73 |
| Dr. Calabró | Personal Brand | ✅ | 71 |
| Indiana Peugeot | Custom (concierge + modules) | ✅ | Clean |
| Olympus Group | Custom (bp-dinamic + modules) | ✅ | Clean |
| Didi | Personal Brand | ✅ | Clean |
| TPI Abogados | Law Firm | ✅ | Clean |

---

## Referencia rápida: producto → comando

```bash
# Law Firm
bewpro:new email "Nombre" law-firm-digital --clean --colors="..." --db=bp-xxx

# Construction
bewpro:new email "Nombre" construction-2 --clean --colors="..." --db=bp-xxx

# Corporative
bewpro:new email "Nombre" corporative --clean --colors="..." --db=bp-xxx

# Personal Brand
bewpro:new email "Nombre" personal-brand --clean --colors="..." --db=bp-xxx

# Real Estate
bewpro:new email "Nombre" real-estate --clean --colors="..." --db=bp-xxx

# Art & Design
bewpro:new email "Nombre" art-design --clean --colors="..." --db=bp-xxx

# Restaurant & Bar
bewpro:new email "Nombre" restaurant-bar --clean --colors="..." --db=bp-xxx

# Institutional
bewpro:new email "Nombre" foundations-ong --clean --colors="..." --db=bp-xxx
```

Todos aceptan `--modules=...` para override y `--skip-assets --no-email` para local.

---

## Comandos auxiliares

```bash
# Ver cores disponibles
php artisan bewpro:products

# Ver variantes de un core
php artisan bewpro:products law-firm-digital

# Ver todos los shop products
php artisan bewpro:products --all

# Seed con dry-run
php artisan bewpro:seed content.json --db=bp-xxx --dry-run
```

---

## Troubleshooting

| Problema | Causa | Solución |
|----------|-------|----------|
| "Core not found" | Slug incorrecto | Verificar con `bewpro:products` |
| "Column cannot be null" | Campo requerido sin valor en el JSON | Agregar valor o string vacío |
| "Duplicate entry" | Slug repetido en la misma tabla | Usar slugs únicos en el JSON |
| Contenido del preset aparece | No usó `--clean` | Reprovisionar con `--clean --fresh` |
| Colores no se aplican | Falta `--colors` o formato incorrecto | 6 HEX separados por coma: `"#HEX1,#HEX2,..."` |
| Seed en DB equivocada | No usó `--db` en `bewpro:seed` | Agregar `--db=bp-xxx` |
