This commit is contained in:
lizandrogd
2026-01-21 02:34:23 -05:00
parent b1961f0116
commit edfa5f68d9
8 changed files with 220 additions and 8 deletions
+73 -6
View File
@@ -35,13 +35,29 @@ class BotService {
if ($this->processSpecialCommands($phoneNumber, $messageText)) {
return;
}
// Si el usuario está en espera por un asesor, 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
}
return;
}
// Si el bot está pausado por bot_paused_until, no responder automáticamente
if (!empty($user['bot_paused_until']) && strtotime($user['bot_paused_until']) > time()) {
return;
}
// Si el asesor ya respondió después del último mensaje del usuario, frenar al bot
$lastIncoming = $this->db->fetch("SELECT created_at FROM conversations WHERE user_id = :uid AND direction = 'incoming' ORDER BY created_at DESC LIMIT 1", ['uid' => $user['id']]);
$lastOutgoing = $this->db->fetch("SELECT created_at FROM conversations WHERE user_id = :uid AND direction = 'outgoing' ORDER BY created_at DESC LIMIT 1", ['uid' => $user['id']]);
if ($lastOutgoing && $lastIncoming && strtotime($lastOutgoing['created_at']) >= strtotime($lastIncoming['created_at'])) {
// El asesor ya respondió, no enviar respuestas automáticas
return;
}
}
// Verificar si el usuario está en un menú
if ($user['current_menu_id']) {
$this->processMenuSelection($user, $messageText);
@@ -59,17 +75,29 @@ class BotService {
"SELECT COUNT(*) as count FROM conversations WHERE user_id = :user_id",
['user_id' => $userId]
);
return $messageCount['count'] <= 1; // Solo el mensaje actual
// Evitar reenviar welcome si ya se envió
$user = $this->db->fetch("SELECT welcome_sent_at FROM users WHERE id = :id", ['id' => $userId]);
$welcomeSent = !empty($user['welcome_sent_at']);
return ($messageCount['count'] <= 1) && !$welcomeSent; // Solo el mensaje actual y si no se ha enviado welcome
}
/**
* Enviar mensaje de bienvenida
*/
private function sendWelcomeMessage($phoneNumber) {
public function sendWelcomeMessage($phoneNumber) {
$enabled = getConfigFromDB('welcome_enabled', '1');
$welcomeMessage = getConfigFromDB('welcome_message', '¡Hola! 👋 Bienvenido a nuestro servicio automatizado. Escribe *menu* para ver las opciones disponibles.');
if (!$enabled || !$welcomeMessage) return;
$this->whatsappService->sendTextMessage($phoneNumber, $welcomeMessage);
// Registrar que se envió el welcome
try {
$this->db->update('users', ['welcome_sent_at' => date('Y-m-d H:i:s')], 'phone_number = :phone', ['phone' => $phoneNumber]);
} catch (Exception $e) {
error_log('Failed to set welcome_sent_at for ' . $phoneNumber . ': ' . $e->getMessage());
}
}
/**
@@ -93,7 +121,8 @@ class BotService {
case 'asesor':
case 'ayuda':
$this->showHelp($phoneNumber);
// Poner la conversación en espera y notificar al usuario
$this->putOnHold($phoneNumber);
return true;
}
@@ -244,6 +273,8 @@ class BotService {
$message = $option['action_value'] ?: "Gracias por usar nuestro servicio. ¡Hasta pronto!";
$this->whatsappService->sendTextMessage($phoneNumber, $message);
$this->exitMenu($phoneNumber);
// Pausar el bot para esta conversación por 4 horas
$this->pauseConversationForHours($phoneNumber, 4);
break;
}
}
@@ -307,7 +338,43 @@ class BotService {
['phone' => $phoneNumber]
);
}
/**
* Poner la conversación en pausa por 4 horas (llamada desde opciones 'end')
*/
private function pauseConversationForHours($phoneNumber, $hours = 4) {
try {
$pausedUntil = date('Y-m-d H:i:s', strtotime("+{$hours} hours"));
$this->db->update('users', ['bot_paused_until' => $pausedUntil], 'phone_number = :phone', ['phone' => $phoneNumber]);
if (function_exists('writeLog')) writeLog('INFO', "Bot paused for {$hours} hours for {$phoneNumber}");
} catch (Exception $e) {
error_log('pauseConversationForHours failed: ' . $e->getMessage());
}
}
/**
* Poner conversación en espera (asesor solicitado)
*/
public function putOnHold($phoneNumber) {
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");
} catch (Exception $e) {
error_log('putOnHold failed: ' . $e->getMessage());
}
}
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.");
if (function_exists('writeLog')) writeLog('INFO', "Advisor released hold for $phoneNumber");
} catch (Exception $e) {
error_log('releaseHold failed: ' . $e->getMessage());
}
}
/**
* Actualizar estado del menú del usuario
*/