=== WhatsBoost ===
Contributors: almcsecurity
Tags: woocommerce, whatsapp, notifications, abandoned cart, order status
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
WC requires at least: 7.0
WC tested up to: 10.7
Stable tag: 2.0.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Avisos por WhatsApp de WooCommerce desde tu propio número: estado del pedido, bienvenida al registrarse y recuperación de carritos abandonados con permiso previo.

== Description ==

WhatsBoost envía mensajes de WhatsApp a tus clientes a través de tu cuenta de WhatsBoost (almc.es), usando un número tuyo que vinculas una vez escaneando un código QR, igual que WhatsApp Web.

Lo que hace:

* **Avisos de estado de pedido.** Eliges en qué estados de WooCommerce avisar y escribes el texto de cada uno, con etiquetas como `{nombre}`, `{producto_pedido}`, `{cantidad}`, `{precio}`, `{plazo}`, `{tienda}`, `{link}`, `{order_number}` o `{tracking}`. Si tu tienda tiene varios idiomas (WPML o Polylang), un texto por idioma. De cada pedido y estado sale un aviso, y solo uno. El teléfono se toma de la dirección de facturación (si no, de la de envío; si no, del móvil que el cliente dejó al registrarse).
* **Bienvenida al registrarse**, con un campo opcional de móvil en el alta y en Mi cuenta. Se envía una sola vez por cuenta, cuando alguien termina de registrarse y ha dejado su móvil.
* **Recordatorios de carrito abandonado** con plazos (por ejemplo a las 24 horas y a los 3 días), franja horaria, importe mínimo, días entre avisos al mismo cliente, un texto propio por aviso, enlace de un solo uso para retomar el carrito con los mismos productos y medición de cuántos acabaron en pedido. Solo salen a quien ha dado su permiso. Funciona con el checkout clásico y con el checkout por bloques.
* **Consentimiento y baja.** Una casilla en el registro, en Mi cuenta y en el checkout clásico, con textos probados en dos tonos, cuyo número de mensajes se calcula solo a partir de los plazos configurados. Cada recordatorio lleva un enlace de baja que se confirma con un botón (no al abrirlo, para que la vista previa de WhatsApp o un antivirus no den de baja a nadie). Quien pide que no se le escriba más queda apuntado en una lista que se conserva incluso si desinstalas el plugin.
* **Privacidad.** Se integra con el exportador y el borrador de datos personales de WordPress (Herramientas → Exportar / Borrar datos personales) y añade su párrafo a la guía de la política de privacidad.
* **Registro** de cambios (quién tocó qué) y sucesos (lo que pasó solo), **estadísticas** de los últimos 30 días en la pantalla de inicio, qué fue de cada mensaje (encolado, entregado, perdido) y la cuota de tu plan.
* **Diagnóstico** a tu cuenta (se puede apagar en Ajustes) y aviso cuando hay una versión nueva, con el enlace de descarga y la huella SHA-256 del paquete.

Necesitas una cuenta de WhatsBoost en almc.es. El plan gratuito no pide tarjeta.

= Qué sale de tu sitio y hacia dónde =

El plugin solo habla con la API de WhatsBoost en `almc.es` (configurable para pruebas en Ajustes), siempre por HTTPS y con tu clave de API en la cabecera `Authorization`. La clave nunca se imprime en pantalla ni se apunta en el registro. Envía:

* **Al verificar la clave y al elegir el número en Ajustes:** la clave, para obtener tus números conectados.
* **Al enviar un mensaje:** el teléfono del destinatario, el texto ya redactado y el identificador de tu número. Una respuesta 202 significa «encolado», no «entregado»: qué fue de cada mensaje se pregunta después.
* **Cada 15 minutos (cron):** los identificadores de los mensajes aceptados en los últimos 30 días que aún no se saben entregados, para apuntar qué fue de ellos.
* **Al abrir la pantalla de inicio:** la cuota de tu plan (se guarda 10 minutos).
* **Una vez al día, si el diagnóstico está encendido (por defecto sí):** URL y nombre de la tienda, versiones de WordPress, WooCommerce, PHP y MySQL, tema, si hay enlaces permanentes, si el plugin está activado, clave verificada y número elegido, cuántos estados tienen aviso y texto, mensajes enviados y fallidos de los últimos 7 días, la última ejecución del cron, qué enganches de WooCommerce están registrados, las pestañas del panel, si están encendidos el móvil en el alta, la bienvenida, los recordatorios y el consentimiento, y los errores del propio plugin (solo de sus ficheros) con rutas recortadas y sin teléfonos, correos, NIF ni claves. En Ajustes hay un «Ver exactamente qué se envía». Si hubo un error nuevo, el informe se adelanta (como mucho uno cada 30 minutos).
* **Una vez al día, sin clave:** una consulta de si hay versión nueva (`modules/wordpress/latest`). Si almc.es no contesta, se espera una hora antes de insistir.

No se envían pedidos completos, catálogos, ni datos de clientes fuera de lo listado.

= Modelo de datos =

El plugin crea estas tablas con el prefijo de tu WordPress:

* `wb_customer` — móvil dejado en el alta o en Mi cuenta, y su consentimiento (texto, fecha y de dónde salió).
* `wb_send` — cada intento de envío: tipo (pedido, bienvenida, carrito), pedido, estado, teléfono recortado a los últimos cuatro dígitos, resultado, motivo, identificador en la cola y qué fue del mensaje.
* `wb_cart_reminder` — carritos abandonados: productos, total, teléfono, enlace de retomar, avisos enviados y estado.
* `wb_log` — registro de cambios y sucesos, podado a 500 líneas y 12 meses. Cada cambio de configuración lleva el nombre de usuario y la IP de quien lo hizo.
* `wb_baja` — teléfonos que pidieron no recibir más recordatorios. **No se borra al desinstalar.**
* `wb_cron_lock` — una fila, el cerrojo del cron.

Y estas direcciones públicas, sin reglas de reescritura:

* `/?wb-retomar=TOKEN` — el enlace `{link_carrito}`: restaura el carrito con los mismos productos y lleva a la cesta, sin iniciar sesión. De un solo uso; caduca a los días que elijas.
* `/?wb-baja=TOKEN` — el enlace `{link_baja}`: una página con un botón para confirmar la baja. El token no caduca.
* `/?wb-cron=TOKEN` — la tarea periódica, para llamarla desde el programador de tu alojamiento. Con un token que no cuadra responde 404.

== Installation ==

1. Sube el ZIP desde Plugins → Añadir nuevo → Subir plugin, o copia la carpeta `whatsboost` en `wp-content/plugins/`.
2. Activa el plugin. Necesita WooCommerce 7 o superior activo (sin él solo funciona la bienvenida al registrarse).
3. Entra en WhatsBoost → Ajustes, pega tu clave de API (se crea en tu panel de almc.es, en «API y Webhooks») y pulsa «Verificar clave».
4. Elige el número desde el que se envía y guarda.
5. En WhatsBoost → Estados de pedido, marca los estados en los que quieres avisar y escribe los textos.
6. Para los recordatorios de carrito, entra en WhatsBoost → Carritos, actívalos y pega la línea de cron que aparece en Ajustes y en Documentación en el programador de tareas de tu alojamiento. Sin cron externo, WP-Cron los envía cuando alguien visita la tienda.

Al actualizar, sube el ZIP nuevo encima del anterior: las tablas y los ajustes se conservan.

== Frequently Asked Questions ==

= ¿Necesito la API oficial de WhatsApp Business? =

No. WhatsBoost envía desde un número tuyo vinculado como dispositivo, igual que WhatsApp Web. Lee las condiciones de tu plan en almc.es.

= ¿Envía publicidad sin permiso? =

No. Los recordatorios de carrito solo salen a quien ha marcado la casilla de consentimiento (si la tienes activada en Clientes), y cada uno lleva un enlace de baja. Los avisos de estado de pedido son información del propio pedido. Con el consentimiento apagado, la casilla no aparece y los recordatorios se envían a quien dejó su móvil: la pantalla de Clientes te avisa de lo que eso supone.

= ¿Funciona con HPOS (almacenamiento de pedidos de alto rendimiento)? =

Sí. El plugin declara compatibilidad y usa únicamente la API de WooCommerce.

= ¿Funciona con el checkout por bloques? =

Sí: avisos de pedido, recordatorios de carrito y casilla de consentimiento. En el checkout por bloques la casilla se declara a WooCommerce como campo adicional (hace falta WooCommerce 8.9 o superior); con una versión anterior queda la casilla del registro y la de Mi cuenta.

= ¿Por qué un mensaje aparece como «encolado» y no como «entregado»? =

Porque la API acepta el mensaje (202) y lo envía después desde tu número. El plugin pregunta cada 15 minutos qué fue de cada uno y lo apunta en Inicio.

= ¿Se pierde algo al desinstalar? =

Se borran las opciones, los transients y las tablas del plugin, salvo la lista de bajas. Ver «Uninstall».

== Privacy ==

* Datos personales que guarda el plugin en tu base de datos: el móvil que el cliente deja en el alta o en Mi cuenta y su consentimiento (`wb_customer`); el teléfono, el correo, el nombre y los productos de un carrito abandonado (`wb_cart_reminder`, se poda a los 90 días de cerrarse; si se cierra sin permiso o sin teléfono, el teléfono y el correo se vacían en el acto); los últimos cuatro dígitos del teléfono de cada envío (`wb_send`); los teléfonos que pidieron la baja (`wb_baja`); y, en `wb_log`, el nombre de usuario y la IP de quien cambia la configuración, durante 12 meses.
* Datos que salen hacia almc.es: solo los listados en «Qué sale de tu sitio y hacia dónde». El diagnóstico se puede apagar en Ajustes.
* Exportar y borrar: el plugin registra un exportador y un borrador en Herramientas → Exportar / Borrar datos personales de WordPress. El borrador elimina la ficha y los carritos de esa persona; la lista de bajas se conserva porque es la constancia de su «no».
* Al borrar un usuario de WordPress se borran también su ficha (móvil y permiso) y su carrito guardado.

== Uninstall ==

Al desinstalar (Plugins → Borrar) se eliminan todas las opciones `whatsboost_*`, todos los transients `whatsboost_*`, el evento de WP-Cron y las tablas `wb_customer`, `wb_send`, `wb_cart_reminder`, `wb_log` y `wb_cron_lock`. La tabla `wb_baja` se conserva a propósito: borrar los datos de alguien no es borrar su «no», y si reinstalas el plugin esas personas siguen sin querer recibir nada.

== Changelog ==

= 2.0.1 =
* Conformidad con el Plugin Check oficial de WordPress, sin cambios de comportamiento: comentarios para traductores en todos los textos con huecos (`%s`, `%d`), `wp_strip_all_tags()` en vez de `strip_tags()`, `gmdate()` en vez de `date()`, `wp_rand()` en vez de `mt_rand()` y `wp_parse_url()` en vez de `parse_url()`.
* Probado de principio a fin en WordPress 7.1 con WooCommerce 10.7.0: instalación desde el ZIP, activación, las seis tablas creadas, el cron `wb_cron_tick` programado cada 15 minutos, las siete pantallas sin un solo aviso de PHP, un pedido real que dispara el aviso y recibe el rechazo de la API traducido, la guarda que impide el aviso repetido, el móvil guardado sólo como rastro (`***1222`), desactivación y desinstalación. De ahí el «Tested up to: 7.1» y el «WC tested up to: 10.7».
* Los comentarios para traductores llegan ahora también al catálogo `whatsboost.pot` (líneas `#.`), que es lo único que ve quien traduce sin abrir el código.

= 2.0.0 =
* Reescritura completa contra la API de WhatsBoost en almc.es. Las claves de la plataforma anterior (whatsboost.net) no valen.
* Avisos de estado de pedido con texto por idioma (WPML, Polylang), un aviso por pedido y estado, y qué fue de cada mensaje.
* Móvil opcional en el alta y en Mi cuenta, y bienvenida al registrarse.
* Carritos abandonados con permiso previo: plazos, franja horaria, importe mínimo, días entre avisos, texto por aviso, enlace de retomar de un solo uso y medición de conversión. Checkout clásico y por bloques.
* Consentimiento con dos tonos y texto propio por idioma, en el registro, Mi cuenta y el checkout (clásico y por bloques); baja confirmada con un botón; lista de bajas que sobrevive a la desinstalación.
* Exportador y borrador de datos personales de WordPress.
* Registro de cambios y sucesos, estadísticas de 30 días, cuota del plan, diagnóstico diario a la cuenta y aviso de versión nueva.
* Cron propio cada 15 minutos con disparo externo por token y cerrojo.
* Compatibilidad con HPOS.
