Actualizar backend/main.py

This commit is contained in:
2026-09-26 10:26:17 -05:00
parent 854a6436ae
commit 2036f16edf

View File

@@ -169,7 +169,8 @@ def get_plantillas():
def post_plantillas_enviar(payload: dict = Body(...)): def post_plantillas_enviar(payload: dict = Body(...)):
"""Envía una plantilla de WhatsApp (Chatwoot) a una lista de números. """Envía una plantilla de WhatsApp (Chatwoot) a una lista de números.
payload: {nombre, categoria, idioma, texto, telefonos:[...]}. payload: {nombre, categoria, idioma, texto, telefonos:[...]}.
Solo se envía a números peruanos con código 51 (formato 51XXXXXXXXX).""" Se envía a CUALQUIER país. NO se crean contactos nuevos: si el número no
existe en Chatwoot, se salta y se reporta en 'no_encontrados'."""
import os, requests, time import os, requests, time
CHATWOOT_URL = os.getenv("CHATWOOT_URL", "https://gestor.escueladerefrigeracion.edu.pe") CHATWOOT_URL = os.getenv("CHATWOOT_URL", "https://gestor.escueladerefrigeracion.edu.pe")
TOKEN = os.getenv("CHATWOOT_TOKEN", "4anazHvZnvKLtup8biu5Zuoh") TOKEN = os.getenv("CHATWOOT_TOKEN", "4anazHvZnvKLtup8biu5Zuoh")
@@ -191,15 +192,18 @@ def post_plantillas_enviar(payload: dict = Body(...)):
for x in ("+", " ", "-", "(", ")"): s = s.replace(x, "") for x in ("+", " ", "-", "(", ")"): s = s.replace(x, "")
return s return s
# Validar: debe empezar con 51 y tener 11 dígitos (51 + 9) # Se envía a CUALQUIER país. Solo se exige que sea un número (dígitos, min 8).
validos, invalidos = [], [] validos, invalidos = [], []
for t in telefonos_raw: for t in telefonos_raw:
s = normaliza(t) s = normaliza(t)
if s.isdigit() and s.startswith("51") and len(s) == 11: if s.isdigit() and len(s) >= 8:
validos.append(s) validos.append(s)
else: else:
invalidos.append(str(t)) invalidos.append(str(t))
# Números que NO existen como contacto en Chatwoot (no se crean, solo se reportan)
no_encontrados = []
def chat_id(tel): def chat_id(tel):
tel_p = "+" + tel tel_p = "+" + tel
try: try:
@@ -208,16 +212,11 @@ def post_plantillas_enviar(payload: dict = Body(...)):
data = r.json() data = r.json()
except Exception: except Exception:
return None return None
cid = None # Si NO existe el contacto → no crear, marcar como no encontrado
if ok(r.status_code) and data.get("payload"): if not (ok(r.status_code) and data.get("payload")):
cid = data["payload"][0]["id"] no_encontrados.append(tel)
else: return None
rc = requests.post(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts", cid = data["payload"][0]["id"]
headers=headers, json={"phone_number": tel_p, "inbox_id": INBOX_ID}, timeout=20)
if ok(rc.status_code):
cid = rc.json()["payload"]["contact"]["id"]
else:
return None
rconv = requests.get(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts/{cid}/conversations", rconv = requests.get(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts/{cid}/conversations",
headers=headers, timeout=20) headers=headers, timeout=20)
for conv in rconv.json().get("payload", []): for conv in rconv.json().get("payload", []):
@@ -246,8 +245,11 @@ def post_plantillas_enviar(payload: dict = Body(...)):
fallidos.append(tel) fallidos.append(tel)
time.sleep(1) time.sleep(1)
# "fallo_envio" = existían pero falló el envío (excluye los no_encontrados)
fallo_envio = [t for t in fallidos if t not in set(no_encontrados)]
return {"status": "ok", "enviados": enviados, return {"status": "ok", "enviados": enviados,
"fallidos": fallidos, "invalidos": invalidos, "fallidos": fallidos, "invalidos": invalidos,
"no_encontrados": no_encontrados, "fallo_envio": fallo_envio,
"total": len(telefonos_raw)} "total": len(telefonos_raw)}