# Panel Reseller (`/reseller`)

> Panel del partner que revende sitios BewPro con su propia marca/precio. Live en `bewpro.com/reseller`.
> Estado: ✅ Production-ready (12/13 ejes aplicables del standard).
>
> Última actualización: 2026-05-12

---

## Quién es el usuario

Partner/agencia que vende sitios a sus propios clientes finales. BewPro le da:
- Catálogo de cores con su precio mayorista
- Tooling para provisionar (form + JSON template)
- Dashboard cross-cliente
- Revenue split (cobra Stripe → BewPro → partner)

**Usuario tipo:** agencia digital, freelance pesado, estudio de comunicación, consultor independiente con cartera de PyMEs.

**Lo que espera:**
- Provisión rápida sin tocar código
- Visibilidad de cartera (clientes + churn + MRR)
- Onboarding claro al programa
- Soporte priorizado de partner

---

## Rutas implementadas

| Ruta | Método | Vista | Propósito |
|------|--------|-------|-----------|
| `/reseller` | GET | `dashboard.blade.php` | KPIs + recent projects + onboarding card |
| `/reseller/customers` | GET | `customers.blade.php` | Lista de clientes del reseller |
| `/reseller/projects` | GET | `projects.blade.php` | Lista filtrable de proyectos provisionados |
| `/reseller/projects/new` | GET | `projects/create.blade.php` | Form de provisión |
| `/reseller/projects` | POST | — | Crear proyecto (Airtable + TenantProject + JSON stash) |
| `/reseller/projects/template/{core}` | GET | (JSON binario) | Descarga JSON modelo del core |
| `/reseller/activity` | GET | `activity.blade.php` | Churn rate + distribución por status |

Middleware: `ensure.main.site` + `auth` + `verified` (no role gate explícito — el controller filtra por `parent_reseller_id == auth()->id()`).

---

## Features clave

### Dashboard (`/reseller`)

- **Onboarding card** 3-pasos (Catálogo / Comprar primer proyecto / Soporte de partners) — visible para resellers fresh sin clientes.
- **Stats cards** (4): Clientes · Proyectos totales · Activos · MRR neto.
- **Quick actions card**: Provisionar nuevo proyecto · Marketplace · Mis clientes · Mi Actividad.
- **Recent projects** table: últimos 5 con badge + progress bar si en provisión.

### Provisión de proyectos nuevos (`/reseller/projects/new`)

- Form fields: customer email, project name, subdomain, core dropdown, JSON content opcional.
- Sub-flow: descarga del JSON template del core (CoreTemplateBuilder genera dinámicamente desde schemas).
- On submit:
  - Crea Airtable Project (Pipeline_Status=Required) + linkea Product al core.
  - Crea TenantProject local (`parent_reseller_id = auth()->id()`).
  - Si hay JSON → stash en `storage/app/reseller-imports/{record_id}.json`.
  - Notif Slack: "Nueva compra" + "Provisioning solicitado".
  - SweetAlert + redirect a `/reseller/projects`.

### Listado proyectos (`/reseller/projects`)

- Filtros: search (nombre/dominio/email cliente) + status dropdown (active, on_development, required, paused, failed).
- Paginación 30/página con `withQueryString()`.
- Botón "Sumar proyecto" → catálogo.
- Empty states tipados (sin proyectos vs sin matches con filtro).

### Listado clientes (`/reseller/customers`)

- Lista de Users con `parent_reseller_id == auth()->id()`.
- Search por email/nombre, paginación.
- Por cada cliente: proyectos count, last activity.

### Mi Actividad (`/reseller/activity`)

- Volumen total (proyectos provisionados).
- Distribución por status (active/on_development/paused/failed) con barras de progreso.
- Churn rate: perdidos / (activos + perdidos).
- NO muestra revenue USD (por privacidad del partner, no es su data principal — el revenue real lo ve en Stripe/Airtable interno).

---

## Standard de Madurez — checklist por eje

| Eje | Status | Notas |
|-----|--------|-------|
| 1. Estructura base | ✅ | x-base-layout + x-admin-header + breadcrumbs en todas |
| 2. Onboarding | ✅ | Welcome 3-pasos hideable, ancho del card adecuado |
| 3. Stats top | ✅ | 4 cards responsivos col-6 col-md-3 |
| 4. Filtros | ✅ | Search + status + paginación con queryString preservation |
| 5. Empty states | ✅ | Tipados por contexto, con CTA |
| 6. Lifecycle banners | ⚠️ | Sin banner trial/payment (el Reseller no maneja billing de su cliente directo). Aceptable. |
| 7. Progress + ETA | ✅ | Provisioning ETA en projects.blade y dashboard recent |
| 8. Primary + secondary | ✅ | "Admin" primary en cada row, secondaries via icon |
| 9. Help in-panel | ⚠️ | Reseller usa el Centro de Ayuda del Customer (sidebar comparte item). Aceptable pero podría tener FAQs propios de revendedor. |
| 10. Integraciones | ✅ | Airtable (full CRUD), Slack notif, JSON template download |
| 11. Auth + permisos | ✅ | Filtro por parent_reseller_id, no cross-reseller leak |
| 12. Responsive | ✅ | Cards stackeables, tabla con table-responsive |
| 13. Flash + alerts | ✅ | SweetAlert custom para "proyecto en proceso" |
| 14. Footer útil | ✅ | Links a marketplace + activity desde dashboard |
| 15. Idioma + tono | ✅ | 100% español, tono partner-oriented |

**Score: 12/13 aplicables (Bloque 6 marcado N/A por modelo de negocio). ✅ Production-ready.**

---

## Decisiones de diseño

### Por qué el Reseller NO ve revenue USD

El Reseller cobra a su cliente final lo que quiera (el "spread" es decisión propia). BewPro solo le cobra su costo mayorista. Exponer USD en el panel:
- Confunde (¿qué USD? ¿lo que paga el cliente final? ¿lo que paga el reseller?).
- Crea fricción en el modelo de pricing libre.

El reseller ve volumen y churn (lo que necesita para gestionar), pero el USD vive en Stripe/Airtable.

### Por qué no hay `role:Reseller` middleware

El gate es por `permission:reseller.dashboard`. El rol `Reseller` Spatie es informativo. Esto permite:
- Que un admin "preview" el panel sin tener rol Reseller asignado.
- Que un user pueda ser Client+Reseller simultáneamente (caso Compañía Digital).

---

## Compañía Digital — caso real

Live since 2026-05-10:
- Email: `lacompaniad@gmail.com`
- Rol: Client + Reseller
- `airtable_reseller_record_id`: linkeado vía `bewpro:link-reseller`
- 22 proyectos históricos backfilleados al panel (3 con Stripe, 19 canjes pre-Stripe).

---

## Referencias

- Roadmap original: `docs/bewpro2.0/programa-de-revendedores.md`
- Flujo E2E reseller: `docs/bewpro2.0/operaciones/reseller-end-to-end-test.md`
- Provisión técnica: `docs/bewpro2.0/operaciones/reseller-provisioning.md`
- Standard de madurez: `docs/bewpro2.0/paneles/standard-de-madurez.md`
