"""Orquestração do Dashboard Contábil: extrai o PDF e roda o motor de regras sobre o resultado — só em memória (dataclasses), sem tocar no ORM diretamente. Mesmo padrão de `portal_api.indicadores.pipeline`/`portal_api.planos_saude. pipeline`; quem persiste é a view. Diferente dos outros dois pacotes, aqui a chave de busca do histórico (`codigo_empresa`) só é conhecida **depois** de extrair o cabeçalho do PDF — por isso `processa_apuracao` recebe `busca_historico` como uma função (injetada pela view, que sabe consultar o ORM) em vez de já receber o histórico pronto.""" from __future__ import annotations from typing import IO, Callable from .modelos import CabecalhoExtraido, ResultadoProcessamento, SnapshotHistorico from .parser import extrai_balancete_dre from .regras import gera_achados def processa_apuracao( origem: str | IO[bytes], busca_historico: Callable[[CabecalhoExtraido], list[SnapshotHistorico]] ) -> ResultadoProcessamento: extracao = extrai_balancete_dre(origem) historico = busca_historico(extracao.cabecalho) achados = gera_achados(extracao, historico) return ResultadoProcessamento(extracao=extracao, achados=achados)