From 6fec24f850f3c792b877d9c48be41e7cba947805 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:41:44 -0500 Subject: [PATCH] create_turno: enviar turno + consentimiento en un solo WA desde el kiosko MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Al crear turno busca el formulario configurado en el desk de recepción - Crea token de consentimiento y lo marca como 'enviado' - Envía plantilla consentimiento_turno con nombre real, nombre formulario y link - Fallback texto plano incluye el link si está disponible - Tipo F (solo muestra) sigue usando plantilla sin consentimiento Co-Authored-By: Claude Sonnet 4.6 --- modules/turnero/api/create_turno.php | 61 +++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/modules/turnero/api/create_turno.php b/modules/turnero/api/create_turno.php index 20e019e..2fa9524 100644 --- a/modules/turnero/api/create_turno.php +++ b/modules/turnero/api/create_turno.php @@ -124,12 +124,11 @@ try { ); $stmtCfg->execute(); $cfgWA = $stmtCfg->fetchAll(PDO::FETCH_KEY_PAIR); - // Tipo F = solo muestra pendiente, sin consentimiento → plantilla diferente $esSoloMuestra = ($prioCodigo === 'F'); $waTemplate = $esSoloMuestra ? ($cfgWA['turnero_wa_template_muestra'] ?? 'turno_muestra_pendiente') : ($cfgWA['turnero_wa_template'] ?? 'consentimiento_turno'); - $waLang = $cfgWA['turnero_wa_lang'] ?? 'es_CO'; + $waLang = $cfgWA['turnero_wa_lang'] ?? 'es_CO'; } catch (\Throwable $e) { $waTemplate = 'consentimiento_turno'; $waLang = 'es_CO'; @@ -139,25 +138,65 @@ try { if (!str_starts_with($cel, '+')) { $cel = '+57' . ltrim($cel, '0'); } + + // ── Buscar consentimiento configurado en recepción y crear token ── + $enlaceConsentimiento = null; + $formularioNomWA = ''; + if (!$esSoloMuestra) { + try { + $stmtForms = $pdo->prepare( + "SELECT tlc.formulario_id, f.nombre AS formulario_nombre + FROM turnero_lugar_consentimientos tlc + JOIN lab_formularios f ON f.id = tlc.formulario_id AND f.is_active = 1 + JOIN turnero_lugares l ON l.id = tlc.lugar_id AND l.tipo = 'recepcion' AND l.activo = 1 + ORDER BY tlc.formulario_id ASC + LIMIT 1" + ); + $stmtForms->execute(); + $formRow = $stmtForms->fetch(\PDO::FETCH_ASSOC); + + if ($formRow) { + $token = sprintf( + '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + mt_rand(0,0xffff), mt_rand(0,0xffff), + mt_rand(0,0xffff), + mt_rand(0,0x0fff)|0x4000, + mt_rand(0,0x3fff)|0x8000, + mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0,0xffff) + ); + $pdo->prepare( + "INSERT IGNORE INTO turnero_consentimientos + (turno_id, formulario_id, token, estado, enviado_at) + VALUES (?, ?, ?, 'enviado', NOW())" + )->execute([$turnoId, (int)$formRow['formulario_id'], $token]); + + $baseUrl = defined('BASE_URL') ? rtrim(BASE_URL, '/') : ''; + $enlaceConsentimiento = $baseUrl . '/ver_formulario_enviado.php?token=' . urlencode($token); + $formularioNomWA = $formRow['formulario_nombre']; + } + } catch (\Throwable $e) { + // Sin consentimiento disponible, continuar sin link + } + } + require_once __DIR__ . '/../../../services/WhatsAppService.php'; + $nombreWA = $pacienteNombre ?: 'Paciente'; try { $wa = new WhatsAppService(); - // Enviar solo el código, sin nombre/apellido $wa->sendTemplateMessage( $cel, $waTemplate, $waLang, - [ - 'Paciente', - $codigo, - '', - ], - [] + [$nombreWA, $formularioNomWA ?: $codigo, $codigo], + $enlaceConsentimiento ? [$enlaceConsentimiento] : [] ); } catch (\Throwable $eTmpl) { try { - $mensajeTexto = "Su turno *{$codigo}* ha sido registrado. Preséntese al laboratorio."; - $wa->sendTextMessage($cel, $mensajeTexto); + $msg = "Hola {$nombreWA}, su turno *{$codigo}* ha sido registrado."; + if ($enlaceConsentimiento) { + $msg .= "\n\nPor favor firme su consentimiento informado antes de ser atendido:\n{$enlaceConsentimiento}"; + } + $wa->sendTextMessage($cel, $msg); } catch (\Throwable $eTxt) { // Silenciar }