# 📋 CHANGELOG — HAP (La-vamos Cuidando)

Todas las actualizaciones destacadas, mejoras visuales, correcciones de errores, nuevas funcionalidades y refactorizaciones realizadas en la plataforma HAP.

---

## 📌 Resumen General de Cambios

- 🔔📲 **Notificaciones Push para Happers en Servicios Programados & Retiro de Copias CC a Dann Arenas (`notificador_servicios.php`, `programar_servicio.php`, `reprogramar_servicio_ajax.php`, `TORRE_CONTROL`, `cron`)**: Conforme a la solicitud de los conductores ("Happers") a Torre de Control para saber con exactitud cuándo ingresar a la app para ver y asignarse citas agendadas, se integró el motor autónomo FCM v1 (`notificar_happers_servicio_programado`). Toda orden programada (agendada por cliente, Día HAP automático o reprogramada) dispara al instante una notificación Push a todos los Happers activos con token registrado (`usuarios.fcm_token`), indicando fecha, hora, zona, vehículo y enlace directo a `agendar_cita.php?id=ID`. En primer plano se reproduce chime Web Audio, vibración y Toast interactivo. Se añadió en el CRON (`generar_dias_hap.php`) la revisión para alertar cuando una cita entra en la ventana de apertura de 24 horas (`notificar_citas_programadas_abiertas_24h`) y en Torre de Control (`torre.js`, `api.php`) el botón de difusión manual `[ 📲 Avisar a Happers (Push) ]`. Asimismo, tras confirmar recepción operativa regular en `admin@soyhap.com`, se retiraron formalmente las copias CC a `dann.arenas@outlook.com` para nuevos servicios y cancelaciones.
- 🎨✨ **Refactorización Integral de Programar Servicio (`programar_servicio.php`) sin Estilos en Código (Zero Inline Styles & Unificación de Temas)**: Homologación visual y arquitectónica completa con el sistema Cyber-Luxe Glassmorphism (Dark) y Crystal Frost Neo-Luxe (Light). Eliminación de 765 líneas de bloques `<style>` embebidos y de todos los estilos quemados en código (`style="..."`), centralizando las reglas en la Sección 11 de `theme-client.css` (`v=4.2`). Barra superior estándar `.hap-top-nav` con botón minimalista `[ < Inicio ]` y selector de tema interactivo (`☀️ Claro`, `🌙 Oscuro`, `🕒 Auto`) conectado a `theme-client.js`. Integración de script Zero-FOUC en `<head>`, adaptación dinámica de Stripe Elements al cambiar de tema (`hapThemeChanged`), modernización de los 5 pasos del checkout wizard y transformación de `#modalNuevoAuto` y `#modalNuevaDireccion` al sistema `.hap-modal`. Preservación del 100% de las reglas de negocio, transacciones atómicas, exclusividad e idempotencia.
- 🌙🚀 **Nuevo Contexto Persuasivo de Horario Nocturno (Funnel Anti-Churn a `programar_servicio.php`)**: Transformación del antiguo bloqueo de callejón sin salida (*"🌙 Servicio no disponible"*) en un embudo de conversión de alta retención. Explicación empática del horario de descanso de los Happers (06:00 a 22:00 hrs) que invita activamente al usuario a asegurar su lugar agendando para el día siguiente o fecha posterior (`programar_servicio.php?auto=ID`), preservando el vehículo seleccionado. Integración universal en Inicio (`perfil.php`), Cochera (`mis_autos.php`), y Solicitud Inmediata (`hapiar.php`), con micro-beneficios (⏰ Horario asegurado, 📍 En tu cochera o trabajo, 💧 Ecológico sin agua) y estilos Cyber-Luxe y Crystal Frost en `theme-client.css` y `theme-client.js`. Botones ergonómicos optimizados para touch móvil con altura aumentada a `54px` (primario) y `50px` (secundario) y control de versiones a `v=4.2`.
- 📐✨ **Ajuste Ergonómico de Espaciado en Barra Flotante (`menu_footer.php`)**: Incremento del espaciado vertical (`gap: 5px !important;`) entre el emoji de navegación (`🏠`, `🧼`, `🚗`) y su respectiva etiqueta de texto (`Inicio`, `Servicios`, `Cochera`) en `.hap-nav-link`. Se preservó al 100% la estética de cápsula frosted glass, las dimensiones ergonómicas y el chip activo con gradiente. Actualización del control de versiones de caché a `v=4.0` en `perfil.php`, `cuenta.php`, `mis_autos.php` e `historial_servicios.php`.
- 🦶✨ **Unificación Integral de la Barra Flotante de Navegación (`menu_footer.php`) con Iconos Emoji Nativos**: Transformación de `menu_footer.php` en un componente único, puro y reutilizable sin bloques `<style>` embebidos. Reemplazo de los iconos de fuentes externas por emojis nativos de alta definición (`🏠 Inicio`, `🧼 Servicios`, `🚗 Cochera`, `👤 Mi Cuenta`), eliminando el parpadeo de carga (FOIT) y las diferencias visuales entre pantallas. Homologación total de las dimensiones, cápsula frosted glass y botón circular flotante centralizados en `theme-client.css` (`v=3.9`).
- 🎨🧼 **Minimalismo en Barra Superior de Navegación (`historial_servicios.php`, `mis_autos.php`, `cuenta.php`)**: Eliminación del título de página en el topbar para lograr una interfaz más limpia, despejada y balanceada en pantallas móviles. Modificación del botón de navegación de "Perfil" a "Inicio" (`[ < Inicio ]`), homologándolo al 100% con la pestaña principal de la barra de navegación flotante inferior.
- 🎨✨ **Refactorización Integral de Mi Cuenta (`cuenta.php`) sin Estilos en Código (Zero Inline Styles)**: Homologación completa con el sistema Cyber-Luxe Glassmorphism (Dark) y Crystal Frost Neo-Luxe (Light). Eliminación al 100% de bloques `<style>` y atributos `style=""` en la plantilla PHP. Integración de barra superior fija `.hap-top-nav` con selector de tema interactivo (`☀️ Claro`, `🌙 Oscuro`, `🕒 Auto`) conectado a `theme-client.js`. Hero card con avatar con anillo en gradiente y metadatos del usuario, grid de accesos rápidos (*Mi Cochera*, *Historial*, *Ranking*), tarjeta de Membresía VIP (*💎 TODO INCLUIDO*), módulos de perfil y seguridad, ayuda y legales, y modal SweetAlert2 temático para eliminación permanente de cuenta.
- 🎨✨ **Refactorización Integral de Servicios (`historial_servicios.php`) y Cochera (`mis_autos.php`) sin Estilos en Código (Zero Inline Styles)**: Homologación visual y arquitectónica completa con el sistema Cyber-Luxe Glassmorphism (Dark) y Crystal Frost Neo-Luxe (Light) de `login.php`, `registro.php` y `perfil.php`. Eliminación al 100% de bloques `<style>` y atributos `style=""` en las plantillas PHP. Integración de barra superior fija `.hap-top-nav` con selector de tema interactivo (`☀️ Claro`, `🌙 Oscuro`, `🕒 Auto`) conectado a `theme-client.js`. En Servicios: Cockpit Hero con estadísticas en tiempo real (Totales, Realizados, En Proceso), carrusel táctil de filtros por píldoras, tarjetas con badges pulsantes y botón de facturación asíncrona SweetAlert2. En Cochera: Hero de garage con acción directa de registro, tarjetas con badges de tamaño y vestidura, ilustraciones optimizadas, botón "Lavar este auto", modales accesibles y confirmación de eliminación segura con SweetAlert2.
- 🎨🌓 **Armonización Visual de Perfil (`perfil.php`), Barra Flotante (`menu_footer.php`) y Sistema Dual de Temas (Claro / Oscuro / Auto Horario)**: Implementación de la suite visual `Plus Jakarta Sans` y un motor de temas inteligente `HapClientTheme` (`theme-client.js`, `theme-client.css`). Conmutación automática por horario local (07:00 a 18:59 = Claro, 19:00 a 06:59 = Oscuro) y control manual instantáneo con persistencia en `localStorage` (`☀️ Claro`, `🌙 Oscuro`, `🕒 Auto`) sin parpadeo de carga (Zero FOUC gracias a script síncrono en `<head>`). Conservación al 100% de la arquitectura y componentes: Hero Card unificada con selector de auto y botones de despacho, tarjetas de estatus en vivo y citas programadas, Membresía VIP, Gamificación con tabla de posiciones y racha semanal, Eco Impacto interactivo y Banner de Referidos. Cápsula y botón circular flotantes adaptados dinámicamente con variables semánticas.
- ✨🚀 **Rediseño Mobile-First de Registro (`registro.php`), Login (`login.php`) y Corrección Integral del Motor de Referidos**: Rediseño radical Dark Glassmorphic alineado a `index.php`. Reducción drástica de fricción de registro de más de 12 campos obligatorios a solo 4 entradas esenciales (Nombre Completo, WhatsApp `🇲🇽 +52`, Email, Contraseña con revelado de ojos) y tarjeta Hero para Códigos de Referidos. Corrección crítica en la base de datos eliminando consultas con la columna inexistente `ref` en `clientes` (`Unknown column 'ref' in 'field list' / 'where clause'`) en `validar_referido.php`, `validar_cupon.php`, `programar_servicio.php` y `stripe.php`. Validación AJAX reactiva de referidos (`HAP82414`, códigos de cliente `HAPB1DD8`, `HAPAC86A`), comprobación asíncrona de email disponible (`verificar_email_disponible.php`) y auto-login directo a `perfil.php?bienvenido=1` con modal de bienvenida.
- 🔧📅 **Corrección Crítica de Agendamiento de Servicios Programados (`programar_servicio.php`) y Cumplimiento de Regla de Oro #25**: Corrección de bug crítico en PHP 8.1+ donde la variable `$q_ins` con la sentencia `INSERT INTO venta_desc` no estaba asignada antes de llamar a `mysqli_query()`, provocando una excepción no controlada (`ValueError: mysqli_query(): Argument #2 ($query) cannot be empty`) que bloqueaba el 100% de las solicitudes de servicios agendados. Se incorporó la generación de PIN de seguridad de 4 dígitos (`hap_generar_pin_4digitos()`) en el mapa de datos y se corrigieron los parámetros de notificación en tiempo real a Torre de Control (`$servicio_name`, `$fecha_prog`, `$hora_prog`).
- 💳🛡️ **Auditoría Integral de Captura Stripe, Recuperación de $843 MXN y Botón de Captura Manual en Torre de Control**: Corrección de bug de ruta relativa en la carga del SDK de Stripe (`/../../CLIENTE/` -> `/../CLIENTE/` con fallback dinámico) en `HAPPER_APP/api.php`, permitiendo la captura automática de fondos retenidos (`requires_capture` -> `succeeded`) al finalizar el lavado. Recuperación financiera de $843.00 MXN en fondos retenidos para servicios #89166, #89168, #89169 y #89170 en Stripe live. Actualización de Torre de Control con botón interactivo "💳 Capturar en Stripe", endpoint asíncrono `capturar_pago_stripe` y autorización de captura retroactiva en `finalizar_servicio_admin` para servicios finalizados con retención activa.
- 🔒🔢 **PIN de Seguridad de 4 Dígitos, Protección Anti-Fraude en Tracking y Regla de Oro #25**: Implementación de columna persistente `pin` en `venta_desc`, eliminación de la confusión entre Folio (5 dígitos) y PIN (4 dígitos), diseño de bloque numérico destacado en `tracking.php` con advertencia obligatoria de seguridad (*no compartir antes del arribo del Happer*), actualización del teclado táctil en `mision.php` y validación centralizada en `Connections/pin_seguridad.php` y `api.php`.
- 📍🛡️ **Control Estricto de Cobertura Geográfica por Código Postal (15 C.P. Autorizados) y Regla de Oro #24**: Implementación obligatoria y blindaje transaccional de los 15 códigos postales autorizados de Querétaro y zonas asignadas (`76269`, `76230`, `76146`, `76226`, `76100`, `76060`, `76215`, `76246`, `76900`, `76902`, `76904`, `76910`, `76090`, `76170`, `87380`). Triple capa de protección (Frontend en tiempo real con badges 'Sin cobertura', API Pre-Stripe `crear_stripe_intent.php` con HTTP 400 y Persistencia de BD en `stripe.php` / `programar_servicio.php`), sincronizador de Días HAP blindado, y Plan de Salida Amigable y Retención interactivo (pedir en oficina/trabajo, lista de espera `kpicp` y catálogo de zonas autorizadas).
- 🚗🛡️ **Auditoría Forense de Servicios Duplicados y Regla de Oro #23 (Exclusividad Operativa e Idempotencia)**: Confirmación empírica en producción de duplicación de órdenes por doble clic/latencia (casos recientes #89164/#89165 en 4s, #718/#719 en 3s, #206/#207); oficialización de la Regla de Negocio Sección 7.5 y Regla de Oro #23 prohibiendo más de 1 servicio activo por vehículo, solapamiento de citas programadas (±60 min) y rebotes de red dentro de 60 segundos.
- 🌐🏛️ **Convención Internacional de Base de Datos en Inglés (Enterprise DB Standard)**: Oficialización de la Regla de Oro #19; esquema estructurado en inglés (`snake_case`, tablas en plural, claves `<singular>_id`, timestamps `_at`, booleanos `is_`/`has_`, montos `_amount`, enums UPPERCASE), con separación estricta de actores (`admin_users`, `franchises`, `franchise_users`, `happers`, `happer_telemetry`, `customers`, `services`, `service_photos`).
- 🧩📱 **Arquitectura de 4 Proyectos PWA Independientes**: Oficialización de la Regla de Oro #20; bifurcación de la plataforma en 4 aplicaciones desacopladas (**HAP Fleet**, **HAP Drivers**, **HAP Control Tower**, **HAP Users**), cada una con su propia PWA y separación estricta entre Frontend UI y Backend REST API.
- 🛡️📦 **Principio de No Destrucción / Migración Segura**: Oficialización de la Regla de Oro #21; prohibición de sobreescritura directa en producción/legado, creación obligatoria en directorios nuevos independientes, respaldos verificados previos y convivencia pacífica sin downtime.
- 📱⚡ **Arquitectura de Campo HAP (Gama Baja, Ahorro Extremo de Datos y Resiliencia)**: Estándar mandatorio para la flota de conductores en `HAPPER_APP 2.0`; optimización para hardware modesto (2-3 GB RAM, PWA ultraligera <200 KB), compresión obligatoria de fotos en Canvas (<200 KB/foto vs ~10 MB en crudo, ahorro >95%), persistencia de misión y timers en `localStorage` ante cierres involuntarios, y tolerancia a desconexión y cortes de red en ruta o cocheras con reintentos en 1 toque y validación granular en servidor.
- 🔒 **Protocolo de Misión Unidireccional & Verificación de Inspección en Servidor**: Verificación asíncrona de 4 ángulos de inspección previa en BD antes de acceder a Identidad (`verificar_fotos_inspeccion`), corrección de `hap_clasificar_angulo` para coincidencia de cadenas, eliminación de la recursión que causaba el error falso de fotos faltantes al finalizar y bloqueo total de retroceso a pasos completados en el Stepper HUD.
- 📱 **Control de Sesión Única por Dispositivo (`session_token`)**: Unicidad de sesión forzada para conductores en `HAPPER_APP`; al abrir sesión en un nuevo dispositivo, se revoca inmediatamente la anterior con HTTP 401 Unauthorized (`SESSION_DUPLICATED`).
- 🛑 **Deprecación y Bloqueo Absoluto de App Clásica (`/HAPPERS/`)**: Componente modal `HAPPERS/modal_obsoleto.php` inyectado en todos los accesos legacy para suspender operaciones y canalizar a los operadores a la nueva HAP Driver App 2.0 (`/HAP/SISTEMA/HAPPER_APP/`).
- 🚪 **Rediseño Mobile-First de Portada de Bienvenida (`CLIENTE/index.php`)**: Estética Dark Glassmorphic con selección de roles en 1 toque `[ 🚗 SOY USUARIO ]` y `[ ⚡ SOY HAPPER ]`, eliminación de badges obsoletos ("Driver 2.0") y enlaces secundarios.
- 🛰️ **Sincronización Reactiva Bidireccional Torre-Happer**: Recepción en tiempo real de conclusiones administrativas y cancelaciones remotas (`modal_torre_signal`) que detiene cronómetros y libera al Happer sin dejarlo atrapado.
- ⏰ **Auditoría Integral de Citas Programadas vs Bajo Demanda**: Apertura estricta de ventana a 45 minutos previos, clasificación `EN_SITIO` al registrar arribo y mapeo homologado en el tablero Kanban.
- 🔐 **Portal de Autenticación Dedicado para Torre de Control**: Nuevo portal `login.php` con estética Mission Control Dark Glassmorphism, autenticación multiformato contra `usuarios`, soporte para nombre o email, botón de logout (`logout.php`) y eliminación total de la redirección a `loginerror.php`.
- 🚀 **Torre de Control Operativa (Mission Control Cyberpunk)**: Tablero maestro de despacho logístico para supervisores en `/HAP/SISTEMA/TORRE_CONTROL/` con radar geolocalizado en vivo (Leaflet con CartoDB Voyager y fallback a Esri CloudFront), tablero Kanban reactivo en 4 columnas (`POR ASIGNAR`, `EN TRASLADO`, `EN LAVADO`, `COMPLETADOS`), modales instantáneos a 0 ms con cronometría de 4 etapas, alertas sonoras con Web Audio API y notificaciones Push.
- ⚡ **Aceleración Extrema de Backend (643x más rápido)**: Refactorización de `api.php` eliminando el bucle N+1 (de 18 consultas por happer a 1 sola consulta agregada `GROUP BY happer`) y creación de 3 índices MySQL en `venta_desc` (`idx_happer_estatus`, `idx_alta_estatus`, `idx_cliente`), reduciendo la latencia de respuesta del servidor de **12,766 ms (~12.8s) a 19.8 ms**.
- 📆 **Filtro Temporal Integral**: Soporte de filtros rápidos `Hoy`, `Mañana`, `Semana`, `Mes` (cálculo dinámico por mes en curso) y `Todos`.
- 📜 **Scroll Vertical Fluido & Saneamiento**: Habilitación de scroll vertical en columnas Kanban (`overflow-y: auto !important; min-height: 0;`) con scrollbars personalizadas cyan. Limpieza masiva de servicios estancados (>15 días) y depuración de pruebas.
- 🗺️ **Estabilización Total del Mapa Leaflet**: Eliminación del bloqueo de OpenStreetMap migrando a CartoDB Voyager y Esri, eliminación de bucle infinito recursivo en `ResizeObserver`, carga síncrona en `<head>` de `leaflet.js`/`leaflet.css` sin dependencia de CDN externo, layout elástico 100% de altura absoluta (`position: absolute; width: 100%; height: 100%;`) y cache-busting dinámico (`?v=<?= time() ?>`).
- 💎 **Ecosistema Membresía HAP & Motor Recurrente de Días HAP**: 3 planes anuales por tamaño de auto (Chico $495, Mediano $563, Grande $597 MXN/mes con 36 lavados incluidos a $0.00 MXN), rutina semanal fija en piloto automático, auto-generación al concluir servicio vía QR (+7 días), políticas de penalización por cancelación escalonada (70% en $\le 182$ días, 10% en $> 182$ días) y protección `PAST_DUE`.
- 💳 **Pasarela Stripe Elements & Tokenización PCI-DSS**: Integración de Stripe Elements para ingresar tarjetas sin salir del flujo de agendamiento, sincronización bidireccional de métodos de pago (`clientes_tarjetas`), cobro off-session al escanear QR y blindaje para órdenes a $0.00 MXN.
- ⏰ **Servicios Programados en Pantalla Única**: Agendamiento futuro interactivo en 5 pasos (Auto, Servicio, Ubicación, Fecha/Hora con anticipación mínima de 3h, Pago/Membresía).
- ⚡ **HAP Express All-in-One (`hapiar.php`)**: Rediseño del pedido inmediato a 1 sola pantalla fluida (<15 segundos), radar 360° y tiempo de llegada estimado de 40 a 120 minutos.
- 🚗 **Mi Garage HAP**: Homologación en 3 categorías (`CHICO`, `MEDIANO`, `GRANDE`), atributo de tapicería (`💺 TELA` / `🛋️ PIEL`) y confirmación de eliminación con SweetAlert2.
- 🎁 **Programa de Referidos & Facturación CSF**: Código `HAPxxxxx` con $50 MXN de descuento en 1er servicio y +$50 MXN de crédito al referidor. Módulo de facturación con carga de PDF de Constancia Fiscal y envío MIME Base64 con botón `mailto:` para el contador.
- 🌐 **Conexión Directa a Producción & Sincronización**: Túnel SSH en puerto 3307 a `95.111.214.233`, sincronización local de multimedia/datos y scripts de respaldo automatizado.

---

## 🚀 Historial Detallado por Versión

### [v2.34.0] - 2026-10-02
#### 🔔📲 Notificaciones Push para Happers en Servicios Programados & Retiro de Copias CC a Dann Arenas

##### 🚨 Contexto y Solicitudes Operativas
1. **Confirmación y Retiro de Copias por Correo**: Tras confirmar que los correos de nuevos servicios y cancelaciones han estado llegando sin fallas a Torre de Control (`admin@soyhap.com`), se solicitó retirar las copias en copia carbón (CC) que se enviaban a la cuenta personal `dann.arenas@outlook.com`.
2. **Petición Operativa de los Conductores ("Happers")**: Los Happers solicitaron a Torre de Control recibir notificaciones Push en su teléfono cada vez que existan servicios programados disponibles, ya que no sabían en qué momento ingresar a la aplicación para revisar la bolsa de citas y asignárselas a su ruta de trabajo.

##### 🛠️ Soluciones y Mejoras Implementadas
1. **Retiro de Copias CC a Dann Arenas (`notificador_servicios.php`)**:
   - Eliminación de `$mail->addCC("dann.arenas@outlook.com", "Dann Arenas");` en `notificar_nuevo_servicio_admin()`.
   - Eliminación de `$mailAdmin->addCC("dann.arenas@outlook.com", "Dann Arenas");` en `notificar_cancelacion_servicio()`.
   - Mantenimiento intacto del destinatario oficial de Torre de Control: `admin@soyhap.com`.
2. **Motor Autónomo de Notificaciones Push para Servicios Programados (`notificar_happers_servicio_programado`)**:
   - Implementación de la función `notificar_happers_servicio_programado($higo, $servicio_ref, $evento)` en `notificador_servicios.php`.
   - Conexión nativa con el motor `fcm_helper.php` (Firebase Cloud Messaging v1 con Google Service Account y firma RS256).
   - Consulta dinámica de todos los Happers activos con token FCM registrado en `usuarios.fcm_token` (excluyendo cuentas dadas de baja).
   - Generación de alerta con fecha legible, día de la semana, hora, zona/colonia y categoría del vehículo.
   - Carga de datos (`data`) con URL directa: `https://lavamoscuidando.com/HAP/SISTEMA/HAPPER_APP/agendar_cita.php?id=ID`.
3. **Disparo Inmediato en Todo el Ciclo de Vida del Servicio Programado**:
   - **Agendamiento por Cliente**: En `programar_servicio.php`, tras confirmar el servicio (tanto regular como con membresía Día HAP), se detona la notificación push inmediata.
   - **Generación Recurrente de Día HAP**: En `sincronizador_dias_hap.php`, al generarse un Día HAP semanal, se alerta a los conductores.
   - **Reprogramación por Cliente**: En `reprogramar_servicio_ajax.php`, cuando un cliente reagenda su cita liberando al Happer previo, se notifica a la bolsa de Happers.
   - **CRON de Ventana de 24 Horas**: En `cron/generar_dias_hap.php`, se evalúa periódicamente `notificar_citas_programadas_abiertas_24h()` para alertar a los Happers cuando una cita futura entra en su ventana de asignación inmediata (< 24 hrs).
4. **Herramienta Operativa en Torre de Control (`torre.js`, `api.php`)**:
   - Incorporación de botón `[ 📲 Avisar a Happers (Push) ]` en la tarjeta de detalles 360° para cualquier servicio no asignado.
   - Endpoint `action=notificar_push_programado` en `TORRE_CONTROL/api.php` para emisión manual bajo demanda.
5. **Experiencia HAP Driver App (`push_manager.js`, `firebase-messaging-sw.js`)**:
   - En primer plano: Sonido de campana Web Audio API, vibración háptica, recarga automática del radar (`cargarEstado(false)`) y Toast interactivo que redirige con 1 toque a la cita.
   - En segundo plano / PWA cerrada: Notificación del sistema que al tocarse enfoca o abre directamente la pantalla de toma de cita `agendar_cita.php?id=ID`.

---

### [v2.33.0] - 2026-09-23
#### 🚀✨ Rediseño Ganador de Registro Móvil, Cero Fricción y Blindaje Total del Motor de Referidos

##### 🚨 Contexto y Diagnóstico
- **Obsolescencia Visual**: La página de registro previa (`CLIENTE/registro.php`) empleaba componentes Materialize CSS claros del 2016 con un encabezado plano turquesa que desentonaba por completo con la nueva experiencia Dark Glassmorphic de bienvenida y login (`CLIENTE/index.php`).
- **Fricción Extrema de Datos**: Se exigían más de 12 campos obligatorios y prescindibles para la creación de cuenta: RFC (con leyenda fiscal innecesaria en alta), Nombre, Apellido paterno y materno separados, País, selector de Estado con llamadas AJAX a `ciudades.php`, Fecha de nacimiento, interruptores de términos y un modal intrusivo con el contrato legal completo que bloqueaba la pantalla nada más cargar. Además, el botón de submit se ocultaba hasta que un AJAX de correo respondía.
- **Bug Crítico en Motor de Referidos**: Se descubrió que las consultas SQL en `validar_referido.php`, `validar_cupon.php`, `programar_servicio.php` y el antiguo `registro.php` consultaban una columna inexistente `ref` en la tabla `clientes` (`Unknown column 'ref' in 'field list' / 'where clause'`). Esto provocaba que cualquier código de referido de un cliente real fuera rechazado silenciosamente (`valid: false`), impidiendo su validación, almacenamiento en `referido_por` y la bonificación de los $50 MXN de crédito al usuario que invitó.

##### 🛠️ Soluciones y Mejoras Implementadas
1. **Rediseño Dark Glassmorphic Ganador (`CLIENTE/registro.php`)**:
   - Interfaz móvil de alta conversión alineada 1:1 con el diseño futurista de `index.php`: fondos `radial-gradient` en `#0a0f1d`, orbes bioluminiscentes esmeralda/cian (`blur(95px)`), logotipo HAP con drop-shadow neón y tipografía oficial `Plus Jakarta Sans`.
   - Tarjeta de cristal con `backdrop-filter: blur(24px)`, bordes sutiles, micro-interacciones suaves e iconografía `RemixIcon`.
2. **Formulario Ultrarrápido de Cero Fricción (<15 segundos)**:
   - Reducido a solo **4 campos esenciales**:
     1. `Nombre Completo`: Campo único con desglose inteligente en backend (`nombre` y `apellidop`).
     2. `Teléfono Móvil (WhatsApp)`: Prefijo `🇲🇽 +52` con máscara dinámica a 10 dígitos `(442) 000-0000`.
     3. `Correo Electrónico`: Con validación semántica instantánea y comprobación en tiempo real en segundo plano sin popups invasivos (`verificar_email_disponible.php`).
     4. `Contraseña`: Con toggle de visualización interactivo (ojo) y requerimiento mínimo de 6 caracteres.
   - **Campos eliminados del formulario**: RFC (trasladado a `datos_facturacion.php`), Apellido materno (unificado), País (predeterminado 'MÉXICO'), Estado (predeterminado 'Querétaro'), Fecha de nacimiento (opcional en perfil) y modales bloqueantes de inicio.
3. **Hero Card de Código de Referidos y Blindaje 100% de la Base de Datos**:
   - Card destacada con acentos ámbar y esmeralda: auto-captura parámetros de URL (`?ref=...`, `?codigo=...`), validación reactiva asíncrona (debounce 300 ms) contra `validar_referido.php` y retroalimentación visual inmediata (píldora verde neón con confirmación del nombre del amigo referidor y beneficio de $50 MXN).
   - Eliminación de la columna inexistente `ref` en `validar_referido.php`, `validar_cupon.php` y `programar_servicio.php`. Las consultas ahora operan de forma segura contra `referido_codigo` y los hashes MD5 oficiales.
   - Soporte total para códigos institucionales de bienvenida (`HAP82414`), códigos reales de clientes (`HAPB1DD8`, etc.) y auto-generación del código propio del nuevo cliente (`HAPxxxxx`).
   - Sincronización en `stripe.php` y `programar_servicio.php` para acreditar $50 MXN tanto por `referido_codigo` directo como por hash.
4. **Auto-Login Inmediato y Bienvenida**:
   - Al registrarse, el cliente ingresa directamente a su panel (`perfil.php?bienvenido=1`), con sesión iniciada y cookies de 30 días, listo para pedir su primer lavado sin pasos intermedios.
   - Notificación instantánea a Torre de Control vía `notificar_torre('NUEVO_CLIENTE', ...)`.
5. **Modernización Coherente de `CLIENTE/login.php`**:
   - Actualización visual integral de la pantalla de login para armonizar con `index.php` y `registro.php`. Enlace directo de regreso y navegación sin fricciones.

---

### [v2.32.1] - 2026-09-13
#### 🔧📅 Corrección Crítica de Agendamiento de Servicios (`programar_servicio.php`) y PIN de Seguridad

##### 🚨 Contexto y Bug Operativo Resuelto
- **Problema Detectado**: Torre de Control detectó que los usuarios recibían un error al intentar solicitar un servicio programado: *"Atención: Excepción al procesar tu solicitud: mysqli_query(): Argument #2 ($query) cannot be empty"*. Existía alta sospecha de que todos los usuarios que intentaban agendar estaban completamente bloqueados.
- **Causa Raíz Forense**: En `HAP/SISTEMA/CLIENTE/programar_servicio.php`, el bloque de preparación de datos construía los arreglos `$fields` y `$values` dinámicamente según las columnas de `venta_desc`. Sin embargo, la variable que contenía la consulta SQL `$q_ins` no se encontraba asignada previo a la ejecución de `mysqli_query($higo, $q_ins)`. En PHP 8.1+, pasar un valor vacío o nulo a `mysqli_query` lanza una excepción nativa `ValueError`, capturada por el bloque `try/catch` y mostrada en pantalla, abortando la transacción y denegando la creación del servicio.
- **Confirmación del Bloqueo**: Se confirmó 100% la sospecha de Torre de Control: cualquier usuario que intentara programar una cita en la plataforma experimentaba este error de forma invariable.
- **Usuario Afectado Identificado**: En la captura del reporte se identificó al usuario Fernando (`luferigi@gmail.com`, cel. `4428347994`), intentando agendar su vehículo Audi SQ5 (`GRANDE`, ID 674) con Membresía Activa (ID 11, 27 lavados restantes) para las 12:00 PM.

##### 🛠️ Cambios Implementados
1. **Definición de Consulta SQL (`programar_servicio.php`)**:
   - Asignación explícita de `$q_ins = "INSERT INTO venta_desc (" . implode(', ', $fields) . ") VALUES (" . implode(', ', $values) . ")";` previo a `mysqli_begin_transaction($higo)`.
2. **Generación de PIN de Seguridad (Regla de Oro #25)**:
   - Se añadió la generación del PIN de 4 dígitos persistente en `$data_map` con `'pin' => GetSQLValueString(function_exists('hap_generar_pin_4digitos') ? hap_generar_pin_4digitos() : (string)rand(1000, 9999), "text")`, asegurando el handshake de seguridad cliente-happer al agendar.
3. **Normalización de Parámetros de Notificación a Torre de Control**:
   - Corrección de variables en `notificar_torre()`: `$producto_nombre` -> `$servicio_name`, `$fecha_cita` -> `$fecha_prog`, `$hora_cita` -> `$hora_prog`.
4. **Despliegue y Verificación en Producción**:
   - Desplegado a `root@95.111.214.233:/var/www/html/hap/HAP/SISTEMA/CLIENTE/programar_servicio.php`.
   - Permisos y propietario validados (`www-data:www-data`), verificación de sintaxis `php -l` sin errores.

### [v2.32.0] - 2026-09-09
#### 💳🛡️ Auditoría Forense de Cobros Stripe, Resolución de Captura Silenciosa en HAP Driver App y Herramienta de Captura en Torre de Control

##### 🚨 Contexto y Bug Operativo Resuelto
- **Problema Detectado**: Torre de Control reportó que múltiples órdenes finalizadas exitosamente por los Happers permanecían en estado "Sin capturar" (`requires_capture`) en el dashboard de Stripe en lugar de convertirse en cobros efectivos (`succeeded`), con riesgo de expirar y perderse tras la ventana bancaria de 7 días.
- **Causa Raíz Forense**: En `HAP/SISTEMA/HAPPER_APP/api.php` (líneas 1051-1052 y 1151-1152), la ruta de inclusión `@include_once(__DIR__ . '/../../CLIENTE/stripe_config.php')` apuntaba erróneamente dos niveles arriba (`/HAP/CLIENTE/` en lugar de `/HAP/SISTEMA/CLIENTE/`). Al estar silenciado con `@`, la ejecución continuaba pero la constante `STRIPE_SECRET_KEY` nunca existía, saltándose silenciosamente la llamada a `$intent->capture()` al presionar "Finalizar Lavado".
- **Aclaración de Cancelaciones**: Se auditó el registro de cancelaciones visualizadas en Stripe para cuentas de clientes; se confirmó que correspondieron a cancelaciones legítimas previas a la asignación gestionadas correctamente por `stripe_cancel.php`.

##### 🛠️ Cambios Implementados
1. **Recuperación Financiera Inmediata ($843.00 MXN)**:
   - Captura exitosa en tiempo real contra la API de Stripe en producción para las órdenes pendientes:
     - Orden #89166 (`pi_3UD3ljKc7j1EacEU0kcAN1JR`): $221.00 MXN -> `succeeded`
     - Orden #89168 (`pi_3UDR1aKc7j1EacEU1jofrwsb`): $234.00 MXN -> `succeeded`
     - Orden #89169 (`pi_3UDSZGKc7j1EacEU07bRELBL`): $194.00 MXN -> `succeeded`
     - Orden #89170 (`pi_3UDTdlKc7j1EacEU1MrZgcxM`): $194.00 MXN -> `succeeded`
   - Registro de bitácora en la columna `comentarios` de `venta_desc` con timestamps y datos de transacción.
2. **App Happer (`HAP/SISTEMA/HAPPER_APP/api.php`)**:
   - Corrección de rutas relativas con resolución jerárquica defensiva `file_exists()` (`../CLIENTE/` y fallback a `../../CLIENTE/`) para `stripe_config.php`, `stripe-php/init.php` y `sincronizador_dias_hap.php`.
   - Verificación estricta de `defined('STRIPE_SECRET_KEY')` y `class_exists('\Stripe\Stripe')`.
   - Registro en `error_log` con ID de servicio e ID de PaymentIntent ante excepciones.
   - Inserción de bitácora automática de captura o error en `venta_desc.comentarios`.
3. **Torre de Control Backend (`HAP/SISTEMA/TORRE_CONTROL/api.php`)**:
   - Actualización de `finalizar_servicio_admin` para permitir la captura de fondos si el servicio ya figuraba como `FINALIZADO` pero su PaymentIntent seguía en `requires_capture`.
   - Nuevo endpoint `action=capturar_pago_stripe` dedicado exclusivamente a capturar retenciones de PaymentIntents válidos de forma asíncrona.
4. **Torre de Control UI & Controlador JS (`index.php`, `assets/js/torre.js`)**:
   - Nuevo botón `[ 💳 Capturar en Stripe ]` en el modal de detalles 360° para servicios finalizados con transacciones Stripe.
   - Modal interactivo de confirmación con SweetAlert2 mostrando el importe exacto a debitar y feedback visual inmediato tras la captura.
5. **Despliegue y Verificación en Servidor de Producción**:
   - Despliegue de los 4 archivos modificados a `95.111.214.233:/var/www/html/hap/HAP/SISTEMA/`.
   - Asignación de permisos `www-data:www-data` y verificación de integridad MD5 (100% match).

### [v2.31.0] - 2026-09-07
#### 🔒🔢 PIN de Seguridad de Servicio (4 Dígitos) y Protección Anti-Fraude de Validación en Sitio

##### 🚨 Contexto y Bug Operativo Resuelto
- **Problema Detectado**: Cuando un Happer no podía escanear el código QR del cliente con la cámara trasera de su dispositivo (debido a reflejos, pantallas con bajo brillo o condiciones de luz), el flujo en `mision.php` solicitaba ingresar a mano un PIN de 4 dígitos. Sin embargo, en la pantalla de seguimiento del cliente (`tracking.php`), solo se mostraba el "Folio de Validación #89166" de 5 dígitos. El cliente intentaba dictar este folio de 5 dígitos, provocando que el teclado táctil de 4 dígitos se auto-enviara o bloqueara (`8916`), resultando en rechazo constante.
- **Riesgo Operativo / Anti-Fraude**: No existía una advertencia que impidiera al cliente dictar su código por WhatsApp o llamada telefónica antes de que el Happer estuviera físicamente en su domicilio frente al vehículo.

##### 🛠️ Cambios Implementados
1. **Migración de Base de Datos**:
   - Agregada columna `pin VARCHAR(10) NULL DEFAULT NULL AFTER token` en la tabla central `venta_desc`.
   - Poblado retroactivo de PIN de 4 dígitos para todas las órdenes activas en el sistema.
2. **Biblioteca Central de Seguridad (`Connections/pin_seguridad.php`)**:
   - `hap_generar_pin_4digitos()`: Generación de PINs numéricos de 4 dígitos (`1000` a `9999`).
   - `hap_obtener_o_asignar_pin($servicio_o_id, $higo)`: Consulta y persistencia automática ante cualquier orden previa que no tuviera PIN asignado.
   - `hap_validar_codigo_servicio($raw_code, $s, $higo, $is_dann)`: Validación multiformato (PIN oficial de 4 dígitos, escaneo QR por folio o serie, y bypass sandbox `1234`).
   - Inyección global en `Connections/higo.php`.
3. **Creación y Persistencia de Órdenes (`stripe.php`, `sincronizador_dias_hap.php`, `simular_pedido.php`)**:
   - Generación e inserción directa del PIN de 4 dígitos en el `INSERT INTO venta_desc`.
4. **Rediseño en Pantalla de Tracking del Cliente (`tracking.php`)**:
   - Bloque estilizado `.pin-security-card` con casillas numéricas individuales (`.pin-digit-cell`) de alto contraste.
   - Renombrado el identificador inferior a **"Folio de Orden #..."** para erradicar la confusión con el PIN.
   - Alerta preventiva anti-fraude: **"🔒 Regla de Seguridad HAP: Por tu tranquilidad y la de tu vehículo, no compartas este PIN con tu Happer por mensaje ni llamada. Proporciónalo únicamente cuando el Happer haya confirmado su llegada a tu ubicación y esté frente a tu vehículo."**
5. **App Happer (`mision.php` y `api.php`)**:
   - Leyenda de ayuda en `mision.php` actualizada para solicitar el PIN de 4 dígitos de la pantalla del cliente.
   - Validación estricta en `api.php?action=iniciar_lavado` invocando `hap_validar_codigo_servicio()`, manteniendo el candado mandatorio de haber confirmado llegada previa (Paso 1).
6. **Torre de Control (`index.php`, `torre.js`, `api.php`)**:
   - Exposición de la propiedad `pin` en el API de servicios y visualización de badge `🔒 PIN: [xxxx]` en el modal de detalles 360° para soporte y supervisión.
7. **Gobernanza y Documentación (`AGENT.md`, `HAP/AGENT.md`, `CHANGELOG.md`)**:
   - Actualización de Sección 10.2 e incorporación de la **Regla de Oro #25**.

### [v2.30.0] - 2026-09-07
#### 📍🛡️ Control Estricto de Cobertura Geográfica por Código Postal (15 C.P. Autorizados) y Plan de Retención Amigable

##### 🚨 Contexto y Bug Operativo Resuelto
- **Problema Detectado**: Usuarios fuera del área geográfica de servicio podían ingresar códigos postales o ubicaciones GPS no cubiertas por la flotilla de Happers, lo cual generaba órdenes huérfanas, cancelaciones forzadas, fricción con clientes y cobros o canjes indebidos.
- **Catálogo Oficial de 15 Códigos Postales Autorizados**:
  - `76269` (Zibatá)
  - `76230` (Juriquilla, Cumbres del Lago, Jurica)
  - `76146` (El Refugio, La Vista Residencial)
  - `76226` (El Campanario, Hacienda El Campanario)
  - `76100` (Álamos 1ª y 2ª Sección, Arboledas)
  - `76060` (Centro Histórico Oriente, Carretas)
  - `76215` (Querétaro Norte, Parque Industrial Querétaro)
  - `76246` (Milenio III, El Mirador)
  - `76900` (El Pueblito Centro, Residencial Santa Fe)
  - `76902` (Corregidora, Pirámides, Camino Real)
  - `76904` (Tejeda, Paseos del Bosque, Candiles)
  - `76910` (Balvanera, La Negreta, Los Pájaros)
  - `76090` (Centro Sur, Colinas del Cimatario, Estadio Corregidora)
  - `76170` (Querétaro Centro Histórico, San Francisquito)
  - `87380` (Zona Especial HAP / Matamoros)

##### 🛠️ Cambios Implementados y Arquitectura de Triple Barrera
1. **Librería Centralizada de Cobertura (`Connections/cobertura.php`)**:
   - `hap_obtener_zonas_cobertura_map()`: Mapa homologado de C.P.s autorizados y colonias principales.
   - `hap_obtener_cps_permitidos($higo)`: Consulta dinámica prioritaria a `rutas_asi` y fallback al catálogo local de 15 C.P.s.
   - `hap_es_cp_permitido($cp, $higo, $email)`: Validación estricta con whitelist de bypass sandbox para `dann.arenas@icloud.com` (C.P. 72410 Palermo).
   - `hap_registrar_espera_cp($usuario, $cp, $dir, $higo)`: Registro automático en tabla `kpicp` para demanda insatisfecha y aperturas futuras.
   - Inyección global en `Connections/higo.php` mediante `require_once`.

2. **Frontend Reactivo & Componente de Retención (`programar_servicio.php`, `hapiar.php`, `charge.js`)**:
   - **Badges Preventivos**: Las tarjetas de direcciones guardadas muestran en vivo el distintivo `⛔ Sin cobertura` si su C.P. no está autorizado.
   - **Interceptores de Ubicación**: Tanto la geolocalización GPS por mapa/coordenadas como el formulario manual extraen y validan el C.P. inmediatamente.
   - **Modal de Salida Amigable y Retención (`mostrarModalFueraCobertura`)**:
     - *Opción A*: Pedir en Oficina o Trabajo (en zona con cobertura).
     - *Opción B*: `🔔 ¡Avísenme cuando abran mi C.P.!` (envía AJAX a `registrar_interes_cp.php`, guardando en `kpicp` y confirmando con SweetAlert2).
     - *Opción C*: Ver lista interactiva de las 15 zonas y C.P.s cubiertos.
   - **Bloqueo Preventivo en `charge.js`**: Si una tarjeta guardada o dirección activa tiene C.P. inválido, se bloquea el disparo a Stripe y membresía.

3. **Backend API Pre-Stripe (`crear_stripe_intent.php`)**:
   - Validación mandatoria de `$cp` antes de inicializar o crear el `PaymentIntent` de Stripe.
   - Responde con HTTP 400 (`OUT_OF_COVERAGE`) si el C.P. está fuera de zona, evitando cualquier retención en tarjeta de crédito/débito.

4. **Persistencia Final Transaccional (`stripe.php` & `programar_servicio.php`)**:
   - Validación a prueba de manipulaciones antes de `INSERT INTO venta_desc`.
   - Lanza excepción bloqueante si el C.P. no está en el catálogo, protegiendo tanto pagos con tarjeta como canjes de membresía ($0.00).

5. **Sincronizador Recurrente de Días HAP (`sincronizador_dias_hap.php`)**:
   - Validación de C.P. antes de generar la cita semanal recurrente automática. Si el C.P. fue revocado o está fuera de cobertura, no se agenda la cita fantasma.

6. **Torre de Control (`api_dashboard.php`)**:
   - Actualización del mapeo de zonas de cobertura para rankings y cierres mensuales con `hap_obtener_zonas_cobertura_map()`.

7. **Gobernanza y Documentación (`AGENT.md`, `HAP/AGENT.md`, `CHANGELOG.md`)**:
   - Agregada la Sección 7.6 con la regla de negocio mandatoria de Cobertura Geográfica.
   - Agregada la **Regla de Oro #24** en Sección 14.

### [v2.29.0] - 2026-09-07
#### ☀️🎨 Reparación Integral y Modernización del Modo Claro en Torre de Control
- **Corrección de Selectores CSS en Modo Claro**: Subsanada discrepancia de selectores en `theme.css` (`.kanban-column` $\rightarrow$ `.kanban-col`, `.service-card` $\rightarrow$ `.serv-card`), restaurando el fondo claro suave (`#f8fafc`) y bordes limpios en las 4 columnas del tablero.
- **Iconografía y Estados Vacíos Estructurados**: Implementado componente `.empty-col-state` con iconos semánticos (`📋`, `🛵`, `🧼`, `✅`, `🚫`) y tipografía con alto contraste en lugar de cajas oscuras vacías.
- **Pestañas de Columna 4 (Completados vs Cancelados)**: Rediseñado el control segmentado con píldoras activas flotantes en verde esmeralda y rojo rubí, con contadores claros.
- **Accesibilidad y Contraste WCAG AA en Tarjetas**: Actualizados los badges de tiempo (rojo vivo `#dc2626` sobre `#fef2f2`, ámbar `#b45309`), botones de acción secundaria (`💬 WhatsApp` `#15803d`, `🚫 Cancelar` `#dc2626`), dirección `#475569` y badge de tapicería `.card-tapiceria-badge`.
- **Mosaicos CartoDB Positron / Dark Matter con Conmutación Reactiva**: Sustituido el mapa vintage de ArcGIS por **CartoDB Positron** en modo claro y **CartoDB Dark Matter** en modo oscuro, con intercambio al vuelo mediante el evento `hapThemeChanged` y reubicación del zoom a `topright`.
- **Despliegue y Sincronización en Producción**: Archivos desplegados al VPS `95.111.214.233` con permisos `www-data:www-data` y hashes MD5 verificados al 100%.

### [v2.28.0] - 2026-09-06
#### 🚗🛡️ Auditoría Forense de Servicios Duplicados, Oficialización de la Regla de Oro #23 e Idempotencia Operativa

##### 🔍 Auditoría Forense en Producción (Confirmación del Bug de Servicios Duplicados)
- **Confirmación Empírica Inequívoca**: Comprobación en base de datos real (`venta_desc`) de generación de órdenes duplicadas gemelas (a 3-12 segundos de diferencia) por doble clic / rebotes de formulario y latencia de red.
  - **Caso Fernando (`luferigi@gmail.com`) del día en curso (2026-09-06)**: Folios `#89164` (21:23:59) y `#89165` (21:24:03), generados a 4 segundos de diferencia para el `2026-09-07 08:00:00`, provocando un doble descuento en su saldo de lavados de membresía (ID 11: 2 lavados debitados).
  - **Casos en Citas Programadas**: Folios `#718` y `#719` (3s de diferencia para `2026-08-26 10:00:00`), `#618` y `#619` (12s de diferencia para `2026-07-27 14:00:00`), `#720`, `#739` y `#744` (múltiples citas superpuestas para `2026-08-30 09:00:00`).
  - **Casos en Bajo Demanda (Express)**: Folios `#206` y `#207` (46s de diferencia, doble cobro en Stripe) y `#151` y `#152` (126s de diferencia).
  - **Duplicación de Series**: Casos en `stripe_servicio.php` donde `$serie = $row_anterior['serie']` provocó que una misma serie fuera compartida por hasta 4 folios distintos.
- **Identificación de 4 Causas Raíz**:
  1. *Frontend UX/UI*: Ausencia de deshabilitación de botones (`disabled = true`), spinners o backdrop overlays en flujos de membresía y tarjetas guardadas (`programar_servicio.php`, `charge.js`).
  2. *Latencia Síncrona*: Ejecución bloqueante de envíos de correo SMTP (PHPMailer) y barrido masivo de notificaciones FCM en el hilo HTTP previo a la respuesta.
  3. *Ausencia de Idempotencia*: Inexistencia de tokens únicos o ventanas de descarte de peticiones idénticas en 60 segundos.
  4. *Vacío en Regla de Negocio*: Cero validación en servidor sobre si el auto ya se encuentra en servicio activo o cuenta con una cita en el mismo bloque horario.

##### 📋 Oficialización de la Regla de Negocio (Sección 7.5 y Regla de Oro #23 en AGENT.md)
- **Bloqueo por Servicio Activo**: Ningún auto puede solicitar nuevo servicio teniendo uno en estatus `PENDIENTE`, `ACEPTADO`, `EN_CAMINO`, `PROCESO` o `INICIADO`.
- **Bloqueo por Cita Programada Existente**: Ventana de protección de ±60 minutos; prohibición estricta de solapar citas en el mismo rango horario para el mismo vehículo.
- **Throttle de Idempotencia (60 segundos)**: Detección y rechazo inmediato de peticiones gemelas sin alterar saldos de membresía ni realizar dobles cargos en pasarelas.

### [v2.27.0] - 2026-09-06
#### 🌐🏛️ Convención Internacional Enterprise DB, 4 Proyectos BFF Desacoplados, Arquitectura AWS y Regla de No Destrucción

##### 🌐 Ecosistema HAP & Base de Datos Enterprise
- **Publicación del Documento Maestro [`INFRASTRUCTURE.md`](file:///Users/Dann/Server/ha-p/INFRASTRUCTURE.md)**:
  - Especificación técnica integral de la arquitectura en la nube de AWS para escala nacional: Amplify Hosting, Global Accelerator (Anycast IPs), Shared ALB (Host-based routing), Elastic Beanstalk (4 entornos independientes), Amazon RDS Multi-AZ (Primary Writer + Read Replica), Amazon ElastiCache (Redis para telemetría a 0 ms) y Amazon S3 con subida directa vía Presigned URLs y archivo a Glacier.
- **Oficialización de la Regla de Oro #19 (Enterprise DB Standard en Inglés)**:
  - Adopción estricta de nomenclatura en idioma inglés para todo nuevo esquema de base de datos (`snake_case`, tablas en plural, claves `<singular>_id`, timestamps terminados en `_at`, booleanos `is_`/`has_`, montos financieros `_amount`/`_balance`, códigos de estado UPPERCASE).
  - Eliminación del antipatrón de usuario monolítico unificado (*The God User Table*); separación explícita de dominios:
    - `admin_users`: Personal administrativo central de Torre de Control.
    - `franchises` & `franchise_users`: Territorios concesionados y administradores de flotilla.
    - `happers` & `happer_telemetry`: Lavadores móviles en campo y pings de geolocalización de alta frecuencia.
    - `customers`: Clientes finales particulares y socios de membresía.
    - `services` & `service_photos`: Transacciones de lavado y archivo de evidencias fotográficas por ángulo.
- **Oficialización de la Regla de Oro #20 (Patrón BFF: 4 Proyectos con Frontend PWA + Backend API Dedicado)**:
  - Bifurcación del producto en 4 aplicaciones y microservicios independientes:
    1. **HAP Users**: PWA Frontend (`app.soyhap.com`) + Backend API dedicado (`api.users.soyhap.com`).
    2. **HAP Drivers**: PWA Frontend (`driver.hap.mx`) + Backend API dedicado (`api.drivers.hap.mx`).
    3. **HAP Fleet**: WebApp Frontend (`fleet.hap.mx`) + Backend API dedicado (`api.fleet.hap.mx`).
    4. **HAP Control Tower**: WebApp Frontend (`tower.hap.mx`) + Backend API dedicado (`api.tower.hap.mx`).
  - Cada aplicación cuenta con su propia API especializada (Backend For Frontend). Cero APIs centrales monolíticas; todas las APIs se conectan directamente a la capa central de base de datos relacional (Amazon RDS).
- **Oficialización de la Regla de Oro #21 (Principio de No Destrucción / Migración Segura)**:
  - Mandato absoluto de no sobreescribir el sistema legado existente de forma destructiva o directa.
  - Creación de todo nuevo desarrollo en directorios autónomos e independientes.
  - Exigencia de respaldo integral previo y verificado antes de cualquier migración de datos o esquema.
  - Convivencia pacífica durante la transición hacia AWS mediante corte transparente vía DNS (*Zero Downtime*).
- **Oficialización de la Regla de Oro #22 (Infraestructura Cloud-Native en AWS)**:
  - Definición del stack estándar: AWS Amplify + Global Accelerator + Shared ALB + Elastic Beanstalk (Multi-Env) + Amazon RDS + ElastiCache Redis + S3 Presigned URLs.

### [v2.26.0] - 2026-09-06
#### 🔑⚡ Persistencia Continua de Sesión en Campo (Zero-Logout Policy) & Refactorización Táctil de Misión

##### ⚡ Happer App (App de Conductores 2.0)
- **Persistencia Continua de Sesión por 365 Días (Regla de Oro #18)**:
  - Eliminación definitiva del cierre de sesión involuntario por inactividad o suspensión del navegador en Android/iOS.
  - Configuración de persistencia extendida en `config.php`: `session.gc_maxlifetime = 31536000` (1 año), `session.cookie_lifetime = 31536000`, `SameSite=Lax`, `HttpOnly`.
  - **Mecanismo de Auto-Restauración Silenciosa (`require_happer_auth`)**: Si la sesión en memoria PHP expira por inactividad pero existe la cookie persistente `happer_session_token`, el backend reconstruye transparente y automáticamente la sesión completa (`happer_id`, `happer_usuario`, `happer_nombre`, `happer_cargo`, `happer_session_token`) en <1 ms sin solicitar credenciales ni interrumpir al conductor.
  - **Convivencia Armónica con Monosesión (Regla de Oro #15)**: Si el usuario inicia sesión en un nuevo dispositivo, el token anterior se revoca y el dispositivo previo es desconectado con `SESSION_DUPLICATED`.
  - **Revocación Limpia al Cerrar Sesión (`logout.php`)**: Al hacer clic voluntario en 'Cerrar Sesión', el campo `session_token` en base de datos se limpia a `NULL`, impidiendo la auto-restauración.
- **Refactorización Táctil Directa en HUD de Misión (`mision.php`)**:
  - Eliminación de disparadores sintéticos `input.click()` sobre inputs ocultos.
  - Incorporación de inputs nativos transparentes (`.slot-native-input`, z-index 6) superpuestos en cada tarjeta de cuadrante (`.angle-slot-card`) y botón de daño previo (`DANOS`) con `touch-action: manipulation` y `user-select: none`.
  - Apertura instantánea de cámara a nivel de sistema operativo sin bloqueos ni retardos de gestos.
- **Pipeline de Compresión Fotográfica Client-Side (Canvas 1280px)**:
  - Compresión obligatoria en dispositivo antes de la transmisión (`comprimirImagenEnCliente`): reduce fotografías de cámara de 12-15 MB a ~120-180 KB (reducción del 98%).
  - Velocidad de subida reducida de 60s a <0.5s en conexiones 3G/4G inestables.
- **Previsualización Optimista Instantánea (0 ms) & Progreso Real XHR**:
  - Despliegue inmediato de la imagen capturada con spinner y barra de progreso real mediante `XMLHttpRequest.upload.onprogress`.
  - Tolerancia a fallos: retención de la foto local y botón de reintento en 1 toque (`[🔄 Reintentar]`) sin pérdida de datos.
- **Optimización de Memoria en Escáner QR**:
  - Reutilización de instancia única de Canvas offscreen en `bucleEscaneoQR` con `{ willReadFrequently: true }`, evitando saturación del Garbage Collector en dispositivos de 2 GB RAM.

### [v2.25.0] - 2026-09-06
#### 📱⚡ Estándar de Campo HAP: Optimización para Gama Baja, Ahorro Extremo de Datos y Resiliencia ante Cortes de Red

##### ⚡ Happer App (App de Conductores 2.0)
- **Doctrina Oficial de Ingeniería de Campo**:
  - Toda nueva funcionalidad debe diseñarse bajo la premisa de que los operadores en campo utilizan teléfonos Android de gama de entrada con bajo rendimiento (2-3 GB RAM), planes de datos móviles limitados/prepago y frecuentes cortes de señal celular en traslados en motocicleta, casetas y sótanos.
- **Pilar 1: Rendimiento Ultraligero en Hardware Restringido**:
  - Arquitectura PWA en Vanilla JS y CSS nativo; peso total menor a 200 KB sin frameworks pesados ni librerías superfluas.
  - Renderizado eficiente y animaciones aceleradas por GPU (`transform`, `opacity`) sin provocar recálculos forzados de layout (*reflows*).
  - Liberación inmediata de memoria Blob (`URL.revokeObjectURL`) y limpieza de timers para prevenir degradación de batería.
- **Pilar 2: Economía Extrema de Datos Móviles**:
  - Compresión obligatoria en cliente mediante Canvas HTML5 para toda fotografía de carrocería (máx 1280-1600px, JPEG calidad 0.72).
  - Reducción del peso de ~10 MB por imagen a **<200 KB por captura**, permitiendo completar el protocolo de 8 fotos con menos de **1.5 MB en total** (ahorro mayor al 98% en el paquete de datos del operador).
  - Payloads JSON concisos y almacenamiento en caché de assets con Service Worker.
- **Pilar 3: Resiliencia ante Desconexión y Cortes de Red**:
  - Persistencia de estado y cronómetro de lavado en `localStorage` ante cierres involuntarios, llamadas entrantes o reinicios de dispositivo.
  - Tolerancia a cortes en subida de evidencias: retención de previews locales, notificación amigable y botón de reintento en 1 toque sin resetear formularios.
  - Validación granular en servidor (`verificar_fotos_inspeccion`): si 3 de 4 fotos se subieron antes de la caída de señal, el sistema conserva las 3 y solo exige retransmitir la foto faltante.

##### 🛰️ Torre de Control
- **Monitoreo de Conectividad de Flota**:
  - Tolerancia a retrasos leves en reportes de telemetría GPS causados por zonas de sombra celular en ruta sin marcar falsos abandonos.

##### 👤 User App (App Clientes)
- **Consistencia en Tiempos de Respuesta**:
  - El cliente recibe evidencias fotográficas optimizadas y ligeras sin tiempos de espera prolongados al abrir la galería de entrega.

---

### [v2.24.0] - 2026-09-06
#### 🔒 Verificación Estricta de Fotos de Inspección en Servidor & Bloqueo Total de Retroceso en Misión HAP

##### ⚡ Happer App (App de Conductores 2.0)
- **Verificación Asíncrona en BD antes de Paso 3 (`verificar_fotos_inspeccion`)**:
  - Nuevo endpoint en `api.php` que consulta físicamente la tabla `fotos` para el `servicio_id`.
  - Comprueba la existencia procesada de los 4 cuadrantes obligatorios (`FRENTE`, `COSTADO_IZQ`, `COSTADO_DER`, `TRASERA`) con soporte para guion bajo y espacio.
  - El botón del Paso 2 pasa a estado de carga `⏳ VERIFICANDO EN SERVIDOR...` y bloquea el avance si algún archivo no se insertó en MySQL por cortes de señal.
  - Si falta algún ángulo, notifica al Happer con un Toast específico (ej. *"⚠️ Falta procesar o subir la fotografía de: Costado Derecho"*) y resetea solo ese cuadrante a pendiente para su re-toma inmediata.
  - Si los 4 ángulos están confirmados, sincroniza los IDs/URLs de BD y autoriza el paso al Paso 3 (*Identidad*).
- **Corrección de Clasificación de Ángulos en PHP (`hap_clasificar_angulo`)**:
  - Corregido el bug que evaluaba `COSTADO_IZQ` y `COSTADO_DER` como `'GENERAL'`, eliminando la pérdida de fotos al recargar la página.
- **Eliminación del Error Falso de Inspección al Finalizar el Lavado**:
  - Rediseñada la función `puedeAccederAlPaso(6)` para suprimir la recursión innecesaria hacia el Paso 3, validando en el Paso 5 únicamente: 30 minutos de lavado, checklist 4/4 y 4 fotos de entrega final.
  - Corregido el llamado a `obtenerMinutosLavado()` para evitar errores de referencia.
- **Validación de 4 Fotos Finales de Entrega en Backend (`finalizar_lavado`)**:
  - `api.php` comprueba en la base de datos que existan `FINAL_FRENTE`, `FINAL_COSTADO_IZQ`, `FINAL_COSTADO_DER` y `FINAL_TRASERA` antes de finalizar la orden y capturar fondos en Stripe.
- **Bloqueo Definitivo de Retroceso en Toda la Misión (Protocolo Unidireccional)**:
  - En `intentarIrAlPaso(targetPaso)`: si `targetPaso < MISION.pasoActivo`, se bloquea el evento táctil y se alerta: *"🔒 Este paso ya fue completado. El protocolo HAP avanza en una sola dirección."*
  - En el Stepper HUD: los pasos completados muestran `.completed` con `cursor: default` y checkmark verde (`✓`).
  - Candado de inmutabilidad: las fotos de inspección inicial no pueden eliminarse una vez superado el Paso 2 (`MISION.pasoActivo > 2`).
- **Actualización de Etiquetas de Avance**:
  - Botón de Paso 2 actualizado a: **`CONTINUAR A IDENTIDAD (QR / PIN)`**.

##### 🛰️ Torre de Control
- **Monitoreo de Calidad Fotográfica**:
  - Las evidencias fotográficas validadas en BD se reflejan en tiempo real en los expedientes de servicio 360°.

##### 👤 User App (App Clientes)
- **Garantía de Auditoría de Carrocería**:
  - El cliente tiene certeza de que el auto cuenta con registro fotográfico completo antes de que inicie la limpieza y después de la entrega.

---

### [v2.23.0] - 2026-09-06
#### 📱 Sesión Única por Dispositivo en Happer App (`session_token`)

##### ⚡ Happer App (App de Conductores 2.0)
- **Unicidad de Sesión por Dispositivo**:
  - Cada inicio de sesión en `login.php` genera un token criptográfico de 32 bytes (`bin2hex(random_bytes(32))`) almacenado en `usuarios.session_token` y sincronizado en `$_SESSION['happer_session_token']` y cookies.
  - Validación en cada petición en `config.php`, `api.php` y `mision.php`.
  - Al iniciar sesión en un segundo teléfono, la sesión anterior queda invalidada al instante.
  - El backend devuelve `HTTP 401 Unauthorized` (`SESSION_DUPLICATED`), destruye las variables de sesión y redirige al operador a `login.php?error=session_duplicated`.
  - Manejo en frontend (`happer_app.js` y `mision.php`) para capturar la respuesta 401 y mostrar aviso de sesión duplicada.

##### 🛰️ Torre de Control
- **Trazabilidad de Conexión de Flota**:
  - Almacenamiento del dispositivo y timestamp de sesión (`session_dispositivo`, `session_alta`) en la tabla `usuarios` para auditoría operativa.

---

### [v2.22.0] - 2026-09-06
#### 🛰️ Sincronización Remota Torre-Happer y Auditoría de Citas Programadas

##### 🛰️ Torre de Control
- **Conclusión y Cancelación Remota con Notificación a Flota**:
  - Al finalizar o cancelar administrativamente un servicio desde la Torre de Control, el evento se transmite en tiempo real al Happer asignado mediante el canal de sondeo/SSE.
- **Mapeo de Columna `EN_SITIO`**:
  - Las citas programadas con hora de llegada confirmada (`espera` no nulo) se mapean adecuadamente en la columna Kanban correspondiente.

##### ⚡ Happer App (App de Conductores 2.0)
- **Modal de Señal Remota de Torre (`modal_torre_signal`)**:
  - Si Torre de Control finaliza o cancela el servicio, `mision.php` detiene los cronómetros, emite alerta sonora y despliega el modal informativo con el motivo asentado por el supervisor, liberando al Happer para volver al Radar sin quedar encerrado en la misión.
- **Ventana de 45 Minutos para Citas Programadas**:
  - Citas programadas futuras no bloquean la disponibilidad operativa en el día actual y solo permiten iniciarse 45 minutos antes de la hora pactada.

##### 👤 User App (App Clientes)
- **Precisión en Estatus de Servicio**:
  - El cliente recibe notificaciones consistentes sin importar si el servicio fue concluido por escaneo del operador o por supervisión administrativa.

---

### [v2.21.0] - 2026-09-06
#### 🛑 Deprecación y Bloqueo Operativo en App Clásica de Happers (`/HAPPERS/`)

##### ⚡ Happer App (App de Conductores 2.0 & Legacy)
- **Componente Modular de Bloqueo (`HAPPERS/modal_obsoleto.php`)**:
  - Capa de bloqueo fija dark glassmorphism (`backdrop-filter: blur(14px)`, `z-index: 9999999`).
  - Badge pulsante de alerta: `🛑 VERSIÓN OBSOLETA SIN SOPORTE`.
  - Notificación categórica informando que la aplicación clásica fue descontinuada y la operación se realiza en la nueva suite.
  - Botón de acción destacado: **`🚀 ABRIR NUEVA APP DE HAPPERS`** (`../HAPPER_APP/`).
  - Enlace secundario de desconexión: *\"Cerrar sesión en esta app antigua\"* (`logout_happer.php`).
- **Cobertura Completa en el Directorio Legacy**:
  - Inyectado en `happer.php`, `index.php`, `login_happer.php` y `aceptar_servicio_happer.php` (con redirección automática de folios a `HAPPER_APP/tomar_servicio.php`).

---

### [v2.20.0] - 2026-09-06
#### 🚪 Rediseño Mobile-First de Portada de Bienvenida (`CLIENTE/index.php`)

##### 👤 User App (App Clientes)
- **Nueva Portada de Bienvenida Dark Glassmorphic**:
  - Diseño moderno optimizado para dispositivos móviles con desenfoque de cristal y paleta neón.
  - Slider interactivo de propuesta de valor (Lavado sin agua, Cero esperas, Garantía total).
- **Separación Limpia de Roles en Dos Botones Claros**:
  - **`[ 🚗 SOY USUARIO ]`**: Acceso al funnel del cliente (`login.php`).
  - **`[ ⚡ SOY HAPPER ]`**: Redirección directa al acceso de conductores (`/HAP/SISTEMA/HAPPER_APP/`).
- **Eliminación de Distractores y Elementos Obsoletos**:
  - Retirados enlaces secundarios confusos.
  - Eliminado el badge descontinuado *"Driver 2.0"*.

---

### [v2.19.0] - 2026-09-05
#### 📱 Nueva App de Happers 2.0 (PWA Ultra Ligera & Single-Task Driver Funnel)
- **Directorio Completamente Aislado (`/HAP/SISTEMA/HAPPER_APP/`)**:
  - Construcción desde cero de una Progressive Web App (PWA) moderna, ergonómica y responsive para operadores de campo, sin tocar el directorio legacy `/HAP/SISTEMA/HAPPERS/`.
  - Peso total de recursos en cliente reducido de más de 60 MB a **menos de 200 KB** (aceleración masiva de carga en redes móviles de calle).
- **Arquitectura de Estado Reactivo (Single-Task Driver Funnel)**:
  - **Estado IDLE**: Switch operativo de Guardia (`[ 🟢 EN GUARDIA ]` / `[ 🔴 DESCONECTADO ]`), bento cards con métricas de la jornada (lavados concluidos, ganancias acumuladas y propinas), radar de servicios bajo demanda cercanos con cálculo de distancia Haversine en km y feed de próximas citas programadas con cuentas regresivas.
  - **Estado TRÁNSITO**: Ficha ergonómica del cliente con enlaces 1-touch a WhatsApp y llamadas telefónicas, datos del vehículo con tamaño y tipo de tapicería, navegación satelital directa en **Waze** y **Google Maps**, y botón de confirmación de llegada.
  - **Estado LAVADO (HUD Circular de Calidad)**: Cronómetro segundo a segundo con arco de progreso neón, control estricto del estándar de calidad mínimo de 30 minutos (bloqueo automático de finalización prematura) y checklist interactivo de inspección con persistencia local.
- **Detección Instantánea de QR & Teclado Táctil de PIN Manual (`qr_engine.js`)**:
  - Detección de código QR por hardware con la API nativa `BarcodeDetector` acelerada por GPU y fallback local offline con `jsQR` (128 KB).
  - Teclado numérico táctil en pantalla para ingreso manual de folio/PIN en segundos, garantizando operación ininterrumpida ante cámaras dañadas, lluvia o baja iluminación.
- **Backend API Unificado (`api.php`) con Reglas del Manifiesto HAP**:
  - Cumplimiento de **Regla #9** (candado de exclusividad estricto de máximo 1 servicio activo por operador).
  - Cumplimiento de **Regla #10** (captura definitiva del `PaymentIntent` de Stripe al finalizar).
  - Cumplimiento de **Regla #11** (bloqueo de citas programadas con más de 45 minutos de anticipación).
  - Cumplimiento de **Regla #6.3** (auto-reagendamiento semanal de citas de membresía DÍA HAP +7 días).
  - Telemetría satelital continua en segundo plano (`ping_gps`) hacia la base de datos para seguimiento en la Torre de Control.

### [v2.18.0] - 2026-09-05
#### ⏰ Blindaje de Ventana de Ejecución de Citas Programadas, Reversión Folio #747 y Expedientes 360° en Torre de Control
- **Ventana de Ejecución de Citas Programadas (Máximo 45 min antes)**:
  - **Bloqueo en Escáner QR (`QR/code.php`)**: Valida que ninguna cita programada pueda pasar a `PROCESO` con más de 45 minutos de anticipación al horario pactado con el cliente. Si un operador intenta validar antes, el sistema rechaza la operación con una advertencia explicativa.
  - **Blindaje en Panel Happer (`happer.php`)**: `query_ultimo_servicio` excluye citas programadas futuras para que no se conviertan prematuramente en el servicio activo del operador. Además, el formulario manual de validación por ID se reemplaza por una tarjeta informativa de cita futura hasta que se cumpla la ventana permitida (45 minutos previos).
  - **No Concurrencia Selectiva**: Se perfeccionó el candado de concurrencia en `aceptar_servicio_happer.php`, `aceptada.php` y `api.php` para que la asignación de citas en días futuros no bloquee al Happer de tomar servicios bajo demanda en el día en curso.
- **Saneamiento Inmediato Folio #747**:
  - Revertido de `PROCESO` a `PROGRAMADO` con `inicio = NULL` en producción. Se conserva la asignación para el Happer Marcos Hiram Gómez para mañana domingo a las 08:00 hrs y se libera su disponibilidad inmediata en campo.
- **Expedientes 360° en Modal de Detalles de Torre de Control**:
  - **Nuevo Expediente Happer (`happer.php` & `assets/js/happer.js`)**: Página de perfil completo para Happers con KPIs operativos, historial de 50 servicios y telemetría.
  - **Accesos Directos en Detalles 360° (`index.php`, `torre.js`, `torre.css`)**: Botones y enlaces en cabecera `[ Ver Perfil ↗ ]` tanto para el cliente solicitante como para el Happer asignado.

### [v2.17.0] - 2026-09-04
#### 🔒 Candado de Exclusividad Operativa de Happers, Cobro Stripe en Dos Fases, Conclusión Administrativa y Saneamiento Integral de Servicios
- **Candado de No-Concurrencia de Happers (Máximo 1 Servicio Activo)**:
  - **Bloqueo Móvil (`aceptar_servicio_happer.php`, `aceptada.php`)**: Intercepta intentos de tomar servicios si el operador ya posee una orden activa en `['ACEPTADO', 'EN_CAMINO', 'PROCESO', 'INICIADO']`. Aborta la transacción y redirige a `happer.php?err=happer_ocupado&serv={id}`.
  - **Alerta Visual en Happer (`happer.php`)**: Modal SweetAlert2 que notifica al operador: *"⛔ Servicio en Curso: Tienes el servicio #{id} en proceso. Debes finalizarlo antes de poder tomar uno nuevo."*
  - **Smart Dispatch Blindado (`api.php`, `torre.js`)**:
    - En el modal de asignación asistida, los Happers ocupados aparecen con badge `⛔ Ocupado (#{id})`, estilo visual translúcido y botón deshabilitado `Bloqueado 🔒`.
    - Endpoint `api.php?action=asignar_happer` valida transaccionalmente la disponibilidad del Happer en la base de datos antes de asignarlo.
- **Ciclo de Vida de Stripe en Dos Fases (Retención Previa vs. Captura Definitiva)**:
  - En `CLIENTE/crear_stripe_intent.php`, el `PaymentIntent` se genera con `capture_method: manual` (`requires_capture`), garantizando fondos y solvencia sin debitar en firme.
  - El cobro definitivo (`$intent->capture()`) se ejecuta exclusivamente al momento de la conclusión del servicio (escaneo de QR de entrega en `HAPPERS/QR/code.php` o Conclusión Administrativa en Torre de Control).
- **Conclusión Administrativa de Servicios en Torre de Control (`index.php`, `api.php`, `torre.js`, `torre.css`)**:
  - Nuevo endpoint `api.php?action=finalizar_servicio_admin`: valida estatus, captura fondos retenidos en Stripe si están en `requires_capture`, asienta `FINALIZADO`, bitácora de auditoría y motivo en `comentarios`, libera la disponibilidad del Happer y emite notificación a Torre de Control.
  - Botón `[ ✅ Concluir ]` en tarjetas Kanban de `EN_TRASLADO` y `EN_PROCESO`, y en la vista de Detalles 360° con confirmación interactiva mediante SweetAlert2.
- **Watchdog Preventivo de Reconciliación Logística (`api.php?action=get_telemetry`)**:
  - En cada pulso de telemetría, inspecciona citas huérfanas o rezagadas (>24h sin asignación de Happer).
  - Las transiciona a `CANCELADO` por expiración de cita y, si corresponden a un socio con membresía de Días HAP, **restituye automáticamente el lavado** en `clientes_membresias.lavados_disponibles`.
- **Saneamiento Inmediato de Base de Datos en Producción**:
  - Depuración de servicios zombis rezagados de agosto/septiembre (#714, #716, #772 a `FINALIZADO`; #733, #745, #738 a `CANCELADO` con lavados restituidos). La base de datos viva opera ahora con 0 servicios vencidos y únicamente 3 citas futuras válidas (#747, #748, #761).
- **Actualización del Manifiesto de Arquitectura (`AGENT.md`)**:
  - Documentadas las secciones 9.5 (Exclusividad Operativa de Happers), 10.10 (Conclusión Administrativa y Watchdog), 11.4 (Ciclo Financiero de Stripe) y Reglas de Oro 9 y 10.

### [v2.16.0] - 2026-09-04
#### 🗺️ Trazado de Ruta Leaflet, Watchdog SLA de Telemetría, Battery API en Tracker y Canal SSE Híbrido
- **Trazado de Ruta Recorrida en Mapa de Torre de Control**:
  - **Endpoint `api.php?action=get_happer_trail`**: Recupera los puntos GPS de las últimas 4 horas ordenados cronológicamente y calcula la distancia recorrida en kilómetros.
  - **Polilíneas Satelitales Leaflet (`torre.js`)**: Trazo de ruta Neón Cyan (`#00e5ff`) con círculos de inicio/fin, encuadre automático con `fitBounds` y chip flotante con distancia, cantidad de pings y botón de cierre rápido `[✕]`.
  - Botón interactivo `[ 🗺️ Ver Ruta Satelital ]` integrado en el popup de cada Happer en el mapa.
- **Watchdog SLA de Telemetría (Detección de Pérdida de Señal Satelital)**:
  - Detección automática en `get_telemetry`: si un Happer con servicio asignado (`EN_TRASLADO` o `LAVANDO`) no envía señal GPS por más de 7 minutos, el backend lo marca con `alerta_telemetria: true` e inyecta la alerta en el arreglo global `alertas_sla`.
  - Advertencia visual en el mapa con badge parpadeante rojo y distintivo de alerta en la tarjeta Kanban del servicio.
- **Modos de Batería Inteligente en Happer Tracker (`happer_tracker.js`)**:
  - Integración nativa con la **Battery Status API** (`navigator.getBattery`):
    - Conmutación automática a **Modo Eco** cuando la batería cae $\le 20\%$ sin cargador conectado: amplía los intervalos a 60s / 50m y libera el `Screen WakeLock` para permitir que la pantalla se atenúe.
    - Reactivación a **Modo Moto** (30s / 20m con WakeLock) al conectar el cargador o superar el 25% de batería.
    - Conmutador manual táctil al pulsar la píldora flotante para alternar libremente entre `[🏍️ MOTO]` y `[🔋 ECO]`.
- **Canal de Streaming de Eventos SSE (`api_stream.php`)**:
  - Endpoint dedicado para Server-Sent Events (`text/event-stream`) con compresión desactivada, latidos periódicos `ping` y ciclos de 40s con reconexión transparente.
  - Integración híbrida en `torre_notificaciones.js`: utiliza `EventSource` como canal prioritario para recibir eventos a **0 ms de latencia**, manteniendo el sondeo HTTP como respaldo infalible.

### [v2.15.0] - 2026-09-04
#### 🛰️ Telemetría GPS Continuo en Segundo Plano, Sesión Única por Dispositivo y Push Notifications en Torre de Control
- **GPS Satelital Continuo en Segundo Plano para Happers**:
  - **Endpoint REST Ultraligero (`HAP/SISTEMA/HAPPERS/api_gps_ping.php`)**: Sustitución definitiva del obsoleto formulario `form100` y el script `code_gps.php`. Inserción optimizada de coordenadas `<15ms` en la tabla `gps (lat, lon, usuario, tvBarCode, alta)` con validación de sesión.
  - **Módulo Continuo Móvil (`HAP/SISTEMA/HAPPERS/assets/js/happer_tracker.js`)**:
    - `navigator.geolocation.watchPosition` con `{ enableHighAccuracy: true }` y fallback periódico cada 20 segundos.
    - Transmisión satelital mediante `fetch(..., { keepalive: true })` y `navigator.sendBeacon` para garantizar envío persistente durante traslados en moto cuando el teléfono bloquea pantalla o se utiliza Waze / Google Maps.
    - Filtro de desplazamiento inteligente (Haversine >= 20 metros o >= 30 segundos) para conservar batería y evitar saturación en base de datos cuando el operador está estacionado lavando.
    - `Screen WakeLock API` para evitar suspensión de pantalla en soporte de motocicleta y `Page Visibility API` para reconexión instantánea al desbloquear el teléfono.
    - Widget visual interactivo flotante en pantalla del Happer con estado en vivo (`🟢 GPS ACTIVO`, `⚡ Transmitiendo...`, `⚠️ Error`).
- **Control Estricto de Concurrencia (Sesión Única de Happer por Dispositivo)**:
  - **Columnas de Seguridad en `usuarios`**: Adición de `session_token VARCHAR(64)`, `session_dispositivo VARCHAR(255)` y `session_alta DATETIME`.
  - **Generación Criptográfica al Iniciar Sesión (`code_happer.php`)**: Creación de token aleatorio de 64 caracteres en cada login, invalidando inmediatamente cualquier sesión previa en otros dispositivos.
  - **Validación Automática en Cada Petición (`session_happer.php`)**: Comprobación constante de `session_token` contra base de datos. Si otro dispositivo inicia sesión, el anterior es desconectado al instante con revocación de cookies y redirección o respuesta `401 Unauthorized` con código `SESSION_DUPLICATED`.
  - **Alerta Amigable en Login (`login_happer.php`)**: Modal SweetAlert2 de advertencia en caso de detección de sesión duplicada.
- **Push Notifications en Tiempo Real para Torre de Control**:
  - **Tabla de Notificaciones (`torre_notificaciones`)**: Cola relacional indexada para eventos del sistema (`NUEVO_SERVICIO`, `CANCELACION_SERVICIO`, `NUEVO_CLIENTE`) con retención y purga automática cada 48 horas.
  - **Emisor Centralizado (`TORRE_CONTROL/helper_notificaciones_torre.php`)**: Función reutilizable `notificar_torre()` conectada a los flujos de `stripe.php`, `programar_servicio.php`, `sincronizador_dias_hap.php`, `stripe_cancel_hap.php`, `cancelar_servicio_admin_ajax.php`, `registro.php` y `api_dashboard.php`.
  - **Endpoint de Eventos (`TORRE_CONTROL/api.php?action=get_live_notifications`)**: Sondeo ligero cada 6 segundos con latencia < 10ms.
  - **Módulo de Experiencia en Vivo (`TORRE_CONTROL/assets/js/torre_notificaciones.js`)**:
    - **Alertas de Escritorio (HTML5 Web Notification API)**: Popups nativos del sistema operativo interactivos con icono oficial HAP.
    - **Síntesis Sonora sin Archivos MP3 (Web Audio API)**: Acordes diferenciados en tiempo real (triada ascendente brillante para nuevo servicio, doble tono de precaución para cancelación y campana cristalina para nuevo cliente).
    - **Toasts Flotantes Glassmorphism**: Tarjetas interactivas en pantalla con botón rápido para inspeccionar el servicio o abrir el perfil 360° del cliente.
    - **Sincronización Reactiva**: Disparo automático de recarga de marcadores en Radar Operativo (`index.php`) y KPIs en Dashboard Ejecutivo (`dashboard.php`).

### [v2.14.0] - 2026-09-04
#### 🌗 Sistema Inteligente Dual Theme (Tema Claro / Tema Oscuro / Detección Automática por Horario)
- **Tema Claro de Alto Contraste (`assets/css/theme.css`)**:
  - Paleta de diseño basada en Slate 100/blanco puro (`--bg-base: #f1f5f9`, `--bg-surface: #ffffff`, `--bg-card: #ffffff`), tipografía Slate 900 de alto contraste (`--text-primary: #0f172a`), y acentos en Azul Zafiro HAP (`#0284c7`) y Esmeralda (`#059669`).
  - Adaptación completa de componentes en toda la Torre de Control: tarjetas KPI, tablas, formularios, modales, dock de acciones masivas, columnas Kanban, tarjetas de cochera e historial, y mapa satelital Leaflet.
- **Detección Automática por Horario del Operador (`assets/js/theme.js`)**:
  - En modo automático (`auto`, por defecto), evalúa el horario local del dispositivo:
    - **07:00 a 18:59**: Carga y activa automáticamente el **Tema Claro**.
    - **19:00 a 06:59**: Carga y activa automáticamente el **Tema Oscuro**.
  - Monitor continuo cada 60 segundos que detecta el cambio de día/noche en tiempo real sin obligar al usuario a recargar la pantalla.
- **Conmutador Interactivo & Persistencia en `localStorage`**:
  - Widget de 3 píldoras en la cabecera de todas las vistas (`dashboard.php`, `index.php`, `cliente.php`): `☀️ Claro`, `🌙 Oscuro`, `🕒 Auto`.
  - El usuario puede cambiar y fijar libremente el tema deseado con un solo clic, guardando su preferencia de inmediato.
- **Prevención Absoluta de Destellos (Zero FOUC)**:
  - Inyección de micro-script en `<head>` antes del parseo de hojas de estilo que pre-calcula el tema y aplica el atributo `data-theme` a nivel raíz (`<html>`), asegurando un renderizado instantáneo y sin parpadeos.
- **Reactividad en Analíticas & Gráficas (Chart.js)**:
  - Escucha de evento `hapThemeChanged` en `dashboard.js` y `cliente.js` para re-dibujar dinámicamente las gráficas de facturación, mix de servicios, distribución semanal y zonas con los colores óptimos de rejilla y texto según el tema activo.

### [v2.13.0] - 2026-09-04
#### 🎛️ Rediseño de Navegación & Máxima Visibilidad de Radar Operativo en Tiempo Real
- **Conmutador Maestro de Modos en Cabecera (`.mode-master-switcher`)**:
  - Implementado tanto en `dashboard.php` como en `index.php` para una transición aeroespacial simétrica entre las dos consolas operativas.
  - Destaca el **Radar Operativo** con punto verde pulsante `🟢 EN VIVO`, subtítulo explicativo *(Despacho GPS & Tiempos)* y etiqueta de atajo de teclado **[R]**.
  - Destaca el **Dashboard Ejecutivo** con subtítulo *(Analíticas & CRM Clientes)* y etiqueta de atajo **[D]**.
- **Pestaña Prioritaria en Barra de Navegación (Nivel 2)**:
  - Se colocó como la opción #1 en `.dashboard-tabs` el acceso directo `[ 🟢 🗺️ Radar en Vivo (Despacho) ]`, haciendo imposible que pase desapercibido para nuevos operadores.
- **Hero Callout Banner en Analíticas & KPIs**:
  - Tarjeta cyberpunk al inicio de la vista de métricas que contextualiza el despacho logístico e invita a abrir el mapa satelital y el tablero Kanban.
  - Muestra en tiempo real el conteo de servicios activos y completados del día provisto por el nuevo campo `operacion_hoy` de `api_dashboard.php`.
- **Atajos Globales de Teclado**:
  - Presionar `[R]` en cualquier pantalla conduce de inmediato al Radar; presionar `[D]` traslada al Dashboard (con bypass automático mientras el operador escribe en campos de texto).
- **Consistencia en Perfil de Cliente (`cliente.php`)**:
  - Se actualizó el botón de cabecera con estilo esmeralda neón y punto verde pulsante para acceso directo al Radar.

### [v2.12.0] - 2026-09-04
#### ⚠️ Deprecación de Dashboard Clásico & Modal de Migración a Torre de Control
- **Modal de Obsolescencia en Dashboard Clásico (`ADMINISTRADOR/index.php`)**:
  - Se implementó un modal automático en pantalla (`#modal-obsoleto-torre-control`) con estética dark glassmorphism.
  - Notifica a los administradores y supervisores que el dashboard legado ya no refleja la telemetría satelital ni las métricas en tiempo real.
  - Ofrece llamadas a la acción destacadas para migrar inmediatamente a la **Torre de Control** (`dashboard.php` y `index.php`), con opción de continuar en modo de solo lectura.
- **Banners de Advertencia Persistentes (`ADMINISTRADOR/index.php`, `ADMINISTRADOR/bienvenido.php`)**:
  - Cinta superior fija en rojo rubí con aviso operativo y botón de un clic `🚀 Abrir Torre de Control →`.
  - Tarjeta de advertencia dentro del iframe `bienvenido.php` para usuarios directos.
- **Acceso Rápido en Menú Lateral (`ADMINISTRADOR/menu.php`)**:
  - Se agregó el enlace prioritario **`Torre de Control 🚀`** al inicio del menú lateral con borde azul e iluminación.
  - Se etiquetó el antiguo enlace como `Dashboard (Obsoleto)`.
- **Adaptación Panorámica 100% Full-Width en Perfil de Cliente (`cliente.php`, `cliente.css`)**:
  - Se eliminaron los límites fijos (`1560px`) en el Hero Card, barra de pestañas y contenedor principal, aprovechando el 100% del viewport en monitores panorámicos para un despliegue sin compresión de KPIs, cocheras e historial.

### [v2.11.0] - 2026-09-04
#### ⚡ Suite Integral de Mejoras CRM & Gamificación (`dashboard.php`, `api_dashboard.php`, `dashboard.css`, `dashboard.js`)
- **1. Ordenamiento Interactivo por Columnas (*Click-to-Sort*)**:
  - Encabezados interactivos con indicador visual dinámico (`▲` ascendente, `▼` descendente, `↕` inactivo).
  - Ordenamiento instantáneo en memoria (<1 ms) por: ID, Nombre, Autos en cochera, Código Postal, Saldo de Monedero, LTV acumulado, Ticket Promedio y Health Score.
- **2. Exportación a Excel / CSV en 1 Clic (`📥 Exportar CSV`)**:
  - Botón directo en la barra de herramientas que genera al vuelo un archivo `.csv` con codificación UTF-8 BOM (`\uFEFF`), garantizando visualización nativa sin problemas de caracteres ni acentos en Microsoft Excel y Google Sheets.
  - Exporta las 18 variables operativas respetando fielmente el subconjunto de clientes actualmente filtrado (por tier, membresía o término de búsqueda).
- **3. Acciones en Lote (*Bulk Actions*) para CRM Operativo**:
  - Checkbox maestro en encabezado y casillas individuales por fila.
  - Dock flotante inferior que se despliega al seleccionar $\ge 1$ cliente:
    - **`🎁 Abonar Saldo a Monedero`**: Modal de bonificación con monto ($ MXN) y motivo. Ejecución transaccional masiva en `api_dashboard.php?action=bulk_credit_wallet` actualizando saldos y bitácoras en `clientes.nota`.
    - **`💬 WhatsApp Difusión`**: Genera y copia al portapapeles enlaces directos de WhatsApp para los clientes seleccionados.
    - **`✖️ Deseleccionar`**: Limpieza rápida de selección.
- **4. Automatización y Alertas de Gamificación**:
  - **Filtro Rápido `📢 Candidatos a Clasificar (1 lavado)`**: Aísla a los usuarios que llevan 1 lavado en el mes y genera un botón de WhatsApp directo con mensaje motivacional pre-redactado para asegurar su 2º servicio y clasificación antes del cierre mensual.
  - **Felicitación a Ganadores Oficiales**: Botón `🎉 Felicitar` en el Salón de Campeones que abre WhatsApp con el mensaje oficial de felicitación por haber ganado su Código Postal con su premio ya acreditado.
- **5. Paginación Dinámica y Selector de Densidad**:
  - Selector para alternar entre `25`, `50`, `100` y `Todos` los clientes por página.
  - Barra de navegación con conteo de registros y botones `◀ Anterior`, `Página X`, `Siguiente ▶`.
- **6. Modal de Alta Rápida `+ Nuevo Cliente`**:
  - Modal para registro directo de clientes desde Torre de Control (caseta o vía telefónica).
  - Formulario de 3 etapas: Datos personales, Vehículo principal (Mi Garage) y Domicilio con código postal y saldo de bienvenida.
  - Endpoint backend seguro `api_dashboard.php?action=create_client` que registra el cliente en `clientes`, su auto en `vehiculos`, su dirección en `clientes_direcciones` y asigna su código de referido único `HAPxxxxx`.
- **Auditoría en Producción**:
  - Validado y probado con transacciones reales en el servidor `95.111.214.233`.

### [v2.10.0] - 2026-09-04
#### 🏆 Módulo Dual de Gamificación (Ranking CP) & Directorio Maestro CRM de Clientes (`dashboard.php`, `api_dashboard.php`, `dashboard.css`, `dashboard.js`)
- **Separación de Módulos Operativos en Dashboard**:
  - Se dividió la antigua vista de "Ranking de Clientes" en 2 módulos de clase mundial totalmente independientes en la barra de navegación:
    1. `🏆 Ranking (Juego CP)`: Gamificación oficial por Código Postal vinculada a la app móvil de clientes.
    2. `👥 Clientes`: Directorio maestro integral con 11 columnas operativas de gestión CRM.
- **Módulo de Gamificación & Ranking por Código Postal (`#tab-ranking`)**:
  - **Reglas del Juego HAP Oficial**: 100 Pts acumulables por servicio finalizado en el mes.
  - **Regla Inquebrantable de Clasificación**: Validación estricta de mínimo 2 lavados en el mes ($\ge 200$ Pts) para calificar al premio. Usuarios con 1 lavado se etiquetan como `⏳ No clasificado (<2)`.
  - **Filtros por Zona y Periodo**: Dropdown de Códigos Postales con nombres de fraccionamientos (Zibatá, Juriquilla, El Refugio, Centro, Campanario, etc.) y selector dinámico de periodos mensuales con conteo de servicios.
  - **Banner Cyberpunk de Premiación**: Banner estilizado que detalla la dinámica del mes, KPIs del ciclo (Participantes, Clasificados, Puntos en juego) y estatus del corte.
  - **Líderes Proyectados por cada Código Postal**: Grid visual que destaca en tiempo real al #1 de cada colonia con medallas, puntos, lavados y estado de clasificación.
  - **Leaderboard con WhatsApp**: Tabla con medallas (🥇, 🥈, 🥉), puntos destacados en dorado, facturación y botón directo para felicitar o notificar al cliente vía WhatsApp.
  - **Motor Automatizado de Corte Mensual (`execute_monthly_closure`)**:
    - Detección automática de ciclos vencidos pendientes de cierre con botón `⚡ Ejecutar Corte Oficial & Acreditar Premios`.
    - Procesa en una sola transacción el archivado en `ranking_cierres_mensuales`, acredita automáticamente `1 Lavado Ecológico Gratis` (+1 lavado en membresía activa o +$221.00 MXN en monedero electrónico `referido_credito`), y registra la bitácora en `clientes.nota`.
  - **Salón de Campeones Histórico (Hall of Fame)**: Tabla con todos los ganadores históricos archivados mes a mes con su puntuación y premio otorgado.
- **Módulo de Directorio Maestro de Clientes (`#tab-clientes`)**:
  - Consolidación y consulta optimizada de los 665 clientes registrados (<20 ms en producción).
  - **11 Columnas CRM Operativas**: ID, Identidad y Avatar, Contacto Directo con WhatsApp, Cochera (Autos registrados con marcas y tamaños), Ubicación & CP, Membresía y Día HAP, Saldo en Monedero ($ MXN), Servicios & LTV facturado, Ticket promedio, Último servicio & Health Score predictivo, y Acciones con enlace directo a Expediente en Pantalla Completa `cliente.php?id={id}`.
  - **Filtros Avanzados**: Buscador universal en memoria (nombre, email, teléfono, marca de auto, alias, placas, dirección o CP), selector de membresía (Activa / Sin membresía) y pills de tiers (`VIP`, `SOCIO`, `FRECUENTE`, `NUEVO`, `RIESGO`, `PROSPECTO`).
- **Auditoría en Producción**:
  - Desplegado y verificado en `95.111.214.233`.
  - Ejecución auditada del corte de Agosto 2026: 5 ganadores de zona premiados exitosamente, incluyendo a Humberto (C.P. 76269) con +$221.00 MXN bonificados y bitácora registrada.

### [v2.9.0] - 2026-09-04
#### 👤 Expediente 360° en Pantalla Completa & Radiografía Analítica de Cliente (`cliente.php`, `cliente.css`, `cliente.js`, `api_dashboard.php`, `dashboard.js`)
- **Expediente Completo en Pantalla Completa (`cliente.php`)**:
  - Desarrollo de una nueva vista inmersiva dedicada para la supervisión y radiografía individual de clientes en Torre de Control (`cliente.php?id={id}`).
  - Diseño *Dark Glassmorphism* con fondo cyberpunk, tipografía `Plus Jakarta Sans`, cabecera de control, reloj en vivo sincronizado y soporte optimizado para exportar ficha o imprimir (`@media print`).
  - Navegación fluida: Botones para regresar al Dashboard (`dashboard.php`), al Radar Operativo (`index.php`) y paginador secuencial de clientes (`◀ Anterior` / `Siguiente ▶`) que permite auditar cliente tras cliente siguiendo el ranking de LTV.
- **Hero Card del Cliente & Health Score Predictivo**:
  - Avatar con iniciales, nombre completo, correo y teléfono con marcado directo `tel:`.
  - **Health Score Predictivo Operativo (0 - 100%)**: Algoritmo matemático que evalúa la frecuencia histórica de compra del cliente contra los días transcurridos desde su última orden, clasificándolo automáticamente en:
    - `🟢 En Ciclo Óptimo` (98%): Dentro del intervalo habitual de servicio.
    - `🟡 Retraso Leve` (50% - 89%): Ligero desfase respecto a su ritmo habitual.
    - `🔴 Riesgo de Abandono / Churn` ($\le 45\%$): Desviación crítica o inactividad prolongada (>45 días).
  - Cálculo predictivo de la **fecha exacta sugerida** para su próximo lavado.
  - **Botón Inteligente de WhatsApp**: Enlace pre-redactado a `https://wa.me/...` que saluda al cliente por su nombre de pila, menciona los días transcurridos desde su último servicio e invita cordialmente a reagendar su lavado en un solo clic.
  - Insignias de segmentación de clientes (`👑 VIP Diamond`, `💎 Socio Membresía HAP`, `⭐ Cliente Frecuente`, `🌿 Cliente Nuevo`) y posición en el ranking global de facturación.
  - Bloc de notas confidenciales de supervisión con **auto-guardado asíncrono en tiempo real** (`api_dashboard.php?action=save_client_note`).
- **5 Pestañas de Análisis Profundo**:
  1. **🔬 Radiografía & KPIs Individuales**:
     - 6 KPIs consolidados: LTV Acumulado ($ MXN), Ticket Promedio, Frecuencia habitual de lavado en días, Tasa de completitud de órdenes, Propinas acumuladas a happers y Ahorro monetario por lavados de membresía bonificados.
     - Identificación del **Happer Preferido / De Confianza** con cantidad de servicios atendidos y rating.
     - 2 Gráficas interactivas con Chart.js: Evolución histórica de facturación mensual y Mix de especialidades contratadas.
  2. **🚗 Autos en Cochera (Mi Garage)**:
     - Tarjetas de cada vehículo con marca, modelo, alias, tamaño (`CHICO`, `MEDIANO`, `GRANDE`), color y tapicería (`TELA` / `PIEL`).
     - **Métrica individual de uso**: Conteo exacto de cuántos lavados y servicios ha recibido cada automóvil específico del garaje.
  3. **📍 Direcciones Guardadas**:
     - Tarjetas con alias, domicilio completo, código postal y referencias detalladas de caseta/acceso.
     - Botón directo con geolocalización para abrir la ubicación en **Google Maps** en 1 clic. Fallback inteligente a la dirección principal del perfil si no cuenta con domicilios adicionales registrados.
  4. **📜 Historial Completo de Servicios**:
     - Tabla cronológica detallada con folio (#), fecha y hora, vehículo atendido, especialidad, monto facturado, operador (Happer), estatus y evaluación con estrellas.
  5. **📸 Galería de Calidad y Evidencias de Entrega**:
     - Mosaico visual de evidencias fotográficas capturadas en campo por los Happers (`fotos` e `images_evidencias/`) con fecha y nota del operador.
- **Integración con Dashboard Central (`dashboard.js`)**:
  - Enlaces directos desde el Leaderboard y Ranking de Clientes: Al hacer clic en el nombre, avatar o botón `👤 Perfil Completo`, se abre fluidamente el expediente en pantalla completa.
- **Auditoría en Producción**:
  - Pruebas exitosas con clientes reales: Salvador Aguilar (ID 243, #1 en LTV con $9,061 MXN, 41 servicios, 7 autos) y Alberto Lerma (ID 47, Socio con Membresía Mediano activa, 19 servicios, 3 autos, $663 MXN en ahorros bonificados).

### [v2.8.0] - 2026-09-04
#### 📊 Suite de Mando Integral & Nuevo Dashboard Ejecutivo de Torre de Control (`dashboard.php`, `api_dashboard.php`, `dashboard.css`, `dashboard.js`, `chart.min.js`, `index.php`)
- **Nuevo Dashboard Ejecutivo (`dashboard.php`)**:
  - Creación de la consola central de inteligencia de negocio y analíticas para Torre de Control.
  - Diseño *Dark Glassmorphism High-Tech* alineado a la estética de Mission Control.
  - Conmutador directo de navegación de un solo clic entre `[ 🗺️ Radar Operativo ]` (despacho en vivo) y `[ 📊 Dashboard ]`.
  - Selector de rangos temporales universales: *Este Mes, Mes Anterior, Últimos 90 Días y Todo el Histórico*.
- **Módulo 1: Analíticas & KPIs Financieros y Operativos**:
  - Tarjetas maestras en tiempo real: Facturación del Periodo con % de variación vs previo, MRR de Membresías recurrentes activas, Ticket Promedio por orden, Servicios Completados vs Cancelados con tasa de efectividad, Tasa de Retención de Clientes recurrentes y Calificación media (⭐ NPS).
  - Integración de librería Chart.js UMD empaquetada localmente (`chart.min.js`) para rendimiento inmediato sin latencias externas.
  - 4 Gráficas interactivas con tooltips y paleta neón:
    1. *Evolución Histórica*: Barras de facturación en MXN combinadas con curva de volumen de servicios.
    2. *Mix de Servicios*: Dona porcentual por especialidades (Lavado, Encerado, Upgrades, Combos, Integral).
    3. *Concentración por Día de la Semana*: Histograma de demanda de Lunes a Domingo.
    4. *Top Zonas y Colonias*: Barras horizontales por Códigos Postales con mayor facturación.
- **Módulo 2: Ranking y Leaderboard de Clientes por LTV**:
  - Segmentación automática por niveles (Tiers): 👑 `VIP Diamond` (+$3,000 MXN), 💎 `Socio HAP` (con membresía), ⭐ `Frecuente` (3+ servicios), 🌿 `Nuevo`, y ⚠️ `En Riesgo` (clientes inactivos por >45 días para reactivación comercial).
  - Tabla interactiva clasificada por gasto acumulado (LTV), total de servicios, ticket promedio, fecha relativa de última orden y enlace directo a WhatsApp en 1 clic (`https://wa.me/...`).
  - Filtros en vivo instantáneos por Tier y buscador omnipresente con autocompletado debounced.
- **Módulo 3: Ficha / Drawer 360° de Cliente**:
  - Panel lateral interactivo que despliega el expediente completo del cliente:
    - Identidad, teléfono con botón de chat WhatsApp, email, crédito en monedero de referidos y notas internas de supervisión.
    - Mi Garage: lista de vehículos registrados con su categoría, placas, color y vestidura (tela/piel).
    - Direcciones guardadas con referencias de acceso.
    - Estatus de membresía activa (plan, tarifa mensual, lavados disponibles, día y hora fija de Día HAP).
    - Historial cronológico de las últimas órdenes con montos pagados, happers asignados y estatus.
- **Módulo 4: Monitor y Ranking de Flota de Happers**:
  - Métricas consolidadas de la plantilla de Happers: servicios completados, cancelaciones, porcentaje de efectividad operativa, volumen total facturado y calificación promedio en estrellas.
- **Módulo 5: Exportación de Datos a CSV**:
  - Descarga instantánea de la base de datos de ranking de clientes en formato CSV compatible con Microsoft Excel.
- **Optimización del Header de Torre de Control (`index.php`)**:
  - Eliminación del botón duplicado `Salir` de los controles del sistema derecho, manteniendo la salida primaria junto al operador.
  - Enlace `📊 Dashboard` configurado y activo.

### [v2.7.0] - 2026-09-04
#### 🔐 Portal de Autenticación Dedicado para Torre de Control (`login.php`, `logout.php`, `config.php`, `index.php`)
- **Portal de Acceso Dedicado (`login.php`)**:
  - Eliminación de la redirección al mensaje de error estático arcaico (`loginerror.php`).
  - Interfaz moderna con temática Dark Glassmorphism / Cyberpunk, alineada al sistema de diseño de Mission Control (`#070b14`, `#0f172a`, `Plus Jakarta Sans`, logotipo oficial HAP con glow cian).
  - Soporte de acceso por nombre de usuario o por correo electrónico administrativo.
  - Alternador de visibilidad de contraseña (mostrar/ocultar con feedback visual).
  - Alertas dinámicas contextuales (credenciales erróneas, cuenta inactiva, rol no autorizado o confirmación de salida).
- **Motor de Autenticación Multiformato Seguro**:
  - Consulta parametrizada segura contra la tabla `usuarios` vía MySQLi Prepared Statements (`WHERE usuario = ? OR email = ?`).
  - Verificación retrocompatible multiesquema:
    1. Bcrypt estándar directo (`password_verify`).
    2. Bcrypt con Salt personalizado legado HAP (`concatPasswordWithSalt`).
    3. Respaldo por coincidencia en columna `clabe` (estándar histórico de HAP `code.php`).
    4. Respaldo por coincidencia plana en columna `pass` para registros directos.
  - Filtrado estricto por roles operativos (`ADMINISTRADOR`, `SUPERVISOR`, `Franquiciatario`) y estado de cuenta (`status = 'ACTIVO'`).
  - Regeneración de ID de sesión (`session_regenerate_id(true)`) e inicialización de variables de sesión (`MM_Username`, `MM_UserGroup`, `MM_Nombre`, `MM_UserId`).
- **Control de Cierre de Sesión Seguro (`logout.php`)**:
  - Destrucción integral de variables de sesión, expiración de cookies y redirección limpia a `login.php?logout=1`.
  - Doble punto de salida ergonómico y visible:
    1. Botón distintivo **`🚪 Cerrar Sesión`** en tono rojo/rosa ubicado de forma prominente a la izquierda, inmediatamente al lado del nombre del operador (`👤 Dann Arenas`), garantizando visibilidad total incluso en pantallas estrechas o laptops.
    2. Botón **`🚪 Salir`** en el extremo derecho de los controles de sistema.
  - Habilitación de scroll horizontal suave en la barra de utilidades para evitar que los controles se oculten en resoluciones menores a 1250px.
- **Auditoría de Producción Exitosa**:
  - Verificación del flujo de redirección no autenticado (302 a `login.php`).
  - Verificación de rechazo de credenciales inválidas y contraseñas erróneas.
  - Verificación de autenticación exitosa con credenciales administrativas (`dann.arenas@outlook.com`).
  - Verificación del renderizado del nombre real del operador en el indicador de sesión (`👤 Dann Arenas`).
  - Verificación del cierre de sesión y revocación del acceso.

### [v2.6.7] - 2026-09-04
#### 💎 Implementación y Auditoría en Producción de la Regla 7.3 (Upgrade de Membresía & Copago por Diferencia) (`programar_servicio.php`, `hapiar.php`, `crear_stripe_intent.php`, `stripe.php`, `helper_contexto_servicio.php`, `torre_dias_hap.php`)
- **Implementación en Citas Programadas (`programar_servicio.php`)**:
  - En frontend JS: cálculo automático del valor de lavado base según la categoría del vehículo ($194 Chico, $221 Mediano, $234 Grande).
  - Si el socio solicita `LAVADO HAP`: servicio 100% bonificado a `$0.00 MXN` con badge `💎 INCLUIDO`.
  - Si el socio solicita un servicio superior (`ENCERADO HAP`, `COMBOS`, `INTEGRAL`): despliegue del banner `💎 Beneficio de Membresía Aplicado (-$V_base MXN)`, selección obligatoria de tarjeta bancaria, cálculo exacto de la diferencia económica ($P_{servicio} - V_{base}$) en el dock de resumen y descuento de 1 lavado en la membresía.
  - En backend PHP: validación de seguridad contra manipulaciones de POST, cobro de la diferencia exacta con Stripe, vinculación obligatoria de `membresia_id` en `venta_desc` y deducción de 1 lavado en `clientes_membresias`.
- **Implementación en HAP Express (`hapiar.php`, `crear_stripe_intent.php`, `stripe.php`)**:
  - En `hapiar.php`: detección dinámica de servicio base vs upgrade superior, cálculo de diferencia y banner visual de bonificación.
  - En `crear_stripe_intent.php`: inyección de metadatos `membresia_id` e `is_upgrade` en el `PaymentIntent` de Stripe.
  - En `stripe.php`: blindaje estricto que impide canjear servicios superiores a $0.00 MXN con `MEMBRESIA_CANJE`, aplicación de la diferencia pagada, vinculación de `membresia_id` y deducción de 1 lavado en `clientes_membresias`.
- **Visibilidad Operativa en Torre de Control (`helper_contexto_servicio.php`, `torre_dias_hap.php`, `bienvenido.php`)**:
  - Clasificación de orden como modalidad `UPGRADE_MEMBRESIA`.
  - Despliegue del badge distintivo `💎 UPGRADE MEMBRESÍA ($XXX.XX MXN)` para alertar a operadores y Happers sobre los insumos especializados requeridos.
- **Auditoría Técnica y Empírica en Producción**:
  - Simulación completa de los tres escenarios (Base $0, Upgrade con membresía y Upgrade con tarjeta) con registros de prueba etiquetados con `"test"` y posterior limpieza estricta (0 registros residuales).

### [v2.6.6] - 2026-09-04
#### 💎 Regla Inquebrantable de Membresía: Bonificación del Lavado Base y Copago por Diferencia en Servicios Superiores (Upgrade) (`AGENT.md`, `CHANGELOG.md`)
- **Institución de la Regla de Upgrade por Diferencia**:
  - Todo socio con membresía activa tiene cubierto al 100% el servicio base **`LAVADO HAP`** ($0.00 MXN) de acuerdo a la categoría de su vehículo (`CHICO`, `MEDIANO`, `GRANDE`).
  - Si el socio desea solicitar o programar un servicio superior o complementario (`ENCERADO HAP`, `PROTECTOR HAP`, `COMBOS 1, 2, 3`, `HAP INTEGRAL`):
    - Se le **bonifica el 100% del valor comercial del `LAVADO HAP`** de su categoría ($194 Chico, $221 Mediano, $234 Grande).
    - El socio únicamente paga la **DIFERENCIA** económica resultante (*Upgrade Fee / Tarifa de Mejora*): $\text{Total} = \max(0, P_{\text{servicio}} - V_{\text{lavado\_base}})$.
    - Se descuenta **1 lavado** de su bolsa de membresía (`lavados_disponibles = lavados_disponibles - 1`).
- **Blindaje y Casos Borde Específicos**:
  - Exigencia de saldo en membresía: el socio debe tener al menos 1 lavado disponible (`lavados_disponibles >= 1`).
  - Respeto a jerarquía de autos: la bonificación solo aplica si el vehículo está cubierto por el plan contratado.
  - Reglas de reembolso en cancelación de orden con upgrade: devolución del 100% del copago monetario y restauración del +1 lavado a la bolsa si se cancela en estado `PENDIENTE`.
  - Desglose transparente en checkout y badge `💎 UPGRADE MEMBRESÍA` en Torre de Control y App de Happers.
- **Creación y Publicación del Manifiesto Maestro `AGENT.md`**:
  - Creación del archivo rector `AGENT.md` con todas las reglas de negocio, modelos de datos, flujos operativos, políticas financieras y directrices para agentes de IA y desarrolladores.

### [v2.6.5] - 2026-09-02
#### 🗺️ Eliminación de Bucle Infinito en ResizeObserver, Mosaicos Sincrónicos y Estabilidad Absoluta del Mapa (`torre.js`, `torre.css`, `index.php`)
- **Diagnóstico y Eliminación de Bucle Infinito a 60 fps**:
  - Se identificó que al colocar un `ResizeObserver` directamente sobre `#leaflet-map`, cada llamada interna a `TorreState.map.invalidateSize()` alteraba el DOM de Leaflet, provocando que el observer volviera a dispararse en el siguiente cuadro de animación en un ciclo infinito de cancelaciones de tiles.
  - Se eliminó por completo el `ResizeObserver` recursivo.
  - El redimensionamiento dinámico ahora se gestiona de forma segura y discreta mediante `window.addEventListener('resize')`, al finalizar la inserción de pines en `renderizarMapa()` y al alternar vistas en `setWorkspaceView()`.
- **Carga 100% Síncrona y Local de Leaflet en `<head>`**:
  - Se eliminó la dependencia externa de `unpkg.com` y los llamados condicionales asíncronos con `document.write`.
  - Inclusión directa y síncrona en el `<head>` de `assets/js/leaflet.js` y `assets/css/leaflet.css`, garantizando que el objeto global `L` exista en memoria antes del evento `DOMContentLoaded`.
- **Layout Elástico de Altura Completa (100%)**:
  - Se configuró `html, body { height: 100vh; overflow: hidden; }` y `flex: 1 1 0%; min-height: 0; height: 100%;` en `.workspace-container`, `.radar-panel` y `.kanban-panel`.
  - `#leaflet-map` se posicionó de manera absoluta con `top: 0; left: 0; right: 0; bottom: 0; width: 100% !important; height: 100% !important;`, cubriendo todo el panel de radar de extremo a extremo sin márgenes vacíos.
- **Sanitización Robusta de Coordenadas**:
  - Conversión estricta de coordenadas a números flotantes con `parseFloat(lat)` y `parseFloat(lon)` y validación `!isNaN() && lat !== 0 && lon !== 0` para Happers y servicios, previniendo excepciones no controladas en Leaflet.
- **Auditoría de Despliegue en Producción**:
  - Verificación de hash MD5 idéntico al 100% entre desarrollo local y el servidor en `95.111.214.233`.

---

### [v2.6.4] - 2026-09-02
#### 📐 Layout Elástico 100% de Altura y Corrección de Recorte Vertical en Radar (`torre.css`, `torre.js`)
- **Corrección de Altura en Radar**:
  - Se diagnosticó que el contenedor del mapa se recortaba a una franja de ~200px de altura dejando el 60% inferior en negro debido a que `min-height: 200px` era adoptado por Leaflet como la altura fija inicial antes de terminar el renderizado flexbox.
  - Desacoplamiento de alturas fijas frágiles (`calc(100vh - 148px)`) y adopción de estructura flexbox elástica pura (`flex: 1 1 0%; height: 100%; min-height: 0;`).
- **Posicionamiento Absoluto del Canvas Leaflet**:
  - Fijación estricta de `#leaflet-map` a `position: absolute; top: 0; left: 0; width: 100%; height: 100%;` dentro de `.radar-panel`, asegurando cobertura del 100% de la ventana.

---

### [v2.6.3] - 2026-09-02
#### 🗺️ Estabilización de Capas de Mapa Leaflet con CartoDB Voyager y Fallback a Esri CloudFront (`torre.js`, `index.php`)
- **Migración de Tiles de OpenStreetMap**:
  - Sustitución de los mosaicos públicos de `tile.openstreetmap.org` (los cuales devuelven bloqueo `x-blocked: Access denied` al consumirse desde aplicaciones web) por los mosaicos vectoriales de alta velocidad de **CartoDB Voyager** (`https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`).
- **Respaldo Automático de Mosaicos con Esri CloudFront**:
  - Incorporación de conmutación transparente en runtime hacia el servidor de mapas de **Esri World Street Map** vía CloudFront Edge en Querétaro en caso de fallos de red en la conexión del operador.
- **Cache-Busting Dinámico en Producción**:
  - Inyección de parámetros de versión temporal dinámicos (`?v=<?= time() ?>`) en las etiquetas `<link>` y `<script>` de `torre.css` y `torre.js` en `index.php`, obligando al navegador a descargar siempre el código más reciente sin requerir limpieza manual de caché.

---

### [v2.6.2] - 2026-09-02
#### 📜 Scroll Vertical Autónomo en Columnas Kanban, Depuración de Servicios Estancados y Fix de Collations (`torre.css`, `api.php`)
- **Habilitación de Scroll Vertical Fluido en Kanban**:
  - Las columnas de despacho (`POR ASIGNAR`, `EN TRASLADO`, `EN LAVADO`, `COMPLETADOS`) ahora cuentan con `overflow-y: auto !important; min-height: 0;`, permitiendo navegar libremente hacia abajo para inspeccionar todos los pedidos del día.
  - Diseño de scrollbars personalizadas delgadas de 5px con tonalidad cian cyberpunk (`#0284c7`).
- **Saneamiento Masivo de la Base de Datos**:
  - Rutina automática de depuración en `venta_desc`: finalización de todos los servicios abiertos o pendientes con más de 15 días de antigüedad.
  - Cancelación o eliminación de registros huérfanos generados durante pruebas o tests.
- **Corrección de Error de Collations en Cancelación**:
  - Corrección de colisión de cotejamientos MySQL (`Illegal mix of collations (utf8_spanish_ci, IMPLICIT) and (latin1_swedish_ci, NUMERIC)`) al cancelar servicios desde el modal de Torre de Control.

---

### [v2.6.1] - 2026-09-02
#### ⚡ Refactorización Masiva de Rendimiento Backend (643x más rápido), Índices MySQL, Modales a 0 ms y Filtro 'Mes' (`api.php`, `torre.js`, `index.php`)
- **Eliminación del Cuello de Botella N+1 en `api.php`**:
  - Se sustituyó el bucle que ejecutaba 18 consultas individuales por cada Happer conectado para calcular servicios del día por **1 sola consulta agregada** con `GROUP BY happer` y cálculo matemático de distancias directas.
  - **Resultado de Benchmark**: El tiempo de ejecución del endpoint `get_telemetry` en el servidor bajó de **12,766 ms (~12.8 segundos) a solo 19.8 milisegundos**, logrando una aceleración de 643x.
- **Indexación Estratégica en MySQL**:
  - Creación de 3 nuevos índices en la tabla `venta_desc`:
    - `idx_happer_estatus`: en columnas `(happer, estatus)` para filtrado instantáneo de asignaciones.
    - `idx_alta_estatus`: en columnas `(alta, estatus)` para consultas por rango de fecha.
    - `idx_cliente`: en columna `(cliente)` para cruces relacionales con `clientes`.
- **Arquitectura Frontend de Cero Latencia (0 ms al Clic)**:
  - El payload de `get_telemetry` ahora transporta la ficha técnica completa de cada servicio (cronometría, timestamps, datos de cliente, auto, happer, detalles de cancelación y timeline).
  - Los modales `abrirModalDetalles(servicioId)` y `abrirModalCancelacion(servicioId)` se despliegan de inmediato en el frame 0 (<16 ms) leyendo directamente de `TorreState.servicesData` en memoria local, eliminando llamadas de red intermedias.
- **Nuevo Filtro Temporal "📆 Mes"**:
  - Se añadió el botón `📆 Mes` (`data-time="MES"`) a la consola segmentada del header en `index.php`.
  - Backend `api.php` procesa `DATE(v.alta) BETWEEN '$primer_dia_mes' AND '$ultimo_dia_mes'`, cubriendo los filtros: `Hoy`, `Mañana`, `Semana`, `Mes` y `Todos`.

---

### [v2.6.0] - 2026-09-02
#### 🚀 Lanzamiento de la Torre de Control Operativa (Mission Control Cyberpunk, Despacho Kanban, Radar en Vivo, Cabecera Master de 2 Niveles) (`index.php`, `torre.css`, `torre.js`, `api.php`)
- **Arquitectura de Pantalla Dividida (Radar + Kanban)**:
  - Nueva consola operativa dedicada para supervisores y operadores logísticos en `HAP/SISTEMA/TORRE_CONTROL/`.
  - **Panel Izquierdo (Radar Operativo)**: Mapa geoespacial Leaflet en tiempo real con monitoreo en vivo de la posición de cada Happer (avatar circular con semáforo de disponibilidad: disponible, ocupado, desconectado) y pines de servicios activos según su estatus.
  - **Panel Derecho (Despacho Kanban Reactivo)**: Tablero dividido en 4 columnas de flujo logístico:
    1. 🔴 `POR ASIGNAR`: Pedidos en espera de confirmación de Happer.
    2. 🟡 `EN TRASLADO`: Happer en camino hacia el domicilio del cliente.
    3. 🔵 `EN LAVADO`: Happer ejecutando el servicio en sitio.
    4. 🟢 `COMPLETADOS`: Servicios concluidos exitosamente.
- **Header Master Propuesta A (2 Niveles Deliberados)**:
  - **Nivel 1 (Sistema & Utilidades)**: Logo oficial HAP con indicador de pulso en vivo `🟢 EN LÍNEA`, reloj en tiempo real, contador de refresco automático con botón manual `🔄`, control de sonido y accesos directos al Dashboard de Días HAP y salida.
  - **Nivel 2 (Consola Operativa)**: Barra de herramientas con filtros temporales (`Hoy`, `Mañana`, `Semana`, `Mes`, `Todos`), buscador en vivo en tiempo real por ID, cliente, auto o dirección, y switch de vistas (`Radar + Kanban`, `Solo Kanban`, `Solo Mapa`).
- **Modal de Detalles 360° con Cronometría Operativa**:
  - Modal inmersivo con visualización completa del servicio:
    - Cronometría en tiempo real: tiempo transcurrido, tiempo de atención y duración total del lavado.
    - Marcas de tiempo (*timestamps*): fecha/hora de solicitud (`alta`), asignación de Happer, inicio del lavado y conclusión.
    - Timeline visual de 4 etapas: *Solicitado* ➔ *Happer Asignado* ➔ *En Camino* ➔ *En Lavado* ➔ *Completado*.
    - Ficha del cliente, vehículo (modelo, placas, tapicería tela/piel), dirección con enlace GPS, notas especiales y botón directo de WhatsApp.
- **Ergonomía en Tarjetas Kanban**:
  - Número de servicio `#ID` destacado a la izquierda y tiempo transcurrido relativo a la derecha.
  - Badge de modalidad debajo del ID (`DÍA HAP`, `SOCIO VIP`, `RAYO DEMANDA`, `CITA PROGRAMADA`).
  - Botón principal de ancho completo `⚡ ASIGNAR HAPPER` o `🔄 REASIGNAR HAPPER`.
  - Botones secundarios `💬 WhatsApp` y `🚫 Cancelar` ubicados ergonómicamente debajo del botón principal.
- **Telemetría y Alertas Proactivas**:
  - Chime sonoro sintetizado con Web Audio API para notificar inmediatamente el ingreso de nuevos servicios sin dependencias de audio externo.
  - Notificaciones de escritorio nativas (Web Push API).
  - Tira de KPIs superiores en vivo: Servicios Hoy, Por Asignar, En Camino, En Lavado, Completados, Socios Día HAP y Happers en Guardia.

---

### [v2.5.8] - 2026-08-28
#### 💳 Solución Integral de Métodos de Pago, Tokenización PCI-DSS, ETA 40-120 min y Captura Segura (`programar_servicio.php`, `hapiar.php`, `metodos_pago.php`, `charge.js`, `stripe_config.php`, `QR/code.php`)
- **Stripe Elements Integrado en Agendamiento (`programar_servicio.php`)**:
  - Incorporación del componente oficial de Stripe Elements (`card-element-prog`) para ingresar datos bancarios directamente en la pantalla de reservación.
  - Validación y tokenización en vivo mediante `stripe.createPaymentMethod` antes de enviar el formulario.
  - Almacenamiento seguro en la tabla `clientes_tarjetas` y vinculación directa al `Customer` en Stripe para evitar reingreso de datos.
  - Enlace rápido a `metodos_pago.php?return_to=programar_servicio.php` con retorno inteligente y preselección automática de la nueva tarjeta.
- **Perfeccionamiento de Flujo Express y Resiliencia (`hapiar.php`, `charge.js`, `crear_stripe_intent.php`, `stripe.php`)**:
  - Intercepción y confirmación de `PaymentIntent` soportando estados `requires_capture` y `succeeded`.
  - Captura del nombre del titular de la tarjeta y guardado automático de nuevas tarjetas tras el pago.
  - Blindaje para pedidos con 100% de descuento o `$0.00 MXN` (`CUPON_TOTAL_FREE`), evitando excepciones de monto mínimo de Stripe.
  - Actualización del tiempo de espera y telemetría de radar a **`⏱️ 40–120 min`** de llegada aproximada.
- **Sincronización Centralizada de Tarjetas (`stripe_config.php`)**:
  - Implementación de `obtener_o_sincronizar_tarjetas_cliente` que asegura la tabla `clientes_tarjetas` y sincroniza bidireccionalmente los PaymentMethods entre Stripe y la base de datos local.
- **Captura Segura al Escanear QR en la App del Happer (`HAPPERS/QR/code.php`)**:
  - Corrección de excepciones al procesar órdenes: captura con seguridad PaymentIntents (`pi_`), ejecuta cargos off-session para reservas programadas con PaymentMethod (`pm_`) y permite el flujo inmediato de membresías (`MEMBRESIA_CANJE`) y cupones sin intentar llamadas inválidas a Stripe.
- **Auditoría en Vivo de Stripe y Base de Datos**:
  - Balance verificado: `$2,053.20 MXN` disponibles en cuenta Live.
  - 523 órdenes procesadas con éxito por `$126,421.47 MXN`.

---

### [v2.5.7] - 2026-08-25
#### 🗓️ Motor Recurrente de Días HAP & Torre de Control Logística (`torre_dias_hap.php`, `sincronizador_dias_hap.php`, `cron/generar_dias_hap.php`)
- **Motor Central de Sincronización y Auto-Generación Recurrente**:
  - Implementación de [`sincronizador_dias_hap.php`](file:///Users/Dann/Server/ha-p/HAP/SISTEMA/CLIENTE/sincronizador_dias_hap.php) para asegurar que cada socio activo con Día HAP tenga siempre su próxima cita firme creada en `venta_desc`.
  - Candado estricto contra duplicados (idempotencia en BD) y protección de saldo (`lavados_disponibles`).
  - Disparador automático al concluir un servicio en [`QR/code.php`](file:///Users/Dann/Server/ha-p/HAP/SISTEMA/HAPPERS/QR/code.php) para generar el servicio de la siguiente semana (+7 días) en piloto automático.
  - Endpoint CRON [`cron/generar_dias_hap.php`](file:///Users/Dann/Server/ha-p/HAP/cron/generar_dias_hap.php) con token de seguridad.
- **Torre de Control Logística (Dashboard Operativo)**:
  - Nueva interfaz interactiva en [`ADMINISTRADOR/torre_dias_hap.php`](file:///Users/Dann/Server/ha-p/HAP/SISTEMA/ADMINISTRADOR/torre_dias_hap.php) con métricas de capacidad por día de la semana, filtros temporales (Hoy, Mañana, Próximos 7 días), semáforo de citas sin Happer y botón de sincronización en vivo.
  - Asignación y reasignación rápida de Happers mediante selector AJAX con 1 clic ([`asignar_happer_ajax.php`](file:///Users/Dann/Server/ha-p/HAP/SISTEMA/ADMINISTRADOR/asignar_happer_ajax.php)).
  - Enlaces directos a WhatsApp para contacto ágil con clientes y accesos directos en el menú de navegación y Dashboard.
- **Claridad y Agenda para Happers & Socios**:
  - En [`happer.php`](file:///Users/Dann/Server/ha-p/HAP/SISTEMA/HAPPERS/happer.php), nueva sección "Mi Agenda Programada" para citas ya asignadas y pool de servicios programados disponibles de la semana con auto-sincronización.
  - En [`membresia.php`](file:///Users/Dann/Server/ha-p/HAP/SISTEMA/CLIENTE/membresia.php), visualizador de "Proyección de Rutina Semanal" con fechas calculadas de las siguientes 3 semanas.

---

### [v2.5.6] - 2026-08-24
#### 🗓️ Modificación y Reasignación Dinámica de DÍA HAP (`membresia.php` & `procesar_membresia.php`)
- **Gestión Autónoma de Rutina VIP**:
  - Los socios activos ahora pueden modificar su **DÍA HAP** semanal o alternar entre *Día Fijo (Piloto Automático)* y *Modo Flexible (Bajo Demanda)* en cualquier momento desde [`membresia.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/membresia.php).
- **Cancelación Automática de Citas Anteriores**:
  - Al cambiar de día u horario, el sistema localiza las citas futuras con estatus `PROGRAMADO` asociadas a la membresía anterior en `venta_desc`, las marca como `CANCELADO` y restaura el saldo de lavados en `clientes_membresias`.
- **Reprogramación Reactiva Inmediata**:
  - Si se selecciona un nuevo día y horario fijo, el motor calcula la próxima fecha de atención, crea la nueva cita en `venta_desc` a costo `$0.00 MXN` y actualiza el saldo de lavados sin discrepancias.
- **UI & Modal Futurista (`#modalCambiarDiaHap`)**:
  - Modal con tema oscuro futurista integrado con Materialize JS y SweetAlert2, con preselección de día, horario (`08:00 AM` a `04:00 PM`), vehículo y dirección.

---

### [v2.5.5] - 2026-08-24
#### 💳 Homologación y Carga de Tarjetas Guardadas en Stripe (`programar_servicio.php`)
- **Sincronización con SDK de Stripe**:
  - Se unificó la lógica de consulta de métodos de pago en Stripe para que coincida exactamente con [`hapiar.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/hapiar.php), resolviendo la ruta del SDK (`stripe-php/init.php` y `stripe_config.php`).
  - Consulta directa de cliente por email (`\Stripe\Customer::all(['email' => $email_usuario])`) y obtención de métodos de pago tipo `card`.
  - Las tarjetas guardadas del usuario ahora se listan de forma idéntica e inmediata tanto en "Pedir Happer" como en "Programar Servicio".

---

### [v2.5.4] - 2026-08-24
#### 📐 Optimización de Layout y Espaciado en Paso 4 ("Fecha y Horario")
- **Desacoplamiento y Ancho Completo**:
  - Se separó el título `"2. SELECCIONA LA HORA (ANTICIPACIÓN MÍN. 3 HRS)"` de la previsualización del horario.
  - Se implementó un banner dedicado a ancho completo (`#selected-datetime-container`) que muestra la cita elegida (`⏰ [Día] a las [Hora]`) con badge de confirmación `SELECCIONADO`, eliminando el amontonamiento horizontal en pantallas móviles.

---

### [v2.5.3] - 2026-08-24
#### 🛠️ Polish & Corrección de Scripts en "Programar Servicio" (`programar_servicio.php`)
- **Limpieza de Header**: Eliminado el badge superior derecho "Reserva 24/7" para una barra superior minimalista y limpia.
- **Corrección de Inclusión de Scripts Core**: Corregida la ruta de jQuery (`modules/jquery/jquery-2.2.4.min.js`) y Materialize JS, restaurando la reactividad completa de:
  - **Pestañas Segmentadas (Paso 2)**: Cambio inmediato entre `🧼 Básicos`, `✨ Avanzados` y `👑 Combos` con filtrado por tamaño y vestiduras.
  - **Días y Horarios Dinámicos (Paso 4)**: Generación reactiva del carrusel de días (`Hoy`, `Mañana`, etc.) y chips táctiles de horarios (`08:00 AM` a `04:00 PM`) con validación en vivo de 3 horas de anticipación.
- **Saneamiento de Estilos CSS**: Eliminación de bloques duplicados en el `<head>`.

---

### [v2.5.2] - 2026-08-24
#### ⏰ Rediseño Integral de "Programar Servicio a Domicilio" (`programar_servicio.php`)
- **Experiencia All-in-One Unificada e Interactiva**:
  - Se rediseñó por completo [`programar_servicio.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/programar_servicio.php) adoptando el mismo estándar de diseño moderno, fluidez táctil y arquitectura reactiva de `hapiar.php`.
- **Paso 1 (Garage)**: Tarjetas horizontales scrollables con badge de tamaño y tapicería (`CHICO • 💺 Tela` / `🛋️ Piel`), apodo, modelo y fecha relativa del último lavado (`⏱️ Hace X días`), más modal rápido para registrar nuevos autos.
- **Paso 2 (Servicios con Segmented Tabs)**: Pestañas táctiles (`🧼 Básicos`, `✨ Avanzados`, `👑 Combos`) con filtrado en tiempo real según la categoría del vehículo y tipo de vestiduras (Tela / Piel), mostrando los 4 combos comerciales limpios y botón `+ Ver detalles` con foto e información técnica.
- **Paso 3 (Ubicación)**: Tarjetas de direcciones frecuentes (`🏠 Casa`, `💼 Oficina`, `🏢 Depa`), geolocalización GPS con confirmación asistida de Código Postal y modal para dirección personalizada con botones de ancho completo (100%).
- **Paso 4 (Selector Interactivo de Fecha y Horarios)**:
  - Carrusel táctil de días próximos (`Hoy`, `Mañana`, `Mié 26`, etc.).
  - Cuadrícula interactiva de chips de horarios (`08:00 AM` a `04:00 PM`) con cálculo en tiempo real de **anticipación mínima de 3 horas** y desactivación automática de horarios pasados.
- **Paso 5 (Pasarela de Pago & Membresía VIP)**:
  - Tarjeta VIP de Membresía espaciosa (`💎 Membresía HAP - $0.00 MXN`) con indicador de ciclo/restantes, validación automática de compatibilidad de vehículo y tarjetas Stripe guardadas.
- **Sticky Bottom Dock Flotante (2-Tier)**:
  - Barra fija inferior con resumen en vivo (`[Auto] • [Servicio] • [Fecha y Hora] • [Total a Pagar]`) y botón principal táctil `🚀 CONFIRMAR RESERVACIÓN ($0.00)`.

---

### [v2.5.0] - 2026-08-24
#### ⚡ HAP Express — Rediseño Integral de "Solicitar Happer Inmediato" a Pantalla Única (`hapiar.php`)
- **Arquitectura All-in-One (0 Recargas de Pantalla)**:
  - Se sustituyó el antiguo wizard fragmentado de 4 pasos (`hapiar.php` ➔ `hapiar_2.php` ➔ `hapiar_3.php` ➔ `hapiar_4.php`) por un **Hub Único Reactivo e Interactivo** en [`hapiar.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/hapiar.php).
  - Reducción del tiempo de pedido de ~60 segundos a **menos de 15 segundos**, optimizado para conexiones móviles 4G/5G.
- **Telemetría y Radar en Vivo**:
  - Hero card futurista con efecto *glassmorphism* y pulso verde que informa el tiempo estimado de llegada en zona (**40–50 min**) y el estado activo **`🟢 DISPONIBLE`**.
- **Paso 1: Selector Minimalista de Garage y Atributo de Vestiduras (`TELA` / `PIEL`)**:
  - Se agregó el campo de tapicería (`vestiduras`: `💺 TELA` o `🛋️ PIEL`) a la base de datos de vehículos (`vehiculos`) y a todos los formularios de alta/edición (`mis_autos.php` y modal rápido en `hapiar.php`).
  - Tarjetas interactivas limpias con badge combinado de categoría y tapicería (ej. `CHICO • 💺 Tela`), apodo, detalles e indicador: **`⏱️ Último lavado hace XX días`**.
- **Paso 2: Segmented Tabs Dinámicos y Eliminación de Duplicados en Combos**:
  - Se sustituyó la lista confusa de 13 servicios por un **Control Segmentado Táctil** con 3 pestañas instantáneas (`Básicos`, `Avanzados`, `Combos`).
  - **Filtro Inteligente de Tapicería**: El sistema asocia automáticamente el auto seleccionado con sus servicios correspondientes, eliminando opciones redundantes y dejando exactamente **4 Combos Únicos y Claros**:
    - 🌟 **Combo Brillo & Plásticos**: *Lavado HAP + Encerado + Desmanchado de Plásticos*.
    - 💺 **Combo Brillo & Asientos**: *Lavado HAP + Encerado + Limpieza Profunda de Vestiduras (Tela/Piel)*.
    - 🧼 **Combo Interiores Profundo**: *Lavado HAP + Limpieza de Vestiduras + Desmanchado de Plásticos*.
    - 👑 **HAP Integral (Todo Incluido)**: *Lavado HAP + Encerado + Vestiduras + Desmanchado Total*.
  - **Estandarización de Badges**: Los badges de servicio ahora se alinean de forma limpia en su propia línea bajo el título del producto.
  - Modal táctil `+ Detalles` con fotografía y descripción del servicio ecológico.
- **Paso 3: Selector Express de Ubicación con Confirmación Asistida**:
  - Chips de direcciones guardadas y botones apilados de ancho completo (**`📍 Mi Ubicación Actual`** y **`➕ Otra Dirección`**).
  - **Modal Interactivo de Geolocalización**: Al presionar *Mi Ubicación Actual*, el sistema detecta coordenadas por GPS y abre un micro-modal de confirmación inmediata con la calle, colonia y campo editable de **Código Postal (C.P.)** para garantizar la asignación exacta del Happer en la zona.
- **Paso 4: Pasarela Inteligente y Rediseño de Tarjeta VIP de Membresía**:
  - Rediseño espacioso y elegante de la tarjeta **`💎 Membresía HAP`** con badge de plan (`Plan MEDIANO`), precio destacado `$0.00 MXN` y texto descriptivo estilizado sin encimarse.
  - Corrección de estilos CSS en selectores de tarjetas para eliminar radios duplicados y mejorar la respuesta táctil en móviles.
  - Alerta reactiva en caso de que el auto no esté cubierto por el plan del usuario, conmutando a cobro regular con tarjeta.
  - Integración nativa de tarjetas Stripe guardadas, Stripe Elements para tarjetas nuevas y validador de cupones vía AJAX.
- **Barra Flotante Inferior de Acción (Sticky Dock 2-Tier)**:
  - Se rediseñó completamente la barra inferior para evitar textos encimados en pantallas móviles:
    - **Tarjeta Superior de Resumen**: Exhibe limpiamente el **Vehículo** (ej. `🚗 Mr Rayo • CHICO (💺 Tela)`), el **Servicio Seleccionado** (ej. `🧼 Lavado HAP` o `🌟 Combo Brillo & Plásticos`) y el **Total a Pagar** (`$0.00 MXN 💎 INCLUIDO` o `$XXX.00 MXN`).
    - **Botón de Acción Full-Width**: Botón de toque amplio a ancho completo (**`🚀 SOLICITAR CON MEMBRESÍA ($0.00)`** o **`🚀 SOLICITAR HAPPER ($XXX.00)`**).
- **Compatibilidad y Redirección Transparente**:
  - `hapiar_2.php`, `hapiar_3.php` y `hapiar_4.php` redirigen automáticamente a `hapiar.php?auto=ID` para unificar el flujo sin romper enlaces externos.

---

### [v2.4.0] - 2026-08-24
#### 🚗 Homologación de Categorías de Vehículos & Corrección de Catálogo (`mis_autos.php`, `hapiar_2.php`, `solicitud_producto.php`)
- **Eliminación de la Categoría Incompatible `CAMIONETA`**:
  - Se unificó el catálogo de vehículos en las 3 categorías oficiales de HAP: **`CHICO`**, **`MEDIANO`** y **`GRANDE (SUV / Crossover / Camioneta / Pickup)`**.
  - Se actualizó el formulario de alta y edición en [`mis_autos.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/mis_autos.php) para eliminar la opción desfasada `CAMIONETA` que guardaba un valor inexistente en el catálogo de productos.
- **Resolución al Bug *"No hay servicios disponibles para esta categoría de vehículo."***:
  - Se implementó en [`hapiar_2.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/hapiar_2.php) y [`solicitud_producto.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/solicitud_producto.php) un normalizador inteligente que mapea automáticamente camionetas o SUVs a la categoría `GRANDE` y cuenta con un fallback de seguridad a `MEDIANO` para garantizar que ningún cliente se quede sin opciones de servicio.
- **Migración de Base de Datos (Local & Producción)**:
  - Se actualizaron todos los registros históricos con `tipo = 'CAMIONETA'` a `tipo = 'GRANDE'` en la tabla `vehiculos` (91 vehículos grandes ahora en catálogo activo).

---

### [v2.3.0] - 2026-08-17
#### 💎 Lanzamiento Oficial: Ecosistema Membresía HAP (3 Planes con 15% de Descuento Anual)
- **3 Niveles de Membresía por Categoría de Vehículo (36 Lavados Anuales)**:
  - 🚗 **Membresía Chica ($495.00 MXN/mes)**: 15% de ahorro (-$1,048 MXN) sobre precio regular de $194. Cobertura exclusiva para vehículos **CHICOS**.
  - 🚙 **Membresía Mediana ($563.00 MXN/mes)**: 15% de ahorro (-$1,200 MXN) sobre precio regular de $221. Cobertura para vehículos **CHICOS y MEDIANOS**.
  - 🚐 **Membresía Grande ($597.00 MXN/mes)**: 15% de ahorro (-$1,264 MXN) sobre precio regular de $234. Cobertura Total para vehículos **CHICOS, MEDIANOS y GRANDES (SUVs)**.
- **Reglas de Jerarquía de Cobertura Estricta**:
  - Validación de categoría en backend (`procesar_membresia.php`) y en agendamiento (`programar_servicio.php`).
  - Si un usuario con membresía Chica intenta canjear un auto Mediano o Grande a $0.00 MXN, el sistema bloquea el canje no cubierto y permite pagarlo de forma individual con tarjeta.
- **Promo de Lanzamiento Exclusiva (Rifa 1 de 30 Gratis)**:
  - Banner dorado de alto impacto en [`membresia.php`](file:///Users/dann/Server/ha-p/HAP/SISTEMA/CLIENTE/membresia.php) destacando la promoción de apertura.
  - Dinámica oficial: Los primeros 30 clientes en contratar entran automáticamente a la rifa donde 1 afortunado recibirá su año completo de membresía 100% gratis.
  - Contador dinámico en tiempo real de lugares disponibles para incentivar la urgencia y conversión.
  - **Pregunta Principal**: *¿Quieres tener un DÍA HAP?* con 2 tarjetas interactivas:
    - **Opción SÍ (Recomendada)**: Despliega el configurador de día (Lun a Dom), hora preferida (8:00 AM a 4:00 PM), vehículo y dirección recurrente.
    - **Opción NO (Modo Flexible)**: Contrae los selectores y despliega la tarjeta de libertad total explicando que el cliente tiene **todos sus servicios incluidos** a costo $0.00 MXN para solicitarlos bajo demanda (sujeto a disponibilidad en zona) o programarlos con al menos 3 horas de anticipación (8:00 AM a 4:00 PM).
  - **Corrección de Scroll Móvil**: Ajuste de padding inferior (`140px`) en `.mem-wrapper` garantizando que el botón de confirmación y activación no quede tapado por la barra de navegación flotante.
- **Política de Retención y Penalizaciones por Cancelación de Membresía (`procesar_membresia.php`, `membresia.php`)**:
  - **Compromiso Anual**: Las membresías contemplan un ciclo anualizado (costo mensual $	imes 12$ meses) para otorgar el precio preferente y los 36 lavados incluidos a $0.00 MXN.
  - **Penalización en Primeros 6 Meses ($\le 182$ días)**: Aplica un cargo del **70% del valor anualizado** (ej. $4,729.20 MXN en Plan Mediano).
  - **Penalización Después de 6 Meses ($> 182$ días)**: Aplica un cargo del **10% del valor anualizado** (ej. $675.60 MXN en Plan Mediano).
  - **Modal de Retención de Alto Impacto**: Presenta el desglose transparente de la penalización, los beneficios que se perderían y destaca como acción principal recomendada **`✨ MANTENER MI MEMBRESÍA ($0 CARGO)`**.
  - **Cobro Automatizado en Stripe**: Al confirmar la cancelación, se ejecuta el cobro de la penalización a la tarjeta registrada mediante `PaymentIntent` y se cancela la suscripción en Stripe.
- **Regla de Negocio: Reprogramación Preferente y Fees de Cancelación Escalonados (`stripe_cancel.php`, `reprogramar_servicio_ajax.php`, `perfil.php`, `tracking.php`)**:
  - **Invitación Prioritaria a Reagendar ($0.00 MXN)**: Cuando un usuario intenta cancelar con un Happer asignado, la interfaz despliega como opción principal destacada **`📅 REAGENDAR SERVICIO ($0)`**, permitiéndole seleccionar una nueva fecha y horario (8:00 AM – 4:00 PM con $\ge 3$h de anticipación) sin cobro de penalización.
  - **Nueva Escala de Fees de Cancelación**:
    - **Sin Happer asignado (`PENDIENTE`)**: Cancelación **100% Gratuita** ($0.00 MXN).
    - **Con Happer asignado ($\le 30$ min)**: Tarifa del **20%** por compensación de traslado y liberación del **80% restante**.
    - **Con Happer asignado ($> 30$ min)**: Tarifa del **100%** del valor del servicio ($0 reembolso) por tiempo reservado y desplazamiento del Happer.
- **Ecosistema de Radar 360° y Puntos de Happers en Zona (`buscando_happer.php`, `tracking.php`)**:
  - **Animación de Haz de Radar 360°**: En lugar de mostrar una moto acercándose ficticiamente antes de tiempo, se implementó una animación de haz de radar cónico (`conic-gradient`) giratorio de 360 grados con anillos de pulso sonar sobre el mapa.
  - **Distribución de Happers Activos en Mapa**: Marcadores animados con efecto de onda (`🛵 Happer Activo`, `Happer en Zona`, `Happer Disponible`) distribuidos en el radio circundante del cliente, simulando el rastreo en vivo de unidades.
  - **Transición Condicional de Ruta**: La moto en movimiento y la ruta punteada hacia la casa del usuario solo se activan y muestran cuando un Happer formalmente acepta el servicio y se encuentra en camino.
- **Ajustes de Navegación y UI (`tracking.php`, `review.php`)**:
  - Se cambió el texto del botón de navegación superior izquierdo de **`← Dashboard`** a **`← Inicio`** para una terminología más intuitiva y cercana al usuario.
- **Gestión y Visibilidad de Servicios Programados para Happers (`happer.php`, `aceptar_servicio_happer.php`, `aceptada.php`)**:
  - **Rediseño Mobile-First por Tarjetas Responsivas**: Se eliminaron las tablas apretadas en pantallas móviles y se implementó una arquitectura de **tarjetas móviles individuales** con tipografía de alto contraste, fecha/hora destacada, badges de estado, vehículo, dirección y botones a todo el ancho (`width: 100%`).
  - **Regla de Anticipación de 24 Horas**:
    - Si faltan $\le 24$ horas para la cita: Se habilita el botón verde **`✅ TOMAR SERVICIO`** para que el Happer pueda apartarlo y organizarse.
    - Si faltan $> 24$ horas: El botón permanece **bloqueado (`🔒 DISPONIBLE 24H ANTES`)** informando la fecha y hora exacta de desbloqueo.
  - **Blindaje en Servidor**: Validación estricta en PHP en `aceptar_servicio_happer.php` y `aceptada.php` impidiendo la toma de servicios programados fuera de la ventana permitida.
- **Corrección de Selección Predeterminada de Servicio (`programar_servicio.php`)**:
  - Se reordenó la consulta SQL y la lógica en JavaScript (`filterServicesByCarType`) para garantizar que al seleccionar cualquier categoría de vehículo (**Chico, Mediano o Grande**) siempre se preseleccione de forma prioritaria el servicio **`LAVADO HAP`** en lugar de otros servicios complementarios como *Encerado* o *Protector*.
  - Se corrigió el registro histórico de la orden `#684` de `alz860717@gmail.com` asignándole el producto correspondiente **`LAVADO HAP`** (`ID: 42`).
  - **Ocultamiento Dinámico del Bloque de Cupón**: Si el usuario canjea su membresía a `$0.00 MXN`, el contenedor del cupón se oculta automáticamente. Si se selecciona una tarjeta (o auto no cubierto), el bloque de cupón se despliega.
  - **Ajustes de Copywriting en Panel VIP (`membresia.php`)**: Botón secundario renombrado a **`🗓️ PROGRAMAR SERVICIO ($0.00)`** y retiro de la palabra *"CALIBRADO"* en la tarjeta de rutina fija para un acabado más limpio y natural.
  - **Percepción de Servicios Ilimitados**: Se eliminó el conteo de lavados restantes cuando la bolsa disponible supera el $30\%$; solo se exhibe el conteo numérico de servicios restantes cuando resta $\le 30\%$ ($\le 10$ lavados).
  - Hub de canje instantáneo a $0.00 MXN para lavados bajo demanda y servicios programados.
  - Panel de telemetría de rutina fija semanal y gestión segura de suscripción.
- **Protección y Regla de Suspensión Estricta (`PAST_DUE`)**:
  - Detección en tiempo real de fallos de cobro de mensualidad.
  - Bloqueo inmediato de canjes a $0.00 MXN y pausa automática de días fijos de rutina.
  - Pantalla amigable de resolución en 1 clic para actualizar tarjeta y reactivar beneficios al instante.
- **Infraestructura de Facturación Recurrente**:
  - Integración nativa del Producto `Membresía HAP Anual (36 Lavados)` (`prod_V5c6mAYh09RsgQ`) y Precio Recurrente `price_1U5QslKc7j1EacEUU4eYqXaY` ($563.00 MXN / mes).
  - Creación de la tabla `clientes_membresias` y columna `membresia_id` en `venta_desc`.
  - Endpoint seguro de suscripción y webhook handler (`procesar_membresia.php`).
- **Growth Hacks e Interceptores en la App**:
  - Banner inteligente en `perfil.php` adaptativo a los 3 estados del usuario.
  - Micro-interceptores de conversión en `programar_servicio.php` y `hapiar_3.php` antes de pagar servicios individuales.
  - Acceso directo a la Membresía HAP en la sección VIP de `cuenta.php`.
- **Limpieza de UI en Dashboard**:
  - Retiro de tarjetas de Saldo Wallet e Historial en `perfil.php` para un flujo más limpio.
- **Corrección y Filtrado Estricto de Tabla de Posiciones (`ranking.php`)**:
  - Solución al error donde se mostraban usuarios globales de otros códigos postales.
  - Filtrado SQL estricto por Código Postal (`v.cp = '$user_cp'`) garantizando competencia 100% local por zona.
  - **Reinicio Mensual Dinámico**: Los puntos de la competencia ahora se reinician en 0 automáticamente el 1° de cada mes (`YEAR(v.alta) = $anio AND MONTH(v.alta) = $mes`).
  - **Regla de Elegibilidad (Mínimo 2 Servicios)**: Filtro estricto `HAVING total_lavados >= 2` para entrar a la tabla de posiciones; tarjeta interactiva con indicador de progreso para usuarios con 1 servicio (*"¡Te falta 1 para clasificar!"*).
  - **Historial y Salón de Campeones**: Creación de la tabla `ranking_cierres_mensuales` y selector de periodos para consultar resultados oficiales de meses anteriores (Julio, Junio, etc.) o el acumulado histórico total (All-Time).
  - Incorporación de selector interactivo de zonas (Zibatá 76269, Juriquilla 76230, El Refugio 76146, Palermo 72410, etc.) y modo Ranking General opcional.

---

### [v2.2.0] - 2026-08-17
#### 🔌 Conexión Directa a Producción, Sincronización Local y Compatibilidad PHP 8
- **Túnel SSH y Conexión en Vivo a Producción**:
  - Implementación de túnel SSH seguro en segundo plano (`conectar_produccion.sh`) que mapea el puerto `3307` directamente al MySQL de producción en `95.111.214.233`.
  - Configuración de `Connections/higo.php` con prioridad #1 hacia la base de datos de producción viva (`127.0.0.1:3307`), y fallback automático a la base de datos local (`127.0.0.1:3306` / `localhost`).
  - Configuración de `sql_mode` compatible en MySQL para evitar errores de agrupación `ONLY_FULL_GROUP_BY`.
- **Sincronización Total de Multimedia & Datos**:
  - Descarga e importación completa de la base de datos viva (599 clientes, 590 servicios, 617 vehículos).
  - Sincronización mediante `rsync` de más de 320 fotos reales de perfil (`images_clientes/`), ilustraciones de vehículos (`car1.png` a `car8.png`), evidencias de lavados y badges de gamificación.
  - Implementación de manejadores `onerror` con avatar por defecto en `perfil.php` para prevenir enlaces 404 en imágenes no cargadas.
- **Correcciones de Compatibilidad en Login (`code.php` & `login.php`)**:
  - Desactivación de excepciones estrictas de MySQLi (`mysqli_report(MYSQLI_REPORT_OFF)`) para compatibilidad total con PHP 8.1+.
  - Solución a pantalla en blanco en `code.php`: validación de peticiones POST, manejo seguro de sesiones/cookies y redirección limpia a `perfil.php`.
  - Limpieza de advertencias y tipos de variables en `login.php`.
- **Rutina de Respaldo Automático (`respaldar_produccion.sh`)**:
  - Script automatizado para clonar la base de datos de producción a la base de datos local al cierre de sesión o cuando se requiera.
- **Optimización de Entorno**:
  - Desinstalación y limpieza de dependencias temporales no utilizadas (`putty`, `sshpass`, librerías GTK/X11), manteniendo el sistema limpio con únicamente `php` y `mysql`.

---

### [v2.1.0] - 2026-08-03
#### 🎁 Módulo de Referidos HAP & Descuentos Automáticos
- **Endpoint Real-time `validar_referido.php`**:
  - Valida códigos de referido `HAPxxxxx` cruzando columnas `referido_codigo`, `ref` y hashes MD5 de `clientes` y `usuarios`.
  - Previene intentos de auto-referencia.
- **Mejoras en el Registro (`registro.php`)**:
  - Detección y auto-llenado automático de códigos compartidos mediante parámetros URL (`?ref=`, `?codigo=`, `?ref_code=`, `?referido=`).
  - Badge dinámico AJAX con respuesta visual (`✔ Código HAP82414 válido! Obtienes $50 MXN de descuento`).
  - Asignación inmediata de su propio código `referido_codigo` al nuevo cliente al registrarse.
- **Reglas de Negocio en Pedidos (`programar_servicio.php`, `validar_cupon.php`, `stripe.php`)**:
  - Aplicación automática de **$50.00 MXN de descuento** en el 1er servicio del nuevo usuario.
  - Acreditación automática de **+$50.00 MXN de crédito** a la cuenta del referidor al completarse la primera reserva (`UPDATE clientes SET referido_credito = referido_credito + 50`), registrándolo en `referidos_log`.
  - Integración de códigos de referido en `validar_cupon.php` para ser aceptados como cupones promocionales en caja.

---

### [v2.0.0] - 2026-07-27
#### 🧾 Módulo de Facturación Electrónica & Evidencias
- **Integración de Acciones en `historial_servicios.php`**:
  - Incorporación de los botones `🔍 VER DETALLES Y EVIDENCIAS ➔` y `🧾 FACTURAR SERVICIO` en cada tarjeta de servicio.
- **Flujo y Reglas de Facturación**:
  - Si el usuario NO tiene datos fiscales, muestra advertencia SweetAlert2 y redirige a `datos_facturacion.php`.
  - Si el usuario YA TIENE datos fiscales, muestra modal interactivo con la leyenda:
    > *"Tu factura está en proceso, pronto recibirás la factura con los datos de facturación proporcionados. Sigamos Happeando juntos."*
- **Backend `solicitar_factura.php`**:
  - Generación de correo HTML a `facturacion@soyhap.com` (con copia CC a `dann.arenas@outlook.com`).
  - Adjunto físico en formato **Multipart MIME Base64** de la Constancia de Situación Fiscal (`constancia_pdf`).
  - Inserción de un botón interactivo `mailto:` con la respuesta ideal pre-llenada para que el contador de HAP responda adjuntando el PDF/XML al cliente en 1 solo clic.
- **Prevención de Solicitudes Duplicadas**:
  - Adición de la columna `factura_solicitada` en la tabla `venta_desc`.
  - Cambio dinámico del botón en la interfaz a **`✅ FACTURA SOLICITADA`** (deshabilitado) tras completar la solicitud.

---

### [v1.9.0] - 2026-07-27
#### 🗺️ Sincronización ETA en Mapa de Seguimiento (`tracking.php`)
- **Cálculo de ETA en PHP**:
  - Cálculo de la diferencia exacta en segundos desde la hora actual hasta la hora pactada de llegada (`$eta_seconds_total`).
- **Animación Proporcional en JavaScript**:
  - Ajuste dinámico de la velocidad del marcador de la moto 🏍️ en el mapa Leaflet.
  - El marcador recorre la ruta a un ritmo continuo calculado en milisegundos para llegar al destino **exactamente al cumplirse la hora estimada** (independientemente si el tiempo es de 5, 20 o 45 minutos).

---

### [v1.8.0] - 2026-07-27
#### 🚪 Cierre de Sesión Seguro (`cuenta.php` & `logout.php`)
- **Solución al fallo de Logout**:
  - Implementación de la función JavaScript `salir()` con modal interactivo de confirmación en SweetAlert2.
- **Limpieza Total de Sesión**:
  - Actualización de `logout.php` para vaciar `$_SESSION`, revocar cookies de autenticación (`usuario`, `usuarioapp`) con fecha de expiración pasada y redirigir inmediatamente a `login.php`.

---

### [v1.7.0] - 2026-07-27
#### ⏰ Módulo de Programación de Servicios Futuros (`programar_servicio.php`)
- **Pantalla Única en 5 Pasos**:
  1. **Auto Guardado**: Selector de vehículos registrados.
  2. **Servicios Filtrados**: Presenta únicamente los 3 servicios principales (*Lavado HAP*, *Encerado HAP*, *Protector HAP*) según el tamaño del auto.
  3. **Dirección Guardada**: Catálogo de ubicaciones del usuario.
  4. **Fecha/Hora Futuras**: Inputs de ancho completo (`100%`) restringiendo fechas pasadas y exigiendo **3 horas mínimas de anticipación**.
  5. **Método de Pago**: Tarjetas tokenizadas en Stripe.
- **Resolución al Error HTTP 500**:
  - Desactivación de excepciones estrictas globales en MySQLi (`@mysqli_report(MYSQLI_REPORT_OFF)`).
  - Envoltura global del proceso en `try / catch (\Throwable $e)`.
  - Mapeo completo de columnas obligatorias en `venta_desc` con valores por defecto.

---

### [v1.6.0] - 2026-07-22
#### 🚗 Rediseño de Mi Garage HAP (`mis_autos.php`)
- **Línea Gráfica Premium**:
  - Tarjeta Hero *Master Blue* con degradados radiales y luces brillantes.
  - Insignias de categoría por tamaño (`CHICO`, `MEDIANO`, `GRANDE`, `CAMIONETA`).
  - Botón directo al 100% de ancho `🧽 LAVAR ESTE AUTO`.
  - Modales de confirmación con SweetAlert2 para eliminar vehículos.

---

### [v1.5.0] - 2026-07-29
#### ⭐️ Pantalla de Evaluación (`review.php`)
- Ocultamiento temporal de la sección de propinas a solicitud del equipo, incluyendo comentario interno en el código fuente para su futura integración.
