This commit is contained in:
lizandrogd
2026-01-21 15:08:18 -05:00
parent 659886c2d3
commit 75b8f469f4
3 changed files with 66 additions and 36 deletions
+41 -36
View File
@@ -57,6 +57,27 @@ class BotService {
}
}
// Si existe una solicitud de asesor (por parte del usuario) y aún no ha respondido un asesor, respetar la espera
if (!empty($user['advisor_requested']) && $user['advisor_requested']) {
$now = time();
$until = !empty($user['bot_paused_until']) ? strtotime($user['bot_paused_until']) : null;
if ($until && $until > $now) {
try {
$this->whatsappService->sendTextMessage($phoneNumber, "🔔 Tu solicitud de asesor está pendiente. Un miembro del equipo te atenderá en breve. Si no, podrás usar *menu* después de " . date('H:i', $until) . ".");
} catch (Exception $e) {
// ignore
}
return;
} else {
// expiró la espera: limpiar flag
try {
$this->db->update('users', ['advisor_requested' => 0], 'phone_number = :phone', ['phone' => $phoneNumber]);
} catch (Exception $e) {
error_log('Failed to clear advisor_requested on expiry: ' . $e->getMessage());
}
}
}
// 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;
@@ -138,8 +159,8 @@ class BotService {
case 'asesor':
case 'ayuda':
// Solicitar asesor: poner espera temporal de 5 minutos (no permanente)
$this->putOnHold($phoneNumber, 5);
// Solicitar asesor: marcar solicitud y pausar brevemente (5 minutos)
$this->requestAdvisor($phoneNumber, 5);
return true;
}
@@ -389,7 +410,7 @@ class BotService {
try {
$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->db->update('users', ['on_hold' => 1, 'bot_paused_until' => $pausedUntil, 'advisor_requested' => 0], '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) {
@@ -397,9 +418,24 @@ class BotService {
}
}
/**
* Registrar solicitud de asesor sin poner on_hold (usuario lo solicita, se notifica al equipo)
*/
public function requestAdvisor($phoneNumber, $minutes = 5) {
try {
$pausedUntil = date('Y-m-d H:i:s', strtotime("+{$minutes} minutes"));
// No ponemos on_hold para evitar bloqueo automático; usamos advisor_requested
$this->db->update('users', ['advisor_requested' => 1, 'bot_paused_until' => $pausedUntil], 'phone_number = :phone', ['phone' => $phoneNumber]);
$this->whatsappService->sendTextMessage($phoneNumber, "🔔 Hemos registrado tu solicitud de asesor. Estaremos atentos y te responderemos en breve. Si no hay respuesta, podrás volver a usar *menu* después de {$minutes} minutos.");
if (function_exists('writeLog')) writeLog('INFO', "Advisor solicited for $phoneNumber until $pausedUntil");
} catch (Exception $e) {
error_log('requestAdvisor failed: ' . $e->getMessage());
}
}
public function releaseHold($phoneNumber) {
try {
$this->db->update('users', ['on_hold' => 0, 'bot_paused_until' => null], 'phone_number = :phone', ['phone' => $phoneNumber]);
$this->db->update('users', ['on_hold' => 0, 'bot_paused_until' => null, 'advisor_requested' => 0], '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) {
@@ -419,38 +455,7 @@ class BotService {
);
}
/**
* Mostrar ayuda
*/
private function showHelp($phoneNumber) {
$helpText = "🆘 *Ayuda del Sistema*\n\n";
$helpText .= "📋 *menu* - Mostrar menú principal\n";
$helpText .= "❌ *salir* - Salir del menú actual\n";
$helpText .= "🆘 *ayuda* - Mostrar esta ayuda\n\n";
$helpText .= "💡 *Consejos:*\n";
$helpText .= "• Responde solo con números en los menús\n";
$helpText .= "• Escribe palabras clave para obtener respuestas rápidas\n";
$helpText .= "• Si tienes problemas, escribe *soporte*";
$this->whatsappService->sendTextMessage($phoneNumber, $helpText);
}
/**
* Procesar mensaje de soporte
*/
public function processSupportMessage($phoneNumber, $message) {
// Notificar a administradores sobre consulta de soporte
$this->whatsappService->sendTextMessage(
$phoneNumber,
"🆘 Tu mensaje ha sido enviado a nuestro equipo de soporte. Te contactaremos pronto.\n\n" .
"📞 También puedes llamarnos al: +57 1 234 5678\n" .
"📧 O escribirnos a: soporte@miempresa.com"
);
// Aquí podrías implementar notificaciones a administradores
// Por ejemplo, enviar email o notificación a Slack
}
/**
* Obtener estadísticas del bot
*/