From 1000b5a030734e5ad1e29591a5cff8f19744e14b Mon Sep 17 00:00:00 2001 From: deyvisonwanderley Date: Fri, 5 Dec 2025 12:57:35 -0300 Subject: [PATCH] feat: add approval/rejection information and change history display in AprovarAusencias and AprovarFerias components for enhanced user feedback --- .../lib/components/AprovarAusencias.svelte | 74 ++++++++ .../src/lib/components/AprovarFerias.svelte | 43 ++++- .../routes/(dashboard)/perfil/+page.svelte | 169 +++++++++++++++++- .../controle-ponto/banco-horas/+page.svelte | 2 + .../recursos-humanos/ferias/+page.svelte | 4 - .../ti/painel-permissoes/+page.svelte | 11 +- packages/backend/convex/ausencias.ts | 79 +++++++- packages/backend/convex/ferias.ts | 23 ++- packages/backend/convex/tables/ausencias.ts | 11 +- 9 files changed, 389 insertions(+), 27 deletions(-) diff --git a/apps/web/src/lib/components/AprovarAusencias.svelte b/apps/web/src/lib/components/AprovarAusencias.svelte index f58e22d..fd7279f 100644 --- a/apps/web/src/lib/components/AprovarAusencias.svelte +++ b/apps/web/src/lib/components/AprovarAusencias.svelte @@ -254,6 +254,80 @@ + + {#if solicitacao.status === 'aprovado'} +
+ +
+
Aprovado
+ {#if solicitacao.gestor} +
+ Por: {solicitacao.gestor.nome} +
+ {/if} + {#if solicitacao.dataAprovacao} +
+ Em: {new Date(solicitacao.dataAprovacao).toLocaleString('pt-BR')} +
+ {/if} +
+
+ {/if} + + {#if solicitacao.status === 'reprovado'} +
+ +
+
Reprovado
+ {#if solicitacao.gestor} +
+ Por: {solicitacao.gestor.nome} +
+ {/if} + {#if solicitacao.dataReprovacao} +
+ Em: {new Date(solicitacao.dataReprovacao).toLocaleString('pt-BR')} +
+ {/if} + {#if solicitacao.motivoReprovacao} +
+
Motivo:
+
{solicitacao.motivoReprovacao}
+
+ {/if} +
+
+ {/if} + + + {#if solicitacao.historicoAlteracoes && solicitacao.historicoAlteracoes.length > 0} +
+

+
+ +
+ Histórico de Alterações +

+
+
+
+ {#each solicitacao.historicoAlteracoes as hist} +
+ +
+
{hist.acao}
+
+ {new Date(hist.data).toLocaleString('pt-BR')} +
+
+
+ {/each} +
+
+
+
+ {/if} + {#if erro}
diff --git a/apps/web/src/lib/components/AprovarFerias.svelte b/apps/web/src/lib/components/AprovarFerias.svelte index a478e42..10231b0 100644 --- a/apps/web/src/lib/components/AprovarFerias.svelte +++ b/apps/web/src/lib/components/AprovarFerias.svelte @@ -410,13 +410,48 @@ {/if} {/if} + + {#if periodo.status === 'aprovado' || periodo.status === 'data_ajustada_aprovada' || periodo.status === 'EmFérias'} +
+ +
+
Aprovado
+ {#if periodo.gestor} +
+ Por: {periodo.gestor.nome} +
+ {/if} + {#if periodo.dataAprovacao} +
+ Em: {formatarData(periodo.dataAprovacao)} +
+ {/if} +
+
+ {/if} + - {#if periodo.status === 'reprovado' && periodo.motivoReprovacao} + {#if periodo.status === 'reprovado'}
-
-
Motivo da Reprovação:
-
{periodo.motivoReprovacao}
+
+
Reprovado
+ {#if periodo.gestor} +
+ Por: {periodo.gestor.nome} +
+ {/if} + {#if periodo.dataReprovacao} +
+ Em: {formatarData(periodo.dataReprovacao)} +
+ {/if} + {#if periodo.motivoReprovacao} +
+
Motivo:
+
{periodo.motivoReprovacao}
+
+ {/if}
{/if} diff --git a/apps/web/src/routes/(dashboard)/perfil/+page.svelte b/apps/web/src/routes/(dashboard)/perfil/+page.svelte index 5e41ee1..9df859e 100644 --- a/apps/web/src/routes/(dashboard)/perfil/+page.svelte +++ b/apps/web/src/routes/(dashboard)/perfil/+page.svelte @@ -62,10 +62,12 @@ type FuncionarioAtual = FunctionReturnType; type TimeAtual = FunctionReturnType; + type TimesSubordinados = FunctionReturnType; type MinhasSolicitacoes = FunctionReturnType; type MinhasAusencias = FunctionReturnType; let funcionarioEstavel = $state(null); let meuTimeEstavel = $state(null); + let timesSubordinadosEstavel = $state([]); let minhasSolicitacoesEstaveis = $state([]); let minhasAusenciasEstaveis = $state([]); @@ -81,6 +83,8 @@ >('meu-perfil'); let periodoSelecionado = $state | null>(null); + let periodoHistoricoFerias = $state | null>(null); + let ausenciaHistorico = $state | null>(null); let mostrarModalFoto = $state(false); let uploadandoFoto = $state(false); @@ -261,6 +265,13 @@ } }); + $effect(() => { + if (timesSubordinadosQuery?.data && Array.isArray(timesSubordinadosQuery.data)) { + timesSubordinadosEstavel = timesSubordinadosQuery.data; + } + // Não limpar durante carregamento (quando undefined) + }); + // Deriveds - agora apenas extraem dados, não criam queries const funcionario = $derived(funcionarioEstavel); const solicitacoesSubordinados = $derived.by(() => { @@ -274,14 +285,14 @@ const meuTime = $derived(meuTimeEstavel); const minhasSolicitacoes = $derived(minhasSolicitacoesEstaveis); const minhasAusencias = $derived(minhasAusenciasEstaveis); - const timesSubordinados = $derived(timesSubordinadosQuery?.data || []); - const meusTimesGestor = $derived(timesSubordinados); + const timesSubordinados = $derived(timesSubordinadosEstavel); + const meusTimesGestor = $derived(timesSubordinadosEstavel); const rolePermiteAprovacao = $derived( currentUser?.data?.role?.nome === 'TI_MASTER' || currentUser?.data?.role?.nome === 'TI_ADMIN' ); - const ehGestor = $derived((timesSubordinados || []).length > 0 || rolePermiteAprovacao); + const ehGestor = $derived(timesSubordinadosEstavel.length > 0 || rolePermiteAprovacao); // Estados estáveis para Meus Chamados let chamadosEstaveis = $state>>([]); @@ -1613,6 +1624,7 @@ Dias Status Solicitado em + Histórico @@ -1650,6 +1662,21 @@ {new Date(periodo._creationTime).toLocaleDateString('pt-BR')} + + {#if periodo.historicoAlteracoes && periodo.historicoAlteracoes.length > 0} + + {:else} + - + {/if} + {/each} @@ -1809,6 +1836,7 @@ Motivo Status Solicitado em + Histórico @@ -1837,6 +1865,21 @@ {new Date(ausencia.criadoEm).toLocaleDateString('pt-BR')} + + {#if ausencia.historicoAlteracoes && ausencia.historicoAlteracoes.length > 0} + + {:else} + - + {/if} + {/each} @@ -1890,6 +1933,7 @@ Período Dias Status + Histórico Ações @@ -1947,6 +1991,21 @@ {getStatusTexto(periodo.status)}
+ + {#if periodo.historicoAlteracoes && periodo.historicoAlteracoes.length > 0} + + {:else} + - + {/if} +
{#if periodo.status === 'aguardando_aprovacao'} @@ -2021,6 +2080,7 @@ Período Dias Status + Histórico Ações @@ -2081,6 +2141,21 @@ {getStatusTexto(ausencia.status)}
+ + {#if ausencia.historicoAlteracoes && ausencia.historicoAlteracoes.length > 0} + + {:else} + - + {/if} +
{#if ausencia.status === 'aguardando_aprovacao'} @@ -2563,6 +2638,94 @@ {/await} {/if} + +{#if periodoHistoricoFerias} + {#await client.query(api.ferias.obterDetalhes, { feriasId: periodoHistoricoFerias }) then detalhes} + {#if detalhes && detalhes.historicoAlteracoes && detalhes.historicoAlteracoes.length > 0} + + + + + {/if} + {/await} +{/if} + + +{#if ausenciaHistorico} + {@const ausenciaComHistorico = ausenciasFiltradas.find((a) => a._id === ausenciaHistorico) || ausenciasSubordinados.find((a) => a._id === ausenciaHistorico)} + {#if ausenciaComHistorico && ausenciaComHistorico.historicoAlteracoes && ausenciaComHistorico.historicoAlteracoes.length > 0} + + + + + {/if} +{/if} +