11 KiB
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— viajeswp_ab_driver_status— online/offline + telemetría GPSwp_ab_driver_sessions— sesiones de conductorwp_ab_incidents— incidentes SOS/pánico, incluye audiowp_ab_zone_alerts— hotspots/bonuswp_ab_zone_alert_responseswp_ab_companies— empresas corporativaswp_ab_company_users— empleados de empresaswp_ab_invoices— facturaswp_ab_reviews— ratingswp_ab_scheduled_trips— viajes programadoswp_ab_trip_positions— posiciones GPS por viaje (tabla de alto volumen)wp_autobooking_chat— chat pasajero-conductorwp_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.mdy 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.mdantes 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íadbDeltaen 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.mdcomo parte del entregable, no como algo opcional. Si un cambio no está enCHANGES.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:
- Registrar el rol
corporate_admincon capabilities mínimas necesarias (read+ las custom caps que use el corporate-dashboard; dedúcelas del código). - Crear también una capability custom
manage_autobookingpara el admin del dueño, y asignarla al roladministratorde WordPress. - MIGRACIÓN RETROACTIVA: al activar, recorrer
wp_ab_companies/wp_ab_company_usersy asignar el rolcorporate_admina 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.) - En desactivación NO borrar roles ni datos (solo limpieza de caps temporales si aplica).
- 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 (cambiadriver_pending→driver), Rechazar (con motivo), Suspender. Cada acción debe quedar registrada en un LOG DE AUDITORÍA (crear tablawp_ab_admin_audit:id,admin_user_id,action,target_type,target_id,metaJSON,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
TODOmarcado; no inventes columnas.
3. EMPRESAS (corporativo)
- Lista de
wp_ab_companies. Acción: Activar cuenta corporativa, que debe asignar el rolcorporate_adminal/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_incidentspriorizando 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énfunctions.phpdel 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:- LOCALIZAR ese sistema: busca en
wp_snippets, en archivosfunctions.php, y enwp_options/wp_postmetacualquier cosa que contengatarifa,fare,rate,country,pais,price,km,base,minute. - 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.).
- 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. - Documentar en
CHANGES.mdqué encontraste y dónde vive cada cosa.
- LOCALIZAR ese sistema: busca en
- 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.mdy 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 conesc_html/esc_attr/esc_url/wp_kses. Sanitizar TODA entrada (sanitize_text_field,absint, etc.). - La tabla
wp_ab_trip_positionses de alto volumen: usaLIMITy rangos; nuncaSELECT *sin acotar. Si notas falta de índices relevantes para las queries del admin, créalos en activación (condbDelta). - Crea la tabla
wp_ab_admin_auditen activación condbDelta. - 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
- Plugin autobooking-roles actualizado (Parte A) con changelog.
- Plugin nuevo autobooking-admin-dashboard completo y funcional (Parte B).
CHANGES.mdcompleto (estado inicial, cada cambio, copias de snippets tocados, sentencias SQL, sección "Cómo revertir", TODOs pendientes).- Un breve
README.mdcon: 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.