diff --git a/portal_api/planos_saude/CHANGELOG.md b/portal_api/planos_saude/CHANGELOG.md index 5cb2bd5..d21d2d2 100644 --- a/portal_api/planos_saude/CHANGELOG.md +++ b/portal_api/planos_saude/CHANGELOG.md @@ -429,3 +429,9 @@ Correções de interface apontadas pela revisão de interface de 30/09/2026, só - **CSS**: algarismos de largura fixa (`tabular-nums`) nas colunas de valor, nos totais e nos contadores do resumo; `overflow-wrap: anywhere` nas observações; `overscroll-behavior: contain` no modal de Cadastro de Regras, na área rolável das tabelas e na lista do combobox; `flex-wrap` nas opções de origem da planilha. Por que as células de valor não têm `inputmode="decimal"`: no teclado virtual de celular (principalmente iOS), esse modo pode não oferecer "-" e "+", que as células aceitam para expressões ("15,30-15"). Os campos de limite/percentual do cadastro de regras, que não aceitam expressão, ficaram com ele. + +### Rodada 138 — Unimed Oeste do Paraná (4709): mensalidade lida como coparticipação + +Na importação da empresa **1883 (Plantiagro)**, competência 08/2026, a ferramenta trouxe só coparticipação. A fatura dessa empresa é emitida pela ACISMI (São Miguel do Iguaçu), não pela ACIME (Medianeira) do arquivo-modelo do parser, e descreve a mensalidade como "MENSALIDADE UNIMED" em vez de "CONVENIO UNIMED". `_eh_mensalidade()` (`operadoras/unimed_oeste_pr/saude.py`) só aceitava o segundo prefixo, então toda linha de mensalidade caía no "qualquer outra coisa é coparticipação", somada junto com a coparticipação real de cada pessoa. + +Corrigido aceitando também o prefixo "MENSALIDADE UNIMED". Validado contra o arquivo real: 20 beneficiários de mensalidade (R$ 6.544,54) e 8 de coparticipação ("CO-PARTICIPACAO UNIMED", R$ 895,84), somando R$ 7.440,38, igual ao "Total Faturados" impresso. Cada beneficiário tem duas linhas "MENSALIDADE UNIMED" com o mesmo prestador (ex.: R$ 387,99 + R$ 38,80, a segunda sempre cerca de 10% da primeira); as duas entram como mensalidade e são somadas, conferindo com o "Total Beneficiário". A importação feita antes da correção precisa ser refeita. diff --git a/portal_api/planos_saude/CLAUDE.md b/portal_api/planos_saude/CLAUDE.md index d83e24c..9d1d025 100644 --- a/portal_api/planos_saude/CLAUDE.md +++ b/portal_api/planos_saude/CLAUDE.md @@ -17,7 +17,7 @@ portal_api/planos_saude/ ├── unimed/saude.py Unimed Saúde — CSV (mensalidade+coparticipação no mesmo arquivo) **ou** 2 PDFs separados (um por tipo), detectados automaticamente pelo conteúdo; mensalidade por nome, coparticipação por CPF (ver "Múltiplos arquivos de operadora" abaixo) ├── itamed/saude.py Itamed Saúde (PDF via pdfplumber, mensalidade+coparticipação, casamento por nome) ├── dental_uni/odonto_mensalidade.py Dental Uni Odonto (PDF via pdfplumber, só mensalidade, casamento por nome) - ├── unimed_oeste_pr/saude.py Unimed Oeste do Paraná (PDF via pdfplumber, mensalidade+coparticipação por texto da descrição, casamento por nome) + ├── unimed_oeste_pr/saude.py Unimed Oeste do Paraná (PDF via pdfplumber, mensalidade+coparticipação por texto da descrição — "CONVENIO UNIMED"/"MENSALIDADE UNIMED" é mensalidade, o resto coparticipação, ver rodada 138 em `CHANGELOG.md` desta pasta —, casamento por nome) ├── bradesco/saude.py Bradesco Saúde (PDF **sem texto selecionável** — OCR via `docling`, mensalidade+coparticipação, casamento por nome) ├── bradesco/odonto_mensalidade.py Bradesco Dental/Bradesaude Odonto — 3759 (PDF via pdfplumber, mensalidade+coparticipação, casamento por nome, ver nota abaixo) ├── amil/odonto_mensalidade.py Amil Odonto — 3758 e 898, dois cadastros da mesma operadora no Questor (PDF via pdfplumber **ou** Excel via openpyxl — detectado pela extensão do arquivo, ver nota abaixo —, só mensalidade, casamento por CPF) diff --git a/portal_api/planos_saude/operadoras/unimed_oeste_pr/saude.py b/portal_api/planos_saude/operadoras/unimed_oeste_pr/saude.py index ef43c1e..d0180bc 100644 --- a/portal_api/planos_saude/operadoras/unimed_oeste_pr/saude.py +++ b/portal_api/planos_saude/operadoras/unimed_oeste_pr/saude.py @@ -90,8 +90,14 @@ def _eh_mensalidade(descricao: str) -> bool: """Regra confirmada com o usuário: só "Convenio Unimed" é mensalidade — tudo o mais (Taxa Administrativa, Aditivo, Coparticipação) é coparticipação, mesmo quando aparece dentro do mesmo bloco/Nro. do - Convênio.""" - return descricao.strip().upper().startswith("CONVENIO UNIMED") + Convênio. + + A fatura emitida pela ACISMI (São Miguel do Iguaçu, empresa 1883, + competência 08/2026) descreve a mensalidade como "MENSALIDADE UNIMED" + em vez de "CONVENIO UNIMED"; sem aceitar esse prefixo, toda a + mensalidade desse layout caía como coparticipação.""" + texto = descricao.strip().upper() + return texto.startswith("CONVENIO UNIMED") or texto.startswith("MENSALIDADE UNIMED") class UnimedOestePrSaude(OperadoraParser):