diff --git a/apps/web/src/lib/components/AlterarStatusFerias.svelte b/apps/web/src/lib/components/AlterarStatusFerias.svelte index 43f2a44..cb4c52a 100644 --- a/apps/web/src/lib/components/AlterarStatusFerias.svelte +++ b/apps/web/src/lib/components/AlterarStatusFerias.svelte @@ -3,13 +3,14 @@ import { api } from '@sgse-app/backend/convex/_generated/api'; import type { Id, Doc } from '@sgse-app/backend/convex/_generated/dataModel'; - type SolicitacaoFerias = Doc<'solicitacoesFerias'> & { + type PeriodoFerias = Doc<'ferias'> & { funcionario?: Doc<'funcionarios'> | null; gestor?: Doc<'usuarios'> | null; + time?: Doc<'times'> | null; }; interface Props { - solicitacao: SolicitacaoFerias; + solicitacao: PeriodoFerias; usuarioId: Id<'usuarios'>; onSucesso?: () => void; onCancelar?: () => void; @@ -27,7 +28,8 @@ aguardando_aprovacao: 'badge-warning', aprovado: 'badge-success', reprovado: 'badge-error', - data_ajustada_aprovada: 'badge-info' + data_ajustada_aprovada: 'badge-info', + EmFérias: 'badge-info' }; return badges[status] || 'badge-neutral'; } @@ -37,7 +39,8 @@ aguardando_aprovacao: 'Aguardando Aprovação', aprovado: 'Aprovado', reprovado: 'Reprovado', - data_ajustada_aprovada: 'Data Ajustada e Aprovada' + data_ajustada_aprovada: 'Data Ajustada e Aprovada', + EmFérias: 'Em Férias' }; return textos[status] || status; } @@ -48,7 +51,7 @@ erro = ''; await client.mutation(api.ferias.atualizarStatus, { - solicitacaoId: solicitacao._id, + feriasId: solicitacao._id, novoStatus: 'aguardando_aprovacao', usuarioId: usuarioId }); @@ -82,33 +85,28 @@ - +
-

Períodos Solicitados

-
- {#each solicitacao.periodos as periodo, index (index)} -
-
{index + 1}
-
-
- Início: - {new Date(periodo.dataInicio).toLocaleDateString('pt-BR')} -
-
- Fim: - {new Date(periodo.dataFim).toLocaleDateString('pt-BR')} -
-
- Dias: - {periodo.diasCorridos} -
-
+

Período Solicitado

+
+
+
+ Início: + {new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')}
- {/each} +
+ Fim: + {new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')} +
+
+ Dias: + {solicitacao.diasFerias} +
+
diff --git a/apps/web/src/lib/components/AprovarFerias.svelte b/apps/web/src/lib/components/AprovarFerias.svelte index 8a8cdac..3c387c1 100644 --- a/apps/web/src/lib/components/AprovarFerias.svelte +++ b/apps/web/src/lib/components/AprovarFerias.svelte @@ -3,59 +3,55 @@ import { api } from '@sgse-app/backend/convex/_generated/api'; import type { Id, Doc } from '@sgse-app/backend/convex/_generated/dataModel'; - interface Periodo { - dataInicio: string; - dataFim: string; - diasCorridos: number; - } - - type SolicitacaoFerias = Doc<'solicitacoesFerias'> & { + type PeriodoFerias = Doc<'ferias'> & { funcionario?: Doc<'funcionarios'> | null; gestor?: Doc<'usuarios'> | null; + time?: Doc<'times'> | null; }; interface Props { - solicitacao: SolicitacaoFerias; + periodo: PeriodoFerias; gestorId: Id<'usuarios'>; onSucesso?: () => void; onCancelar?: () => void; } - let { solicitacao, gestorId, onSucesso, onCancelar }: Props = $props(); + let { periodo, gestorId, onSucesso, onCancelar }: Props = $props(); const client = useConvexClient(); let modoAjuste = $state(false); - let periodos = $state([]); + let novaDataInicio = $state(periodo.dataInicio); + let novaDataFim = $state(periodo.dataFim); let motivoReprovacao = $state(''); let processando = $state(false); let erro = $state(''); - $effect(() => { - if (modoAjuste && periodos.length === 0) { - periodos = solicitacao.periodos.map((p) => ({ ...p })); - } + // Calcular dias do período ajustado + const diasAjustados = $derived.by(() => { + if (!novaDataInicio || !novaDataFim) return 0; + const inicio = new Date(novaDataInicio); + const fim = new Date(novaDataFim); + const diffTime = Math.abs(fim.getTime() - inicio.getTime()); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1; + return diffDays; }); - function calcularDias(periodo: Periodo) { - if (!periodo.dataInicio || !periodo.dataFim) { - periodo.diasCorridos = 0; - return; - } + function calcularDias(dataInicio: string, dataFim: string): number { + if (!dataInicio || !dataFim) return 0; - const inicio = new Date(periodo.dataInicio); - const fim = new Date(periodo.dataFim); + const inicio = new Date(dataInicio); + const fim = new Date(dataFim); if (fim < inicio) { erro = 'Data final não pode ser anterior à data inicial'; - periodo.diasCorridos = 0; - return; + return 0; } const diff = fim.getTime() - inicio.getTime(); const dias = Math.ceil(diff / (1000 * 60 * 60 * 24)) + 1; - periodo.diasCorridos = dias; erro = ''; + return dias; } async function aprovar() { @@ -64,19 +60,19 @@ erro = ''; // Validar se as datas e condições estão dentro do regime do funcionário - if (!solicitacao.funcionario?._id) { + if (!periodo.funcionario?._id) { erro = 'Funcionário não encontrado'; processando = false; return; } const validacao = await client.query(api.saldoFerias.validarSolicitacao, { - funcionarioId: solicitacao.funcionario._id, - anoReferencia: solicitacao.anoReferencia, - periodos: solicitacao.periodos.map((p) => ({ - dataInicio: p.dataInicio, - dataFim: p.dataFim - })) + funcionarioId: periodo.funcionario._id, + anoReferencia: periodo.anoReferencia, + periodos: [{ + dataInicio: periodo.dataInicio, + dataFim: periodo.dataFim + }] }); if (!validacao.valido) { @@ -86,7 +82,7 @@ } await client.mutation(api.ferias.aprovar, { - solicitacaoId: solicitacao._id, + feriasId: periodo._id, gestorId: gestorId }); @@ -109,7 +105,7 @@ erro = ''; await client.mutation(api.ferias.reprovar, { - solicitacaoId: solicitacao._id, + feriasId: periodo._id, gestorId: gestorId, motivoReprovacao }); @@ -128,28 +124,27 @@ erro = ''; // Validar se as datas ajustadas e condições estão dentro do regime do funcionário - if (!solicitacao.funcionario?._id) { + if (!periodo.funcionario?._id) { erro = 'Funcionário não encontrado'; processando = false; return; } - // Validar todos os períodos ajustados - for (const periodo of periodos) { - if (!periodo.dataInicio || !periodo.dataFim) { - erro = 'Todos os períodos devem ter data de início e fim'; - processando = false; - return; - } + // Validar datas ajustadas + if (!novaDataInicio || !novaDataFim) { + erro = 'Informe as novas datas de início e fim'; + processando = false; + return; } const validacao = await client.query(api.saldoFerias.validarSolicitacao, { - funcionarioId: solicitacao.funcionario._id, - anoReferencia: solicitacao.anoReferencia, - periodos: periodos.map((p) => ({ - dataInicio: p.dataInicio, - dataFim: p.dataFim - })) + funcionarioId: periodo.funcionario._id, + anoReferencia: periodo.anoReferencia, + periodos: [{ + dataInicio: novaDataInicio, + dataFim: novaDataFim + }], + feriasIdExcluir: periodo._id // Excluir o período original do cálculo de saldo }); if (!validacao.valido) { @@ -159,9 +154,10 @@ } await client.mutation(api.ferias.ajustarEAprovar, { - solicitacaoId: solicitacao._id, + feriasId: periodo._id, gestorId: gestorId, - novosPeriodos: periodos + novaDataInicio, + novaDataFim }); if (onSucesso) onSucesso(); @@ -177,7 +173,8 @@ aguardando_aprovacao: 'badge-warning', aprovado: 'badge-success', reprovado: 'badge-error', - data_ajustada_aprovada: 'badge-info' + data_ajustada_aprovada: 'badge-info', + EmFérias: 'badge-info' }; return badges[status] || 'badge-neutral'; } @@ -187,7 +184,8 @@ aguardando_aprovacao: 'Aguardando Aprovação', aprovado: 'Aprovado', reprovado: 'Reprovado', - data_ajustada_aprovada: 'Data Ajustada e Aprovada' + data_ajustada_aprovada: 'Data Ajustada e Aprovada', + EmFérias: 'Em Férias' }; return textos[status] || status; } @@ -195,6 +193,23 @@ function formatarData(data: number) { return new Date(data).toLocaleString('pt-BR'); } + + // Função para formatar data sem problemas de timezone + function formatarDataString(dataString: string): string { + if (!dataString) return ''; + // Dividir a string da data (formato YYYY-MM-DD) + const partes = dataString.split('-'); + if (partes.length !== 3) return dataString; + // Retornar no formato DD/MM/YYYY + return `${partes[2]}/${partes[1]}/${partes[0]}`; + } + + $effect(() => { + if (modoAjuste) { + novaDataInicio = periodo.dataInicio; + novaDataFim = periodo.dataFim; + } + });
@@ -202,63 +217,58 @@

- {solicitacao.funcionario?.nome || 'Funcionário'} + {periodo.funcionario?.nome || 'Funcionário'}

- Ano de Referência: {solicitacao.anoReferencia} + Ano de Referência: {periodo.anoReferencia}

-
- {getStatusTexto(solicitacao.status)} +
+ {getStatusTexto(periodo.status)}
- +
-

Períodos Solicitados

-
- {#each solicitacao.periodos as periodo, index} -
-
{index + 1}
-
-
- Início: - {new Date(periodo.dataInicio).toLocaleDateString('pt-BR')} -
-
- Fim: - {new Date(periodo.dataFim).toLocaleDateString('pt-BR')} -
-
- Dias: - {periodo.diasCorridos} -
-
+

Período Solicitado

+
+
+
+ Início: + {formatarDataString(periodo.dataInicio)}
- {/each} +
+ Fim: + {formatarDataString(periodo.dataFim)} +
+
+ Dias: + {periodo.diasFerias} +
+
- {#if solicitacao.observacao} + {#if periodo.observacao}

Observações

- {solicitacao.observacao} + {periodo.observacao}
{/if} - {#if solicitacao.historicoAlteracoes && solicitacao.historicoAlteracoes.length > 0} + {#if periodo.historicoAlteracoes && periodo.historicoAlteracoes.length > 0}

Histórico

- {#each solicitacao.historicoAlteracoes as hist} + {#each periodo.historicoAlteracoes as hist}
- {#if solicitacao.status === 'aguardando_aprovacao'} + {#if periodo.status === 'aguardando_aprovacao'}
{#if !modoAjuste} @@ -341,7 +351,7 @@
-

Reprovar Solicitação

+

Reprovar Período