""" Envio de WhatsApp. Três avisos ao cliente, não sete: aprovada · em produção · finalizada (+ correção, a única que pede resposta) Provedor definido por WHATS_PROVEDOR = meta | zapi A API oficial da Meta exige template aprovado para mensagem iniciada por nós. """ from __future__ import annotations import os import httpx PROVEDOR = os.environ.get("WHATS_PROVEDOR", "meta") TOKEN = os.environ.get("WHATS_TOKEN", "") NUMERO_ID = os.environ.get("WHATS_NUMERO_ID", "") ZAPI_URL = os.environ.get("ZAPI_URL", "") TEXTOS = { "prova_cor": ("Antes de imprimir o pedido {pedido} inteiro, fizemos uma amostra " "de cor. Confira a foto e responda APROVO para seguirmos. A cor no " "filme pode variar em relação ao seu monitor."), "producao": "Seu pedido {pedido} entrou em produção. Avisamos quando ficar pronto.", "concluido": "Pedido {pedido} finalizado e pronto para retirada ou envio.", "correcao": "Precisamos de um ajuste na arte do pedido {pedido}: {motivo}", } def _enviar(telefone: str, texto: str) -> None: if PROVEDOR == "zapi": httpx.post(ZAPI_URL, json={"phone": telefone, "message": texto}, timeout=20) return httpx.post( f"https://graph.facebook.com/v20.0/{NUMERO_ID}/messages", headers={"Authorization": f"Bearer {TOKEN}"}, json={"messaging_product": "whatsapp", "to": telefone, "type": "text", "text": {"body": texto}}, timeout=20, ).raise_for_status() def enviar_link(telefone: str, pedido: str, link: str) -> None: _enviar(telefone, f"Pedido {pedido} confirmado. Envie sua arte por aqui: {link}\n" "O link vale por 7 dias. Gabarito 57 × 97 cm, PNG 300 DPI com fundo " "transparente.") def enviar_aprovacao(pedido, r) -> None: n = len(r.partes) _enviar(pedido.telefone if hasattr(pedido, "telefone") else "", f"Arte do pedido {pedido.numero_tiny} aprovada. " f"{r.metros_totais:.2f} m em {n} arquivo{'s' if n > 1 else ''}. " "Entrou na fila de impressão.".replace(".", ",", 1)) def enviar_recusa(pedido, motivo: str) -> None: _enviar(getattr(pedido, "telefone", ""), f"A arte do pedido {pedido.numero_tiny} precisa de ajuste: {motivo}\n" "O prazo só começa a contar depois que a arte for aprovada.") def avisar(pedido: str, tipo: str, motivo: str = "") -> None: # o telefone vem do cadastro do pedido no Tiny import tiny p = tiny.buscar_pedido(pedido) telefone = (p.get("cliente") or {}).get("fone", "") _enviar(telefone, TEXTOS[tipo].format(pedido=pedido, motivo=motivo))