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(...)):
"""Envía una plantilla de WhatsApp (Chatwoot) a una lista de números.
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
CHATWOOT_URL = os.getenv("CHATWOOT_URL", "https://gestor.escueladerefrigeracion.edu.pe")
TOKEN = os.getenv("CHATWOOT_TOKEN", "4anazHvZnvKLtup8biu5Zuoh")
@@ -191,15 +192,18 @@ def post_plantillas_enviar(payload: dict = Body(...)):
for x in ("+", " ", "-", "(", ")"): s = s.replace(x, "")
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 = [], []
for t in telefonos_raw:
s = normaliza(t)
if s.isdigit() and s.startswith("51") and len(s) == 11:
if s.isdigit() and len(s) >= 8:
validos.append(s)
else:
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):
tel_p = "+" + tel
try:
@@ -208,16 +212,11 @@ def post_plantillas_enviar(payload: dict = Body(...)):
data = r.json()
except Exception:
return None
cid = None
if ok(r.status_code) and data.get("payload"):
cid = data["payload"][0]["id"]
else:
rc = requests.post(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts",
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
# Si NO existe el contacto → no crear, marcar como no encontrado
if not (ok(r.status_code) and data.get("payload")):
no_encontrados.append(tel)
return None
cid = data["payload"][0]["id"]
rconv = requests.get(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts/{cid}/conversations",
headers=headers, timeout=20)
for conv in rconv.json().get("payload", []):
@@ -246,8 +245,11 @@ def post_plantillas_enviar(payload: dict = Body(...)):
fallidos.append(tel)
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,
"fallidos": fallidos, "invalidos": invalidos,
"no_encontrados": no_encontrados, "fallo_envio": fallo_envio,
"total": len(telefonos_raw)}