# modules/asesores/processor.py import requests import time class AsesoresProcessor: def __init__(self): # Tus credenciales maestras de Chatwoot self.chatwoot_url = "https://gestor.escueladerefrigeracion.edu.pe" self.access_token = "4anazHvZnvKLtup8biu5Zuoh" self.account_id = "1" def obtener_agentes_chatwoot(self): url = f"{self.chatwoot_url}/api/v1/accounts/{self.account_id}/agents" headers = { "api_access_token": self.access_token, "Content-Type": "application/json" } try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() agentes = response.json() # ================================================================= # 🕵️‍♂️ ESCÁNER DEBUG (Se imprimirá en tu consola negra) # ================================================================= print("\n" + "="*60) print("🕵️‍♂️ ESCÁNER: REVISANDO 'DESCONEXIÓN AUTOMÁTICA'") print("="*60) for ag in agentes: nombre = ag.get('available_name') or ag.get('name', 'Desconocido') estado = ag.get('availability_status', 'offline') auto_offline = ag.get('auto_offline', 'Desconocido') print(f"👤 {nombre} | Estado: {estado} | Radar: {auto_offline}") print("="*60 + "\n") return agentes except Exception: return [] # ========================================================================= # MOTOR DE ACTUALIZACIÓN (EL COMBO DE 2 GOLPES) # ========================================================================= def cambiar_estado_agente(self, agent_id, is_online): url = f"{self.chatwoot_url}/api/v1/accounts/{self.account_id}/agents/{agent_id}" headers = { "api_access_token": self.access_token, "Content-Type": "application/json" } estado_str = "online" if is_online else "offline" try: # ----------------------------------------------------------------- # GOLPE 1: Desactivar el botón automático primero # ----------------------------------------------------------------- payload_radar = { "auto_offline": False } requests.patch(url, headers=headers, json=payload_radar, timeout=10) # Le damos 0.5 segundos a la base de datos de Chatwoot para que # asimile que el radar de este usuario acaba de ser destruido. time.sleep(0.5) # ----------------------------------------------------------------- # GOLPE 2: El código viejo y confiable para cambiar el estado # ----------------------------------------------------------------- payload_estado = { "availability_status": estado_str, "availability": estado_str } response = requests.patch(url, headers=headers, json=payload_estado, timeout=10) if response.status_code == 500: return False, "Error interno del servidor Chatwoot." response.raise_for_status() # ⏳ Le damos 1.5 segundos para que le avise a la computadora # del asesor que su estado acaba de cambiar en pantalla. time.sleep(1.5) return True, "Orden ejecutada con el combo de 2 pasos" except Exception as e: return False, f"Fallo de red: {str(e)}"