Files
AutoBooking/PROMPT-claude-code-admin-dashboard.md
T

212 lines
11 KiB
Markdown

# Tarea: Crear plugin "autobooking-admin-dashboard" + arreglar bug crítico de rol
Eres un desarrollador senior de WordPress. Trabajas dentro de una plataforma tipo Uber
llamada **AutoBooking**, compuesta por varios plugins. Tu trabajo tiene DOS partes:
(A) arreglar un bug crítico de roles, y (B) crear el panel de administrador del dueño.
**Lee este documento COMPLETO antes de escribir una sola línea de código.** Hay reglas
de auditoría y de reutilización de código existente que son obligatorias y que cambian
la forma en que debes trabajar.
---
## Contexto del sistema existente (NO reinventar)
Plugins actuales que debes tomar como referencia de estilo y convenciones:
- **autobooking-driver-dashboard v2.0** (el más completo)
- **autobooking-passenger-dashboard v1.0**
- **autobooking-corporate-dashboard** ← USA ESTE como referencia de UI:
ya tiene íconos SVG profesionales en tabs (sin emojis), idioma ES/EN, y layout limpio.
El admin dashboard debe verse y comportarse consistente con este.
- **autobooking-roles** (tiene el bug a corregir)
Tablas de base de datos ya existentes (prefijo `wp_`, usar SIEMPRE `$wpdb->prefix`):
- `wp_ab_trips` — viajes
- `wp_ab_driver_status` — online/offline + telemetría GPS
- `wp_ab_driver_sessions` — sesiones de conductor
- `wp_ab_incidents` — incidentes SOS/pánico, incluye audio
- `wp_ab_zone_alerts` — hotspots/bonus
- `wp_ab_zone_alert_responses`
- `wp_ab_companies` — empresas corporativas
- `wp_ab_company_users` — empleados de empresas
- `wp_ab_invoices` — facturas
- `wp_ab_reviews` — ratings
- `wp_ab_scheduled_trips` — viajes programados
- `wp_ab_trip_positions` — posiciones GPS por viaje (**tabla de alto volumen**)
- `wp_autobooking_chat` — chat pasajero-conductor
- `wp_ab_driver_daily` — agregados diarios por conductor
**Antes de escribir código:** inspecciona los plugins existentes para deducir el esquema
EXACTO de cada tabla (nombres de columnas, tipos), las convenciones de naming de
funciones/hooks, y cómo registran sus endpoints AJAX. NO asumas columnas; verifícalas.
---
## ⚠️ REGLA #0 — Registro de cambios y verificación (LEER PRIMERO)
Este sistema ya tiene trabajo previo hecho (snippets, tablas, lógica de tarifas). El mayor
riesgo de esta tarea es **pisar o duplicar algo que ya existe**. Por eso, ANTES de tocar
nada y A MEDIDA que avanzas, mantén un archivo **`CHANGES.md`** en la raíz del trabajo con
TODO lo que toques. No basta con hacer los cambios; se necesita un registro legible por una
persona. Debe incluir:
- **ESTADO INICIAL:** antes de tocar tarifas/roles/cualquier cosa existente, anota qué
encontraste y dónde (qué snippets, en qué tabla, qué columnas, qué versión de plugin).
Pega los nombres exactos de tablas/columnas/funciones/snippets que vas a tocar.
- **POR CADA CAMBIO,** una línea con:
`[AÑADIDO|MODIFICADO|ELIMINADO|EXTENDIDO] — archivo o tabla afectada — qué cambió — por qué`.
- **ELIMINACIONES:** evita borrar. Si algo te parece obsoleto o duplicado, NO lo borres;
márcalo como "candidato a eliminar" en `CHANGES.md` y explica por qué, para que el
dueño decida. Solo borra si es estrictamente necesario y déjalo registrado.
- **SNIPPETS:** si desactivas o modificas un snippet existente, guarda una COPIA del
código original del snippet dentro de `CHANGES.md` antes de tocarlo, para poder revertir.
- **BASE DE DATOS:** por cada `ALTER`/`CREATE TABLE`, registra la sentencia exacta y si es
reversible. Toda creación/alteración debe ir vía `dbDelta` en el hook de activación.
- **AL FINAL:** una sección **"Cómo revertir"** con los pasos para deshacer cada cambio
mayor, y una lista de TODOs/decisiones pendientes que dejaste para el dueño.
> Trata `CHANGES.md` como parte del entregable, no como algo opcional.
> Si un cambio no está en `CHANGES.md`, es como si no hubiera pasado.
---
## PARTE A — Bug crítico en autobooking-roles
**Problema:** el plugin crea los roles `driver` y `driver_pending`, pero NO crea
`corporate_admin`, por lo que las empresas no pueden entrar a su dashboard.
Requisitos del fix:
1. Registrar el rol `corporate_admin` con capabilities mínimas necesarias
(`read` + las custom caps que use el corporate-dashboard; dedúcelas del código).
2. Crear también una capability custom `manage_autobooking` para el admin del dueño,
y asignarla al rol `administrator` de WordPress.
3. **MIGRACIÓN RETROACTIVA:** al activar, recorrer `wp_ab_companies` / `wp_ab_company_users`
y asignar el rol `corporate_admin` a los usuarios corporativos que YA existen y
que no lo tengan. Esto debe ser **idempotente** (correrlo dos veces no duplica nada).
*(Las empresas ya creadas no reciben el rol automáticamente solo con cambiar el
activation hook; por eso esta migración es obligatoria.)*
4. En desactivación NO borrar roles ni datos (solo limpieza de caps temporales si aplica).
5. Subir la versión del plugin y dejar un comentario de changelog.
---
## PARTE B — Plugin nuevo: autobooking-admin-dashboard
Estructura estándar de plugin WP: archivo principal con cabecera, `/includes`, `/assets/css`,
`/assets/js`, carga condicional de scripts solo en la página del dashboard.
**Acceso:** SOLO usuarios con la capability `manage_autobooking`. Verificar en CADA carga de
página y en CADA endpoint AJAX con `current_user_can('manage_autobooking')`; si no, abortar.
El dashboard se renderiza vía shortcode `[autobooking_admin]` en una página, con tabs
(íconos SVG, mismo estilo que corporate-dashboard, soporte ES/EN). Tabs:
### 1. RESUMEN (overview)
- KPIs en (casi) tiempo real: viajes hoy/semana, conductores online ahora,
viajes activos, ingresos del día, incidentes SOS abiertos, conductores pendientes.
- Gráfico de viajes por día (últimos 30 días).
### 2. CONDUCTORES
- Lista de conductores con búsqueda y filtros (online/offline, rating, estado).
- **Cola de APROBACIÓN:** usuarios con rol `driver_pending`. Para cada uno mostrar sus
datos y documentos. Acciones: **Aprobar** (cambia `driver_pending``driver`),
**Rechazar** (con motivo), **Suspender**. Cada acción debe quedar registrada en un
**LOG DE AUDITORÍA** (crear tabla `wp_ab_admin_audit`: `id`, `admin_user_id`, `action`,
`target_type`, `target_id`, `meta` JSON, `created_at`).
- Nota: si el flujo de verificación de documentos (licencia, seguro, tarjeta de
circulación, foto del vehículo) aún no existe, deja la UI preparada con placeholders
claros y un `TODO` marcado; **no inventes columnas**.
### 3. EMPRESAS (corporativo)
- Lista de `wp_ab_companies`. Acción: **Activar cuenta corporativa**, que debe asignar
el rol `corporate_admin` al/los usuario(s) de esa empresa (reusa la lógica de Parte A).
- Ver facturas (`wp_ab_invoices`) por empresa.
### 4. VIAJES
- Tabla de TODOS los viajes (`wp_ab_trips`) con filtros por fecha, estado, conductor,
pasajero/empresa. **Paginación server-side.** Exportar CSV.
- Detalle de viaje: ruta en mapa (`wp_ab_trip_positions`), estados, chat, rating.
### 5. INCIDENTES / SOS
- Lista de `wp_ab_incidents` priorizando los abiertos. Reproducir el audio del SOS.
Mostrar ubicación en mapa, conductor, viaje asociado. Acciones: marcar como
atendido / resuelto, con nota. Registrar en audit log.
### 6. ZONAS
- Crear/editar/desactivar zone alerts (`wp_ab_zone_alerts`) tipo hotspot/bonus,
dibujando el área en el mapa. Ver respuestas (`wp_ab_zone_alert_responses`).
### 7. CONFIGURACIÓN
- **IMPORTANTE — TARIFAS POR PAÍS YA EXISTEN:** el sistema ya tiene un mecanismo de
tarifas por país, implementado como **SNIPPETS** (revisa el plugin "Code Snippets"
si está instalado —tabla `wp_snippets`— y también `functions.php` del tema activo y
del child theme) y como una o más **TABLAS** de base de datos. **NO crees un sistema
nuevo.** Tu trabajo es:
1. **LOCALIZAR** ese sistema: busca en `wp_snippets`, en archivos `functions.php`,
y en `wp_options`/`wp_postmeta` cualquier cosa que contenga
`tarifa`, `fare`, `rate`, `country`, `pais`, `price`, `km`, `base`, `minute`.
2. **IDENTIFICAR** la(s) tabla(s) reales que guardan tarifa por país (estructura
exacta: columnas, tipos, qué país, base, por km, por minuto, moneda, etc.).
3. La UI de configuración debe **LEER Y ESCRIBIR sobre esa estructura existente**,
NO sobre una nueva. Si la estructura está incompleta, EXTIÉNDELA con cuidado
(`dbDelta`, columnas nuevas) en vez de reemplazarla.
4. **Documentar en `CHANGES.md`** qué encontraste y dónde vive cada cosa.
- **Comisión de la plataforma** (% — global o por país si el sistema actual ya lo soporta;
síguelo del mismo modelo que las tarifas por país).
- API key de Google Maps (reutilizar la existente; no duplicar).
- Datos de la plataforma (nombre, logo, email de notificaciones SOS).
- Si encuentras lógica de tarifas DUPLICADA o conflictiva entre snippets y tablas,
**NO borres nada:** documéntalo en `CHANGES.md` y propón cuál debería ser la fuente
única de verdad, dejándolo marcado como decisión pendiente para el dueño.
---
## Requisitos técnicos NO negociables
- **Seguridad:** TODOS los endpoints AJAX con `check_ajax_referer` (nonce) +
`current_user_can`. TODAS las consultas con `$wpdb->prepare`. TODA salida con
`esc_html`/`esc_attr`/`esc_url`/`wp_kses`. Sanitizar TODA entrada
(`sanitize_text_field`, `absint`, etc.).
- La tabla `wp_ab_trip_positions` es de **alto volumen**: usa `LIMIT` y rangos; nunca
`SELECT *` sin acotar. Si notas falta de índices relevantes para las queries del admin,
créalos en activación (con `dbDelta`).
- Crea la tabla `wp_ab_admin_audit` en activación con `dbDelta`.
- Idioma ES/EN igual que corporate-dashboard (mismo mecanismo, no inventes otro).
- Mapa con Google Maps, reusando el patrón de carga de los plugins existentes.
- Íconos SVG inline en tabs (sin emojis). Estética consistente con corporate-dashboard.
- Código comentado, versión del plugin definida, sin warnings de PHP.
---
## Lo que NO debes hacer (fuera de alcance de este prompt)
- NO implementar el motor de matching/despacho automático (irá en otro prompt).
- NO implementar el cálculo de tarifas ni Stripe Connect/payouts (otro prompt).
Solo deja la configuración de comisión/tarifa leyendo y escribiendo sobre el sistema
de tarifas por país que YA existe.
- NO tocar la lógica interna de los otros plugins salvo el fix de roles de la Parte A.
- NO borrar snippets, tablas ni columnas. Marca candidatos a eliminar en `CHANGES.md`.
---
## Entregables
1. Plugin **autobooking-roles** actualizado (Parte A) con changelog.
2. Plugin nuevo **autobooking-admin-dashboard** completo y funcional (Parte B).
3. **`CHANGES.md`** completo (estado inicial, cada cambio, copias de snippets tocados,
sentencias SQL, sección "Cómo revertir", TODOs pendientes).
4. Un breve **`README.md`** con: cómo instalar, qué capability se requiere, qué tablas crea,
y una lista de TODOs/placeholders que dejaste pendientes (verificación de documentos,
integración del motor de despacho, payouts, fuente única de verdad de tarifas si había
conflicto).
---
**Empieza** inspeccionando los plugins, los snippets y el esquema real de las tablas antes
de escribir nada, y abre `CHANGES.md` con el ESTADO INICIAL. Si encuentras una ambigüedad
de esquema que te bloquee, documéntala y elige la opción más segura en vez de adivinar
columnas.