Voa

Mapa de rejeição

Agregue achados de lotes sintéticos por prestador e mês. Identificadores CPF são pseudonimizados com um segredo local.

import json
import os
import subprocess
import sys
from copy import deepcopy
from datetime import date
from pathlib import Path
from tempfile import TemporaryDirectory

from voa_tiss import examples, parse_lote, rejection_map

base = parse_lote(examples.load("lote-valido"))
for guia in base["guias"]:
    guia["procedimentos_executados"][0]["data_execucao"] = "2026-10-21"

lotes = [deepcopy(base) for _ in range(3)]
lotes[0]["prestador"] = {"codigo_prestador_na_operadora": "CLINICA-A"}
lotes[1]["prestador"] = {"cnpj": "11222333000181"}
lotes[1]["guias"][0]["procedimentos_executados"][0]["valor_total"] = 0
lotes[2]["prestador"] = {"cpf": "123.456.789-09"}

mapa = rejection_map(
    lotes,
    segredo_pseudonimo="s" * 16,
    at=date(2026, 10, 21),
)
linhas_resumo = [
    (linha["prestador"], linha["codigo"], linha["guias"], linha["valor_afetado"])
    for linha in mapa["linhas"]
]
linhas_resumo
Saída
[('cnpj:11222333000181', 'audit.valor_nao_positivo', 1, '0.00'),
 ('cnpj:11222333000181', 'item.valor_divergente', 1, '0.00'),
 ('cnpj:11222333000181', 'item.valor_zerado', 1, '100.00'),
 ('cnpj:11222333000181', 'lote.valor_total_geral', 1, '100.00'),
 ('cpf:hmac:4bc3e26011e3d2415208e751c83b6f999fd3d8e9bd0ee74386a0b33e43de0f4e',
  'xsd.padrao',
  2,
  '200.00')]

A página HTML é estática e não depende de serviços externos. A CLI também lê XML e JSON recursivamente: python -m voa_tiss mapa ./lotes --json mapa.json --html mapa.html.

with TemporaryDirectory() as pasta_temporaria:
    raiz = Path(pasta_temporaria)
    pasta_lotes = raiz / "lotes"
    pasta_lotes.mkdir()
    for indice, lote in enumerate(lotes, start=1):
        (pasta_lotes / f"lote-{indice}.json").write_text(
            json.dumps(lote, ensure_ascii=False), encoding="utf-8"
        )
    pagina = raiz / "mapa.html"
    subprocess.run(
        [sys.executable, "-m", "voa_tiss", "mapa", str(pasta_lotes), "--html", str(pagina)],
        env={
            **os.environ,
            "VOA_TISS_SEGREDO_PSEUDONIMO": "s" * 16,
        },
        check=True,
        capture_output=True,
    )
    resultado_html = (
        pagina.is_file(),
        "<script" not in pagina.read_text(encoding="utf-8").lower(),
    )
resultado_html
Saída
(True, True)