""" Toda operadora nova (Bradesco, SulAmérica, Unimed, ...) implementa esta interface. Isso mantém o main.py e o resto do pipeline (matching, geração de saída, auditoria) totalmente reaproveitáveis — só muda a forma de extrair e normalizar os dados de cada arquivo. """ from abc import ABC, abstractmethod from typing import List, Tuple from core.modelos import Individuo, ItemAuditoria class OperadoraParser(ABC): """ Uma operadora pode mandar só um tipo de lançamento (ex: Amil Odonto, só mensalidade) ou os dois juntos no mesmo arquivo (ex: Unimed, mensalidade + coparticipação). Por isso `extrai()` não fica mais amarrado a um único tipo: cada Individuo já vem marcado com seu próprio `tipo_lancamento`, e o main.py separa e gera um arquivo de saída para cada tipo que aparecer — numa única execução. `chave_casamento` indica como essa operadora deve ser casada com a planilha padrão do sistema: - "cpf" -> casamento por CPFFUNC/CPFDEPENDENTE (preferível, mais seguro) - "nome" -> casamento por nome normalizado, usado só quando a operadora não informa CPF nenhum (ex: Unimed). Nesse modo, nome que não bate EXATO vai para auditoria — nunca é resolvido por aproximação/fuzzy automática. """ nome_operadora: str chave_casamento: str = "cpf" @abstractmethod def extrai(self, caminho_arquivo: str) -> Tuple[List[Individuo], List[ItemAuditoria]]: """ Lê o arquivo bruto do cliente (PDF, CSV, XLS...) e devolve: - lista de Individuo já agregada (um item por beneficiário e por tipo de lançamento, com o valor do mês somado a partir de todas as rubricas/serviços dele); - lista de ItemAuditoria para problemas já identificados na própria extração (ex: uma linha com um "Tipo" de despesa que a operadora nunca usou antes e não sabemos classificar). """ raise NotImplementedError