diff --git a/backend/main.py b/backend/main.py index bcf52cd..2ea1314 100644 --- a/backend/main.py +++ b/backend/main.py @@ -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)} @@ -473,4 +475,4 @@ def debug_cursos(ano: str = "2026", mes: str = "1"): if __name__ == "__main__": - uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=False) + uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=False) \ No newline at end of file