From 98159edf88a739155420194144ab82c44beb572e Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 8 Apr 2025 22:57:43 -0300 Subject: [PATCH 1/4] feat: atualizando referencia do modulo theme-Funarte --- src/themes/Funarte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes/Funarte b/src/themes/Funarte index ccf6387a81..89f71ba66b 160000 --- a/src/themes/Funarte +++ b/src/themes/Funarte @@ -1 +1 @@ -Subproject commit ccf6387a81ca3736e41cd6041f576b2c1e459bf1 +Subproject commit 89f71ba66bd108df2844317ba0b4474635fc8287 From 6650d49ce34835db77b85f5ef1921dba1d2e5d4c Mon Sep 17 00:00:00 2001 From: Gabriel Borges Botelho Date: Thu, 10 Apr 2025 09:55:26 -0300 Subject: [PATCH 2/4] =?UTF-8?q?Atualiza=20identificador=20de=20vers=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/AdminLoginAsUser | 2 +- src/plugins/MultipleLocalAuth | 2 +- version.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/AdminLoginAsUser b/src/plugins/AdminLoginAsUser index d322e1a153..608d9288d3 160000 --- a/src/plugins/AdminLoginAsUser +++ b/src/plugins/AdminLoginAsUser @@ -1 +1 @@ -Subproject commit d322e1a153d3459c2c7f298720a531e7a18e1cab +Subproject commit 608d9288d37f86e133761fd2ca3bced5bd407dd2 diff --git a/src/plugins/MultipleLocalAuth b/src/plugins/MultipleLocalAuth index 0a530d7430..5c74673d3a 160000 --- a/src/plugins/MultipleLocalAuth +++ b/src/plugins/MultipleLocalAuth @@ -1 +1 @@ -Subproject commit 0a530d7430acb8dd8f2f59c7e74fe3e5c70f7f91 +Subproject commit 5c74673d3a366771608c4f730a19108dd1bf9fe7 diff --git a/version.txt b/version.txt index 012cdd4c55..9040ac452c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v7.6.0-minc22-RC +v7.6.0-minc23-RC From a9f2187d6c2e4bf9a745c703d1c0320b81c38d5e Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Thu, 10 Apr 2025 10:49:00 -0300 Subject: [PATCH 3/4] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 474747739d1ab3e0f04b3a01b6538267a5090745 Merge: eb77f167b ee5a0e4f5 Author: Gabriel Borges Botelho Date: Thu Apr 10 09:50:58 2025 -0300 Merge branch 'release/v7.6.0-minc22' commit eb77f167b33aa0dce19cba4ad2efa766ef5e68b6 Merge: 9a50831ea a5ec108cd Author: Gabriel Borges Botelho Date: Fri Apr 4 11:20:02 2025 -0300 Merge branch 'release/v7.6.0-minc21' commit 9a50831ea0c648b2045ba3ffc8debbf459c86ef2 Merge: 1bd882a21 fa59969d7 Author: Gabriel Borges Botelho Date: Thu Apr 3 10:46:48 2025 -0300 Merge branch 'release/v7.6.0-minc20' commit fa59969d7de0c717b830508f60ba7134b161dd9d Author: Gabriel Borges Botelho Date: Thu Apr 3 10:44:46 2025 -0300 Atualiza identificador de versão commit 17492f453621e374f78bdecaff114a9620105c20 Merge: 6c0660d11 34b8205df Author: Gabriel Borges Botelho Date: Thu Apr 3 10:41:13 2025 -0300 Merge branch 'upd' into release/v7.6.0-minc20 commit 34b8205df79f1af5e485af2696ee11c56bc619f1 Author: Gabriel Borges Botelho Date: Tue Apr 1 17:17:16 2025 -0300 Atualiza identificador de versão commit bfc63a139d59e64fd1af77440ac3609b0db5c4f4 Merge: b9ae01d76 20f2675b9 Author: Gabriel Borges Botelho Date: Tue Apr 1 17:16:30 2025 -0300 Merge remote-tracking branch 'upstream/release/7.6' into upd commit 20f2675b9a0fd7395de188fd48b43bcbdf2f8b06 Merge: 31efca2ea c5b6d2c27 Author: Rafa Chaves Date: Tue Apr 1 15:04:50 2025 -0300 Merge branch 'develop' into release/7.6 commit c5b6d2c27488f3a32560cb789bc2ce6327b4546e Merge: e5a90844a 4ab05c993 Author: Rafa Chaves Date: Tue Apr 1 15:04:24 2025 -0300 Merge branch 'develop' of github.com:mapasculturais/mapasculturais into develop commit e5a90844adb421b707fe39ce503f92f7d5c73af1 Author: Rafa Chaves Date: Tue Apr 1 15:02:32 2025 -0300 remove o filtro por status na api quando o controle de acesso estiver desligado commit 4ab05c993d7efa92f6eb808c03fd98f864d35fb0 Author: leopiccionia Date: Tue Apr 1 09:50:52 2025 -0300 Corrige cor do ícone de perfil quando ativo commit 31efca2eaa96ac5ce952d9de9f22b0bdbdbc208e Merge: 8e134bc61 4edd07b06 Author: erleibiazzio Date: Tue Apr 1 09:17:02 2025 -0300 Merge branch 'develop' into release/7.6 commit b9ae01d76d674c7a609a82ab35965c9bdfaa3757 Author: Lucas Oliveira Date: Mon Mar 31 20:29:34 2025 -0300 feat: atualizando referencia do plugin AdminLoginAsUser commit 18a3e8b524554f44f7bc64570b945a0a31a33771 Author: Gabriel Borges Botelho Date: Mon Mar 31 17:25:52 2025 -0300 Atualiza identificar de versão commit 9c6e62daeef9696277c510b84ffd14a1fcf823c1 Merge: 6f8cf1506 8e134bc61 Author: Gabriel Borges Botelho Date: Mon Mar 31 17:25:35 2025 -0300 Merge remote-tracking branch 'upstream/release/7.6' into upd commit 4edd07b068ce161cf31b440d1bad697545bf8a4e Author: israelmelo Date: Mon Mar 31 11:34:57 2025 -0300 Cria a permissão canUserModify na EvaluationMethodConfigurationAgentRelation commit 48ba7228f179b3953e4d8d9e07637d511ee4788a Author: israelmelo Date: Mon Mar 31 11:34:30 2025 -0300 Ajusta a permissão canUserManageEvaluationCommittee commit 8e134bc610bb0637b554136bd891e54d46f09866 Merge: aa51f2ca0 c19ac783d Author: Rafa Chaves Date: Fri Mar 28 21:35:23 2025 -0300 Merge branch 'develop' into release/7.6 commit c19ac783d89e55b4bb158411dcf17500c5a50132 Author: Rafa Chaves Date: Fri Mar 28 21:01:08 2025 -0300 no enqueueJob só substitui jobs com status de processamento se tiverem sido criados a mais de 5 minutos commit d388b4b9d280d03865d6f2bb9e5237b1c40d56b0 Author: Rafa Chaves Date: Fri Mar 28 20:58:26 2025 -0300 corrige página de avaliação commit aa51f2ca03dd299a6de1a98b723a4ea1bc1874fa Author: Rafa Chaves Date: Fri Mar 28 20:58:26 2025 -0300 corrige página de avaliação commit cfdd6aee4910480976e006ce4059c6a2e319e8fa Author: Rafa Chaves Date: Fri Mar 28 19:40:25 2025 -0300 versão 7.6.0-RC commit 0b4d4ca026e7d5a5ece5e0d0631153ca558fc403 Merge: c257a0731 706a43031 Author: Rafa Chaves Date: Fri Mar 28 19:39:13 2025 -0300 Merge branch 'feature/evaluations-refactor' into develop commit 706a430317c78ff7e8e2cb5005bd9b00c4ac1a51 Author: Rafa Chaves Date: Fri Mar 28 19:06:20 2025 -0300 remove parâmetro não mais existente no mc-updates commit ee5abacbc5e0d507abeb3cf019903b603594e895 Author: Rafa Chaves Date: Fri Mar 28 19:05:41 2025 -0300 refatora cmponente panel--evaluations-tabs para utilizar o novo endpoint api/opportunity/findEvaluable commit 46ddc3cd4a93e78031e9483b88ef521615d704b3 Author: Rafa Chaves Date: Fri Mar 28 19:04:29 2025 -0300 correção no botão de expandir todos os avaliadores no componente de configuração de comissão de avaliadores commit 67d2335af8b29239c98b1a3875877b71f682934d Author: Rafa Chaves Date: Fri Mar 28 19:03:42 2025 -0300 inicializa variável no componente fields-visible-evaluators commit bb555d3f7735315a3120ec0462380cea29302db4 Author: Rafa Chaves Date: Fri Mar 28 19:03:03 2025 -0300 corrige formato do salvamento dos filtros por campos de inscrição na configuração das comissões commit 5d656ee7fe912589e5f2e8a660754e054e61866d Author: Rafa Chaves Date: Fri Mar 28 19:01:01 2025 -0300 atualiza o resumo dos avaliadores nas modificações das avaliações commit 8f6d0e2e5ffc20621fd9b94b125b31664403637f Author: Rafa Chaves Date: Fri Mar 28 18:59:23 2025 -0300 função no EntityAgentRelations para retornar todas as relações de um usuário com uma entidade commit 4adf0d15f591d315f68da8ff41aec1862b24301b Author: Rafa Chaves Date: Fri Mar 28 18:57:17 2025 -0300 adiciona interface informativa da distribuição das avaliações e botão para executar o agendamento da distribuição commit 41ce2ac6ea723099cf344c48aa4d127401e2128f Author: Rafa Chaves Date: Fri Mar 28 18:55:28 2025 -0300 atualiza o resumo das avaliações na mudança do status das inscrições commit abae0d3803bf304686eb7c5750744fa79705e8f2 Author: Rafa Chaves Date: Fri Mar 28 18:53:54 2025 -0300 refatoração da função que gera o resumo do avaliador e unificação da utilização dessa função em todas os componentes commit 7258aef76fb8e3f3a66952303e387bc264c32330 Author: Rafa Chaves Date: Fri Mar 28 18:47:18 2025 -0300 enpoint da api (/api/opportunity/findEvaluable para encontrar oportunidades que um determinado usuário pode avaliar commit 5173e86c5758ab65b2fbb0e9f48523671acfae36 Author: Rafa Chaves Date: Fri Mar 28 18:46:32 2025 -0300 implementa função no repositório de oportunidades para encontrar as oportuniades que um usuário pode avaliar commit c59023f4f4b08d3c2ed082f0e5bdaa5149aba43f Author: Rafa Chaves Date: Fri Mar 28 18:44:09 2025 -0300 endpoint para executar o agendamento da redistribuição das avaliações commit a7887c6d1a305ff4ec2371d94c59897699016451 Author: Rafa Chaves Date: Fri Mar 28 18:42:08 2025 -0300 se no enfileiramento de um job já existir o mesmo job no banco de dados e este for de 1 iteração e o status for 1 (processando), remove este e enfileira novamente commit c257a07316a2e7747b7dec9196c9bee00ce86c11 Author: erleibiazzio Date: Fri Mar 28 17:24:05 2025 -0300 Corrige erro exibir um campo de lista de links na tabale commit 6f8cf1506f8a2a2dd6a98dec3822a9db265e1268 Author: Gabriel Borges Botelho Date: Fri Mar 28 15:57:18 2025 -0300 Atualiza identificador de versão commit 5560723008f2c1ca8faf8548d0d63bf7b10b2328 Merge: 464bfdb4a a2d7d3834 Author: Gabriel Borges Botelho Date: Fri Mar 28 15:54:15 2025 -0300 Merge remote-tracking branch 'upstream/release/7.6' into upd commit 464bfdb4aaefb024c53620d1c62c0b851de53d50 Merge: 0b2b9c8dc 55ad05da0 Author: Gabriel Borges Botelho Date: Fri Mar 28 15:52:31 2025 -0300 Merge branch 'develop-minc' into upd commit d520d7ece01a5952c81a90929df9ea0eb2573ab9 Author: leopiccionia Date: Fri Mar 28 15:28:14 2025 -0300 Corrige ordenamento de entidades, muda padrão para ordem alfabética Corrige um bug no componente `` que fazia, em certas circunstâncias, o ordenamento passado pelo componente-pai ser ignorado, por exemplo, na lista de notificações Também muda o ordenamento padrão do componente `` para ser por ordem alfabética, se a entidade possui o campo `name` commit d6ea5b963a9d6ebdde6db70c94bf0c0cc93e81cc Author: leopiccionia Date: Fri Mar 28 14:41:50 2025 -0300 Corrige exibição do componente durante desenvolvimento commit a2d7d38346467ebf7676671e69fa084e2e85c967 Author: leopiccionia Date: Thu Mar 27 16:45:47 2025 -0300 Melhora estilo da timeline commit b3b576c005c378008706102f651c3b2d301a3f67 Author: Rafa Chaves Date: Thu Mar 27 11:07:24 2025 -0300 corrige warning em Entities\Opportunity::setRegistrationCategories na verificação de categorias utilizadas pelas inscrições commit a0498d48335ec1e02f7c085aae10a27f7c110d09 Author: leopiccionia Date: Thu Mar 27 10:31:21 2025 -0300 Melhora responsividade dos mapas commit 0b2b9c8dcf7df6fe0c519357bcc8289a3cf72a1a Author: Gabriel Borges Botelho Date: Thu Mar 27 10:25:59 2025 -0300 Atualiza identificador de versão commit 8700ed255ce22a8b7edf98cbbcc83685c30ddd83 Merge: 52b5493a1 45241d929 Author: Gabriel Borges Botelho Date: Thu Mar 27 10:25:38 2025 -0300 Merge remote-tracking branch 'upstream/release/7.6' into upd commit 43965172fdee33f8ea05c332fb37df76baf2fd5c Author: leopiccionia Date: Thu Mar 27 09:45:05 2025 -0300 Corrige tamanho da barra de filtros quando foundResults é presente commit f6a6426dc3b3ea7f0de03075d0599bf809725f4f Author: Rafa Chaves Date: Wed Mar 26 22:38:19 2025 -0300 refatoração na distribuição de avaliadores para melhorar a performance commit b330a2f03d5cd24240c89f4e69a3f562a698f9e6 Author: Rafa Chaves Date: Wed Mar 26 22:33:24 2025 -0300 evita quebra da ApiQuery quando encontra um objeto de um tipo não registrado commit 5534d7ccb7185833b0a0e691dcccc0af3b5986cb Author: Rafa Chaves Date: Wed Mar 26 22:32:39 2025 -0300 remoção do enfileiramento do reprocessamento do cache de inscriçòes na modificação da redistribuição commit 40f29e8503172dc4b01dbab37be30a2d93a81885 Author: Rafa Chaves Date: Wed Mar 26 22:30:44 2025 -0300 correção da inicialização do Registration::__valuersExceptionsList commit 17c81a20ba9caad5eadac0b5c80aac34f06f0869 Author: Rafa Chaves Date: Wed Mar 26 22:29:22 2025 -0300 logs da atualização do resumo das inscrições e avaliações commit 45241d929722ec45c26a2e866a3a7a1d49cdbb01 Author: leopiccionia Date: Wed Mar 26 17:24:11 2025 -0300 Exibe avaliadores em ordem alfabética commit ff2440459537e916702b5f2f059df6c9f6b4fc12 Author: Rafa Chaves Date: Wed Mar 26 17:11:36 2025 -0300 localização do componente opportunity-registration-filter-configuration commit 7ee59c4af97d11c915b3e21b8a297388c535002b Author: Rafa Chaves Date: Wed Mar 26 16:45:33 2025 -0300 implementa reatividade do botão de expandir avaliadores na configuração da comissão commit da8ee99af77d2bb6bbb11a8587cf8801667dcb77 Author: leopiccionia Date: Wed Mar 26 14:47:55 2025 -0300 Corrige ordenamento e deduplicação das requisições de pesquisa commit 50717df26f4502a650c4a4dbf0be66e8134853a0 Author: leopiccionia Date: Tue Mar 25 17:52:11 2025 -0300 Trata editais de fluxo contínuo na linha do tempo da inscrição commit a2bf5aa2ca0836fd2c419c14f4e70b40d4f5a457 Author: leopiccionia Date: Tue Mar 25 17:14:55 2025 -0300 Adiciona alguns tratamentos de valores vazios no componente `` commit 1f13b9d773dd54b2700f6566fb31c7322f57eff2 Author: Rafa Chaves Date: Tue Mar 25 14:45:44 2025 -0300 implementa alguns caches na distribuição de avaliações commit 96452f706d03f9e548e4b8fb79c34f507c4ea548 Author: Rafa Chaves Date: Tue Mar 25 14:43:51 2025 -0300 refatora distribuição de avaliações para funcionar com a nova view commit bb3d17d5a5a9a6cc2fd3685f8fe7daaaddfbea18 Author: Rafa Chaves Date: Tue Mar 25 14:20:25 2025 -0300 evita o reprocessamento do cache na manipulação dos avaliadores commit ce7959d8ef920cd7e2950128e23d10cbc7907f46 Author: Rafa Chaves Date: Tue Mar 25 14:04:04 2025 -0300 modifica tipo do mapeamento da propriedade Registration::__valuersExceptionsList para json commit 388b2d1b2867376a75dc82c300f7a5be83d1cc6c Author: Rafa Chaves Date: Tue Mar 25 13:52:13 2025 -0300 db-update que chama a função de distriuição das avaliações para todos os avaliadores commit c8b4d47d88ff83b884a42bd8d06a388aabe46057 Author: Rafa Chaves Date: Tue Mar 25 13:44:29 2025 -0300 corrige o registro dos metadados das inscrições no final do método findRegistrations commit d85a076ebe5aa240bdf945d765951349fdc22a3c Author: Carolina Pedrosa Date: Tue Mar 25 12:32:23 2025 -0300 ajusta width de coluna fixa da tabela. Ref.: hacklabr/RCV#154 commit c96820aef0a1a76e81d20b6570bf9ed11b36b626 Author: Rafa Chaves Date: Tue Mar 25 12:23:17 2025 -0300 se o controle de acesso estiver desligado, não usa o filtro por permissão na api commit 05042d4606db4f640868e57677e6612fa5ada5ca Author: Rafa Chaves Date: Tue Mar 25 12:10:36 2025 -0300 Refatoração da view evaluations para se utilizar da coluna valuers_exceptions_list da tabela registration commit fe4c29fffd23c998214ce043723e2f1cd9dadb9a Author: Welington De Lima Olegario Date: Tue Mar 25 10:38:05 2025 -0300 Ajuste para garantir que todas as colunas sejam retornadas corretamente na tabela commit 1472da3b814208cab24d8448f4e8710cc25443e2 Author: leopiccionia Date: Tue Mar 25 09:16:42 2025 -0300 Melhora tratamento de links vazios no componente `` commit ca42123fa042ad02dcf821092d9ddb781fb3504e Author: leopiccionia Date: Fri Mar 21 16:08:17 2025 -0300 Reverte mudança na largura do `` commit ef39bd2b6a066749d49be10bd413e446f2504a10 Author: leopiccionia Date: Fri Mar 21 14:55:03 2025 -0300 Usar um `AbortController` para cada escopo do componente `` Isso evitará quebrar páginas em que a mesma API é usada por dois componentes diferentes commit 21647e8357a592f5770df6dc9bf76aed79458f81 Author: leopiccionia Date: Fri Mar 21 11:36:05 2025 -0300 Corrige permissões no painel Minhas Avaliações commit 52b5493a1485dc3d20c693336c2bd9294a84652f Author: Gabriel Borges Botelho Date: Fri Mar 21 10:21:56 2025 -0300 Atualiza identificador de versão. commit 53acd79b68294dd0c9d43fba21c52e003a072c5e Merge: 889c21729 ffdc1575e Author: Gabriel Borges Botelho Date: Fri Mar 21 10:20:27 2025 -0300 Merge remote-tracking branch 'upstream/release/7.6' into upd commit 889c2172951fbfb276f2e2da076440b1deda470f Merge: 67e4e3bfa d70ee509b Author: Gabriel Borges Botelho Date: Fri Mar 21 10:17:06 2025 -0300 Merge branch 'correcao-6652-redirecionamento-validacao-email' into upd commit ffdc1575edcaa00e3d45e44636e74f5bb2f916a3 Merge: fd11cdab4 4603d9c12 Author: Welington De Lima Olegario Date: Thu Mar 20 17:29:12 2025 -0300 Merge branch 'develop' of https://github.com/mapasculturais/mapasculturais into develop commit fd11cdab4d0007224db6f59d0fc5bc9a65dd6364 Author: Welington De Lima Olegario Date: Thu Mar 20 17:28:02 2025 -0300 Melhorias nos textos das fases de avaliação commit d70ee509b5ae1eb952523c4b633f46d0fda7fcaf Author: Lucas Oliveira Date: Thu Mar 20 14:38:15 2025 -0300 feat: atualizando referência do plugin commit 4603d9c124cc0e1c497c1dd996c81ea4855cac0a Author: leopiccionia Date: Thu Mar 20 12:29:04 2025 -0300 Permite passar a contagem de itens para os slots do filtro de pesquisa commit 7a2a299fce49470e9e83db0d41400f5096999a40 Author: leopiccionia Date: Thu Mar 20 12:20:59 2025 -0300 Permite passar a contagem de itens para os slots do filtro de pesquisa commit 9ec7f4ae818b0cec7296c5f92bb8be63fa96104a Author: israelmelo Date: Wed Mar 19 15:47:06 2025 -0300 Corrige ordenação do resultado do componente select-entity para ser em ordem alfabética commit 67e4e3bfac988664a25a3ff7cf7276cafd035411 Author: Gabriel Borges Botelho Date: Wed Mar 19 11:19:25 2025 -0300 Atualiza identificador de versão commit d1660f64ff59c341de1bd85d21c1e76b33c0d66b Merge: a49e1687a 8dc981fde Author: Gabriel Borges Botelho Date: Wed Mar 19 11:03:26 2025 -0300 Merge remote-tracking branch 'upstream/release/7.6' into upd commit a49e1687a5dd7108290d6e049a455ad9b8be7d52 Merge: 74bc776ba 0b9f3d529 Author: Gabriel Borges Botelho Date: Tue Mar 18 17:51:22 2025 -0300 Merge branch 'develop-minc' into upd commit 1bd882a21507acf3a2a98193668dcf66ef8c457e Merge: 47a920c03 3d4396ca1 Author: Gabriel Borges Botelho Date: Thu Mar 13 16:44:16 2025 -0300 Merge branch 'release/v7.6.0-minc19' commit 3d4396ca17ca01e0789a17826046b71bc833bc33 Author: Gabriel Borges Botelho Date: Thu Mar 13 16:43:12 2025 -0300 Atualiza identificador de versão commit 8dc981fde9e8dc65841e1d6e2e5daa93b20c10f2 Merge: 69ff9e15f c465ff979 Author: leopiccionia Date: Wed Mar 12 17:17:32 2025 -0300 Merge branch 'develop' of https://github.com/mapasculturais/mapasculturais into develop commit 69ff9e15f7c332420551778f64ca01c73d973953 Author: leopiccionia Date: Wed Mar 12 17:17:18 2025 -0300 Correção da exibição dos cards de avaliações Ref.: hacklabr/RCV#97 commit c465ff979042f11acc28d37828948ec1f6d2287a Author: Raul Vitor Lucena Brito Date: Wed Mar 12 15:34:36 2025 -0300 Refatora componente opportunity-registration-table para manipulação das colunas disponíveis via hook commit e97e90cf5e26f87bb66ec8aedfde5fa473b4b3ff Author: Raul Vitor Lucena Brito Date: Wed Mar 12 13:58:04 2025 -0300 Corrige comportamento do botão 'cancelar convite' nas configurações da comissão de avaliação (Ref.: rcv-179) commit 47a920c039fad5bda1ab77714822a5567bac20b0 Merge: d48e4cae8 387463fef Author: Gabriel Borges Botelho Date: Wed Mar 12 12:39:07 2025 -0300 Merge branch 'release/v7.6.0-minc18' commit 387463fef7e6a6a149796ed9b426422481bf7d76 Author: Gabriel Borges Botelho Date: Wed Mar 12 12:35:03 2025 -0300 Atualiza identificador de versão commit 8645791b6e91e922fe577ba0d53b5b4dbb2ac03c Author: leopiccionia Date: Wed Mar 12 12:12:21 2025 -0300 Melhorias de responsividade no formulário de inscrição Ref.: hacklabr/RCV#146 commit 17afda9af41d636fcd63acc2bb8300cd4411bc0c Author: leopiccionia Date: Wed Mar 12 11:46:25 2025 -0300 Melhorias de responsividade nos links do agente Ref.: hacklabr/RCV#146 commit d48e4cae8ad6fd1cde26d68e0b1d4edf73a4bdd9 Merge: 9560ef2e1 15c3e8bc3 Author: Fernando Lordão Date: Sat Mar 8 00:03:45 2025 -0300 Merge branch 'release/v7.6.0-minc17' commit 15c3e8bc3dcb1bd2190d0003db0a0348092d4cfc Author: Fernando Lordão Date: Sat Mar 8 00:03:44 2025 -0300 Atualiza identificador de versão commit 655d4a47e2048d6a0e843d1fa19600d0c73beb55 Author: Raul Vitor Lucena Brito Date: Fri Mar 7 10:58:28 2025 -0300 Corrige normalização dos filtros dos avaliadores #819 commit 9560ef2e11b3267912d6c4fc88949eb45d6fff07 Merge: a3a3a21f3 d69a80938 Author: Fernando Lordão Date: Thu Mar 6 22:02:19 2025 -0300 Merge branch 'release/v7.6.0-minc16' commit d69a80938423c2e0c12313995bbed11ee6a7b07d Author: Fernando Lordão Date: Thu Mar 6 22:00:23 2025 -0300 Atualiza identificador de versão commit a3a3a21f38dce84890efa51b33438d0c9bb9a24b Merge: 2815be784 d95781ae4 Author: Fernando Lordão Date: Fri Feb 28 17:41:19 2025 -0300 Merge branch 'release/v7.6.0-minc15' commit d95781ae49b4b763cd52c0fc2ceb08f696a71003 Author: Fernando Lordão Date: Fri Feb 28 17:39:51 2025 -0300 Atualiza identificador de versão commit 2815be784400774433bacf3bbac1b0125ed066e4 Merge: a6bfdd118 a43210853 Author: Fernando Lordão Date: Fri Feb 21 16:33:25 2025 -0300 Merge branch 'release/v7.6.0-minc14' commit a4321085307f75fa2070990d99c0d5cbb4b70c82 Author: Fernando Lordão Date: Fri Feb 21 16:20:40 2025 -0300 Atualiza identificador de versão commit a6bfdd118e229fa460d51a04a6f029806ea4438a Merge: e469ef67a 7b60c7bf6 Author: Fernando Lordão Date: Wed Feb 19 22:57:10 2025 -0300 Merge branch 'release/v7.6.0-minc13' commit 7b60c7bf6e244101672cd38ec96246212e75f57a Author: Fernando Lordão Date: Wed Feb 19 22:49:13 2025 -0300 Atualiza identificador de versão commit e469ef67a17d8f54ec303b15839a814429dff615 Merge: bb2adee3b 3812c4101 Author: Fernando Lordão Date: Thu Feb 13 21:26:06 2025 -0300 Merge branch 'release/v7.6.0-minc12' commit 3812c4101231e433bb878cedecf5fb17e05fcc00 Author: Fernando Lordão Date: Thu Feb 13 21:25:16 2025 -0300 Atualiza identificador da versão commit bb2adee3bfeee4ce4be93953ba625d055b0df076 Merge: 0366eb88b 78ab6b7bf Author: Fernando Lordão Date: Wed Feb 12 23:19:45 2025 -0300 Merge branch 'release/v7.6.0-minc11' commit 78ab6b7bfc4545ecb4aa7a8d352cb20aa83130c0 Author: Fernando Lordão Date: Wed Feb 12 23:17:38 2025 -0300 Atualiza identificador de versão commit 0366eb88be7ab810b0831dc1e08817ceee3526f3 Merge: 67e45cd48 c3b44f018 Author: Fernando Lordão Date: Mon Feb 10 13:43:33 2025 -0300 Merge branch 'release/v7.6.0-minc10' commit c3b44f018f670763b28318fc616dea45f8b034db Author: Fernando Lordão Date: Mon Feb 10 13:37:08 2025 -0300 Atualiza identificado de versão. commit 67e45cd48b34f6db903ab3bb631fa24234a3f686 Merge: b3c301cac 3a3a06295 Author: Fernando Lordão Date: Thu Jan 23 17:45:37 2025 -0300 Merge branch 'release/v7.6.0-minc9' commit 3a3a06295116ce787d7a1dd3786355486d535400 Author: Fernando Lordão Date: Thu Jan 23 17:42:54 2025 -0300 Atualiza identificador de versão commit 0ddb4f835f80823779c719f6eafa0a98011ff68c Author: erleibiazzio Date: Thu Jan 23 16:40:08 2025 -0300 Corrige validação do campo moeda commit df368886695cc006e4521d9b71767981d7d56e12 Author: Rafa Chaves Date: Wed Jan 22 08:28:44 2025 -0300 corrige js do componente evaluation-card commit b3c301cac314c17f4691e8a4832403d9ce6f886e Merge: 6e6ee65fd 5265e5645 Author: Fernando Lordão Date: Fri Jan 10 11:21:10 2025 -0300 Merge branch 'v7.6.0-minc8' commit 5265e5645c2b8c3a1e57d7e123bab1a27dbf633a Author: Fernando Lordão Date: Thu Jan 9 21:31:01 2025 -0300 Atualiza identificador de versão commit b28738df6bc5cd973eb1e569f46443a48a03e3bf Author: Rafa Chaves Date: Wed Jan 8 12:21:52 2025 -0300 correções no método de avaliação habilitação documental para avaliações legadas de versões anteriores à 7.6 commit 5d4bfec4a13e7cd356ebed043a60a71de8a1737d Author: Gabriel Borges Botelho Date: Wed Jan 8 16:28:21 2025 -0300 Atualiza Versão do Submodulo commit 37e993685cd351a1a31144bc2d57406db7f602a4 Author: Lucas Oliveira Date: Thu Jan 2 21:42:48 2025 -0300 feat: Aplicando o conceito de pattern para campos multivalorados commit dd7547be54785ea10e545cf17488b95f5e388ce3 Author: Lucas Oliveira Date: Thu Jan 2 21:36:50 2025 -0300 fix: removendo tratativa utilizada para 'impedir' a aplicação de fórmulas nas exportações' commit 0be1d6274ba977e684f6a96d23399c0016662d01 Author: Lucas Oliveira Date: Thu Jan 2 21:35:23 2025 -0300 feat: implementando as fórmulas de links de acordo com a extensão do arquivo [csv|xslx|ods] commit 6e6ee65fd7675af7fe2b4710459059d215ebfbfc Merge: 422648e2f 4e10ca433 Author: Fernando Lordão Date: Tue Dec 31 12:00:41 2024 -0300 Merge branch 'v7.6.0-minc7' commit 4e10ca43397102a29096863ccfa0b3f80713db41 Author: Fernando Lordão Date: Tue Dec 31 11:57:56 2024 -0300 Atualiza identificador de versão commit 422648e2f1a6cec24ac72e413c210c105b13ccf5 Merge: 718914c7e 1030f426c Author: Fernando Lordão Date: Tue Dec 24 13:34:48 2024 -0300 Merge branch 'v7.6.0-minc6' commit 1030f426c774b30b8d07c3e1d17dfc1d51f76b75 Author: Fernando Lordão Date: Tue Dec 24 13:34:05 2024 -0300 Atualiza identificador de versão commit 718914c7e8396f8f531e2e2bb74b208369288bde Merge: 8421376a4 47c4bd218 Author: Fernando Lordão Date: Mon Dec 23 21:42:30 2024 -0300 Merge branch 'v7.6.0-minc5' commit 47c4bd218aa477cc7cb9460dacc37c18daaedcba Author: Fernando Lordão Date: Mon Dec 23 21:41:15 2024 -0300 Atualiza identificador de versão commit 8421376a4b3aee97b7811cf9e613f77dd0fec662 Merge: 165c26cc2 5abe487c9 Author: Fernando Lordão Date: Mon Dec 23 10:10:21 2024 -0300 Merge branch 'develop-minc' commit 165c26cc2f8d8989cd3336e31a2c48f56aa7c5ad Merge: 35bec30ed 0a7df05a2 Author: Fernando Lordão Date: Fri Dec 20 21:39:13 2024 -0300 Merge branch 'develop-minc' commit 35bec30ed477efdf10348ab292b17eccf25ae321 Merge: 0883c4301 66b38c82a Author: Fernando Lordão Date: Thu Dec 19 13:51:36 2024 -0300 Merge branch 'develop-minc' commit 0883c43019ade4a34648c769c2c06c74d1820759 Merge: b437f3625 d418df115 Author: Fernando Lordão Date: Wed Dec 18 17:15:51 2024 -0300 Merge branch 'develop-minc' commit b437f3625742ad541e551f1bcea5d46a26b6df68 Merge: 40a7a4074 48b1438bf Author: Fernando Lordão Date: Tue Dec 3 14:28:00 2024 -0300 Merge branch 'develop-minc' commit 40a7a407428aaf06c4724fc467ec12728f1f4320 Merge: 4f89d1ef5 c323fdec3 Author: Fernando Lordão Date: Fri Nov 29 23:46:24 2024 -0300 Merge branch 'develop-minc' commit 4f89d1ef5982651ac19f198f2a8ef8b766129e9a Merge: 2c8cf20d0 4c951a353 Author: Fernando Lordão Date: Mon Nov 4 17:06:33 2024 -0300 Merge branch 'v7.4.26-minc1' commit 4c951a353c84c293054259970e53505ffed83dd8 Author: Fernando Lordão Date: Mon Nov 4 17:05:07 2024 -0300 Atualiza identificador da versão commit 2c8cf20d0cb2ffbaf8cce3a18745c13dabfa9071 Merge: 8b3dec5be 78b618930 Author: Fernando Lordão Date: Tue Oct 22 17:03:17 2024 -0300 Merge branch 'v7.4.16-minc5' commit 78b61893016833e01017f5f839664f7c69b5a7fd Author: Fernando Lordão Date: Tue Oct 22 17:02:00 2024 -0300 Atualiza identificador da versão. commit 8b3dec5be28c7f037dff4194edf0566473817fe5 Merge: 97d06e8ac 3377fa32e Author: Fernando Lordão Date: Fri Oct 18 10:49:47 2024 -0300 Merge branch 'v7.4.16-minc4' commit 3377fa32ebf3a1e950a7d89e29afffdfab4837ae Author: Fernando Lordão Date: Fri Oct 18 10:44:44 2024 -0300 Atualiza identificador da versão. commit 97d06e8ac491b749f05cf4e949bbb0f56233da6e Merge: ce8fdc3d7 c85cb68c2 Author: Fernando Lordão Date: Wed Oct 9 16:38:39 2024 -0300 Merge branch 'v7.4.16-minc3' commit c85cb68c20679a24b91334a6d6488eeb4e1e8f0f Author: Fernando Lordão Date: Wed Oct 9 16:34:42 2024 -0300 v7.4.16-minc3 commit ce8fdc3d75c604d29f554adf71653dffda727fbe Merge: 321c91cc1 0c7abed17 Author: Fernando Lordão Date: Thu Sep 26 15:10:34 2024 -0300 Merge branch 'v7.4.16-minc2' commit 0c7abed1720c8cbdb7bdde3ac1d4dbd3597f2a69 Author: Fernando Lordão Date: Thu Sep 26 15:01:36 2024 -0300 Ajusta identificador da versão commit 321c91cc10865cf627144f9b0875b83641b801a8 Merge: e4fa7148f f2dc4721a Author: Fernando Lordão Date: Wed Sep 11 23:34:30 2024 -0300 Merge branch 'v7.4.16-minc1' commit f2dc4721a50582ce877432f7ae85b39720e8cdc2 Author: Fernando Lordão Date: Wed Sep 11 23:33:19 2024 -0300 Ajusta nome da versão commit e4fa7148f368a577de0d3e82b0f12b061b95f50d Merge: d86c1cf58 364217837 Author: Fernando Lordão Date: Sat Sep 7 00:28:10 2024 -0300 Merge branch 'v7.4.12-minc3' commit 364217837786a8aa846b549b98f12758858f412e Author: Fernando Lordão Date: Sat Sep 7 00:26:18 2024 -0300 v7.4.12-minc3 commit d86c1cf58fd5ed4f8e4df608b9b045b254a3d3fc Author: Fernando Lordão Date: Wed Aug 21 19:51:09 2024 -0300 v7.4.12-minc2 --- config/logs.php | 9 +- src/core/ApiQuery.php | 9 +- src/core/App.php | 14 +- .../EvaluationMethodConfiguration.php | 18 + src/core/Controllers/Opportunity.php | 37 +- .../EvaluationMethodConfiguration.php | 71 ++- ...uationMethodConfigurationAgentRelation.php | 84 +--- src/core/Entities/Opportunity.php | 13 +- src/core/Entities/Registration.php | 19 +- src/core/Entities/RegistrationEvaluation.php | 33 +- src/core/EvaluationMethod.php | 426 ++++++++++++------ src/core/Repositories/Opportunity.php | 49 +- src/core/Theme.php | 13 +- src/core/Traits/EntityAgentRelation.php | 20 + src/db-updates.php | 48 +- src/mc-updates.php | 17 +- src/modules/Components/Module.php | 8 +- .../assets/js/components-base/API.js | 9 +- .../components/mc-debug/template.php | 2 +- .../components/mc-entities/script.js | 55 ++- .../Components/components/mc-status/script.js | 14 +- .../components/mc-summary-evaluate/init.php | 50 +- .../components/select-entity/template.php | 2 +- .../components/entity-field-links/script.js | 1 + .../components/entity-table/script.js | 2 +- .../components/entity-table/template.php | 8 +- .../configuracoes/agendamento-distribuicao.md | 19 + .../components/notification-list/script.js | 4 - .../Jobs/UpdateSummaryCaches.php | 4 +- src/modules/Opportunities/Module.php | 6 +- .../components/evaluation-card/script.js | 12 +- .../components/evaluation-card/template.php | 2 +- .../fields-visible-evaluators/script.js | 2 +- .../opportunity-committee-groups/script.js | 10 +- .../opportunity-committee-groups/template.php | 24 + .../script.js | 81 ++-- .../template.php | 17 +- .../opportunity-evaluations-table/init.php | 23 +- .../opportunity-phases-timeline/script.js | 34 +- .../script.js | 90 +++- .../template.php | 10 +- .../texts.php | 17 + .../opportunity-registrations-table/init.php | 42 +- .../opportunity-registrations-table/script.js | 46 +- .../panel--evaluations-tabs/init.php | 18 - .../panel--evaluations-tabs/script.js | 1 - .../panel--evaluations-tabs/template.php | 2 +- .../Opportunities/layouts/registrations.php | 3 +- .../Search/components/search-list/script.js | 11 +- .../components/search-list/template.php | 2 +- .../Search/components/search-map/template.php | 2 +- .../2.components/_entity-field-links.scss | 4 + .../sass/2.components/_entity-table.scss | 1 + .../sass/2.components/_mc-multiselect.scss | 1 - .../_opportunity-phases-timeline.scss | 9 +- .../sass/2.components/_panel-sidebar.scss | 3 +- .../sass/2.components/_search-filter.scss | 35 +- .../assets-src/sass/pages/_registrations.scss | 2 +- src/themes/theme-Funarte | 1 + 59 files changed, 1028 insertions(+), 541 deletions(-) create mode 100644 src/modules/FAQ/questions/pt_BR/editais-oportunidades/configuracoes/agendamento-distribuicao.md create mode 100644 src/modules/Opportunities/components/opportunity-registration-filter-configuration/texts.php delete mode 100644 src/modules/Opportunities/components/panel--evaluations-tabs/init.php create mode 160000 src/themes/theme-Funarte diff --git a/config/logs.php b/config/logs.php index 54521c3e12..1a21c8b94e 100644 --- a/config/logs.php +++ b/config/logs.php @@ -56,6 +56,11 @@ 'app.log.assets' => env('LOG_ASSETS', false), 'app.log.auth' => env('LOG_AUTH', false), + 'app.log.evaluations' => env('LOG_EVALUATIONS', false), + 'app.log.summary' => env('LOG_SUMMARY', false), + + 'app.log.lockfile' => env('LOG_LOCKFILE', false), + 'app.log.components' => env('LOG_COMPONENTS', false), 'app.log.assetManager' => env('LOG_ASSETMANAGER', false), @@ -63,6 +68,8 @@ 'app.log.pcache' => env('LOG_PCACHE', false), 'app.log.pcache.users' => env('LOG_PCACHE_USERS', false), - 'app.queryLogger' => env('LOG_QUERYLOG_CLASS', null) + 'app.queryLogger' => env('LOG_QUERYLOG_CLASS', null), + + ]; \ No newline at end of file diff --git a/src/core/ApiQuery.php b/src/core/ApiQuery.php index a4d34278e0..50e4439786 100644 --- a/src/core/ApiQuery.php +++ b/src/core/ApiQuery.php @@ -1070,7 +1070,7 @@ protected function generateWhere() { $where = $where_dqls; } - if($this->usesStatus && (!isset($this->apiParams['status']) || !$this->_permission)){ + if($app->isAccessControlEnabled() && $this->usesStatus && (!isset($this->apiParams['status']) || !$this->_permission)){ $params = $this->apiParams; if($this->rootEntityClassName === Opportunity::class && (isset($params['id']) || isset($params['status']) || isset($params['parent']))) { @@ -1319,7 +1319,7 @@ protected function processEntities(array &$entities) { $entity['originSiteUrl'] = $main_site_url; } if($this->_selectingType && isset($entity['_type'])){ - $entity['type'] = $types[$entity['_type']]; + $entity['type'] = $types[$entity['_type']] ?? null; unset($entity['_type']); } @@ -3156,6 +3156,11 @@ protected function _setPermissionsUser($value) { protected function _addFilterByPermissions($value) { $app = App::i(); + + if(!$app->isAccessControlEnabled()) { + return; + } + $user = $this->_permissionsUser ? $app->repo('User')->find($this->_permissionsUser) : $app->user; diff --git a/src/core/App.php b/src/core/App.php index cc5fa52df3..686fe887c8 100644 --- a/src/core/App.php +++ b/src/core/App.php @@ -1799,8 +1799,20 @@ public function enqueueJob(string $type_slug, array $data, string $start_string $conn->delete('job', ['id' => $id]); } + /** @var Entities\Job $job */ if ($job = $this->repo('Job')->find($id)) { - return $job; + $job_create_timestamp = $job->createTimestamp; + + // o job tem mais que 5 minutos? + $is_old = $job_create_timestamp->getTimestamp() < (time() - 5 * MINUTE_IN_SECONDS); + + // remove o job se ele estiver com status de processamento e for mais velho que 5 minutos + if($job->status == Job::STATUS_PROCESSING && $iterations == 1 && $is_old) { + $conn = $this->em->getConnection(); + $conn->delete('job', ['id' => $id]); + } else { + return $job; + } } $job = new Job($type); diff --git a/src/core/Controllers/EvaluationMethodConfiguration.php b/src/core/Controllers/EvaluationMethodConfiguration.php index 6c01098048..b0ab047478 100644 --- a/src/core/Controllers/EvaluationMethodConfiguration.php +++ b/src/core/Controllers/EvaluationMethodConfiguration.php @@ -6,6 +6,7 @@ use MapasCulturais\Controller; use MapasCulturais\Entities\EvaluationMethodConfiguration as EvaluationMethodConfigurationEntity; use MapasCulturais\Traits; +use Opportunities\Jobs\RedistributeCommitteeRegistrations; // use MapasCulturais\Entities\EvaluationMethodConfiguration; @@ -187,4 +188,21 @@ protected function _setPermissionCacheUsers(){ $entity->__skipQueuingPCacheRecreation = true; } + + function POST_registributeEvaluations() { + $app = App::i(); + + $this->requireAuthentication(); + + $emc = $this->requestedEntity; + + if(!$emc) { + $app->pass(); + } + $emc->checkPermission('manageEvaluationCommittee'); + + $app->enqueueOrReplaceJob(RedistributeCommitteeRegistrations::SLUG, ['evaluationMethodConfiguration' => $emc], 'now'); + + $this->json(true); + } } diff --git a/src/core/Controllers/Opportunity.php b/src/core/Controllers/Opportunity.php index f886d0fd1b..c659008a8e 100644 --- a/src/core/Controllers/Opportunity.php +++ b/src/core/Controllers/Opportunity.php @@ -518,7 +518,8 @@ function apiFindRegistrations($opportunity, $query_data) { } } - + $opportunity->registerRegistrationMetadata(); + return (object) ['count' => $current_phase_query->count(), 'registrations' => $current_phase_result,]; } @@ -942,8 +943,8 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = []) $rdata = [ '@select' => 'id', 'opportunity' => "EQ({$opportunity->id})", - '@permissions' => 'viewUserEvaluation', - '@order' => 'id ASC' + '@order' => 'id ASC', + 'status' => API::GT(0) ]; foreach($query_data as $k => $v){ @@ -960,9 +961,10 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = []) } } + $app->disableAccessControl(); $registrations_query = new ApiQuery('MapasCulturais\Entities\Registration', $rdata); - $registration_ids = implode(",", $registrations_query->findIds() ?: [-1]); + $app->enableAccessControl(); $query = " SELECT @@ -1035,6 +1037,7 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = []) $evaluations = $conn->fetchAll($query, $params); + $app->disableAccessControl(); $registration_numbers = array_filter(array_unique(array_map(function($r) { return $r['registration_number']; }, $evaluations))); $evaluations_ids = array_filter(array_unique(array_map(function($r) { return $r['evaluation_id']; }, $evaluations))); @@ -1042,6 +1045,8 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = []) $_registrations = $this->_getOpportunityRegistrations($opportunity, $registration_numbers, $query_data); $_evaluations = $this->_getOpportunityEvaluations($opportunity, $evaluations_ids); + $app->disableAccessControl(); + $_result = []; foreach($evaluations as $eval) { @@ -1473,5 +1478,29 @@ public function ALL_fixNextPhaseRegistrationIds():void $opportunity->fixNextPhaseRegistrationIds(); } + + public function API_findEvaluable(): void { + $this->requireAuthentication(); + + $app = App::i(); + + $user_id = $this->data['@user'] ?? $app->user->id; + $user = $app->repo('User')->find($user_id); + + $user->profile->checkPermission('@control'); + + $opportunity_ids = $app->repo('Opportunity')->findValuerOpportunities($user->id, only_ids: true); + + $query_params = $this->data; + $query_params['id'] = API::IN($opportunity_ids); + + unset($query_params['@user']); + + $query = new ApiQuery(EntitiesOpportunity::class, $query_params); + $result = $query->find(); + + $this->apiAddHeaderMetadata($query_params, $result, $query->count()); + $this->apiResponse($result); + } } \ No newline at end of file diff --git a/src/core/Entities/EvaluationMethodConfiguration.php b/src/core/Entities/EvaluationMethodConfiguration.php index 51aa2364ea..211e3e1108 100644 --- a/src/core/Entities/EvaluationMethodConfiguration.php +++ b/src/core/Entities/EvaluationMethodConfiguration.php @@ -325,6 +325,11 @@ public function getSummary($skip_cache = false): array { return $app->mscache->fetch($cache_key); } } + + if ($app->config['app.log.summary']) { + $app->log->debug("SUMMARY: Atualizando o resumo de avaliações da fase {$this->name} ($this->id)"); + } + $em = $this->evaluationMethod; $conn = $app->em->getConnection(); $opportunity = $this->owner; @@ -402,7 +407,65 @@ public function getSummary($skip_cache = false): array { return $data; } - public function enqueueUpdateSummary($start_string = '10 seconds') { + + + public function getValuerSummary(?User $user = null): array { + $app = App::i(); + + /** @var \MapasCulturais\Connection $conn */ + $conn = $app->em->getConnection(); + $opportunity = $this->opportunity; + $data = []; + if($user) { + $user_ids = [$user->id]; + } else { + $agent_relations = $this->getAgentRelations(); + + $user_ids = array_map(fn($agent_relation) => $agent_relation->agent->user->id, $agent_relations); + } + + $user_ids = implode(',', $user_ids); + /** + * Constrói a query para contar as avaliações com base no status. + * + * @param int|null $status Status da avaliação (0 = iniciada, 1 = concluída, 2 = enviada). + * @return int Retorna a contagem de avaliações. + */ + $buildQuery = function ($status = null) use ($user_ids, $opportunity, $conn): int { + $statusCondition = is_null($status) ? "e.status IS NULL" : "e.status = {$status} AND e.registration_id IN (SELECT r.id FROM registration r WHERE r.opportunity_id = {$opportunity->id})"; + + + $query = " + SELECT DISTINCT count(e.registration_id) + FROM registration_evaluation e + WHERE {$statusCondition} AND user_id IN($user_ids) + "; + + return $conn->fetchScalar($query); + }; + + // Avaliações pendentes + $query = " + SELECT DISTINCT count(e.registration_id) + FROM evaluations e + WHERE opportunity_id = {$opportunity->id} AND e.evaluation_status IS NULL AND valuer_user_id IN ($user_ids) + "; + + $data['pending'] = $conn->fetchScalar($query); + + // Avaliações iniciadas + $data['started'] = $buildQuery(0); + + // Avaliações concluídas + $data['completed'] = $buildQuery(1); + + // Avaliações enviadas + $data['sent'] = $buildQuery(2); + + return $data; + } + + public function enqueueUpdateSummary(string $start_string = 'now') { $app = App::i(); $app->enqueueOrReplaceJob(UpdateSummaryCaches::SLUG, [ 'evaluationMethodConfiguration' => $this @@ -488,11 +551,7 @@ protected function canUserRemove($user){ } protected function canUserManageEvaluationCommittee($user){ - if(!$this->canUser('@controll', $user)){ - return false; - } - - return true; + return $this->opportunity->canUser('@control', $user); } protected function canUserCreateAgentRelationWithControl($user){ diff --git a/src/core/Entities/EvaluationMethodConfigurationAgentRelation.php b/src/core/Entities/EvaluationMethodConfigurationAgentRelation.php index a0fef5a2e4..5719d370bd 100644 --- a/src/core/Entities/EvaluationMethodConfigurationAgentRelation.php +++ b/src/core/Entities/EvaluationMethodConfigurationAgentRelation.php @@ -3,6 +3,7 @@ use MapasCulturais\App; use Doctrine\ORM\Mapping as ORM; +use MapasCulturais\EvaluationMethod; use MapasCulturais\Exceptions\PermissionDenied; use MapasCulturais\Exceptions\WorkflowRequest; use MapasCulturais\GuestUser; @@ -46,6 +47,12 @@ public function __construct() parent::__construct(); } + function save($flush = false) + { + $this->owner->__skipQueuingPCacheRecreation = true; + $this->owner->opportunity->__skipQueuingPCacheRecreation = true; + parent::save($flush); + } function delete($flush = false) { $app = App::i(); @@ -59,7 +66,9 @@ function delete($flush = false) { } $app->enableAccessControl(); - $this->owner->opportunity->enqueueToPCacheRecreation([$this->agent->user]); + $this->owner->opportunity->__skipQueuingPCacheRecreation = true; + $this->owner->__skipQueuingPCacheRecreation = true; + parent::delete($flush); } @@ -69,8 +78,8 @@ function reopen($flush = true){ $app = App::i(); $app->applyHookBoundTo($this,"{$this->hookPrefix}.reopen:before"); + $this->status = self::STATUS_ENABLED; - $this->save($flush); $job = $app->enqueueJob(ReopenEvaluations::SLUG, ['agentRelation' => $this]); @@ -125,65 +134,12 @@ function enable($flush = true){ * @throws PermissionDenied * @throws WorkflowRequest */ - function updateSummary(bool $flush = false, bool $pending = true, bool $started = true, bool $completed = true, bool $sent = true): void + function updateSummary(): void { - $entity = $this->owner; $app = App::i(); - /** @var \MapasCulturais\Connection $conn */ - $conn = $app->em->getConnection(); - - $user = $this->agent->user; - $data = $this->metadata["summary"] ?? []; - - /** - * Constrói a query para contar as avaliações com base no status. - * - * @param int|null $status Status da avaliação (0 = iniciada, 1 = concluída, 2 = enviada). - * @return int Retorna a contagem de avaliações. - */ - $buildQuery = function ($status = null) use ($user, $entity, $conn): int { - $statusCondition = is_null($status) ? "e.status IS NULL" : "e.status = {$status} AND e.registration_id IN (SELECT r.id FROM registration r WHERE r.opportunity_id = {$entity->opportunity->id})"; - - $query = " - SELECT DISTINCT count(e.registration_id) - FROM registration_evaluation e - WHERE {$statusCondition} AND user_id = {$user->id} - "; - - return $conn->fetchScalar($query); - }; - - // Atualiza as avaliações pendentes - if ($pending) { - $query = " - SELECT DISTINCT count(e.registration_id) - FROM evaluations e - WHERE opportunity_id = {$entity->opportunity->id} AND e.evaluation_status IS NULL AND valuer_user_id = {$user->id} - "; - $data['pending'] = $conn->fetchScalar($query); - } else { - $data['pending'] = $data['pending'] ?? 0; - } - - // Atualiza as avaliações iniciadas - if ($started) { - $data['started'] = $buildQuery(0); - } else { - $data['started'] = $data['started'] ?? 0; - } - - // Atualiza as avaliações concluídas - if ($completed) { - $data['completed'] = $buildQuery(1); - } else { - $data['completed'] = $data['completed'] ?? 0; - } - - // Atualiza as avaliações enviadas - if ($sent) { - $data['sent'] = $buildQuery(2); - } else { - $data['sent'] = $data['sent'] ?? 0; + + if ($app->config['app.log.summary']) { + $app->log->debug("SUMMARY: Atualizando o resumo de avaliações do avaliador {$this->agent->name}"); } if(is_object($this->metadata)) { @@ -192,8 +148,11 @@ function updateSummary(bool $flush = false, bool $pending = true, bool $started $metadata = (object) []; } - $metadata->summary = $data; + $user = $this->agent->user; + $evaluation_method_configuration = $this->owner; + $metadata->summary = $evaluation_method_configuration->getValuerSummary($user); + $conn = $app->em->getConnection(); $conn->update('agent_relation', ['metadata' => json_encode($metadata)], ['id' => $this->id]); } @@ -201,4 +160,9 @@ protected function canUserRemove($user): bool { return $this->owner->canUser('manageEvaluationCommittee', $user); } + + protected function canUserModify($user): bool + { + return $this->owner->canUser('manageEvaluationCommittee', $user); + } } diff --git a/src/core/Entities/Opportunity.php b/src/core/Entities/Opportunity.php index f108105d34..e25da76723 100644 --- a/src/core/Entities/Opportunity.php +++ b/src/core/Entities/Opportunity.php @@ -773,13 +773,7 @@ function setRegistrationCategories(string|array $categories) { $new_categories = Utils::nl2array($categories); } - if (is_array($new_categories)) { - $new_categories = array_filter($new_categories , function($category){ - return !empty($category); - }); - } - - $removed_categories = array_diff($this->registrationCategories, $new_categories); + $removed_categories = array_filter(array_diff($this->registrationCategories, $new_categories)); $errors = []; foreach ($removed_categories as $removed_category) { @@ -1388,11 +1382,14 @@ public function getSummary($skip_cache = false): array { $cache_key = $this->summaryCacheKey; if(!$skip_cache && $app->config['app.useOpportunitySummaryCache']) { - if ($app->mscache->contains($cache_key)) { return $app->mscache->fetch($cache_key); } } + + if ($app->config['app.log.summary']) { + $app->log->debug("SUMMARY: Atualizando o resumo de inscrições da fase {$this->name} ({$this->id})"); + } $params = ["opp" => $this]; diff --git a/src/core/Entities/Registration.php b/src/core/Entities/Registration.php index 7b6b73e962..d1b8dc2c7a 100644 --- a/src/core/Entities/Registration.php +++ b/src/core/Entities/Registration.php @@ -165,9 +165,9 @@ class Registration extends \MapasCulturais\Entity /** * @var integer * - * @ORM\Column(name="valuers_exceptions_list", type="text", nullable=false) + * @ORM\Column(name="valuers_exceptions_list", type="json", nullable=false) */ - protected $__valuersExceptionsList = '{"include": [], "exclude": []}'; + protected $__valuersExceptionsList; @@ -273,6 +273,8 @@ class Registration extends \MapasCulturais\Entity function __construct() { $app = App::i(); + $this->__valuersExceptionsList = (object) ["include" => [], "exclude" => []]; + $this->owner = $app->user->profile; if(!self::$hooked){ @@ -737,19 +739,20 @@ function randomIdGeneratorInitialRange(){ * @return mixed */ function getValuersExceptionsList(){ - return json_decode($this->__valuersExceptionsList); + if(is_string($this->__valuersExceptionsList) && json_validate($this->__valuersExceptionsList)) { + $this->__valuersExceptionsList = json_decode($this->__valuersExceptionsList); + } + return (object) $this->__valuersExceptionsList; } protected function _setValuersExceptionsList($object){ $this->checkPermission('modifyValuers'); if(is_object($object) && isset($object->exclude) && is_array($object->exclude) && isset($object->include) && is_array($object->include)){ - $this->__valuersExceptionsList = json_encode($object); + $this->__valuersExceptionsList = $object; } else { throw new \Exception('Invalid __valuersExceptionsList format'); } - - $this->enqueueToPCacheRecreation(); } function setValuersExcludeList(array $user_ids){ @@ -771,7 +774,7 @@ function setValuersIncludeList(array $user_ids){ */ function getValuersIncludeList(){ $exceptions = $this->getValuersExceptionsList(); - return $exceptions->include; + return (array) $exceptions->include; } /** @@ -780,7 +783,7 @@ function getValuersIncludeList(){ */ function getValuersExcludeList(){ $exceptions = $this->getValuersExceptionsList(); - return $exceptions->exclude; + return (array) $exceptions->exclude; } /** diff --git a/src/core/Entities/RegistrationEvaluation.php b/src/core/Entities/RegistrationEvaluation.php index 64f6758702..7bfa93d3f1 100644 --- a/src/core/Entities/RegistrationEvaluation.php +++ b/src/core/Entities/RegistrationEvaluation.php @@ -2,21 +2,29 @@ namespace MapasCulturais\Entities; +use Doctrine\ORM\Exception\NotSupported; use MapasCulturais; use MapasCulturais\i; use MapasCulturais\Traits; use Doctrine\ORM\Mapping as ORM; use Doctrine\Persistence\Mapping\MappingException; use MapasCulturais\App; +use MapasCulturais\Exceptions\PermissionDenied; +use MapasCulturais\Exceptions\WorkflowRequest; use ReflectionException; +use RuntimeException; /** * RegistrationMeta * + * @property-read \MapasCulturais\Definitions\EvaluationMethod $evaluationMethodDefinition + * @property-read EvaluationMethodConfiguration $evaluationMethodConfiguration + * @property-read \MapasCulturais\EvaluationMethod $evaluationMethod + * @property-read string $resultString + * @property-read string $statusString * @property-read string $result * * @property integer $id - * @property mexed $result * @property object $evaluationData * @property Registration $registration * @property User $user @@ -167,7 +175,7 @@ public function getEvaluationMethodDefinition() { /** * Returns the Evaluation Method Configuration - * @return \MapasCulturais\Definitions\EvaluationMethodConfiguration + * @return EvaluationMethodConfiguration */ public function getEvaluationMethodConfiguration() { return $this->registration->evaluationMethodConfiguration; @@ -287,6 +295,20 @@ public static function getEntityTypeLabel($plural = false): string { return \MapasCulturais\i::__('Avaliação de Inscrição'); } + /** + * Atualiza os resumos do avaliador + * + * @return void + */ + public function updateValuerSummaries() { + /** @var EvaluationMethodConfigurationAgentRelation[] */ + $relations = $this->evaluationMethodConfiguration->getAgentRelationOfUser($this->user); + + foreach($relations as $relation) { + $relation->updateSummary(); + } + } + //============================================================= // // The following lines ara used by MapasCulturais hook system. // Please do not change them. @@ -304,6 +326,7 @@ public function postPersist($args = null){ parent::postPersist($args); $this->registration->consolidateResult(true, $this); + $this->updateValuerSummaries(); } /** @ORM\PreRemove */ @@ -313,6 +336,7 @@ public function postRemove($args = null){ parent::postRemove($args); $this->registration->consolidateResult(true, $this); + $this->updateValuerSummaries(); } /** @ORM\PreUpdate */ @@ -322,9 +346,6 @@ public function postUpdate($args = null){ parent::postUpdate($args); $this->registration->consolidateResult(true, $this); - } - - public function getResult() { - return $this->result; + $this->updateValuerSummaries(); } } diff --git a/src/core/EvaluationMethod.php b/src/core/EvaluationMethod.php index 463f7b16cb..c5dc5dd873 100644 --- a/src/core/EvaluationMethod.php +++ b/src/core/EvaluationMethod.php @@ -4,6 +4,7 @@ use MapasCulturais\Entities\RegistrationEvaluation; use MapasCulturais\i; use MapasCulturais\Entities; +use MapasCulturais\Entities\EvaluationMethodConfiguration; use MapasCulturais\Entities\EvaluationMethodConfigurationAgentRelation; use MapasCulturais\Entities\Opportunity; use MapasCulturais\Entities\Registration; @@ -27,6 +28,13 @@ abstract function _getEvaluationDetails(Entities\RegistrationEvaluation $evaluat abstract function _getConsolidatedDetails(Entities\Registration $registration): ?array; + static function getNextRedistributionDateTime(): \DateTime { + $app = App::i(); + $str_time = date($app->config['registrations.distribution.dateString']) . ' ' . $app->config['registrations.distribution.incrementString']; + $datetime = new \DateTime($str_time); + return $datetime; + } + public function cmpValues($value1, $value2){ if($value1 > $value2){ return 1; @@ -266,6 +274,12 @@ function getConsolidatedDetails(Entities\Registration $registration): array { * @return Entities\User[][] */ function getCommitteeGroups(Entities\EvaluationMethodConfiguration $evaluation_config): array { + $cache_key = __METHOD__ . ':' . $evaluation_config->id; + $app = App::i(); + + if($app->rcache->contains($cache_key)){ + return $app->rcache->fetch($cache_key); + } $committee = []; foreach($evaluation_config->getAgentRelations(null, false) as $relation) { @@ -275,6 +289,8 @@ function getCommitteeGroups(Entities\EvaluationMethodConfiguration $evaluation_c } } + $app->rcache->save($cache_key, $committee); + return $committee; } @@ -291,6 +307,11 @@ function evaluationPhaseUsesTiebreaker(Entities\EvaluationMethodConfiguration|nu return false; } + $cache_key = __METHOD__ . ':' . $evaluation_method_configuration->id; + if($app->rcache->contains($cache_key)){ + return $app->rcache->fetch($cache_key); + } + /** @var Connection */ $conn = $app->em->getConnection(); @@ -308,6 +329,8 @@ function evaluationPhaseUsesTiebreaker(Entities\EvaluationMethodConfiguration|nu 'id' => $evaluation_method_configuration->id ]); + $app->rcache->save($cache_key, (bool) $uses); + return (bool) $uses; } @@ -324,6 +347,11 @@ function registrationNeedsTiebreaker(Registration $registration): bool { return false; } + $cache_key = __METHOD__ . ':' . $registration->id; + if($app->rcache->contains($cache_key)){ + return $app->rcache->fetch($cache_key); + } + $registration_committee = $registration->getCommittees(true); $valuer_users = []; @@ -365,6 +393,7 @@ function registrationNeedsTiebreaker(Registration $registration): bool { } if($num > 0) { + $app->rcache->save($cache_key, false); return false; } } @@ -382,14 +411,19 @@ function registrationNeedsTiebreaker(Registration $registration): bool { // se há mais que um valor no array, então há divergência if(count(array_unique($results)) > 1) { - return true; + $result = true; } else { - return false; + $result = false; } + + $app->rcache->save($cache_key, $result); + return $result; } public function redistributeRegistrations(Entities\Opportunity $opportunity) { $app = App::i(); + $opportunity->registerRegistrationMetadata(); + $evaluation_config = $opportunity->evaluationMethodConfiguration; $conn = $app->em->getConnection(); @@ -404,19 +438,12 @@ public function redistributeRegistrations(Entities\Opportunity $opportunity) { $committee['@tiebreaker'] = $tiebreaker_committee; } - $must_enqueue_evaluation_config = false; - $non_tiebreaker_valuers = []; foreach($committee as $group => $committee_users) { $valuers_per_registration = (int) ($evaluation_config->valuersPerRegistration->$group ?? 0); $ignore_started_evaluations = $evaluation_config->ignoreStartedEvaluations->$group ?? false; - if(!$valuers_per_registration) { - $must_enqueue_evaluation_config = true; - continue; - } - $committee_user_ids = array_map(fn($user) => $user->id, $committee_users); $_user_ids = implode(',', $committee_user_ids); @@ -493,16 +520,40 @@ public function redistributeRegistrations(Entities\Opportunity $opportunity) { } foreach($result as &$reg) { + /** @var Registration $registration */ + $registration = $app->repo('Registration')->find($reg->id); + + if(!$this->mustBeEvaluatedByCommittee($evaluation_config, $registration, $group)) { + if($app->config['app.log.evaluations']) { + $app->log->debug("Registration:: {$reg->id} não pode ser avaliada pela comissão: $group"); + } + continue; + } + + if($valuers_per_registration && (count($reg->valuers) >= $valuers_per_registration)) { + if($app->config['app.log.evaluations']) { + $app->log->debug("Registration:: {$reg->id} já conta com todos os avaliadores necessários"); + } + continue; + } + foreach($valuers as &$valuer) { $user = $valuer->user; + + if($valuers_per_registration && (count($reg->valuers) >= $valuers_per_registration)) { + if($app->config['app.log.evaluations']) { + $app->log->debug("Registration:: {$reg->id} já conta com todos os avaliadores necessários"); + } + break; + } - if(count($reg->valuers) >= $valuers_per_registration || in_array($user->id, $reg->valuers)) { + if(in_array($user->id, $reg->valuers)) { + if($app->config['app.log.evaluations']) { + $app->log->debug("Registration:: {$reg->id} - User: {$valuer->user->id} já é avaliador"); + } continue; } - /** @var Registration $registration */ - $registration = $app->repo('Registration')->find($reg->id); - if($group == '@tiebreaker' && !$this->registrationNeedsTiebreaker($registration)) { continue; } @@ -511,9 +562,15 @@ public function redistributeRegistrations(Entities\Opportunity $opportunity) { $reg->valuers[] = $user->id; $valuer->count++; } + + if($app->config['app.log.evaluations']) { + $app->log->debug("Registration: {$reg->id} - User: {$valuer->user->id} - Count: {$valuer->count}"); + } + } usort($valuers, fn($u1, $u2) => $u1->count <=> $u2->count); + $app->em->clear(); } foreach($result as $r) { @@ -526,18 +583,176 @@ public function redistributeRegistrations(Entities\Opportunity $opportunity) { } foreach($registrations_valuers as $registration_id => $r) { - $app->log->debug(print_r($r->valuers, true)); - $users = array_merge($r->valuers_exceptions_list->include, $r->valuers_exceptions_list->exclude, $r->valuers); $r->valuers_exceptions_list->include = $r->valuers; $json = json_encode ($r->valuers_exceptions_list); - - $app->log->debug("$registration_id $json"); $conn->update('registration', ['valuers_exceptions_list' => $json], ['id' => $registration_id]); - $r = $app->repo('Registration')->find($registration_id); - $r->enqueueToPCacheRecreation($users); + + if($app->config['app.log.evaluations']) { + $app->log->debug("Avaliadores da inscrição {$registration_id}: " . json_encode($r->valuers)); + } + } + + // atualiza os resumos das avaliações + $evaluationMethodConfiguration = $opportunity->evaluationMethodConfiguration; + $app->mscache->delete($evaluationMethodConfiguration->summaryCacheKey); + + if($app->config['app.log.evaluations']) { + $app->log->debug("Atualizando o resumo de avaliações da fase {$evaluationMethodConfiguration->name} ({$evaluationMethodConfiguration->id})"); + + } + $evaluationMethodConfiguration->getSummary(true); + + /** @var EvaluationMethodConfigurationAgentRelation[] */ + $relations = $evaluationMethodConfiguration->getAgentRelations(); + foreach($relations as $relation) { + $relation->updateSummary(); + } + } + + /** + * Verifica se a inscrição deve ser avaliada por um determinado comitê + * @param mixed $registration + * @param string $committee_name + * @return bool + */ + public function mustBeEvaluatedByCommittee(EvaluationMethodConfiguration $evaluation_config, Registration $registration, string $committee_name): bool { + $can = true; + + $global_filter_configs = $evaluation_config->fetchFields; + $global_filter_configs = (array) ($global_filter_configs->$committee_name ?? []); + + if ( $categories = $global_filter_configs['category'] ?? null) { + unset($global_filter_configs['category']); + if(!$this->canEvaluateRegistrationCategory($registration, $categories)) { + $can = false; + } + } + + if ( $ranges = $global_filter_configs['range'] ?? null) { + unset($global_filter_configs['range']); + if(!$this->canEvaluateRegistrationRange($registration, $ranges)) { + $can = false; + } + } + + if ( $proponent_types = $global_filter_configs['proponentType'] ?? null) { + unset($global_filter_configs['proponentType']); + if(!$this->canEvaluateRegistrationProponentType($registration, $proponent_types)) { + $can = false; + } + } + + + if($global_filter_configs) { + if(!$this->canEvaluateRegistrationFields($registration, $global_filter_configs)) { + $can = false; + } + } + + return $can; + } + + /** + * Verifica se a categoria da inscrição deve ser avaliada pelo filtro + * @param Registration $registration + * @param array $filter_configuration + * @return bool + */ + public function canEvaluateRegistrationCategory(Entities\Registration $registration, array $filter_configuration): bool { + foreach($filter_configuration as $cat){ + $cat = trim($cat); + if(strtolower((string)$registration->category) === strtolower($cat)){ + return true; + } + } + + return false; + } + + /** + * Verifica se a faixa da inscrição deve ser avaliada pelo filtro + * @param Registration $registration + * @param array $filter_configuration + * @return bool + */ + public function canEvaluateRegistrationRange(Entities\Registration $registration, array $filter_configuration): bool { + foreach($filter_configuration as $cat){ + $cat = trim($cat); + if(strtolower((string)$registration->range) === strtolower($cat)){ + return true; + } + } + + return false; + } + + /** + * Verifica se o tipo de proponente da inscrição deve ser avaliada pelo filtro + * @param Registration $registration + * @param array $filter_configuration + * @return bool + */ + public function canEvaluateRegistrationProponentType(Entities\Registration $registration, array $filter_configuration): bool { + foreach($filter_configuration as $cat){ + $cat = trim($cat); + if(strtolower((string)$registration->proponentType) === strtolower($cat)){ + return true; + } + } + + return false; + } + + /** + * Verifica se o número da inscrição deve ser avaliada pelo filtro por número + * @param Registration $registration + * @param string $filter_configuration + * @return bool + */ + public function canEvaluateRegistrationNumber(Entities\Registration $registration, string $filter_configuration) { + $can = true; + + if(preg_match("#([0-9]+) *[-] *([0-9]+)*#", $filter_configuration, $matches)){ + $s1 = $matches[1]; + $s2 = $matches[2]; + + $len = max([strlen($s1), strlen($s2)]); + + $fin = substr($registration->number, -$len); + + if(intval($s2) == 0){ // "00" => "100" + $s2 = "1$s2"; + } + if($fin < $s1 || $fin > $s2){ + $can = false; + } + } + + return $can; + } + + public function canEvaluateRegistrationFields(Entities\Registration $registration, array $filter_configuration): bool { + $can = true; + /** @var Opportunity $opportunity */ + $opportunity = $registration->opportunity; + $opportunity->registerRegistrationMetadata(); + + foreach($filter_configuration as $field_name => $values){ + $found_field = false; + foreach($values as $val) { + $val = trim($val); + + if(strtolower((string)$registration->metadata[$field_name]) === strtolower($val)){ + $found_field = true; + } + } + + if($values && !$found_field){ + $can = false; + } } - $app->persistPCachePendingQueue(); + return $can; } public function canUserEvaluateRegistration(Entities\Registration $registration, User|GuestUser $user, $skip_exceptions = false, $skip_valuers_limit = false){ @@ -547,7 +762,7 @@ public function canUserEvaluateRegistration(Entities\Registration $registration, return false; } - $cache_key = "$registration -> $user"; + $cache_key = "$registration -> $user -> $skip_exceptions -> $skip_valuers_limit"; if(!$skip_exceptions && !$skip_valuers_limit && $app->rcache->contains($cache_key)){ return $app->rcache->fetch($cache_key); } @@ -555,11 +770,15 @@ public function canUserEvaluateRegistration(Entities\Registration $registration, $evaluation_config = $registration->evaluationMethodConfiguration; $valuers_per_registration_config = $evaluation_config->valuersPerRegistration; - - $agent_relations = $app->repo('EvaluationMethodConfigurationAgentRelation')->findBy([ - 'owner' => $evaluation_config, - 'agent' => $user->profile - ]); + $agent_relations = []; + + foreach($evaluation_config->getRelatedAgents(return_relations: true) as $relations) { + $agent_relations = array_merge($agent_relations, $relations); + } + + $agent_relations = array_filter($agent_relations, function($ar) use($user) { + return $ar->agent->user->equals($user); + }); $is_same_as_evaluator = false; $has_global_filter_configs = false; @@ -621,14 +840,14 @@ public function canUserEvaluateRegistration(Entities\Registration $registration, if($can = $evaluation_config->canUser('@control', $user) && !$has_limit){ $fetch = []; - $config_fetch = is_array($evaluation_config->fetch) ? $evaluation_config->fetch : (array) $evaluation_config->fetch; - $config_fetchCategories = is_array($evaluation_config->fetchCategories) ? $evaluation_config->fetchCategories : (array) $evaluation_config->fetchCategories; - $config_ranges = is_array($evaluation_config->fetchRanges) ? $evaluation_config->fetchRanges : (array) $evaluation_config->fetchRanges; - $config_proponent_types = is_array($evaluation_config->fetchProponentTypes) ? $evaluation_config->fetchProponentTypes : (array) $evaluation_config->fetchProponentTypes; - $config_selection_fields = is_array($evaluation_config->fetchSelectionFields) ? $evaluation_config->fetchSelectionFields : (array) $evaluation_config->fetchSelectionFields; - $global_filter_configs = isset($evaluation_config->fetchFields) && is_array($evaluation_config->fetchFields) ? $evaluation_config->fetchFields : (array) $evaluation_config->fetchFields; + $config_fetch = (array) $evaluation_config->fetch; + $config_fetchCategories = (array) $evaluation_config->fetchCategories; + $config_ranges = (array) $evaluation_config->fetchRanges; + $config_proponent_types = (array) $evaluation_config->fetchProponentTypes; + $config_selection_fields = (array) $evaluation_config->fetchSelectionFields; + $global_filter_configs = (array) $evaluation_config->fetchFields; - $relations = $registration->opportunity->evaluationMethodConfiguration->agentRelations; + $relations = $evaluation_config->agentRelations; if(is_array($global_filter_configs)) { $global_config_categories = []; @@ -637,20 +856,14 @@ public function canUserEvaluateRegistration(Entities\Registration $registration, $global_config_selection_fields = []; foreach($relations as $relation) { - if($relation->agent->id == $user->profile->id) { + if($relation->agent->user->equals($user)) { $committee_config = $global_filter_configs[$relation->group] ?? (object) []; - if(!empty($committee_config->category)) { - $global_config_categories = array_merge($global_config_categories, (array) $committee_config->category); - } + $global_config_categories = array_merge($global_config_categories, (array) ($committee_config->category ?? [])); - if(!empty($committee_config->range)) { - $global_config_ranges = array_merge($global_config_ranges, (array) $committee_config->range); - } + $global_config_ranges = array_merge($global_config_ranges, (array) ($committee_config->range ?? [])); - if(!empty($committee_config->proponentType)) { - $global_config_proponent_types = array_merge($global_config_proponent_types, (array) $committee_config->proponentType); - } + $global_config_proponent_types = array_merge($global_config_proponent_types, (array) ($committee_config->proponentType ?? [])); foreach ($committee_config as $key => $value) { if (!in_array($key, ['category', 'range', 'proponentType', 'distribution'])) { @@ -712,125 +925,38 @@ public function canUserEvaluateRegistration(Entities\Registration $registration, } } - if(isset($fetch[$user->id])){ - $ufetch = $fetch[$user->id]; - if(preg_match("#([0-9]+) *[-] *([0-9]+)*#", $ufetch, $matches)){ - $s1 = $matches[1]; - $s2 = $matches[2]; - - $len = max([strlen($s1), strlen($s2)]); - - $fin = substr($registration->number, -$len); - - if(intval($s2) == 0){ // "00" => "100" - $s2 = "1$s2"; - } - if($fin < $s1 || $fin > $s2){ - $can = false; - } + // verifica permissão de avaliação por número da inscrição + if ($ufetch = $fetch[$user->id] ?? false){ + if(!$this->canEvaluateRegistrationNumber($registration, $ufetch)){ + $can = false; } } - if(isset($fetch_categories[$user->id])){ - $ucategories = $fetch_categories[$user->id]; - if($ucategories){ - if(!is_array($ucategories)) { - $ucategories = explode(';', $ucategories); - } - - if($ucategories){ - $found = false; - - foreach($ucategories as $cat){ - $cat = trim($cat); - if(strtolower((string)$registration->category) === strtolower($cat)){ - $found = true; - } - } - - if(!$found) { - $can = false; - } - } + // verifica permissão de avaliação por categoria + if ($ucategories = $fetch_categories[$user->id] ?? false){ + if(!$this->canEvaluateRegistrationCategory($registration, $ucategories)){ + $can = false; } } - if(isset($fetch_ranges[$user->id])){ - $uranges = $fetch_ranges[$user->id]; - if($uranges){ - if(!is_array($uranges)) { - $uranges = explode(';', $uranges); - } - - if($uranges){ - $found = false; - - foreach($uranges as $ran){ - $ran = trim($ran); - if(strtolower((string)$registration->range) === strtolower($ran)){ - $found = true; - } - } - - if(!$found) { - $can = false; - } - } + // verifica permissão de avaliação por faixa + if ($uranges = $fetch_ranges[$user->id] ?? false){ + if(!$this->canEvaluateRegistrationRange($registration, $uranges)){ + $can = false; } } - - if(isset($fetch_proponent_types[$user->id])){ - $uproponet_types = $fetch_proponent_types[$user->id]; - if($uproponet_types){ - if(!is_array($uproponet_types)) { - $uproponet_types = explode(';', $uproponet_types); - } - - if($uproponet_types){ - $found = false; - foreach($uproponet_types as $ran){ - $ran = trim($ran); - if(strtolower((string)$registration->proponentType) === strtolower($ran)){ - $found = true; - } - } - - if(!$found) { - $can = false; - } - } + // verifica permissão de avaliação por tipo de proponente + if ($uproponent_types = $fetch_proponent_types[$user->id] ?? false){ + if(!$this->canEvaluateRegistrationProponentType($registration, $uproponent_types)){ + $can = false; } } - - if(isset($fetch_selection_fields[$user->id])){ - $uselection_fields = $fetch_selection_fields[$user->id]; - if($uselection_fields){ - if($uselection_fields){ - $found_selection_fields = false; - - /** @var Opportunity $opportunity */ - $opportunity = $registration->opportunity; - $opportunity->registerRegistrationMetadata(); - $fields = $opportunity->registrationFieldConfigurations; - - $field_name = []; - foreach($fields as $field) { - $field_name[$field->title] = $field->fieldName; - } - foreach($uselection_fields as $key => $values){ - foreach($values as $val) { - $val = trim($val); - - if(strtolower((string)$registration->metadata[$field_name[$key]]) === strtolower($val)){ - $found_selection_fields = true; - } - } - } - - $can = $found_selection_fields ? true : false; - } + // verifica permissão de avaliação por campos de seleção + if ($uselection_fields = $fetch_selection_fields[$user->id] ?? false){ + if(!$this->canEvaluateRegistrationFields($registration, $uselection_fields)){ + $can = false; } } } diff --git a/src/core/Repositories/Opportunity.php b/src/core/Repositories/Opportunity.php index 1fcd635ff0..0f4854bc30 100644 --- a/src/core/Repositories/Opportunity.php +++ b/src/core/Repositories/Opportunity.php @@ -4,7 +4,12 @@ use MapasCulturais\Entities\ProjectOpportunity; use MapasCulturais\Entities\Project; use DateTime; - +use Doctrine\DBAL\Exception; +use Doctrine\ORM\Query; +use LogicException; +use Doctrine\ORM\Exception\ORMException; +use MapasCulturais\App; +use Psr\Cache\InvalidArgumentException; class Opportunity extends \MapasCulturais\Repository{ use Traits\RepositoryKeyword, @@ -68,5 +73,47 @@ function findByProjectAndOpportunityMeta(Project $project, $key, $value, $status return $query->getResult(); } + + /** + * Retornar as oportunidades que o avaliador pode avaliar + * + * @param int $valuer_user_id + * @return Opportunity[]|array + */ + function findValuerOpportunities(int $valuer_user_id, $only_ids = false, $hydration_mode = Query::HYDRATE_OBJECT): array { + $app = App::i(); + + $conn = $app->em->getConnection(); + + $opportunity_ids = $conn->fetchFirstColumn(" + select distinct(opportunity_id) from evaluations where valuer_user_id = :valuer_user_id; + ", [ + 'valuer_user_id' => $valuer_user_id, + ]); + if (empty($opportunity_ids)) { + return []; + } + + if($only_ids) { + return $opportunity_ids; + } + + $query = $app->em->createQuery(" + SELECT + o + FROM + MapasCulturais\Entities\Opportunity o + WHERE + o.id in (:opportunity_ids) + AND o.status = 1 OR o.status = -1" + + ); + + $query->setParameters([ + 'opportunity_ids' => $opportunity_ids, + ]); + + return $query->getResult($hydration_mode); + } } diff --git a/src/core/Theme.php b/src/core/Theme.php index d4273364d3..43b58e92f0 100644 --- a/src/core/Theme.php +++ b/src/core/Theme.php @@ -860,7 +860,7 @@ function autoLinkString($text, $force = false) { } - function addRequestedEntityToJs(string $entity_class_name = null, int $entity_id = null, Entity $entity = null) { + function addRequestedEntityToJs(string $entity_class_name = null, int $entity_id = null, Entity $entity = null, $disable_access_control = false){ $entity_class_name = $entity_class_name ?: $this->controller->entityClassName ?? null; $entity_id = $entity_id ?: $this->controller->data['id'] ?? null; @@ -905,11 +905,17 @@ function addRequestedEntityToJs(string $entity_class_name = null, int $entity_id } $app->applyHookBoundTo($this, "view.requestedEntity($_entity).params", [&$query_params, $entity_class_name, $entity_id]); - + if($disable_access_control) { + $app->disableAccessControl(); + } + $query = new ApiQuery($entity_class_name, $query_params); $query->__useDQLCache = false; $e = $query->findOne(); + if($disable_access_control) { + $app->enableAccessControl(); + } } else { $e = $entity->jsonSerialize(); @@ -1025,5 +1031,4 @@ function addRequestedEntityToJs(string $entity_class_name = null, int $entity_id $this->jsObject['requestedEntity'] = $e; } } - -} +} \ No newline at end of file diff --git a/src/core/Traits/EntityAgentRelation.php b/src/core/Traits/EntityAgentRelation.php index cb02e7c697..4997331b3e 100644 --- a/src/core/Traits/EntityAgentRelation.php +++ b/src/core/Traits/EntityAgentRelation.php @@ -1,9 +1,12 @@ getAgentRelations($has_control, $include_pending_relations); + $result = array_filter($relations, function($relation) use ($user){ + return $relation->agent->user->id === $user->id; + }); + + return $result; + } + function getAgentRelations($has_control = null, $include_pending_relations = false){ if(!$this->id){ return []; diff --git a/src/db-updates.php b/src/db-updates.php index 1647ed1097..03aea641e6 100644 --- a/src/db-updates.php +++ b/src/db-updates.php @@ -1152,6 +1152,13 @@ function __try($sql, $cb = null){ __exec("ALTER TABLE permission_cache_pending ALTER column id SET DEFAULT nextval('permission_cache_pending_seq');"); }, + 'altera o tipo da coluna valuers_exceptions_list da tabela registration para jsonb' => function () { + __exec("ALTER TABLE registration ALTER COLUMN valuers_exceptions_list DROP DEFAULT;"); + __exec("ALTER TABLE registration ALTER COLUMN valuers_exceptions_list TYPE JSONB USING valuers_exceptions_list::JSONB"); + __exec("ALTER TABLE registration ALTER COLUMN valuers_exceptions_list SET DEFAULT '{\"include\": [], \"exclude\": []}'::jsonb;"); + __exec("CREATE INDEX registration_valuers_index ON registration USING GIN((valuers_exceptions_list->'include') jsonb_path_ops)"); + }, + /// MIGRATIONS - DATA CHANGES ========================================= 'migrate gender' => function() use ($conn) { @@ -1747,15 +1754,15 @@ function __try($sql, $cb = null){ }, - 'DROP VIEW evaluations' => function () { - __try("DROP VIEW evaluations"); + 'DROP MATERIALIZED VIEW evaluations!' => function () { + __try("DROP MATERIALIZED VIEW evaluations"); }, - 'RECREATE MATERIALIZED VIEW evaluations' => function() use($conn) { - __try("DROP MATERIALIZED VIEW IF EXISTS evaluations"); + 'Recria view evaluations!!!!' => function() use($conn) { + __try("DROP VIEW IF EXISTS evaluations"); $conn->executeQuery(" - CREATE MATERIALIZED VIEW evaluations AS ( + CREATE VIEW evaluations AS ( SELECT registration_id, registration_sent_timestamp, @@ -1786,32 +1793,29 @@ function __try($sql, $cb = null){ ON re.registration_id = r.id JOIN usr u ON u.id = re.user_id - where - r.status > 0 - UNION + WHERE + r.status > 0 + UNION SELECT r2.id AS registration_id, r2.sent_timestamp AS registration_sent_timestamp, r2.number AS registration_number, r2.category AS registration_category, r2.agent_id AS registration_agent_id, - p2.user_id AS valuer_user_id, + u2.id AS valuer_user_id, u2.profile_id AS valuer_agent_id, r2.opportunity_id, NULL AS evaluation_id, NULL AS evaluation_result, NULL AS evaluation_status + FROM registration r2 - JOIN pcache p2 - ON p2.object_id = r2.id AND - p2.object_type = 'MapasCulturais\Entities\Registration' AND - p2.action = 'evaluateOnTime' JOIN usr u2 - ON u2.id = p2.user_id + on ('[' || u2.id || ']')::jsonb <@ (r2.valuers_exceptions_list->'include') JOIN evaluation_method_configuration emc ON emc.opportunity_id = r2.opportunity_id - WHERE - r2.status > 0 + WHERE + r2.status = 1 ) AS evaluations_view GROUP BY registration_id, @@ -1826,15 +1830,8 @@ function __try($sql, $cb = null){ "); }, - 'enqueue job to refresh materialized view evaluations' => function() use($conn) { - $app = App::i(); - - $app->disableAccessControl(); - // é para rodar a cada minuto, por 10 anos - $app->enqueueOrReplaceJob(\Opportunities\Jobs\RefreshViewEvaluations::SLUG, [], interval_string: '1 minute', iterations: 60*24*365*10); - - // retorna false para executar a cada redeploy do serviço - return false; + 'delete job de refresh materialized view evaluations' => function() use($conn) { + __exec("DELETE FROM job WHERE name = 'RefreshViewEvaluations'"); }, 'adiciona oportunidades na fila de reprocessamento de cache' => function () use($conn) { @@ -2667,6 +2664,7 @@ function __try($sql, $cb = null){ 'support', 'viewUserEvaluation', 'evaluateOnTime', + 'evaluateRegistrations', 'createEvents', 'requestEventRelation');"); }, diff --git a/src/mc-updates.php b/src/mc-updates.php index d68cb33438..5fe7c4d1d2 100644 --- a/src/mc-updates.php +++ b/src/mc-updates.php @@ -554,5 +554,20 @@ } }); } - } + }, + + 'Redistribui as avaliações de todas as oportunidades para os avaliadores novamente' => function() use ($app) { + DB_UPDATE::enqueue(Opportunity::class, "id in (select opportunity_id from evaluation_method_configuration)", function (Opportunity $opportunity) use($app) { + if($opportunity->getEvaluationMethodDefinition()){ + $em = $opportunity->getEvaluationMethod(); + $app->log->debug('distribuindo avaliações da oportunidade ' . $opportunity->id . ' - ' . $opportunity->name); + $em->redistributeRegistrations($opportunity); + foreach($opportunity->getEvaluationCommittee(true) as $relation) { + $app->log->debug('atualiza sumário do avaliador ' . $relation->agent->id . ' - ' . $relation->agent->name); + $relation->updateSummary(); + } + + } + }); + }, ]; diff --git a/src/modules/Components/Module.php b/src/modules/Components/Module.php index 0543fdb592..71500c002e 100644 --- a/src/modules/Components/Module.php +++ b/src/modules/Components/Module.php @@ -124,13 +124,13 @@ function _init() $this->insideApp = false; $this->part('main-app--end'); },1000); - + if ($app->config['app.mode'] == 'development') { $app->hook('template(<<*>>):<<*>>', function () use($app) { $hook = $app->hooks->hookStack[count($app->hooks->hookStack) - 1]->name; if($this->version >= 2) { $this->import('mc-debug'); - echo "\n"; + echo "\n"; } }); } @@ -165,7 +165,7 @@ function _init() if ($app->mode == APPMODE_DEVELOPMENT) { $this->import('mc-debug'); - echo ""; + echo ""; } $app->applyHookBoundTo($this, $hook_name, $params); @@ -304,7 +304,7 @@ function _init() $app->applyHookBoundTo($this, "component({$component}):after", [$__data]); - if ($app->mode == APPMODE_DEVELOPMENT) { + if ($app->config['app.mode'] == APPMODE_DEVELOPMENT) { echo "\n"; } diff --git a/src/modules/Components/assets/js/components-base/API.js b/src/modules/Components/assets/js/components-base/API.js index fa8398d111..ae9ae75efd 100644 --- a/src/modules/Components/assets/js/components-base/API.js +++ b/src/modules/Components/assets/js/components-base/API.js @@ -90,7 +90,7 @@ globalThis.useEntitiesLists = Pinia.defineStore('entitiesLists', { globalThis.apiInstances = {}; class API { - constructor(objectType, scope, fetchOptions) { + constructor(objectType, scope = 'default', fetchOptions = undefined) { const instanceId = `${objectType}:${scope}`; if (apiInstances[instanceId]) { return apiInstances[instanceId]; @@ -99,7 +99,6 @@ class API { this.cache = useEntitiesCache(); this.lists = useEntitiesLists(); this.objectType = objectType; - this.abortController = null; this.options = { cacheMode: 'force-cache', ...fetchOptions @@ -273,11 +272,9 @@ class API { return this.fetch('find', query, {list, raw, rawProcessor}); } - async fetch(endpoint, query, {list, raw, rawProcessor, refresh}) { + async fetch(endpoint, query, { list, raw, rawProcessor, refresh, signal }) { let url = this.createApiUrl(endpoint, query); - this.abortController?.abort(); - this.abortController = new AbortController(); - return this.GET(url, {}, { signal: this.abortController.signal }).then(response => response.json().then(objs => { + return this.GET(url, {}, { signal }).then(response => response.json().then(objs => { let result; if(raw) { rawProcessor = rawProcessor || Utils.entityRawProcessor; diff --git a/src/modules/Components/components/mc-debug/template.php b/src/modules/Components/components/mc-debug/template.php index 5d075b0a5f..071b9fde85 100644 --- a/src/modules/Components/components/mc-debug/template.php +++ b/src/modules/Components/components/mc-debug/template.php @@ -4,4 +4,4 @@ * @var MapasCulturais\Themes\BaseV2\Theme $this */ ?> -{{name}} \ No newline at end of file +{{name}} \ No newline at end of file diff --git a/src/modules/Components/components/mc-entities/script.js b/src/modules/Components/components/mc-entities/script.js index 19173b09cf..f41d6170af 100644 --- a/src/modules/Components/components/mc-entities/script.js +++ b/src/modules/Components/components/mc-entities/script.js @@ -4,6 +4,7 @@ app.component('mc-entities', { data() { return { + abortController: null, api: new API(this.type, this.scope || 'default'), entities: [], page: 1, @@ -58,10 +59,7 @@ app.component('mc-entities', { }, limit: Number, permissions: String, - order: { - type: String, - default: 'id ASC' - }, + order: String, watchQuery: { type: Boolean, default: false @@ -86,36 +84,48 @@ app.component('mc-entities', { } }, - + + computed: { + defaultOrder () { + if ($DESCRIPTIONS[this.type].name) { + return 'name ASC'; + } else { + return 'id ASC'; + } + } + }, + methods: { populateQuery(query) { if (this.select) { query['@select'] = this.select; - } - + } + if (this.ids) { query[this.API.$PK] = 'IN(' + this.ids.join(',') + ')' } if (this.order) { query['@order'] = this.order; + } else if (!query['@order']) { + query['@order'] = this.defaultOrder; } - + if (this.limit) { query['@limit'] = this.limit; query['@page'] = this.page; } - + if (this.permissions) { query['@permissions'] = this.permissions; } }, getDataFromApi() { - let query = {...this.query}; - + const query = {...this.query}; + this.$emit('loading', query); - + this.populateQuery(query); const options = {list: this.entities, refresh: true}; @@ -123,12 +133,16 @@ app.component('mc-entities', { if (this.limit && this.page) { query['@page'] = this.page; } - + if (this.rawProcessor) { options.raw = true; options.rawProcessor = this.rawProcessor; }; + this.abortController?.abort(); + this.abortController = new AbortController(); + options.signal = this.abortController.signal; + const result = this.api.fetch(this.endpoint, query, options); result.then((entities) => { @@ -137,27 +151,22 @@ app.component('mc-entities', { return result; }, - - refresh(debounce) { - if (this.entities.loading) { - return; - }; + refresh(debounce) { if (this.timeout) { - clearTimeout(this.timeout) + clearTimeout(this.timeout); }; - this.entities.splice(0); this.timeout = setTimeout(() => { + this.entities.splice(0); this.entities.loading = true; - + this.getDataFromApi() .then(() => { this.entities.loading = false; }) }, debounce); }, - loadMore() { if (!this.limit) { @@ -197,4 +206,4 @@ app.component('mc-entities', { } }, }, -}); \ No newline at end of file +}); diff --git a/src/modules/Components/components/mc-status/script.js b/src/modules/Components/components/mc-status/script.js index 056f098d89..9ad0720804 100644 --- a/src/modules/Components/components/mc-status/script.js +++ b/src/modules/Components/components/mc-status/script.js @@ -33,11 +33,13 @@ app.component('mc-status', { case 'pago': case 'enviado': case 'enviada': + case 'habilitado': classes.push('mc-status--success'); break; case 'não selecionado': case 'não selecionada': + case 'inabilitado': case 'não aceito': case 'inválido': case 'inválida': @@ -59,23 +61,19 @@ app.component('mc-status', { case 'enviada': classes.push('mc-status--primary'); break; - case 'Avaliações pendentes': - case 'Avaliação pendente': + case 'avaliações pendentes': case 'avaliação pendente': classes.push('mc-status--evaluation-pending'); break; - case 'Avaliações iniciadas': - case 'Avaliação iniciada': + case 'avaliações iniciadas': case 'avaliação iniciada': classes.push('mc-status--evaluation-started'); break; - case 'Avaliações concluídas': - case 'Avaliação concluída': + case 'avaliações concluídas': case 'avaliação concluída': classes.push('mc-status--evaluation-completed'); break; - case 'Avaliações enviadas': - case 'Avaliação enviada': + case 'avaliações enviadas': case 'avaliação enviada': classes.push('mc-status--evaluation-sent'); break; diff --git a/src/modules/Components/components/mc-summary-evaluate/init.php b/src/modules/Components/components/mc-summary-evaluate/init.php index 015f9123c8..410a8f8325 100644 --- a/src/modules/Components/components/mc-summary-evaluate/init.php +++ b/src/modules/Components/components/mc-summary-evaluate/init.php @@ -5,49 +5,19 @@ $data['isActive'] = false; if($requestedEntity instanceof MapasCulturais\Entities\EvaluationMethodConfiguration){ - $entity = $requestedEntity; + $evaluation_method_configuration = $requestedEntity; }else if($requestedEntity instanceof MapasCulturais\Entities\Opportunity){ - $entity = $requestedEntity->evaluationMethodConfiguration; + $evaluation_method_configuration = $requestedEntity->evaluationMethodConfiguration; }else if($requestedEntity instanceof MapasCulturais\Entities\Registration){ - $entity = $requestedEntity->opportunity->evaluationMethodConfiguration; + $evaluation_method_configuration = $requestedEntity->opportunity->evaluationMethodConfiguration; } - - $conn = $app->em->getConnection(); +if($this->controller->action == 'allEvaluations') { + $data = $evaluation_method_configuration->getValuerSummary(); +} else { $user = isset($this->controller->data['user']) ? $app->repo("User")->find($this->controller->data['user']) : $app->user; - - if ($entity->opportunity->canUser('@control') && $this->controller->action == "allEvaluations") { - $user_filter = ' > 0'; - } else { - $user_filter = "= {$user->id}"; - } - - $buildQuery = function($colluns = "*", $params = "", $type = "fetchAll") use ($conn, $entity){ - return $conn->$type("SELECT {$colluns} FROM evaluations e WHERE opportunity_id = {$entity->opportunity->id} {$params}"); - }; - - $pending = $buildQuery("DISTINCT count(e.registration_id) as qtd", "AND e.evaluation_status IS NULL AND valuer_user_id $user_filter", "fetchAssoc"); - $data['pending'] = $pending['qtd']; - - $completed = $buildQuery("DISTINCT count(e.registration_id) as qtd", "AND e.evaluation_status = 1 AND valuer_user_id $user_filter", "fetchAssoc"); - $data['completed'] = $completed['qtd']; + $data = $evaluation_method_configuration->getValuerSummary($user); +} - $sent = $buildQuery("DISTINCT count(e.registration_id) as qtd", "AND e.evaluation_status = 2 AND valuer_user_id $user_filter", "fetchAssoc"); - $data['sent'] = $sent['qtd']; - - $started = $conn->fetchAssoc(" - SELECT DISTINCT count(e.registration_id) as qtd - FROM registration_evaluation e - WHERE - e.status = 0 AND - e.registration_id IN ( - SELECT r.id - FROM registration r - WHERE r.opportunity_id = {$entity->opportunity->id} - ) AND - user_id $user_filter"); - $data['started'] = $started['qtd']; - $data['isActive'] = true; - -$this->jsObject['config']['summaryEvaluations'] = $data; - +$data['isActive'] = true; +$this->jsObject['config']['summaryEvaluations'] = $data; \ No newline at end of file diff --git a/src/modules/Components/components/select-entity/template.php b/src/modules/Components/components/select-entity/template.php index e96816c811..4ca2c2a628 100644 --- a/src/modules/Components/components/select-entity/template.php +++ b/src/modules/Components/components/select-entity/template.php @@ -23,7 +23,7 @@