#!/usr/bin/env python3 """A despesa previdenciária do FCDF em 2025, por ação orçamentária. python3 fcdf.py Lê fontes/Portal-Transparencia-Orcamento-Despesa-2025.zip (Portal da Transparência, "Despesas - Orçamento", exercício 2025) sem descompactar em disco. Filtra a unidade orçamentária 73901 (Fundo Constitucional do DF) e os elementos 01 (aposentadorias, reserva remunerada e reformas) e 03 (pensões), que somam o que o RREO de dez/2025 republicado chama de aposentadorias e pensões do FCDF. Valores empenhados, em R$ bi. """ import csv, io, zipfile from collections import defaultdict from pathlib import Path ZIP = Path(__file__).parent / "fontes" / "Portal-Transparencia-Orcamento-Despesa-2025.zip" GRUPOS = { "00NS": "PM e Bombeiros do DF: inativos", "00Q2": "PM e Bombeiros do DF: pensões", "00QN": "Polícia Civil do DF: inativos e pensões", "00WX": "educação do DF: inativos e pensões", "00WW": "saúde do DF: inativos e pensões", } def num(s): return float(s.replace(".", "").replace(",", ".")) if s else 0.0 valor = defaultdict(float) with zipfile.ZipFile(ZIP) as z: nome = next(n for n in z.namelist() if n.endswith(".csv")) for r in csv.DictReader(io.TextIOWrapper(z.open(nome), encoding="latin1"), delimiter=";"): if r["CÓDIGO UNIDADE ORÇAMENTÁRIA"] != "73901" or r["CÓDIGO ELEMENTO DE DESPESA"] not in ("01", "03"): continue valor[(r["CÓDIGO AÇÃO"], r["CÓDIGO ELEMENTO DE DESPESA"])] += num(r["ORÇAMENTO EMPENHADO (R$)"]) # Os totais por elemento batem com o RREO republicado: 9,078 (aposentadorias) e 1,331 (pensões). print(f"total inatividade {sum(v for (_, e), v in valor.items() if e == '01')/1e9:.3f}" f" pensões {sum(v for (_, e), v in valor.items() if e == '03')/1e9:.3f}") for acao, rotulo in GRUPOS.items(): a, p = valor.pop((acao, "01"), 0.0), valor.pop((acao, "03"), 0.0) print(f"{acao} {rotulo:42} inatividade {a/1e9:6.3f} pensões {p/1e9:6.3f}") assert not valor, f"ações não classificadas: {sorted(valor)}"