up
This commit is contained in:
+41
-36
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user