This commit is contained in:
lizandrogd
2026-01-21 14:57:57 -05:00
parent 9881a94301
commit 0f882f6b40
4 changed files with 265 additions and 23 deletions
+42 -21
View File
@@ -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());