diff --git a/scripts/add_advisor_requested_column.php b/scripts/add_advisor_requested_column.php new file mode 100644 index 0000000..1a705e2 --- /dev/null +++ b/scripts/add_advisor_requested_column.php @@ -0,0 +1,17 @@ +fetch("SHOW COLUMNS FROM users LIKE 'advisor_requested'"); +if ($col) { + echo "Column advisor_requested already exists\n"; + exit(0); +} + +try { + $db->query("ALTER TABLE users ADD COLUMN advisor_requested TINYINT(1) DEFAULT 0 AFTER on_hold"); + echo "Added advisor_requested column to users\n"; +} catch (Exception $e) { + echo "Failed to add column: " . $e->getMessage() . "\n"; + exit(1); +} diff --git a/services/BotService.php b/services/BotService.php index 064a9c5..206a608 100644 --- a/services/BotService.php +++ b/services/BotService.php @@ -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 */ diff --git a/services/WhatsAppService.php b/services/WhatsAppService.php index f21248f..84f1d20 100644 --- a/services/WhatsAppService.php +++ b/services/WhatsAppService.php @@ -541,6 +541,14 @@ class WhatsAppService } $this->db->insert('conversations', $messageData); + + // Si un asesor envía un mensaje, limpiar la solicitud de asesor (advisor_requested) + try { + $this->db->update('users', ['advisor_requested' => 0, 'on_hold' => 0, 'bot_paused_until' => null], 'id = :id', ['id' => $user['id']]); + if (function_exists('writeLog')) writeLog('INFO', "Cleared advisor_requested for user {$user['id']} after outgoing message"); + } catch (Exception $e) { + error_log('Failed to clear advisor_requested after outgoing: ' . $e->getMessage()); + } } } catch (Exception $e) { error_log("Error saving outgoing message: " . $e->getMessage());