#!/usr/bin/env python3 """Militares inativos na folha de dez/2025, por situação: reserva remunerada ou reforma. python3 reserva-reforma.py Lê fontes/Portal-Transparencia-Reserva-Reforma-Militares-202512.zip (Portal da Transparência, arquivo mensal "Reserva_Reforma_Militares") sem descompactar em disco. A situação vem da coluna SITUACAO_VINCULO do cadastro ("MILITAR DA RESERVA" ou "MILITAR REFORMADO"); o motivo da reforma, de TIPO_APOSENTADORIA. O valor é a remuneração básica bruta mais o abate-teto, do mês. """ import csv, io, zipfile from collections import Counter, defaultdict from pathlib import Path ZIP = Path(__file__).parent / "fontes" / "Portal-Transparencia-Reserva-Reforma-Militares-202512.zip" def num(s): return float(s.replace(".", "").replace(",", ".")) if s else 0.0 def ler(z, sufixo): nome = next(n for n in z.namelist() if n.endswith(sufixo)) return csv.reader(io.TextIOWrapper(z.open(nome), encoding="latin1"), delimiter=";") with zipfile.ZipFile(ZIP) as z: cad = ler(z, "_Cadastro.csv"); h = next(cad) i_id, i_sit, i_tipo = h.index("Id_SERVIDOR_PORTAL"), h.index("SITUACAO_VINCULO"), h.index("TIPO_APOSENTADORIA") situacao, motivo = {}, {} for r in cad: situacao[r[i_id]] = "reforma" if "REFORMADO" in r[i_sit] else "reserva" motivo[r[i_id]] = r[i_tipo] rem = ler(z, "_Remuneracao.csv"); h = next(rem) i_bruta, i_teto = h.index("REMUNERAÇÃO BÁSICA BRUTA (R$)"), h.index("ABATE-TETO (R$)") pessoas, valor = Counter(), defaultdict(float) invalidez = Counter() for r in rem: s = situacao.get(r[2]) if s is None: continue pessoas[s] += 1 valor[s] += num(r[i_bruta]) + num(r[i_teto]) if s == "reforma" and ("INVALIDEZ" in motivo[r[2]] or "DOEN" in motivo[r[2]]): invalidez["pessoas"] += 1 invalidez["valor"] += num(r[i_bruta]) + num(r[i_teto]) total = sum(valor.values()) print(f"{'situação':10} {'pessoas':>8} {'folha do mês':>14} {'parte':>7}") for s in ("reserva", "reforma"): print(f"{s:10} {pessoas[s]:8d} R$ {valor[s]/1e9:8.3f} bi {100*valor[s]/total:6.1f}%") print(f"{'total':10} {sum(pessoas.values()):8d} R$ {total/1e9:8.3f} bi") print(f"reforma por invalidez ou doença: {invalidez['pessoas']} pessoas, " f"{100*invalidez['valor']/total:.1f}% da folha")