46 lines
2.0 KiB
Python
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
|