"""Dataclasses puras (sem ORM) do Dashboard Contábil: o formato intermediário entre o PDF extraído (`parser.py`) e as regras de auditoria (`regras.py`). Mesmo padrão de `portal_api.planos_saude.modelos`/`portal_api.indicadores.pipeline` — quem persiste em model é a view, este módulo só representa dados em memória.""" from __future__ import annotations from dataclasses import dataclass, field from datetime import date from decimal import Decimal @dataclass class CabecalhoExtraido: codigo_empresa: str nome_empresa: str cnpj: str periodo_inicio: date periodo_fim: date @dataclass class LinhaBalanceteExtraida: conta_numero: int codigo: str descricao: str tipo: str # "S" (sintética) ou "A" (analítica) saldo_anterior: Decimal debito: Decimal credito: Decimal saldo_atual: Decimal @dataclass class LinhaDreExtraida: ordem: int descricao: str nivel: int valor: Decimal totalizador: bool @dataclass class ResultadoExtracao: cabecalho: CabecalhoExtraido contas: list[LinhaBalanceteExtraida] linhas_dre: list[LinhaDreExtraida] @dataclass class AchadoDetectado: regra: str severidade: str # "alta" | "media" | "baixa" titulo: str mensagem: str codigo_conta: str | None = None valor_referencia: Decimal | None = None @dataclass class SnapshotHistorico: """Retrato mínimo de uma apuração anterior já concluída/em revisão da mesma empresa — usado pelas regras de variação mês a mês (ver `regras.py`). `contas`/`linhas_dre` são dicionários já resolvidos (codigo/descrição → valor) pra não precisar reconsultar o ORM dentro das regras, que são funções puras.""" competencia: date contas: dict[str, Decimal] = field(default_factory=dict) linhas_dre: dict[str, Decimal] = field(default_factory=dict) @dataclass class ResultadoProcessamento: extracao: ResultadoExtracao achados: list[AchadoDetectado]