69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
"""
|
||
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))
|