# Cómo crear tu propio Dashboard Agentblazer con Claude Code

Esta guía contiene **todo el conocimiento** para que cualquier manager de Salesforce
reproduzca este dashboard de status Agentblazer (Champion / Innovator / Legend, 2025 y 2026)
para su propia organización, usando Claude Code. Pégala como contexto a Claude Code y pídele
que lo construya — o adáptala a mano.

---

## 1. Qué hace el dashboard

Muestra, por persona y agrupado por manager, el status Agentblazer en dos años (2025 y 2026):
- 🏆 Champion · 💡 Innovator · ⭐ Legend (los 3 niveles, cada año por separado)
- Quién está **"en proceso"** de llegar a un nivel (In-Progress en Trailhead)
- KPIs arriba: % Champion, # Innovator, # Legend, # en proceso, y **renovación 25→26**
  (cuántos de los que eran Champion 2025 ya renovaron a 2026)
- Filtro por manager + búsqueda + toggle de año

---

## 2. La fuente de datos (lo más importante)

El status Agentblazer por persona **NO** está en una API pública de Trailhead ni en el
export de cursos de ACT. Vive en **Tableau** (`prod-uswest-c.online.tableau.com`, site `salesforce`).

### La vista correcta
- **Workbook:** `AgentForce and AI Content Dashboard` (contentUrl `AgentForceandAIContentDashboard`)
- **Vista:** `Agentblazer Champions Details (Download Crosstab)` — view id `71b973b2-8a99-4959-a8c3-84f0452495ad`
- **Datasource:** `Employee Agentblazer Statuses` — basado en **TBID de Trailhead**.

> ⚠️ **Gotcha clave:** NO uses el **Employee 360** (`Manager_360` › "Agentblazer Status Drill Down").
> Ese va por la jerarquía **Workday** y OMITE a los Early Career / interns (cuelgan de otro
> manager en Workday aunque funcionalmente sean tuyos). El crosstab de "AgentForce AI Content"
> va por TBID de Trailhead y SÍ trae a todos.

### Cómo extraer (REST API de Tableau con un Personal Access Token)
1. Genera un **PAT** en Tableau: tu avatar → *My Account Settings* → *Personal Access Tokens* → Create.
2. Sign in:
   ```
   POST https://prod-uswest-c.online.tableau.com/api/3.29/auth/signin
   body: {"credentials":{"personalAccessTokenName":"<nombre>","personalAccessTokenSecret":"<secret>","site":{"contentUrl":"salesforce"}}}
   → devuelve credentials.token y credentials.site.id
   ```
3. Extrae los datos filtrando por TU organización con la cadena de management:
   ```
   GET /api/3.29/sites/{siteId}/views/71b973b2-8a99-4959-a8c3-84f0452495ad/data?vf_Management Chain L5=<EMPID>-<Tu Nombre>&maxAge=1
   header: X-Tableau-Auth: {token}
   ```
   - El filtro `vf_MANAGER_NAME=<Nombre>` trae solo tus reportes directos.
   - El filtro `vf_Management Chain L4/L5/L6/L7=<EmpId>-<Nombre>` trae TODA tu sub-organización
     (prueba cuál nivel corresponde a ti; el valor se ve como `751023-Jose Luis Varela`).
   - Sin filtro = toda la compañía (203k filas, hace timeout — siempre filtra).

### Columnas del crosstab
`WORKER_FULL_NAME`, `MANAGER_NAME`, `EMPLOYEE_ID`, `GEO_REGION`, `BUSINESS_UNIT`,
`IS_PEOPLE_MANAGER`, `Management Chain L4..L7`, `Agentblazer Status`
(Champion/Innovator/Legend), `Completion Status` (Completed / In-Progress),
y **`Attributes Status Level Id`**.

### Distinguir 2025 de 2026 (crítico)
El crosstab **mezcla ambos años**. Se distinguen por `Attributes Status Level Id`:
| Level Id | Nivel | Año |
|---|---|---|
| 1 / 2 / 3 | Champion / Innovator / Legend | **2025** |
| 5 / 6 / 7 | Champion / Innovator / Legend | **2026** |

- Cuenta un nivel como **logrado** solo si `Completion Status = Completed`.
- `Completion Status = In-Progress` → la persona está **en proceso** de ese nivel.
- Hay varias filas por persona (un nivel/año c/u, a veces duplicadas) → consolida en memoria.
- Parsea con un lector CSV real (hay comas dentro de comillas en `GEO_REGION`).

---

## 3. Stack técnico (lo que pide Claude Code)

- **Node.js + Express + PostgreSQL** (en Heroku: addon `heroku-postgresql:essential-0` + paquete `pg`).
- Frontend: un `public/index.html` vanilla (sin build) — o React+Vite si prefieres.
- Tabla `people` en Postgres con: nombre, manager, geo, business_unit, 6 flags booleanos
  (champion/innovator/legend × 2025/2026), `in_progress` (texto/JSON), `source` ('tableau'|'manual').
- Seed desde un `data.json` con upsert `ON CONFLICT ... WHERE source='tableau'` para **no pisar
  ediciones manuales**.
- Endpoints: `GET /api/data`, `GET /api/managers`, `PUT /api/person` (editar status a mano).

### Gotchas de Heroku verificados
- **SSL Postgres:** activa SSL solo para conexiones remotas. Detecta local con
  `process.env.PGSSL==='off' || /@(localhost|127\.0\.0\.1)/.test(url) || /^postgres(ql)?:\/\/\/[^/]/.test(url)`.
  Remoto → `ssl:{rejectUnauthorized:false}`. (Una regex mal hecha apaga SSL en prod y falla con
  `no pg_hba.conf entry ... no encryption`.)
- **Fechas DATE de pg** salen como timestamp ISO → usa `to_char(col,'YYYY-MM-DD')` en el SELECT.
- **Provisioning async:** tras `addons:create`, espera `addons:info <name>` State=created antes de
  confiar en `DATABASE_URL`, o la app crashea al arrancar (ECONNREFUSED).

---

## 4. Branding Salesforce (opcional pero recomendado)

- Paleta: SOLO 6 azules + blanco → `#001E5B #022AC0 #066AFE #00B3FF #90D0FE #EAF5FE`.
- Texto blanco solo es legible (WCAG AA) sobre stops **≤ #066AFE**. Header gradiente Evening
  capado: `linear-gradient(135deg,#001E5B,#022AC0 42%,#066AFE)`.
- Fuentes: AvantGarde (títulos) + Salesforce Sans (body), vía `@font-face`.
- Sparkles (SVG amarillo+azul) SOLO en bandas/bordes, nunca sobre texto. Logo en chip blanco frosted.

---

## 5. Prompt sugerido para Claude Code

> "Construye un dashboard Node+Express+Postgres del status Agentblazer (Champion/Innovator/Legend,
> años 2025 y 2026) de mi organización. Los datos los extraigo de Tableau con mi PAT desde la vista
> 'Agentblazer Champions Details (Crosstab)' (view id 71b973b2-...), filtrando
> vf_Management Chain L5=<mi nombre>. Distingue 2025 (Level Id 1/2/3) de 2026 (5/6/7), cuenta como
> logrado solo si Completion=Completed y marca In-Progress como 'en proceso'. KPIs arriba
> (% Champion, Innovator, Legend, en proceso, renovación 25→26), filtro por manager + búsqueda,
> tabla agrupada por manager con los 6 badges, y branding Salesforce. Deploya a Heroku con Postgres."

Pégale además esta guía completa como contexto. ¡Éxito! 🚀

---
*Generado por el Dashboard Agentblazer · Organización Jose Luis Varela · Q Branch LATAM*
