+ + +
@@ -77,8 +80,13 @@ try {
En línea -
-
+
+ +
@@ -924,6 +932,152 @@ try { + \ No newline at end of file diff --git a/services/BotService.php b/services/BotService.php index 2cf65d7..4844ff0 100644 --- a/services/BotService.php +++ b/services/BotService.php @@ -36,14 +36,25 @@ class BotService { return; } - // Si el usuario está en espera por un asesor, no procesar + // Si el usuario está en espera por un asesor, y el periodo no expiró, no procesar. if (!empty($user['on_hold']) && $user['on_hold']) { - try { - $this->whatsappService->sendTextMessage($phoneNumber, "⚠️ Has sido puesto en espera por un asesor. En breve te contactarán."); - } catch (Exception $e) { - // ignore + $now = time(); + $until = null; + if (!empty($user['bot_paused_until'])) { + $until = strtotime($user['bot_paused_until']); + } + // Si hay un tiempo de expiración y aún no pasó, notificar y retornar + if ($until && $until > $now) { + try { + $this->whatsappService->sendTextMessage($phoneNumber, "⚠️ Has sido puesto en espera por un asesor. Estarás en espera hasta " . date('H:i', $until) . ". Si no hay respuesta, podrás usar *menu*." ); + } catch (Exception $e) { + // ignore + } + return; + } else { + // El hold expiró, liberar y continuar + $this->releaseHold($phoneNumber); } - return; } // Si el bot está pausado por bot_paused_until, no responder automáticamente @@ -67,8 +78,9 @@ class BotService { if ($user['current_menu_id']) { $this->processMenuSelection($user, $messageText); } else { - // Procesar respuestas automáticas o comando menu - $this->processAutoResponses($phoneNumber, $messageText); + // No usar las "respuestas rápidas" (autoresponses) automáticamente desde el bot. + // Estas respuestas solo se mostrarán en la UI del chat como "respuestas rápidas". + $this->sendDefaultNoMatch($phoneNumber); } } @@ -126,9 +138,9 @@ class BotService { case 'asesor': case 'ayuda': - // Poner la conversación en espera y notificar al usuario - $this->putOnHold($phoneNumber); - return true; + // Solicitar asesor: poner espera temporal de 5 minutos (no permanente) + $this->putOnHold($phoneNumber, 5); + return true; } return false; @@ -326,11 +338,18 @@ class BotService { $this->showMainMenu($phoneNumber); } } else { - // Respuesta por defecto para mensajes no reconocidos - $defaultMessage = "🤖 No entendí tu mensaje. Escribe *menu* para ver las opciones disponibles o *ayuda* para obtener ayuda."; - $this->whatsappService->sendTextMessage($phoneNumber, $defaultMessage); + // Respuesta por defecto para mensajes no reconocidos cuando se llama explícitamente + $this->sendDefaultNoMatch($phoneNumber); } } + + /** + * Enviar mensaje por defecto cuando no hay coincidencias + */ + private function sendDefaultNoMatch($phoneNumber) { + $defaultMessage = "🤖 No entendí tu mensaje. Escribe *menu* para ver las opciones disponibles o *ayuda* para obtener ayuda."; + $this->whatsappService->sendTextMessage($phoneNumber, $defaultMessage); + } /** * Salir del menú actual @@ -358,13 +377,15 @@ class BotService { } /** - * Poner conversación en espera (asesor solicitado) + * Poner conversación en espera (asesor solicitado) por X minutos */ - public function putOnHold($phoneNumber) { + public function putOnHold($phoneNumber, $minutes = 5) { try { - $this->db->update('users', ['on_hold' => 1], 'phone_number = :phone', ['phone' => $phoneNumber]); - $this->whatsappService->sendTextMessage($phoneNumber, "🔔 Se ha solicitado un asesor. Te hemos puesto en espera. Te contactaremos en breve."); - if (function_exists('writeLog')) writeLog('INFO', "Advisor requested for $phoneNumber"); + $pausedUntil = date('Y-m-d H:i:s', strtotime("+{$minutes} minutes")); + // Guardar bandera y tiempo de expiración (usamos bot_paused_until que ya existe) + $this->db->update('users', ['on_hold' => 1, 'bot_paused_until' => $pausedUntil], 'phone_number = :phone', ['phone' => $phoneNumber]); + $this->whatsappService->sendTextMessage($phoneNumber, "🔔 Se ha solicitado un asesor. Te hemos puesto en espera por {$minutes} minutos. Si no hay respuesta, podrás volver a usar *menu*." ); + if (function_exists('writeLog')) writeLog('INFO', "Advisor requested for $phoneNumber until $pausedUntil"); } catch (Exception $e) { error_log('putOnHold failed: ' . $e->getMessage()); } @@ -372,8 +393,8 @@ class BotService { public function releaseHold($phoneNumber) { try { - $this->db->update('users', ['on_hold' => 0], 'phone_number = :phone', ['phone' => $phoneNumber]); - $this->whatsappService->sendTextMessage($phoneNumber, "🔔 Tu conversación ha sido retomada por el equipo."); + $this->db->update('users', ['on_hold' => 0, 'bot_paused_until' => null], 'phone_number = :phone', ['phone' => $phoneNumber]); + $this->whatsappService->sendTextMessage($phoneNumber, "🔔 Tu conversación ha sido retomada por el equipo. Puedes usar *menu* para continuar."); if (function_exists('writeLog')) writeLog('INFO', "Advisor released hold for $phoneNumber"); } catch (Exception $e) { error_log('releaseHold failed: ' . $e->getMessage());