""" Certa Fiscal — exemplo de integração em Python 3 (somente stdlib). Uso: python certafiscal_exemplo.py cf_test_SUACHAVE ULID_DA_EMPRESA Demonstra: Bearer, Idempotency-Key (retry nunca duplica), X-Correlation-Id, retry com backoff p/ 429/5xx e leitura dos achados. """ import json import sys import time import uuid import urllib.request import urllib.error BASE_URL = "http://127.0.0.1:8000/api/v1" # produção: https://.../api/v1 def chamar(metodo, caminho, corpo, api_key, idempotency_key=""): for tentativa in range(1, 5): headers = { "Accept": "application/json", "Authorization": f"Bearer {api_key}", "X-Correlation-Id": uuid.uuid4().hex, } dados = None if corpo is not None: headers["Content-Type"] = "application/json" dados = json.dumps(corpo, ensure_ascii=False).encode("utf-8") if idempotency_key: headers["Idempotency-Key"] = idempotency_key req = urllib.request.Request(BASE_URL + caminho, data=dados, headers=headers, method=metodo) try: with urllib.request.urlopen(req, timeout=30) as resp: return resp.status, json.loads(resp.read().decode("utf-8")) except urllib.error.HTTPError as exc: status = exc.code try: payload = json.loads(exc.read().decode("utf-8")) except Exception: payload = {} # 401/403/422 são erro de configuração/dados: não repetir. if status not in (429,) and status < 500: return status, payload except urllib.error.URLError: status, payload = 0, {} if tentativa < 4: espera = 2 ** (tentativa - 1) # 1s, 2s, 4s — MESMA Idempotency-Key print(f"HTTP {status} — repetindo em {espera}s...", file=sys.stderr) time.sleep(espera) return status, payload def main(): if len(sys.argv) < 3: sys.exit("Uso: python certafiscal_exemplo.py ") api_key, empresa_id = sys.argv[1], sys.argv[2] status, _ = chamar("GET", "/health", None, api_key) if status != 200: sys.exit(f"API indisponível (HTTP {status})") print("Health-check: OK") status, resposta = chamar("POST", "/analyses/operation", { "company_id": empresa_id, "origin_uf": "RS", "destination_uf": "SC", "ncm": "22021000", "cest": "0301100", "cfop": "6102", "csosn": "102", "value": 1500.00, "product_description": "Refrigerante Cola 2 L (exemplo Python)", }, api_key, idempotency_key=f"pedido-{uuid.uuid4().hex[:16]}") if status not in (200, 201): erro = resposta.get("error", {}).get("message", resposta) sys.exit(f"Erro HTTP {status}: {erro}") dados = resposta["data"] print(f"Análise {dados['reference']} | risco={dados['risk_level']} " f"| pontuação={dados['score']} | motor={dados['engine_version']}") bloquear = False for achado in dados["findings"]: print(f" [{achado['severity']} {achado['rule_code']}] {achado['title']} " f"(confiança {achado['confidence']}%)") print(f" Sugestão: {achado['suggestion']}") bloquear = bloquear or achado["severity"] in ("high", "critical") print("VEREDITO: NÃO emitir — corrigir os achados primeiro." if bloquear else "VEREDITO: liberado para emitir.") if __name__ == "__main__": main()