portal_publico/projects/project/operadoras/base.py

46 lines
2.0 KiB
Python

"""
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