From 3a6c3e1815bb573175a1126ef786b8aff10dcff0 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Tue, 18 Aug 2026 10:57:39 -0300 Subject: [PATCH] Commit inicial do Portal De Paula --- .gitignore | 50 + CLAUDE.md | 581 +++++ config/__init__.py | 0 config/asgi.py | 7 + config/settings.py | 106 + config/urls.py | 40 + config/wsgi.py | 7 + database/__init__.py | 0 database/connection.py | 100 + database/query.py | 7 + database/settings.py | 64 + manage.py | 20 + .../honorarios/Honorários_Por_Cliente.xlsx | Bin 0 -> 36472 bytes .../Honorários_Por_Cliente_i3XRI3v.xlsx | Bin 0 -> 36472 bytes .../Honorários_Por_Cliente_p1NP1Ox.xlsx | Bin 0 -> 36472 bytes .../honorarios/honorarios_teste.xlsx | 1 + .../honorarios/honorarios_teste_fZ7ugXp.xlsx | 1 + .../tareffa/Serviços_Tareffa.xlsx | Bin 0 -> 83019 bytes .../tareffa/Serviços_Tareffa_F2ttKtO.xlsx | Bin 0 -> 83019 bytes .../tareffa/Serviços_Tareffa_fWr2GDj.xlsx | Bin 0 -> 83019 bytes media/indicadores/tareffa/tareffa_teste.xlsx | 1 + .../tareffa/tareffa_teste_sZCMsiH.xlsx | 1 + ...52_ae05daba721b438aae0f48c39aae585bmv2.png | Bin 0 -> 116243 bytes .../7070c620d7d048b477199d44f3a12f54.jpg | Bin 0 -> 11644 bytes media/links_ferramentas/Asana-Logo.png | Bin 0 -> 128767 bytes media/links_ferramentas/CUUUylLq_400x400.jpg | Bin 0 -> 7759 bytes .../Captura_de_tela_2026-08-04_100519.png | Bin 0 -> 35657 bytes ..._-_Azul.png_name_20220609-29668-u9vd09.png | Bin 0 -> 28370 bytes media/links_ferramentas/Serviços.png | Bin 0 -> 47831 bytes media/links_ferramentas/Serviços_1.png | Bin 0 -> 49378 bytes media/links_ferramentas/Serviços_2.png | Bin 0 -> 47056 bytes media/links_ferramentas/Serviços_3.png | Bin 0 -> 49254 bytes media/links_ferramentas/WhatsApp.svg.webp | Bin 0 -> 80814 bytes media/links_ferramentas/agenda_eliz.jpg | Bin 0 -> 14044 bytes media/links_ferramentas/images.png | Bin 0 -> 4581 bytes media/links_ferramentas/images_1.jpg | Bin 0 -> 17920 bytes media/links_ferramentas/images_1.png | Bin 0 -> 5540 bytes media/links_ferramentas/images_2.jpg | Bin 0 -> 14751 bytes media/links_ferramentas/images_2.png | Bin 0 -> 10608 bytes media/links_ferramentas/images_3.jpg | Bin 0 -> 12791 bytes media/links_ferramentas/images_3.png | Bin 0 -> 6337 bytes media/links_ferramentas/images_5.jpg | Bin 0 -> 14856 bytes .../logo-workmonitor-BZgtEcg-.png | Bin 0 -> 121183 bytes media/links_ferramentas/logo.png | Bin 0 -> 7865 bytes media/links_ferramentas/logoRHGestor.png | Bin 0 -> 13541 bytes media/links_ferramentas/meet.png | Bin 0 -> 200671 bytes ...-tributária-squareLogo-1750853635998.webp | Bin 0 -> 2152 bytes .../operadora/092_-_EXTRATO_072026.csv | 67 + ..._270720260942558922821682729471894__1_.PDF | Bin 0 -> 107693 bytes ..._-_RELATORIO_DENTAL_UNI_072026_UKBwlqT.pdf | Bin 0 -> 7151 bytes .../operadora/128_-_PLANO_DE_SAUDE_072026.csv | 82 + .../1604_-_Plano_de_Saude_072026.pdf | Bin 0 -> 94842 bytes .../2028_-_RELATORIO_DENTAL_UNI_072026.pdf | Bin 0 -> 7491 bytes .../626_-_coparticipacao_itamed_-_07.2026.pdf | Bin 0 -> 104150 bytes .../operadora/Demonstrativo_Junho.2026.pdf | Bin 0 -> 13275 bytes ..._OPER_3755_FUNDACAO_DE_SAUDE_ITAIGUAPY.CSV | 17 + ...UNI_-_COOPERATIVA_ODONTOLOGICA_svbbApa.CSV | 12 + ...TADO_DO_PARANA_-_FEDERACAO_ESTADUAL_DA.CSV | 4 + ...STE_DO_PARANA_-_COOPERATIVA_DE_TRABALH.CSV | 5 + ..._OPER_3755_FUNDACAO_DE_SAUDE_ITAIGUAPY.CSV | 3 + ..._DENTAL_UNI_-_COOPERATIVA_ODONTOLOGICA.CSV | 18 + ..._OPER_3755_FUNDACAO_DE_SAUDE_ITAIGUAPY.CSV | 8 + ...TADO_DO_PARANA_-_FEDERACAO_ESTADUAL_DA.CSV | 22 + plano.md | 849 +++++++ portal_api/__init__.py | 0 portal_api/admin.py | 202 ++ portal_api/apps.py | 7 + portal_api/catalogo.py | 202 ++ portal_api/custo_contratacao/__init__.py | 0 portal_api/custo_contratacao/calculo.py | 251 ++ portal_api/custo_contratacao/pdf.py | 293 +++ portal_api/custo_contratacao/tabelas.py | 46 + portal_api/indicadores/__init__.py | 0 portal_api/indicadores/calculo.py | 300 +++ portal_api/indicadores/departamentos.py | 31 + portal_api/indicadores/entregas.py | 41 + portal_api/indicadores/leiaute.py | 120 + portal_api/indicadores/pipeline.py | 151 ++ portal_api/indicadores/recibo.py | 472 ++++ portal_api/indicadores/tipos.py | 110 + portal_api/management/__init__.py | 0 portal_api/management/commands/__init__.py | 0 .../commands/seed_indicador_desempenho.py | 130 + portal_api/management/commands/seed_portal.py | 187 ++ portal_api/migrations/0001_initial.py | 110 + .../migrations/0002_notificacaodispensada.py | 29 + .../0003_linkferramenta_and_more.py | 34 + ...perfilacesso_gerencia_links_ferramentas.py | 17 + .../0005_alter_linkferramenta_icone.py | 19 + ..._contabit_usuario_codigo_folha_and_more.py | 43 + ...to_remove_usuario_departamento_and_more.py | 35 + .../migrations/0008_linkferramentafavorito.py | 29 + ...o_options_widgetusuario_altura_and_more.py | 32 + ...0_alter_favorito_options_favorito_ordem.py | 22 + portal_api/migrations/0011_usuario_ramal.py | 18 + .../migrations/0012_ramal_ramalausencia.py | 50 + ...3_remove_ramal_usuario_alter_ramal_nome.py | 22 + .../0014_funcaotelefonia_telefoneexterno.py | 44 + ...015_usuario_liderados_usuario_lideranca.py | 24 + .../0016_acessogeralsecao_acessogeral.py | 47 + ...ssogeralsecao_perfis_restritos_and_more.py | 24 + ...genda_compartilhado_com_perfil_and_more.py | 33 + ...to_compromissoagenda_descricao_and_more.py | 48 + .../0020_compromissoagenda_eh_evento.py | 18 + ..._importacaoplanosaudeauditoria_and_more.py | 81 + ...caoplanosaudeauditoria_resolucao_manual.py | 24 + .../0023_parametrofiscalcustocontratacao.py | 35 + ...adorcriterio_indicadorapuracao_and_more.py | 135 + .../0025_indicadorapuracao_avisos.py | 18 + ...aocolaborador_pct_departamento_and_more.py | 33 + ...orapuracaoresposta_percentual_calculado.py | 18 + ...artamento_ajustado_manualmente_and_more.py | 48 + ...dicadorapuracaoempresa_options_and_more.py | 22 + ..._alter_indicadorapuracaoempresa_options.py | 18 + ...1_indicadorapuracaocolaborador_validado.py | 18 + .../0032_indicadorsetorapelido_and_more.py | 31 + ...o_indicadordepartamentogerente_and_more.py | 71 + ...34_backfill_departamento_fisco_contabil.py | 30 + ...indicadorcriterio_departamento_and_more.py | 24 + ...aoplanosaude_arquivo_operadora_and_more.py | 24 + .../migrations/0037_regracusteioplanosaude.py | 34 + portal_api/migrations/__init__.py | 0 portal_api/models.py | 1178 +++++++++ portal_api/permissions.py | 39 + portal_api/planos_saude/__init__.py | 0 portal_api/planos_saude/leiaute_sistema.py | 73 + portal_api/planos_saude/matcher.py | 327 +++ portal_api/planos_saude/modelos.py | 114 + .../planos_saude/operadoras/__init__.py | 0 .../planos_saude/operadoras/amil/__init__.py | 0 .../operadoras/amil/odonto_mensalidade.py | 131 + portal_api/planos_saude/operadoras/base.py | 44 + .../operadoras/dental_uni/__init__.py | 0 .../dental_uni/odonto_mensalidade.py | 169 ++ .../operadoras/itamed/__init__.py | 0 .../planos_saude/operadoras/itamed/saude.py | 159 ++ .../operadoras/unimed/__init__.py | 0 .../planos_saude/operadoras/unimed/saude.py | 168 ++ .../operadoras/unimed_oeste_pr/__init__.py | 0 .../operadoras/unimed_oeste_pr/saude.py | 203 ++ portal_api/planos_saude/pipeline.py | 120 + portal_api/serializers.py | 1201 +++++++++ portal_api/urls.py | 86 + portal_api/views.py | 1564 ++++++++++++ .../Indicadores/FISCO CONTABIL 0726 OK.ods | Bin 0 -> 1166855 bytes .../Indicadores/Honorários Por Cliente.xlsx | Bin 0 -> 36472 bytes projects/Indicadores/Modelo de Recibo.pdf | Bin 0 -> 975987 bytes projects/Indicadores/Serviços Tareffa.xlsx | Bin 0 -> 83019 bytes ...- CUSTO EMPREGADO SALÁRIO (8.500,00).xlsx | Bin 0 -> 9173 bytes .../AUDITORIA_EMP_218_AMIL_3758_082026.csv | 2 + .../auditoria/AUDITORIA_amil_202608.csv | 2 + .../auditoria/AUDITORIA_unimed_202608.csv | 2 + projects/project/core/auditoria.py | 38 + projects/project/core/leiaute_sistema.py | 56 + projects/project/core/matcher.py | 232 ++ projects/project/core/modelos.py | 111 + .../project/entrada/amil_odonto_202608.pdf | Bin 0 -> 47858 bytes .../entrada/planilha_padrao_218_3758.csv | 37 + .../entrada/planilha_padrao_218_5060.csv | 43 + projects/project/entrada/unimed_202608.csv | 67 + .../entrada/unimed_202608_original.csv | 67 + projects/project/main.py | 94 + .../operadoras/amil/odonto_mensalidade.py | 130 + projects/project/operadoras/base.py | 45 + projects/project/operadoras/unimed/saude.py | 168 ++ .../project/saida/amil_202608/mensalidade.csv | 37 + .../mensalidade/EMP_218_AMIL_3758_082026.csv | 37 + .../saida/unimed_202608/coparticipacao.csv | 43 + .../saida/unimed_202608/mensalidade.csv | 43 + requirements.txt | Bin 0 -> 1206 bytes static/css/acessos-gerais.css | 275 +++ static/css/base.css | 126 + static/css/calendario.css | 294 +++ static/css/components.css | 805 ++++++ static/css/custo-contratacao.css | 152 ++ static/css/importacao-plano-saude.css | 604 +++++ static/css/indicador-desempenho.css | 724 ++++++ static/css/layout.css | 376 +++ static/css/links-ferramentas.css | 158 ++ static/css/login.css | 138 ++ static/css/perfis-acesso.css | 683 +++++ static/css/ramais-lookup.css | 221 ++ static/css/ramais.css | 174 ++ static/css/tokens.css | 161 ++ static/css/widgets.css | 230 ++ static/img/favicon.png | Bin 0 -> 18770 bytes static/img/logo-branco.png | Bin 0 -> 474536 bytes static/img/logo-mono.png | Bin 0 -> 29940 bytes static/img/logo.png | Bin 0 -> 488908 bytes static/js/access.js | 74 + static/js/account.js | 224 ++ static/js/acessos-gerais.js | 611 +++++ static/js/api.js | 79 + static/js/auth.js | 73 + static/js/calendar-individual.js | 580 +++++ static/js/custo-contratacao.js | 320 +++ static/js/events.js | 29 + static/js/favorites.js | 254 ++ static/js/importacao-plano-saude.js | 1516 ++++++++++++ static/js/indicador-desempenho.js | 2196 +++++++++++++++++ static/js/links-ferramentas.js | 351 +++ static/js/notifications.js | 196 ++ static/js/profiles.js | 644 +++++ static/js/ramais-lookup.js | 205 ++ static/js/ramais.js | 834 +++++++ static/js/search.js | 49 + static/js/sidebar.js | 148 ++ static/js/theme.js | 69 + static/js/users-admin.js | 445 ++++ static/js/widgets.js | 313 +++ templates/acessos-gerais.html | 467 ++++ templates/calendario-individual.html | 604 +++++ templates/custo-contratacao.html | 589 +++++ templates/importacao-plano-saude.html | 629 +++++ templates/index.html | 78 + templates/indicador-desempenho.html | 843 +++++++ templates/links-ferramentas.html | 454 ++++ templates/perfis-acesso.html | 467 ++++ templates/portal.html | 453 ++++ templates/ramais.html | 668 +++++ templates/usuarios.html | 498 ++++ 221 files changed, 32889 insertions(+) create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 config/__init__.py create mode 100644 config/asgi.py create mode 100644 config/settings.py create mode 100644 config/urls.py create mode 100644 config/wsgi.py create mode 100644 database/__init__.py create mode 100644 database/connection.py create mode 100644 database/query.py create mode 100644 database/settings.py create mode 100644 manage.py create mode 100644 media/indicadores/honorarios/Honorários_Por_Cliente.xlsx create mode 100644 media/indicadores/honorarios/Honorários_Por_Cliente_i3XRI3v.xlsx create mode 100644 media/indicadores/honorarios/Honorários_Por_Cliente_p1NP1Ox.xlsx create mode 100644 media/indicadores/honorarios/honorarios_teste.xlsx create mode 100644 media/indicadores/honorarios/honorarios_teste_fZ7ugXp.xlsx create mode 100644 media/indicadores/tareffa/Serviços_Tareffa.xlsx create mode 100644 media/indicadores/tareffa/Serviços_Tareffa_F2ttKtO.xlsx create mode 100644 media/indicadores/tareffa/Serviços_Tareffa_fWr2GDj.xlsx create mode 100644 media/indicadores/tareffa/tareffa_teste.xlsx create mode 100644 media/indicadores/tareffa/tareffa_teste_sZCMsiH.xlsx create mode 100644 media/links_ferramentas/377d52_ae05daba721b438aae0f48c39aae585bmv2.png create mode 100644 media/links_ferramentas/7070c620d7d048b477199d44f3a12f54.jpg create mode 100644 media/links_ferramentas/Asana-Logo.png create mode 100644 media/links_ferramentas/CUUUylLq_400x400.jpg create mode 100644 media/links_ferramentas/Captura_de_tela_2026-08-04_100519.png create mode 100644 media/links_ferramentas/Icones_-_Azul.png_name_20220609-29668-u9vd09.png create mode 100644 media/links_ferramentas/Serviços.png create mode 100644 media/links_ferramentas/Serviços_1.png create mode 100644 media/links_ferramentas/Serviços_2.png create mode 100644 media/links_ferramentas/Serviços_3.png create mode 100644 media/links_ferramentas/WhatsApp.svg.webp create mode 100644 media/links_ferramentas/agenda_eliz.jpg create mode 100644 media/links_ferramentas/images.png create mode 100644 media/links_ferramentas/images_1.jpg create mode 100644 media/links_ferramentas/images_1.png create mode 100644 media/links_ferramentas/images_2.jpg create mode 100644 media/links_ferramentas/images_2.png create mode 100644 media/links_ferramentas/images_3.jpg create mode 100644 media/links_ferramentas/images_3.png create mode 100644 media/links_ferramentas/images_5.jpg create mode 100644 media/links_ferramentas/logo-workmonitor-BZgtEcg-.png create mode 100644 media/links_ferramentas/logo.png create mode 100644 media/links_ferramentas/logoRHGestor.png create mode 100644 media/links_ferramentas/meet.png create mode 100644 media/links_ferramentas/sittax-inteligência-tributária-squareLogo-1750853635998.webp create mode 100644 media/planos_saude/operadora/092_-_EXTRATO_072026.csv create mode 100644 media/planos_saude/operadora/1006_-_DEMONSTRATIVO_PAGAMENTO_CPLS_1722_270720260942558922821682729471894__1_.PDF create mode 100644 media/planos_saude/operadora/1084_-_RELATORIO_DENTAL_UNI_072026_UKBwlqT.pdf create mode 100644 media/planos_saude/operadora/128_-_PLANO_DE_SAUDE_072026.csv create mode 100644 media/planos_saude/operadora/1604_-_Plano_de_Saude_072026.pdf create mode 100644 media/planos_saude/operadora/2028_-_RELATORIO_DENTAL_UNI_072026.pdf create mode 100644 media/planos_saude/operadora/626_-_coparticipacao_itamed_-_07.2026.pdf create mode 100644 media/planos_saude/operadora/Demonstrativo_Junho.2026.pdf create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_1006_COPYVIC_LOCAÇÃO_DE_EQUIPAMENTOS_LTDA_OPER_3755_FUNDACAO_DE_SAUDE_ITAIGUAPY.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_1084_LUSIA_DALA_ROSA_VOLPATO_LTDA_OPER_4723_DENTAL_UNI_-_COOPERATIVA_ODONTOLOGICA_svbbApa.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_128_CHURRASCARIA_BÚFALO_BRANCO_LTDA_OPER_5060_UNIMED_DO_ESTADO_DO_PARANA_-_FEDERACAO_ESTADUAL_DA.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_1601_LABORATORIO_DE_ANALISES_CLINICAS_OSWALDO_CRUZ_DE_MEDIANEIRA_LTDA_OPER_4709_UNIMED_DO_OESTE_DO_PARANA_-_COOPERATIVA_DE_TRABALH.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_1604_T__F_JOALHEIROS_E_ACESSÓRIOS_LTDA_-_ME_OPER_3755_FUNDACAO_DE_SAUDE_ITAIGUAPY.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_2028_LAS_WINE_BAR_LTDA_OPER_4723_DENTAL_UNI_-_COOPERATIVA_ODONTOLOGICA.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_626_MTI_SERVICOS_E_COMERCIO_EXTERIOR_LTDA_OPER_3755_FUNDACAO_DE_SAUDE_ITAIGUAPY.CSV create mode 100644 media/planos_saude/planilha_padrao/LEIAUTE_IMPORTACAO_DESPESAS_MEDICAS_EMP_92_PRESCINOTTI__CIA_LTDA._OPER_5060_UNIMED_DO_ESTADO_DO_PARANA_-_FEDERACAO_ESTADUAL_DA.CSV create mode 100644 plano.md create mode 100644 portal_api/__init__.py create mode 100644 portal_api/admin.py create mode 100644 portal_api/apps.py create mode 100644 portal_api/catalogo.py create mode 100644 portal_api/custo_contratacao/__init__.py create mode 100644 portal_api/custo_contratacao/calculo.py create mode 100644 portal_api/custo_contratacao/pdf.py create mode 100644 portal_api/custo_contratacao/tabelas.py create mode 100644 portal_api/indicadores/__init__.py create mode 100644 portal_api/indicadores/calculo.py create mode 100644 portal_api/indicadores/departamentos.py create mode 100644 portal_api/indicadores/entregas.py create mode 100644 portal_api/indicadores/leiaute.py create mode 100644 portal_api/indicadores/pipeline.py create mode 100644 portal_api/indicadores/recibo.py create mode 100644 portal_api/indicadores/tipos.py create mode 100644 portal_api/management/__init__.py create mode 100644 portal_api/management/commands/__init__.py create mode 100644 portal_api/management/commands/seed_indicador_desempenho.py create mode 100644 portal_api/management/commands/seed_portal.py create mode 100644 portal_api/migrations/0001_initial.py create mode 100644 portal_api/migrations/0002_notificacaodispensada.py create mode 100644 portal_api/migrations/0003_linkferramenta_and_more.py create mode 100644 portal_api/migrations/0004_remove_perfilacesso_gerencia_links_ferramentas.py create mode 100644 portal_api/migrations/0005_alter_linkferramenta_icone.py create mode 100644 portal_api/migrations/0006_usuario_codigo_contabit_usuario_codigo_folha_and_more.py create mode 100644 portal_api/migrations/0007_departamento_remove_usuario_departamento_and_more.py create mode 100644 portal_api/migrations/0008_linkferramentafavorito.py create mode 100644 portal_api/migrations/0009_alter_widgetusuario_options_widgetusuario_altura_and_more.py create mode 100644 portal_api/migrations/0010_alter_favorito_options_favorito_ordem.py create mode 100644 portal_api/migrations/0011_usuario_ramal.py create mode 100644 portal_api/migrations/0012_ramal_ramalausencia.py create mode 100644 portal_api/migrations/0013_remove_ramal_usuario_alter_ramal_nome.py create mode 100644 portal_api/migrations/0014_funcaotelefonia_telefoneexterno.py create mode 100644 portal_api/migrations/0015_usuario_liderados_usuario_lideranca.py create mode 100644 portal_api/migrations/0016_acessogeralsecao_acessogeral.py create mode 100644 portal_api/migrations/0017_acessogeralsecao_perfis_restritos_and_more.py create mode 100644 portal_api/migrations/0018_remove_compromissoagenda_compartilhado_com_perfil_and_more.py create mode 100644 portal_api/migrations/0019_categoriaevento_compromissoagenda_descricao_and_more.py create mode 100644 portal_api/migrations/0020_compromissoagenda_eh_evento.py create mode 100644 portal_api/migrations/0021_importacaoplanosaude_importacaoplanosaudeauditoria_and_more.py create mode 100644 portal_api/migrations/0022_importacaoplanosaudeauditoria_resolucao_manual.py create mode 100644 portal_api/migrations/0023_parametrofiscalcustocontratacao.py create mode 100644 portal_api/migrations/0024_indicadorcriterio_indicadorapuracao_and_more.py create mode 100644 portal_api/migrations/0025_indicadorapuracao_avisos.py create mode 100644 portal_api/migrations/0026_alter_indicadorapuracaocolaborador_pct_departamento_and_more.py create mode 100644 portal_api/migrations/0027_alter_indicadorapuracaoresposta_percentual_calculado.py create mode 100644 portal_api/migrations/0028_indicadorapuracaocolaborador_pct_departamento_ajustado_manualmente_and_more.py create mode 100644 portal_api/migrations/0029_alter_indicadorapuracaoempresa_options_and_more.py create mode 100644 portal_api/migrations/0030_alter_indicadorapuracaoempresa_options.py create mode 100644 portal_api/migrations/0031_indicadorapuracaocolaborador_validado.py create mode 100644 portal_api/migrations/0032_indicadorsetorapelido_and_more.py create mode 100644 portal_api/migrations/0033_indicadordepartamento_indicadordepartamentogerente_and_more.py create mode 100644 portal_api/migrations/0034_backfill_departamento_fisco_contabil.py create mode 100644 portal_api/migrations/0035_alter_indicadorcriterio_departamento_and_more.py create mode 100644 portal_api/migrations/0036_alter_importacaoplanosaude_arquivo_operadora_and_more.py create mode 100644 portal_api/migrations/0037_regracusteioplanosaude.py create mode 100644 portal_api/migrations/__init__.py create mode 100644 portal_api/models.py create mode 100644 portal_api/permissions.py create mode 100644 portal_api/planos_saude/__init__.py create mode 100644 portal_api/planos_saude/leiaute_sistema.py create mode 100644 portal_api/planos_saude/matcher.py create mode 100644 portal_api/planos_saude/modelos.py create mode 100644 portal_api/planos_saude/operadoras/__init__.py create mode 100644 portal_api/planos_saude/operadoras/amil/__init__.py create mode 100644 portal_api/planos_saude/operadoras/amil/odonto_mensalidade.py create mode 100644 portal_api/planos_saude/operadoras/base.py create mode 100644 portal_api/planos_saude/operadoras/dental_uni/__init__.py create mode 100644 portal_api/planos_saude/operadoras/dental_uni/odonto_mensalidade.py create mode 100644 portal_api/planos_saude/operadoras/itamed/__init__.py create mode 100644 portal_api/planos_saude/operadoras/itamed/saude.py create mode 100644 portal_api/planos_saude/operadoras/unimed/__init__.py create mode 100644 portal_api/planos_saude/operadoras/unimed/saude.py create mode 100644 portal_api/planos_saude/operadoras/unimed_oeste_pr/__init__.py create mode 100644 portal_api/planos_saude/operadoras/unimed_oeste_pr/saude.py create mode 100644 portal_api/planos_saude/pipeline.py create mode 100644 portal_api/serializers.py create mode 100644 portal_api/urls.py create mode 100644 portal_api/views.py create mode 100644 projects/Indicadores/FISCO CONTABIL 0726 OK.ods create mode 100644 projects/Indicadores/Honorários Por Cliente.xlsx create mode 100644 projects/Indicadores/Modelo de Recibo.pdf create mode 100644 projects/Indicadores/Serviços Tareffa.xlsx create mode 100644 projects/planilha de custo/1972 - CUSTO EMPREGADO SALÁRIO (8.500,00).xlsx create mode 100644 projects/project/auditoria/AUDITORIA_EMP_218_AMIL_3758_082026.csv create mode 100644 projects/project/auditoria/AUDITORIA_amil_202608.csv create mode 100644 projects/project/auditoria/AUDITORIA_unimed_202608.csv create mode 100644 projects/project/core/auditoria.py create mode 100644 projects/project/core/leiaute_sistema.py create mode 100644 projects/project/core/matcher.py create mode 100644 projects/project/core/modelos.py create mode 100644 projects/project/entrada/amil_odonto_202608.pdf create mode 100644 projects/project/entrada/planilha_padrao_218_3758.csv create mode 100644 projects/project/entrada/planilha_padrao_218_5060.csv create mode 100644 projects/project/entrada/unimed_202608.csv create mode 100644 projects/project/entrada/unimed_202608_original.csv create mode 100644 projects/project/main.py create mode 100644 projects/project/operadoras/amil/odonto_mensalidade.py create mode 100644 projects/project/operadoras/base.py create mode 100644 projects/project/operadoras/unimed/saude.py create mode 100644 projects/project/saida/amil_202608/mensalidade.csv create mode 100644 projects/project/saida/mensalidade/EMP_218_AMIL_3758_082026.csv create mode 100644 projects/project/saida/unimed_202608/coparticipacao.csv create mode 100644 projects/project/saida/unimed_202608/mensalidade.csv create mode 100644 requirements.txt create mode 100644 static/css/acessos-gerais.css create mode 100644 static/css/base.css create mode 100644 static/css/calendario.css create mode 100644 static/css/components.css create mode 100644 static/css/custo-contratacao.css create mode 100644 static/css/importacao-plano-saude.css create mode 100644 static/css/indicador-desempenho.css create mode 100644 static/css/layout.css create mode 100644 static/css/links-ferramentas.css create mode 100644 static/css/login.css create mode 100644 static/css/perfis-acesso.css create mode 100644 static/css/ramais-lookup.css create mode 100644 static/css/ramais.css create mode 100644 static/css/tokens.css create mode 100644 static/css/widgets.css create mode 100644 static/img/favicon.png create mode 100644 static/img/logo-branco.png create mode 100644 static/img/logo-mono.png create mode 100644 static/img/logo.png create mode 100644 static/js/access.js create mode 100644 static/js/account.js create mode 100644 static/js/acessos-gerais.js create mode 100644 static/js/api.js create mode 100644 static/js/auth.js create mode 100644 static/js/calendar-individual.js create mode 100644 static/js/custo-contratacao.js create mode 100644 static/js/events.js create mode 100644 static/js/favorites.js create mode 100644 static/js/importacao-plano-saude.js create mode 100644 static/js/indicador-desempenho.js create mode 100644 static/js/links-ferramentas.js create mode 100644 static/js/notifications.js create mode 100644 static/js/profiles.js create mode 100644 static/js/ramais-lookup.js create mode 100644 static/js/ramais.js create mode 100644 static/js/search.js create mode 100644 static/js/sidebar.js create mode 100644 static/js/theme.js create mode 100644 static/js/users-admin.js create mode 100644 static/js/widgets.js create mode 100644 templates/acessos-gerais.html create mode 100644 templates/calendario-individual.html create mode 100644 templates/custo-contratacao.html create mode 100644 templates/importacao-plano-saude.html create mode 100644 templates/index.html create mode 100644 templates/indicador-desempenho.html create mode 100644 templates/links-ferramentas.html create mode 100644 templates/perfis-acesso.html create mode 100644 templates/portal.html create mode 100644 templates/ramais.html create mode 100644 templates/usuarios.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d793fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# Ambiente virtual +.venv/ +venv/ +env/ + +# Variáveis de ambiente / segredos +.env +.env.* +!.env.example + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python + +# Django +staticfiles/ +db.sqlite3 +db.sqlite3-journal +*.log +local_settings.py + +# Distribuição / empacotamento +build/ +dist/ +*.egg-info/ +.eggs/ + +# Ferramentas de teste/cobertura +.coverage +.coverage.* +htmlcov/ +.pytest_cache/ +.tox/ + +# Editores / IDEs +.vscode/ +.idea/ +*.swp +*.swo + +# Sistema operacional +.DS_Store +Thumbs.db +desktop.ini + +# Configuração local do Claude Code +.claude/settings.local.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b826065 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,581 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Contexto do projeto + +Portal interno da De Paula Contadores ("Portal De Paula"). `Portal/` **é** o próprio projeto Django — **Python 3.13 + Django 6.0 + Django REST Framework + PostgreSQL 14** — organizado no padrão convencional de um projeto Django (`manage.py` na raiz, app `portal_api/`, `templates/`, `static/`), servindo tanto a API (`/api/...`) quanto o frontend HTML/CSS/JS (mesma origem — ver "Arquitetura" abaixo). + +Até uma rodada anterior, todo o estado (sessão, usuários, perfis de acesso, favoritos, widgets, compromissos) vivia no `localStorage` do navegador — não havia backend. Isso mudou: o usuário decidiu a stack real e pediu a migração completa desses dados para o banco. Ver `plano.md` para o histórico de decisões rodada a rodada; consultar antes de mudar algo que pareça uma limitação (ex.: ausência de teste automatizado, remoção do calendário interno antigo) sem confirmar se foi decisão deliberada. + +**O que continua só no `localStorage`**: apenas a preferência de tema (claro/escuro e cor do tema) — é preferência de navegador, não dado de negócio, e ficou fora do escopo da migração por decisão explícita do usuário. + +## Como rodar / testar localmente + +### Backend (obrigatório para qualquer teste agora — o frontend não funciona mais sozinho via `file://`/`http.server`) + +``` +cd Portal +python -m venv .venv +.venv\Scripts\activate # Windows +pip install -r requirements.txt +``` + +Configurar as variáveis de ambiente do Postgres 14 antes de migrar — `config/settings.py` chama `load_dotenv(BASE_DIR / ".env")` e lê `DB_NAME`, `DB_USER`, `DB_PASSWORD`, `DB_HOST`, `DB_PORT` (o arquivo `.env` já existe na raiz de `Portal/`): + +``` +python manage.py makemigrations portal_api +python manage.py migrate +python manage.py seed_portal # recria os 8 perfis + usuários gabriel/bruno +python manage.py runserver +``` + +Abrir `http://localhost:8000/` — o Django serve `index.html` e as demais páginas do frontend diretamente (ver `config/urls.py`), então **não há mais um segundo servidor** (`python -m http.server`) para o frontend.Vamos desenvolver outra + +Contas de demonstração (criadas por `seed_portal`, senha via `set_password` do Django — não é mais texto puro): + +- `gabriel` / `gabriel` — perfil "Integração e Inovação" (código 8), o único com `gerencia_permissoes=True` (acesso total + gerencia Perfis de Acesso/Usuários) e o único com os `*-editar` de `links-ferramentas` (cartões e Acessos Gerais) e de `ramais` `True` (único perfil que pode reordenar/incluir/remover cartões em Links & Ferramentas, criar/editar seções e acessos em Acessos Gerais, e adicionar/editar ramal/criar ausência em Ramais, até que outro perfil seja liberado em Perfis de Acesso — ver "Modelo de permissões" abaixo). +- `bruno` / `bruno` — sem perfil vinculado, usado para testar o estado "sem acesso". + +Não há suíte de testes, lint ou build configurados neste projeto. + +### Ambiente de desenvolvimento assistido + +O `.venv` do projeto já tem Python 3.13 + Django 6.0 + DRF + psycopg + python-dotenv + Pillow + nh3 + reportlab + openpyxl + holidays instalados, e há um Postgres local acessível via `.env` — dá pra rodar `makemigrations`/`migrate`/`seed_portal`/`runserver` normalmente por aqui usando `.venv\Scripts\python.exe manage.py ...` (ou ativando o venv primeiro). Isso deixou de ser uma limitação a partir da rodada em que o ambiente ganhou essas ferramentas (ver `plano.md`) — não assumir mais que só é possível revisar o backend estaticamente. + +## Arquitetura + +### Estrutura de pastas (padrão Django) + +``` +Portal/ +├── manage.py +├── requirements.txt +├── .env +├── config/ # settings.py, urls.py, wsgi.py, asgi.py — pacote de configuração do projeto +├── portal_api/ # único app Django (models, serializers, views, admin, migrations, seed) +├── templates/ # as 8 páginas HTML (TEMPLATES[0]["DIRS"] em settings.py aponta pra cá) +├── static/ # css/, js/, img/ — STATICFILES_DIRS em settings.py aponta pra cá +├── media/ # upload de usuário (hoje só ícones de LinkFerramenta) — MEDIA_ROOT em settings.py +├── CLAUDE.md +└── plano.md +``` + +### Logos em `static/img/` + +`static/img/` tem três variantes do logo "D De Paula Contadores" (D em degradê dourado/marrom + texto), todas PNG com fundo transparente: + +- `logo.png` — original, texto **preto**. Serve como fonte pra gerar as outras variantes e também é usada diretamente em `index.html` (login) quando `data-theme="light"` — o card do login usa `--bg-surface` (claro nesse tema), e o texto branco de `logo-branco.png` ficava ilegível contra ele. +- `logo-branco.png` — usada em `index.html` no login quando `data-theme="dark"` (default) e sempre no `sidebar__brand` dos 5 shells (a sidebar usa fundo frozen sempre escuro, independente do tema — ver "Sidebar" em `layout.css` — então não precisa alternar) — mesmo D colorido de `logo.png`, mas com o texto recolorido pra branco. Gerada programaticamente a partir de `logo.png` (script Python com Pillow: qualquer pixel opaco quase-neutro/escuro — `max(r,g,b) < 70` e `spread(r,g,b) < 12` — virou branco; o D nunca entra nesse filtro porque mesmo na sombra mais escura do degradê ele mantém um matiz quente nitidamente não-neutro). Se o logo oficial mudar, regerar `logo-branco.png` a partir do novo `logo.png` com o mesmo filtro, não editar à mão. +- A troca da logo do login por tema é feita em `theme.js` (`pidSyncLoginLogo()`): o `` de `index.html` carrega os dois caminhos resolvidos por `{% static %}` em `data-logo-dark`/`data-logo-light`, e o JS só troca o `src` conforme `data-theme` atual — chamado no load e no evento `pid:theme-changed`. +- `logo-mono.png` — versão totalmente monocromática (D **e** texto em branco/cinza claro). Não usada em nenhum template hoje; existe como variante alternativa (útil se algum dia precisar de um logo "chapado" sem o dourado do D). +- `favicon.png` — só o D (sem o texto "De Paula Contadores"), quadrado, 192×192, usado como ícone da aba do navegador (`` no `` das 7 páginas). Gerado a partir de `logo.png` com o mesmo filtro de `logo-branco.png` (pixel opaco quase-neutro/escuro — `max(r,g,b) < 70` e `spread(r,g,b) < 12` — é texto, não o D), mas em vez de recolorir esses pixels pra branco, eles são apagados (`alpha = 0`); o resultado é recortado pelo bounding box do que sobrou opaco e centralizado num canvas quadrado transparente (o D é mais alto que largo). Se o logo oficial mudar, regerar a partir do novo `logo.png` com o mesmo processo, não editar à mão. + +Tamanho: `.sidebar__logo` é `width: 200px; height: auto` (era 56×56 fixo, esmagava o logo — a arte é bem mais larga que alta, ~1.41:1 — e ficava pequena demais); encolhe pra `44px` quando a sidebar colapsa (desktop `.is-collapsed` e o breakpoint mobile), senão o logo vaza da faixa de 76px. + +### Backend serve o frontend (mesma origem) + +`config/urls.py` registra `path("api/", include("portal_api.urls"))` e, para cada página HTML do frontend (`index.html`, `portal.html`, `perfis-acesso.html`, `usuarios.html`, `calendario-individual.html`, `links-ferramentas.html`, `acessos-gerais.html`, `ramais.html`), uma rota `TemplateView` que resolve o arquivo em `templates/`. Os estáticos (`static/css`, `static/js`, `static/img`) são servidos por `django.contrib.staticfiles` automaticamente em `DEBUG` (via `STATICFILES_DIRS`) — não há mais nenhum `re_path`/`static_serve` manual em `urls.py`. Cada template usa `{% load static %}` + `{% static 'css/tokens.css' %}` (nunca um caminho hardcoded tipo `assets/css/...`, que não existe mais). Essa escolha (Django servindo o próprio frontend) existe para evitar CORS/cookie cross-origin: autenticação é por **sessão/cookie do Django**, então frontend e API precisam estar na mesma origem. + +Em produção, rodar `python manage.py collectstatic` (junta tudo em `STATIC_ROOT = BASE_DIR / "staticfiles"`) e servir esse diretório via whitenoise/nginx — `django.contrib.staticfiles` só serve automaticamente quando `DEBUG=True`. Uploads de usuário (ícones de `LinkFerramenta`) são um mecanismo separado: `MEDIA_URL`/`MEDIA_ROOT` em `settings.py`, servidos por `config/urls.py` via `static()` só quando `DEBUG=True` (em produção, servir `media/` também por whitenoise/nginx, igual ao `STATIC_ROOT`). + +### Apps Django + +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). | +| `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). | +| `views.py` | `login_view`/`logout_view`/`csrf_view` (auth por sessão), `me_view` (usuário + `permissoes_efetivas` já unidas no servidor + `lideranca`/`liderados`), `trocar_senha_view`, `usuarios_resumo_view`, `meus_liderados_view` (ver seção "Liderança"), `departamentos_resumo_view` (ver "Ramais"), `catalogo_view`, e os `ModelViewSet` de perfis/departamentos/usuários/compromissos/favoritos/widgets/notificações dispensadas/links e ferramentas/favoritos de links e ferramentas/seções e linhas de Acessos Gerais/ramais/ausências de ramal/importações de plano de saúde e suas linhas. | +| `admin.py` | Django admin básico para todos os models (uso interno, não é a UI do portal). | +| `management/commands/seed_portal.py` | Recria os 8 perfis padrão + `gabriel`/`bruno` + as 13 linhas de `FuncaoTelefonia` + o seed de `CategoriaEvento`. | +| `management/commands/seed_indicador_desempenho.py` | Popula o primeiro histórico do Indicador de Desempenho (7 `IndicadorCriterio` + 5 `IndicadorPercentualTipo`, idempotente) com os valores da planilha antiga — ver seção "Indicador de Desempenho" abaixo. | +| `planos_saude/` | Pacote Python puro (sem ORM) com o pipeline de extração/casamento de "Importação de Plano de Saúde", portado de `projects/project/` — ver seção própria abaixo. | +| `custo_contratacao/` | Pacote Python puro (sem ORM) da ferramenta "Simulação de Custo de Contratação" (Geradoc) — `tabelas.py` (seed/default das faixas de INSS/IRRF, hoje editáveis via `ParametroFiscalCustoContratacao`), `calculo.py` (`ParametrosFiscais` dataclass + `calcula_custo_empregado`), `pdf.py` (`gera_pdf_simulacao`, via `reportlab`). Ver seção própria abaixo. | +| `indicadores/` | Pacote Python puro (sem ORM) da ferramenta "Indicador de Desempenho" (Geradoc) — `tipos.py` (deriva o tipo de colaborador por empresa via Tareffa), `leiaute.py` (leitura das planilhas Tareffa/Honorários via `openpyxl`), `pipeline.py` (orquestração, `processa_apuracao`), `entregas.py` (cálculo dos 3 critérios automáticos), `calculo.py` (composição dos percentuais Individual/Grupo/Departamento e valores em R$), `recibo.py` (PDF do recibo por colaborador, via `reportlab`). Ver seção própria abaixo. | + +### API (sessão + CSRF, não token) + +| Endpoint | Método | Uso | +|---|---|---| +| `/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/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/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) | +| `/api/compromissos/`, `/api/compromissos/{id}/` | GET/POST/PATCH/DELETE | GET já retorna só o que o usuário logado pode ver (próprios + `visibilidade="todos"` + `visibilidade="departamento"` com departamento em comum); campo `notificar_em` (calculado, ver "Calendário Individual e Widgets") indica quando o lembrete passa a valer; criar/editar com `visibilidade` em `departamento`/`todos` (inclusive todo `eh_evento=True`, que força `visibilidade="todos"`) exige `apps["calendario-individual-criar-evento"]` (ver "Eventos Corporativos" abaixo) | +| `/api/categorias-evento/`, `/api/categorias-evento/{id}/` | GET/POST/PATCH/DELETE | cadastro de categorias de evento (`nome`+`cor`) usado pelo Calendário Individual; GET livre a qualquer autenticado, escrita exige `apps["calendario-individual-criar-evento"]` — ver "Eventos Corporativos" abaixo | +| `/api/favoritos/`, `/api/favoritos/{app_id}/` | GET/POST/PATCH/DELETE | chave natural é `app_id`, não um id numérico; `ordem` é gravável via PATCH (drag-and-drop na grade de favoritos, ver "Favoritos" abaixo) | +| `/api/widgets/`, `/api/widgets/{tipo}/` | GET/POST/PATCH/DELETE | chave natural é `tipo`; `ordem` (reordenar por drag-and-drop) e `largura`/`altura` em px (redimensionamento) também são graváveis via PATCH — ver "Calendário Individual e Widgets" abaixo | +| `/api/notificacoes-dispensadas/`, `/api/notificacoes-dispensadas/{notif_id}/` | GET/POST/DELETE | chave natural é `notif_id` (ex.: `"tool-widgets"`, `"event-42"`); `notifications.js` usa GET pra filtrar o que já foi dispensado e POST a cada X/"Limpar tudo" | +| `/api/links-ferramentas/`, `/api/links-ferramentas/{id}/` | GET/POST/PATCH/DELETE | lista **compartilhada** (não por usuário); leitura exige `apps["links-ferramentas-visualizar"]` e escrita exige `apps["links-ferramentas-editar"]` em `permissoes["links-ferramentas"]` (`PermissaoApp`, gate por método em `get_permissions()` — ver "Modelo de permissões" abaixo); POST é `multipart/form-data` (aceita upload de `icone`); `ordem` sempre é atribuída pelo servidor na criação (ignora o que vier no payload), reordenar é PATCH trocando o `ordem` de dois itens | +| `/api/links-ferramentas-favoritos/`, `/api/links-ferramentas-favoritos/{link_id}/` | GET/POST/DELETE | favorito **por usuário** de um cartão (chave natural é `link_id`, o id do `LinkFerramenta` — mesmo padrão de `app_id`/`notif_id`); exige só `apps["links-ferramentas-visualizar"]` (favoritar não precisa de editar); só afeta a ordem de exibição em Links & Ferramentas e o widget "Links Favoritos", nunca o `ordem` compartilhado (ver seção "Links & Ferramentas" abaixo) | +| `/api/acessos-gerais-secoes/`, `/api/acessos-gerais-secoes/{id}/` | GET/POST/PATCH/DELETE | seções do cadastro "Acessos Gerais" (aplicação dentro da seção Links & Ferramentas); leitura exige `apps["acessos-gerais-visualizar"]`, escrita exige `apps["acessos-gerais-editar"]`; excluir uma seção também exclui (`CASCADE`) os acessos dela; GET só lista seções sem `perfis_restritos` ou com interseção com os perfis do usuário (ver "Acessos Gerais" abaixo) | +| `/api/acessos-gerais/`, `/api/acessos-gerais/{id}/` | GET/POST/PATCH/DELETE | linhas (acessos/logins) dentro de uma seção; mesma permissão de `acessos-gerais-secoes`; `ordem` é escopada por `secao` (servidor calcula `max(ordem)` só entre as linhas da mesma seção) — ver seção "Acessos Gerais" abaixo | +| `/api/ramais/` | GET | diretório **mesclado**: todo usuário ativo (linha montada do cadastro, sem precisar de nenhum registro extra) + linhas avulsas de `Ramal`; leitura exige `apps.visualizar` — ver seção "Ramais" abaixo | +| `/api/ramais/`, `/api/ramais/{id}/` | POST/PATCH/DELETE | CRUD só das linhas avulsas (`Ramal`, sem `Usuario` por trás); escrita exige `apps.editar` | +| `/api/ramais/usuarios/` | GET | lista enxuta (`id`/`nome`) de usuários ativos pra alimentar o `` do formulário | +| `/api/importacoes-plano-saude/{id}/gerar/` | POST | monta o CSV (ou ZIP, se mais de um tipo de lançamento) a partir das linhas já revisadas/editadas e devolve como download binário; marca a importação como `concluida` | +| `/api/importacoes-plano-saude-linhas/{id}/` | GET/PATCH | edição de uma linha da revisão (todos os campos, não só valores); mesma permissão da importação, sem conceito de "dono" | +| `/api/regras-custeio-plano-saude/`, `/api/regras-custeio-plano-saude/{id}/` | GET/POST/PATCH/DELETE | banco de regras de custeio salvas (`nome`+`operadora`+`tipos_lancamento`+`custeio_por_tipo`+`observacoes`, ver "Regras de custeio salvas" abaixo) — mesma permissão de toggle único da ferramenta; lista compartilhada, sem "dono" | +| `/api/simulacao-custo-contratacao/gerar/` | POST | calcula (`portal_api.custo_contratacao.calculo.calcula_custo_empregado`) e devolve o PDF direto na resposta (`application/pdf`, sem persistir nada); `PermissaoApp`-like check manual via `permissao_app("geradoc", "simulacao-custo-contratacao")` — ver seção própria abaixo | +| `/api/parametros-fiscais-custo-contratacao/` | GET/PATCH | tabelas de INSS/IRRF + parâmetros da Lei 15.270/2025 usados pela simulação (`ParametroFiscalCustoContratacao`, singleton `pk=1`); mesma permissão da simulação, sem par visualizar/editar dedicado | +| `/api/indicadores-percentuais-tipo/` | GET/POST/DELETE | histórico de percentuais individual/grupo/departamento por tipo de colaborador (`IndicadorPercentualTipo`) — nunca editado in-place, só criado com `vigente_desde` novo; mesma permissão de toggle único `apps["indicador-desempenho"]` em `permissoes["geradoc"]` | +| `/api/indicadores-criterios/`, `/api/indicadores-criterios/{id}/` | GET/POST/PATCH/DELETE | CRUD do cadastro genérico de critérios (`IndicadorCriterio`) — nome/grupo/peso/período/papel/cálculo automático livres, editável pelo RH | +| `/api/indicadores-apuracoes/`, `/api/indicadores-apuracoes/{id}/` | GET/POST/DELETE | apuração mensal (`IndicadorApuracao`); POST é multipart (2 planilhas) e roda `indicadores.pipeline.processa_apuracao()` de forma síncrona dentro de um `transaction.atomic()`, persistindo colaboradores/empresas/respostas já calculados; DELETE também apaga os 2 arquivos de `MEDIA_ROOT` | +| `/api/indicadores-apuracoes/{id}/gerar/` | POST | gera um ZIP com um PDF de recibo por colaborador (`indicadores.recibo.gera_pdf_recibo`), a partir do que já está salvo (não reprocessa as planilhas); `colaborador_ids` opcional no corpo restringe a geração a só esses colaboradores (modal "Gerar Recibos" — um colaborador só, alguns específicos, por departamento ou todos); marca a apuração como `concluida` só quando a seleção cobre **todos** os colaboradores | +| `/api/indicadores-apuracoes/{id}/ajustar-grupo/`, `/recalcular-grupo/` | POST | ajusta (ou reverte) o `pct_grupo` de **todos** os colaboradores de um mesmo `gerente` na apuração de uma vez — "cada gerente representa um grupo" (ver seção própria abaixo) | +| `/api/indicadores-apuracoes/{id}/ajustar-departamento/`, `/recalcular-departamento/` | POST | idem, mas aplica a **todos** os colaboradores do `departamento` (id de um `IndicadorDepartamento`) informado no corpo (`{departamento, pct_departamento}`/`{departamento}`) — cada departamento tem sua própria meta de Departamento, ver "Departamento organizacional" abaixo | +| `/api/indicadores-departamentos/`, `/api/indicadores-departamentos/{id}/` | GET/POST/PATCH/DELETE | cadastro de departamentos (`IndicadorDepartamento`, nome/ativo) — mesma permissão de toggle único do Indicador de Desempenho, ver "Departamento organizacional" abaixo | +| `/api/indicadores-departamentos-gerentes/`, `/api/indicadores-departamentos-gerentes/{id}/` | GET/POST/PATCH/DELETE | relação gerente→departamento (`IndicadorDepartamentoGerente`, `nome_gerente` único) — mesma permissão, ver "Departamento organizacional" abaixo | +| `/api/indicadores-apuracoes/{id}/ajustar-honorario-empresa/` | POST | `{codigo_empresa, honorario}` — preenche (ou corrige) o honorário de uma empresa com `honorario_nao_encontrado=True` ou `honorario_ajustado_manualmente=True` de uma vez pra **todos** os colaboradores desta apuração que a têm (mesmo código), recalculando cada um (ver "Empresas sem Honorário"/"Empresas Ajustadas Manualmente" abaixo) | +| `/api/indicadores-apuracoes-colaboradores/{id}/` | GET/PATCH | ajuste manual do `pct_individual` de um colaborador (`pct_individual_ajustado_manualmente=True`); recalcula `valor_total` via `indicadores.calculo.recalcula_colaborador` | +| `/api/indicadores-apuracoes-colaboradores/{id}/recalcular/` | POST | reverte `pct_individual` pro modo automático (limpa o ajuste manual) e recalcula | +| `/api/indicadores-apuracoes-colaboradores/{id}/marcar-validado/` | POST | `{validado}` — checklist de revisão do RH, só grava o campo, sem recalcular nada (ver "Checklist de revisão do RH" abaixo) | +| `/api/indicadores-apuracoes-empresas/{id}/trocar-responsavel/` | POST | `{colaborador_id}` — reatribui essa linha (empresa+tipo) pra outro colaborador da mesma apuração, recalculando os dois (ver "Corrigir Responsável" abaixo) | +| `/api/indicadores-apuracoes-empresas/{id}/` | GET/PATCH | preenchimento manual do `honorario` de uma empresa com `honorario_nao_encontrado=True` (código não casou com a planilha de Honorários Por Cliente); zera essa flag e recalcula o colaborador | +| `/api/indicadores-apuracoes-respostas/{id}/` | GET/PATCH | edição de uma resposta de critério (SIM/NÃO/NÃO FAZ/NÃO SE APLICA) já existente; recalcula o colaborador | +| `/api/indicadores-apuracoes-respostas/aplicar-em-lote/` | POST | `{resposta_ids, valor}` — aplica o mesmo valor a várias respostas de uma vez (seleção múltipla da tela de revisão), recalculando todos os colaboradores afetados | + +### Frontend consumindo a API + +`static/js/api.js` é a base de tudo: `pidApiRequest(path, options)` faz `fetch` com `credentials:"include"`, injeta `X-CSRFToken` (lendo o cookie `csrftoken`, buscando-o via `/api/auth/csrf/` primeiro se ainda não existir) em métodos não seguros, e redireciona pra `index.html` em 401 por padrão (`redirectOn401: false` para os poucos casos onde 401 é esperado, como o próprio login). + +`access.js` expõe `pidGetMe()` — chamada única e **cacheada por página** (`pidMePromise`) para `GET /api/me/`. Cada arquivo controlador (`account.js`, `favorites.js`, `widgets.js`, `profiles.js`, `users-admin.js`, `calendar-individual.js`, `links-ferramentas.js`, `acessos-gerais.js`, `ramais-lookup.js`) chama `pidGetMe()` no início do seu próprio `DOMContentLoaded`, mas como todos rodam antes do primeiro `await` resolver, a promise cacheada garante **uma única requisição de rede** por carregamento de página, não uma por arquivo. + +`pidApiRequest` (em `api.js`) detecta `body instanceof FormData` e, nesse caso, **não** faz `JSON.stringify` nem define `Content-Type` manualmente — deixa o browser montar o `multipart/form-data` com o boundary certo. Usado pelo upload de `icone` em Links & Ferramentas e pelos dois arquivos anexados em "Nova Importação" de Plano de Saúde; todo o resto da API é JSON puro. A única resposta binária da API (`/importacoes-plano-saude/{id}/gerar/`, que devolve CSV/ZIP) não passa por `pidApiRequest` — usa um `fetch` manual dedicado (ver seção "Importação de Plano de Saúde"). + +`pidApplyAccessVisibility` não recalcula mais união de permissões no cliente — usa `me.permissoes_efetivas`, já unida no backend (`permissoes_efetivas()` em `views.py`). + +## Páginas + +| Página | Papel | +|---|---| +| `index.html` | Login. POST `/api/auth/login/`. | +| `portal.html` | Shell principal: busca de aplicações, grade de favoritos, seção de Widgets. | +| `calendario-individual.html` | Agenda pessoal: grade mensal + modal de criar/editar compromisso. | +| `perfis-acesso.html` | CRUD de perfis de acesso (lista + edição com abas Permissões/Usuários do Escritório). | +| `usuarios.html` | CRUD de contas de usuário (lista + edição com checklist de perfis). | +| `links-ferramentas.html` | Grade de cartões de atalho para ferramentas externas; reordenar/incluir/remover só com `apps["links-ferramentas-editar"]` (ver seção própria abaixo). | +| `acessos-gerais.html` | Cadastro de acessos/logins compartilhados organizados em seções e linhas, com popup de detalhes; criar/editar/excluir seções e linhas só com `apps["acessos-gerais-editar"]` (ver seção "Acessos Gerais" abaixo). | +| `ramais.html` | Diretório de ramais internos, filtros por nome/departamento; adicionar/editar ramal, criar ausência e excluir só com `apps.editar` em `ramais` (ver seção "Ramais" abaixo). | +| `importacao-plano-saude.html` | Ferramenta de Utilitários: histórico + nova importação (upload) + revisão/geração do arquivo de lançamento de plano de saúde (ver seção "Importação de Plano de Saúde" abaixo). | +| `custo-contratacao.html` | Ferramenta de Geradoc: formulário de simulação de custo de contratação (Empregado CLT) + painel colapsável de parâmetros fiscais, gera um PDF (ver seção "Simulação de Custo de Contratação" abaixo). | +| `indicador-desempenho.html` | Ferramenta de Geradoc: histórico de apurações + nova apuração (upload das 2 planilhas) + cadastro de critérios/percentuais + revisão/geração dos recibos em PDF do Indicador de Desempenho do Fiscontábil (ver seção própria abaixo). | + +O item "Calendário De Paula" no menu **não é uma página local** — é um `` (continua favoritável, já que ainda é um `` — ver "Favoritos" abaixo) cujo clique é interceptado em `sidebar.js` (`PID_CALENDARIO_DEPAULA_URL`) pra abrir `https://depaula-tvcorporativa.lovable.app/calendario` num modal com ` + + + + + + + + + + + + + + + diff --git a/templates/calendario-individual.html b/templates/calendario-individual.html new file mode 100644 index 0000000..0787e73 --- /dev/null +++ b/templates/calendario-individual.html @@ -0,0 +1,604 @@ +{% load static %} + + + + + + Portal De Paula — Calendário Individual + + + + + + + + + + +
+ + +
+
+ +

Calendário Individual

+ +
+ + + + +
+ + +
+ + +
+
+ +
+
+
+ + + +
+

+
+ + + + + +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/custo-contratacao.html b/templates/custo-contratacao.html new file mode 100644 index 0000000..7d23ac4 --- /dev/null +++ b/templates/custo-contratacao.html @@ -0,0 +1,589 @@ +{% load static %} + + + + + + Portal De Paula — Simulação de Custo de Contratação + + + + + + + + + +
+ + +
+
+ +

Simulação de Custo de Contratação

+ +
+ + +
+ + +
+ + +
+
+ +
+ + +
+
+
+

Simulação de Custo de Contratação

+

Regime Empregado CLT. Preencha os dados abaixo e gere um PDF com o custo total para o empregador e o valor líquido recebido pelo empregado.

+
+
+ +
+ + +
+ +
+ + + + +
+

Remuneração

+ + + +

Itens adicionais somam à base de cálculo do INSS, FGTS, 13º, férias e IRRF, junto com o salário.

+ + + + + +
Outro item de remuneraçãoValor (R$)
+ +
+ +
+

Encargos

+ +
+ +
+

Benefícios

+

Custo do empregador — entram no Custo Total Empresa como custo variável, sem afetar o valor líquido do empregado.

+ + + + + + + + +
Outro benefícioValor (R$)
+ +
+ +
+

Descontos

+

Descontados direto do empregado — reduzem o valor líquido, sem afetar o custo total para o empregador. Aceitam valor em reais ou percentual do salário contratual (ex.: "6%").

+ + + + + + + +
Outro descontoValor (R$ ou %)
+ +
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/templates/importacao-plano-saude.html b/templates/importacao-plano-saude.html new file mode 100644 index 0000000..1602a8a --- /dev/null +++ b/templates/importacao-plano-saude.html @@ -0,0 +1,629 @@ +{% load static %} + + + + + + Portal De Paula — Importação de Plano de Saúde + + + + + + + + + + +
+ + +
+
+ +

Importação de Plano de Saúde

+ +
+ + +
+ + +
+ + +
+
+ +
+ + +
+
+
+
+

Importação de Plano de Saúde

+

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

+
+ +
+ + + +
+ + + + + + + + + + + + + + +
Cód. Empresa ↕Operadora ↕Tipos ↕Status ↕Criado por ↕Data ↕
+
+ +
+

+
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..fbd9624 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,78 @@ +{% load static %} + + + + + + Portal De Paula — Login + + + + + + + + + + +
+ +
+ + + + + diff --git a/templates/indicador-desempenho.html b/templates/indicador-desempenho.html new file mode 100644 index 0000000..32effdb --- /dev/null +++ b/templates/indicador-desempenho.html @@ -0,0 +1,843 @@ +{% load static %} + + + + + + Portal De Paula — Indicador de Desempenho + + + + + + + + + + +
+ + +
+
+ +

Indicador de Desempenho

+ +
+ + +
+ + +
+ + +
+
+ +
+ + +
+
+
+
+

Indicador de Desempenho

+

Apuração mensal do indicador do Fiscontábil a partir das planilhas de Serviços Tareffa e Honorários Por Cliente.

+
+
+ + +
+
+ +
+ + + + + + + + + + + + +
CompetênciaColaboradoresStatusCriado porData
+
+ +
+ + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/links-ferramentas.html b/templates/links-ferramentas.html new file mode 100644 index 0000000..c282b87 --- /dev/null +++ b/templates/links-ferramentas.html @@ -0,0 +1,454 @@ +{% load static %} + + + + + + Portal De Paula — Links & Ferramentas + + + + + + + + + + +
+ + +
+
+ +

Links & Ferramentas

+ +
+ + + + +
+ + +
+ + +
+
+ +
+ + +
+
+
+

Links & Ferramentas

+

Acesso rápido às ferramentas e sistemas usados no dia a dia.

+
+ +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/perfis-acesso.html b/templates/perfis-acesso.html new file mode 100644 index 0000000..3ba2df1 --- /dev/null +++ b/templates/perfis-acesso.html @@ -0,0 +1,467 @@ +{% load static %} + + + + + + Portal De Paula — Perfis de Acesso + + + + + + + + + +
+ + +
+
+ +

Administração

+ +
+ + +
+ + +
+ + +
+
+ +
+
+
+

Perfis de Acesso

+
+ + + +
+
+ +
+ + + + + + + + + +
CódigoPerfil de Acesso
+ +
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/portal.html b/templates/portal.html new file mode 100644 index 0000000..213394f --- /dev/null +++ b/templates/portal.html @@ -0,0 +1,453 @@ +{% load static %} + + + + + + Portal De Paula + + + + + + + + + + + + + +
+ + +
+
+ +

Portal De Paula

+ +
+ + + + +
+ + +
+ + +
+
+ +
+ + +
+ + +
+ + +
+ +
+
+

Widgets

+ +
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/ramais.html b/templates/ramais.html new file mode 100644 index 0000000..5ddbe5a --- /dev/null +++ b/templates/ramais.html @@ -0,0 +1,668 @@ +{% load static %} + + + + + + Portal De Paula — Ramais + + + + + + + + + + +
+ + +
+
+ +

Ramais

+ +
+ + +
+ + +
+ + +
+
+ +
+ + +
+
+
+

Ramais

+

Diretório de ramais internos da De Paula Contadores.

+
+
+ +
+ + + + + +
+ +
+
+
+ + +
+
+ + +
+
+ +
+ + + +
+ +
+ + + + + + + + + + +
NomeDepartamentoRamal
+ +
+
+ + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/usuarios.html b/templates/usuarios.html new file mode 100644 index 0000000..ae8f081 --- /dev/null +++ b/templates/usuarios.html @@ -0,0 +1,498 @@ +{% load static %} + + + + + + Portal De Paula — Usuários + + + + + + + + + +
+ + +
+
+ +

Administração

+ +
+ + +
+ + +
+ + +
+
+ +
+
+
+

Usuários

+
+ + +
+
+ +
+ + + + + + + + + + + +
LoginNomePerfil de AcessoStatus
+ +
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +