From 8d2650812dee8641ac8c0ec578dcc80a05930532 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Mon, 24 Aug 2026 10:54:17 -0300 Subject: [PATCH] =?UTF-8?q?Inclus=C3=A3o=20do=20Mais=20informa=C3=A7=C3=B5?= =?UTF-8?q?es=20e=20corre=C3=A7=C3=A3o=20visual=20da=20aplica=C3=A7=C3=A3o?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 40 +++- .../coparticipacao_itamed_-_08.2026.pdf | Bin 0 -> 104079 bytes .../planilha_padrao/questor_626_2026-08.csv | 8 + portal_api/admin.py | 7 + portal_api/management/commands/seed_portal.py | 20 +- portal_api/migrations/0046_ajudaaplicacao.py | 29 +++ .../0047_alter_ajudaaplicacao_texto.py | 19 ++ portal_api/models.py | 50 ++++ portal_api/planos_saude/pipeline.py | 2 +- portal_api/serializers.py | 53 +++-- portal_api/urls.py | 1 + portal_api/views.py | 24 ++ static/css/components.css | 126 ++++++++++ static/css/importacao-plano-saude.css | 6 + static/js/acessos-gerais.js | 4 +- static/js/ajuda-aplicacao.js | 219 ++++++++++++++++++ static/js/calendar-individual.js | 2 +- static/js/confirm-modal.js | 91 ++++++++ static/js/importacao-plano-saude.js | 65 ++---- static/js/indicador-desempenho.js | 13 +- static/js/links-ferramentas.js | 4 +- static/js/profiles.js | 4 +- static/js/ramais.js | 12 +- static/js/users-admin.js | 12 +- templates/acessos-gerais.html | 3 +- templates/calendario-individual.html | 1 + templates/custo-contratacao.html | 3 +- templates/importacao-plano-saude.html | 26 +-- templates/index.html | 3 +- templates/indicador-desempenho.html | 3 +- templates/links-ferramentas.html | 3 +- templates/perfis-acesso.html | 1 + templates/portal.html | 3 +- templates/ramais.html | 3 +- templates/usuarios.html | 1 + 35 files changed, 746 insertions(+), 115 deletions(-) create mode 100644 media/planos_saude/operadora/coparticipacao_itamed_-_08.2026.pdf create mode 100644 media/planos_saude/planilha_padrao/questor_626_2026-08.csv create mode 100644 portal_api/migrations/0046_ajudaaplicacao.py create mode 100644 portal_api/migrations/0047_alter_ajudaaplicacao_texto.py create mode 100644 static/js/ajuda-aplicacao.js create mode 100644 static/js/confirm-modal.js diff --git a/CLAUDE.md b/CLAUDE.md index 4df4a4b..d322ef8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,7 +97,7 @@ Um único app, `portal_api/`: | Arquivo | Conteúdo | |---|---| -| `models.py` | `Usuario` (`AbstractUser` + `nome`, M2M `perfis`, M2M `departamentos` (pra `Departamento`, ver abaixo), campos cadastrais opcionais `codigo_folha`/`codigo_questor`/`codigo_tareffa`/`codigo_contabit`/`ramal` (`CharField`, `blank=True`) e `data_aniversario` (`DateField`, `null=True, blank=True`), `lideranca` (`BooleanField`, é gerente/coordenador) e M2M `liderados` (self-referential, `symmetrical=False`, `related_name="lideres"` — ver seção "Liderança" abaixo) — `email` já vem de `AbstractUser`, não precisou de campo novo; método `permissao_app(module_key, app_key)` — união genérica de um flag de `apps` entre os perfis vinculados), `Departamento` (só `nome`, `unique=True` — cadastro inline pela própria tela de Usuários, sem tela de administração dedicada como `PerfilAcesso`), `PerfilAcesso` (`permissoes` em `JSONField`, mesmo formato aninhado do frontend; mais o booleano dedicado `gerencia_permissoes`), `CompromissoAgenda`, `Favorito`, `WidgetUsuario`, `NotificacaoDispensada`, `LinkFerramenta` (`icone` é `ImageField`, requer Pillow), `LinkFerramentaFavorito` (favorito por usuário de um cartão de Links & Ferramentas — não confundir com `Favorito`), `AcessoGeralSecao`/`AcessoGeral` (cadastro de logins/acessos compartilhados da aplicação "Acessos Gerais", ver seção própria abaixo), `Ramal` (linha **avulsa** da tela de Ramais, sem `Usuario` por trás — colaboradores de verdade aparecem automaticamente na listagem, sem precisar de uma linha aqui; ver seção "Ramais" abaixo), `RamalAusencia` (período de ausência de um colaborador, com `esta_ativa()` calculando "ausente agora" em vez de armazenar), `TelefoneExterno` (subtela "Telefones Externos" de Ramais, sem `Usuario` por trás), `FuncaoTelefonia` (subtela "Funções de Telefonia" de Ramais, `Meta.ordering` por `comando` reproduz a ordem esperada sem campo de ordem manual), `ImportacaoPlanoSaude`/`ImportacaoPlanoSaudeLinha`/`ImportacaoPlanoSaudeAuditoria` (ferramenta "Importação de Plano de Saúde" em Utilitários, ver seção própria abaixo). | +| `models.py` | `Usuario` (`AbstractUser` + `nome`, M2M `perfis`, M2M `departamentos` (pra `Departamento`, ver abaixo), campos cadastrais opcionais `codigo_folha`/`codigo_questor`/`codigo_tareffa`/`codigo_contabit`/`ramal` (`CharField`, `blank=True`) e `data_aniversario` (`DateField`, `null=True, blank=True`), `lideranca` (`BooleanField`, é gerente/coordenador) e M2M `liderados` (self-referential, `symmetrical=False`, `related_name="lideres"` — ver seção "Liderança" abaixo) — `email` já vem de `AbstractUser`, não precisou de campo novo; método `permissao_app(module_key, app_key)` — união genérica de um flag de `apps` entre os perfis vinculados; método `eh_perfil_inovacao()` — checagem de nome fixo pro perfil "Inovação", ver "Ajuda de aplicação" abaixo), `AjudaAplicacao` (texto de "Mais informações" de uma aplicação, chave natural `app_key`), `Departamento` (só `nome`, `unique=True` — cadastro inline pela própria tela de Usuários, sem tela de administração dedicada como `PerfilAcesso`), `PerfilAcesso` (`permissoes` em `JSONField`, mesmo formato aninhado do frontend; mais o booleano dedicado `gerencia_permissoes`), `CompromissoAgenda`, `Favorito`, `WidgetUsuario`, `NotificacaoDispensada`, `LinkFerramenta` (`icone` é `ImageField`, requer Pillow), `LinkFerramentaFavorito` (favorito por usuário de um cartão de Links & Ferramentas — não confundir com `Favorito`), `AcessoGeralSecao`/`AcessoGeral` (cadastro de logins/acessos compartilhados da aplicação "Acessos Gerais", ver seção própria abaixo), `Ramal` (linha **avulsa** da tela de Ramais, sem `Usuario` por trás — colaboradores de verdade aparecem automaticamente na listagem, sem precisar de uma linha aqui; ver seção "Ramais" abaixo), `RamalAusencia` (período de ausência de um colaborador, com `esta_ativa()` calculando "ausente agora" em vez de armazenar), `TelefoneExterno` (subtela "Telefones Externos" de Ramais, sem `Usuario` por trás), `FuncaoTelefonia` (subtela "Funções de Telefonia" de Ramais, `Meta.ordering` por `comando` reproduz a ordem esperada sem campo de ordem manual), `ImportacaoPlanoSaude`/`ImportacaoPlanoSaudeLinha`/`ImportacaoPlanoSaudeAuditoria` (ferramenta "Importação de Plano de Saúde" em Utilitários, ver seção própria abaixo). | | `catalogo.py` | Fonte única da verdade do catálogo de módulos/aplicações do menu (`MODULES`, `MODULE_APPS`) — exposto só leitura via `GET /api/catalogo/`. Ao adicionar uma seção/aplicação nova ao menu, editar **aqui**, não em `static/js/profiles.js` (que só cacheia o payload recebido). | | `serializers.py` | `PerfilAcessoSerializer`, `DepartamentoSerializer`, `UsuarioResumoSerializer` (`id`/`nome`/`departamentos`, usado nos dois lados de `liderados` e por `/api/usuarios-resumo/`), `UsuarioSerializer` (escrita, aceita `senha`+`perfis`+`departamentos`+`liderados`)/`UsuarioListSerializer` (leitura, `perfis`/`departamentos`/`liderados` aninhados), `CompromissoAgendaSerializer` (`sou_dono`, `dono_nome`, `dono_username`), `FavoritoSerializer`, `WidgetUsuarioSerializer`, `NotificacaoDispensadaSerializer`, `LinkFerramentaSerializer`, `LinkFerramentaFavoritoSerializer`, `AcessoGeralSecaoSerializer`, `AcessoGeralSerializer`, `RamalSerializer` (só das linhas avulsas — ver seção "Ramais"), `RamalAusenciaSerializer`, `TelefoneExternoSerializer`, `FuncaoTelefoniaSerializer`, `ImportacaoPlanoSaudeCreateSerializer`/`ImportacaoPlanoSaudeListSerializer`/`ImportacaoPlanoSaudeDetailSerializer`/`ImportacaoPlanoSaudeLinhaSerializer`/`ImportacaoPlanoSaudeAuditoriaSerializer` (ver seção "Importação de Plano de Saúde"). | | `permissions.py` | `PodeGerenciarPermissoes` — gate único de `gerencia_permissoes()` para as telas administrativas; `PermissaoApp(module_key, app_key)` — classe genérica reutilizável que checa `Usuario.permissao_app()`, instanciada por view (ex.: Links & Ferramentas e Ramais, ver seção própria abaixo). | @@ -116,13 +116,14 @@ Um único app, `portal_api/`: | `/api/auth/csrf/` | GET | garante o cookie `csrftoken` | | `/api/auth/login/` | POST | `{username, password}` → cria sessão | | `/api/auth/logout/` | POST | encerra sessão | -| `/api/me/` | GET | usuário logado + `perfis` + `departamentos` (os próprios, pra alimentar o seletor de "Meu departamento" do Calendário Individual) + `gerencia_permissoes` + `permissoes_efetivas` (união já calculada no servidor) | +| `/api/me/` | GET | usuário logado + `perfis` + `departamentos` (os próprios, pra alimentar o seletor de "Meu departamento" do Calendário Individual) + `gerencia_permissoes` + `eh_perfil_inovacao` (perfil "Inovação" vinculado, ver "Ajuda de aplicação" abaixo) + `permissoes_efetivas` (união já calculada no servidor) | | `/api/me/senha/` | POST | `{senha_atual, nova_senha}` | | `/api/me/liderados/` | PATCH | `{liderados: [id, ...]}` — só se `me.lideranca`; auto-gerenciamento de liderados (ver seção "Liderança") | | `/api/catalogo/` | GET | módulos/aplicações/subgrupos do menu | | `/api/feriados/?ano=AAAA` | GET | feriados nacionais + estaduais (PR) do ano pedido (default: ano atual), via lib `holidays` — ver "Feriados no Calendário Individual" abaixo | | `/api/usuarios-resumo/` | GET | lista enxuta (`id`/`nome`) de usuários ativos — alimenta o seletor de liderados, sem exigir `gerencia_permissoes` (mesmo padrão de `/api/ramais/usuarios/`) | | `/api/departamentos-resumo/` | GET | lista enxuta (`id`/`nome`) de departamentos — alimenta os botões de filtro do modal de consulta rápida de Ramais, exige só `ramais-visualizar` (não `gerencia_permissoes` como `/api/departamentos/`) | +| `/api/ajuda-aplicacoes//` | GET/PATCH | texto de "Mais informações" de uma aplicação (ver seção própria abaixo); GET livre a qualquer autenticado, PATCH exige `eh_perfil_inovacao` (perfil "Inovação", checagem de nome fixo, não uma flag em Perfis de Acesso) | | `/api/perfis/`, `/api/perfis/{codigo}/` | GET/POST/PUT/DELETE | CRUD de perfil — só quem tem `gerencia_permissoes` | | `/api/departamentos/`, `/api/departamentos/{id}/` | GET/POST/PUT/DELETE | CRUD de departamento — só quem tem `gerencia_permissoes`; usado pela tela de Usuários pra listar o checklist e cadastrar um novo departamento inline (sem tela própria) | | `/api/usuarios/`, `/api/usuarios/{id}/` | GET/POST/PATCH/DELETE | CRUD de conta — só quem tem `gerencia_permissoes`; `departamentos` é M2M igual `perfis` (lista de ids na escrita, objetos aninhados na leitura); `is_active` é gravável via PATCH (inativar/reativar, ver "Inativar usuário" abaixo) | @@ -198,7 +199,7 @@ O item "Calendário De Paula" no menu **não é uma página local** — é um `< ## Ordem de ` + diff --git a/templates/calendario-individual.html b/templates/calendario-individual.html index d3e0f73..1723d3e 100644 --- a/templates/calendario-individual.html +++ b/templates/calendario-individual.html @@ -666,6 +666,7 @@ + diff --git a/templates/custo-contratacao.html b/templates/custo-contratacao.html index eaf1ddf..ebb257e 100644 --- a/templates/custo-contratacao.html +++ b/templates/custo-contratacao.html @@ -290,7 +290,7 @@
@@ -652,6 +652,7 @@
+ diff --git a/templates/importacao-plano-saude.html b/templates/importacao-plano-saude.html index 3b918f9..bd010f9 100644 --- a/templates/importacao-plano-saude.html +++ b/templates/importacao-plano-saude.html @@ -291,14 +291,20 @@
-

Importação de Plano de Saúde

+
+

Importação de Plano de Saúde

+ + + Mais informações + +

Gere o arquivo de lançamento de mensalidade/coparticipação no leiaute do sistema, a partir do relatório da operadora.

@@ -493,7 +499,7 @@ @@ -118,6 +118,7 @@
+ diff --git a/templates/indicador-desempenho.html b/templates/indicador-desempenho.html index e54daf6..caab6b7 100644 --- a/templates/indicador-desempenho.html +++ b/templates/indicador-desempenho.html @@ -291,7 +291,7 @@
@@ -906,6 +906,7 @@
+ diff --git a/templates/links-ferramentas.html b/templates/links-ferramentas.html index 71423f9..afbf6d0 100644 --- a/templates/links-ferramentas.html +++ b/templates/links-ferramentas.html @@ -296,7 +296,7 @@
@@ -516,6 +516,7 @@
+ diff --git a/templates/perfis-acesso.html b/templates/perfis-acesso.html index 100cc88..c51f144 100644 --- a/templates/perfis-acesso.html +++ b/templates/perfis-acesso.html @@ -581,6 +581,7 @@
+ diff --git a/templates/portal.html b/templates/portal.html index 77b6265..23d088e 100644 --- a/templates/portal.html +++ b/templates/portal.html @@ -295,7 +295,7 @@
@@ -509,6 +509,7 @@
+ diff --git a/templates/ramais.html b/templates/ramais.html index 8e1b7a5..e36d4d2 100644 --- a/templates/ramais.html +++ b/templates/ramais.html @@ -291,7 +291,7 @@
@@ -731,6 +731,7 @@
+ diff --git a/templates/usuarios.html b/templates/usuarios.html index 16c8a4d..b8d2180 100644 --- a/templates/usuarios.html +++ b/templates/usuarios.html @@ -632,6 +632,7 @@
+