Solucionado submodulos y subiendo codigo real
This commit is contained in:
86
backend/modules/asesores/processor.py
Normal file
86
backend/modules/asesores/processor.py
Normal file
@@ -0,0 +1,86 @@
|
||||
# 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)}"
|
||||
Reference in New Issue
Block a user