diff --git a/modules/turnero/api/sesion_turno.php b/modules/turnero/api/sesion_turno.php index 71a1319..353e44a 100644 --- a/modules/turnero/api/sesion_turno.php +++ b/modules/turnero/api/sesion_turno.php @@ -80,15 +80,19 @@ if ($accion === 'reabrir') { // ── CONFIG WHATSAPP ────────────────────────────────────────── if ($accion === 'config_wa') { - $template = trim($input['template'] ?? ''); - $lang = trim($input['lang'] ?? 'es_CO'); - $waKiosko = (int)($input['wa_kiosko'] ?? 0); - $waConsent = (int)($input['wa_consent'] ?? 0); + $template = trim($input['template'] ?? ''); + $templateMuestra = trim($input['template_muestra'] ?? ''); + $lang = trim($input['lang'] ?? 'es_CO'); + $waKiosko = (int)($input['wa_kiosko'] ?? 0); + $waConsent = (int)($input['wa_consent'] ?? 0); if ($template === '') jsonError('El nombre de plantilla es requerido'); if (!preg_match('/^[a-z0-9_]{1,64}$/i', $template)) { jsonError('Nombre de plantilla inválido — solo letras, números y guiones bajos'); } + if ($templateMuestra !== '' && !preg_match('/^[a-z0-9_]{1,64}$/i', $templateMuestra)) { + jsonError('Nombre de plantilla muestra inválido — solo letras, números y guiones bajos'); + } if (!preg_match('/^[a-z]{2}_[A-Z]{2}$/i', $lang)) { jsonError('Código de idioma inválido (formato: es_CO)'); } @@ -99,6 +103,7 @@ if ($accion === 'config_wa') { ON DUPLICATE KEY UPDATE valor = VALUES(valor)' ); $upsert->execute(['turnero_wa_template', $template]); + $upsert->execute(['turnero_wa_template_muestra', $templateMuestra]); $upsert->execute(['turnero_wa_lang', $lang]); $upsert->execute(['turnero_wa_kiosko_enabled', (string)$waKiosko]); $upsert->execute(['turnero_wa_consent_enabled', (string)$waConsent]); diff --git a/modules/turnero/views/configuracion.php b/modules/turnero/views/configuracion.php index 9039202..26f20e6 100644 --- a/modules/turnero/views/configuracion.php +++ b/modules/turnero/views/configuracion.php @@ -760,12 +760,19 @@ $tab = $_GET['tab'] ?? 'lugares';
-
- +
+ - Nombre exacto en Meta Business Manager + Consulta, toma de muestra, etc. — incluye link de firma +
+
+ + + Solo notifica turno, sin consentimiento
@@ -773,16 +780,16 @@ $tab = $_GET['tab'] ?? 'lugares'; value="" placeholder="es_CO">
-
- -
+
+
+
- La plantilla debe estar aprobada en Meta y contener una variable de URL - ({{1}}) para el enlace de firma del consentimiento. + La plantilla con consentimiento debe contener una variable de URL + ({{1}}) para el enlace de firma. El sistema usará texto plano como fallback si la plantilla falla.
@@ -1173,16 +1180,17 @@ async function borrarTvVideo() { } async function guardarWhatsApp() { - const template = document.getElementById('wa-template')?.value.trim(); - const lang = document.getElementById('wa-lang')?.value.trim(); - const waKiosko = document.getElementById('chk-wa-kiosko')?.checked ? 1 : 0; - const waConsent = document.getElementById('chk-wa-consent')?.checked ? 1 : 0; + const template = document.getElementById('wa-template')?.value.trim(); + const templateMuestra = document.getElementById('wa-template-muestra')?.value.trim(); + const lang = document.getElementById('wa-lang')?.value.trim(); + const waKiosko = document.getElementById('chk-wa-kiosko')?.checked ? 1 : 0; + const waConsent = document.getElementById('chk-wa-consent')?.checked ? 1 : 0; if (!template) { toast('El nombre de plantilla es requerido', 'error'); return; } try { const res = await fetch(API + 'sesion_turno.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ accion: 'config_wa', template, lang, wa_kiosko: waKiosko, wa_consent: waConsent }) + body: JSON.stringify({ accion: 'config_wa', template, template_muestra: templateMuestra, lang, wa_kiosko: waKiosko, wa_consent: waConsent }) }); const json = await res.json(); if (!json.ok) { toast(json.error || 'Error', 'error'); return; }