-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdue_diligence.py
More file actions
72 lines (62 loc) · 2.78 KB
/
due_diligence.py
File metadata and controls
72 lines (62 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# FonteData - Due Diligence completa de empresa
# Custo estimado: ~R$ 17,58 por empresa
# pip install requests
import requests, json, sys
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime
API_KEY = "fd_live_SUA_CHAVE"
BASE_URL = "https://app.fontedata.com/api/v1/consulta"
HEADERS = {"X-API-Key": API_KEY}
CHECKS = {
"cadastral_qsa": "receita-federal-pj-qsa",
"beneficiario": "beneficiario-final",
"pgfn": "pgfn-devedores",
"cnd": "cnd-debitos",
"cndt": "tst-cndt",
"fgts": "fgts-regularidade",
"cadin": "cadin-federal",
"ceis": "ceis-sancoes",
"cnep": "cnep-sancoes",
"trabalho_forcado": "trabalho-forcado",
"improbidade": "cnia-improbidade",
"processos": "processos-completa",
"tcu": "tcu-consolidada",
"ibama_reg": "ibama-regularidade",
"ibama_embargo": "ibama-embargo",
"ibama_debitos": "ibama-debitos",
"ofac": "ofac-sancoes",
"onu": "onu-sancoes",
"ue": "eu-sancoes",
}
def _fetch(endpoint, doc):
try:
r = requests.get(f"{BASE_URL}/{endpoint}/{doc}", headers=HEADERS, timeout=60)
return endpoint, {"status": r.status_code, "data": r.json() if r.ok else None, "cost": r.headers.get("X-Request-Cost")}
except Exception as e:
return endpoint, {"status": "error", "error": str(e)}
def due_diligence(cnpj: str, output_file: str = None) -> dict:
cnpj_limpo = cnpj.replace(".", "").replace("/", "").replace("-", "")
results = {"cnpj": cnpj, "timestamp": datetime.now().isoformat(), "checks": {}}
custo_total = 0.0
print(f"Due diligence: {cnpj}")
print("-" * 40)
with ThreadPoolExecutor(max_workers=4) as ex:
futures = {ex.submit(_fetch, ep, cnpj_limpo): name for name, ep in CHECKS.items()}
for f in as_completed(futures):
name, result = f.result()
results["checks"][name] = result
custo = float(result.get("cost") or 0)
custo_total += custo
icon = "OK" if result["status"] == 200 else "FALHOU"
print(f" [{icon}] {name:<22} R$ {custo:.2f}")
results["custo_total"] = round(custo_total, 2)
print(f"\nCusto total: R$ {custo_total:.2f}")
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"Salvo em: {output_file}")
return results
if __name__ == "__main__":
cnpj = sys.argv[1] if len(sys.argv) > 1 else "00000000000191"
output = sys.argv[2] if len(sys.argv) > 2 else f"dossie_{cnpj.replace('.','').replace('/','').replace('-','')}.json"
due_diligence(cnpj, output_file=output)