diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte index f663bdd..c3ee514 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte @@ -404,6 +404,70 @@ }); // Função para calcular saldo diário como diferença entre saída e entrada + /** + * Calcula saldos parciais entre cada par entrada/saída + * Retorna um mapa com o índice do registro e seu saldo parcial + */ + function calcularSaldosParciais(registros: Array<{ tipo: string; hora: number; minuto: number; _id?: any }>): Map { + const saldos = new Map(); + if (registros.length === 0) return saldos; + + // Criar array com índices originais + const registrosComIndice = registros.map((r, idx) => ({ ...r, originalIndex: idx })); + + // Ordenar registros por hora e minuto para processar em ordem cronológica + const registrosOrdenados = [...registrosComIndice].sort((a, b) => { + if (a.hora !== b.hora) { + return a.hora - b.hora; + } + return a.minuto - b.minuto; + }); + + // Identificar pares entrada/saída + // Par 1: entrada -> saida_almoco + // Par 2: retorno_almoco -> saida + let entradaAtual: typeof registrosComIndice[0] | null = null; + let parNumero = 1; + + for (let i = 0; i < registrosOrdenados.length; i++) { + const registro = registrosOrdenados[i]; + + // Considerar entrada ou retorno_almoco como início de um período + if (registro.tipo === 'entrada' || registro.tipo === 'retorno_almoco') { + entradaAtual = registro; + } else if (entradaAtual) { + // Qualquer saída (saida_almoco ou saida) fecha o período atual + if (registro.tipo === 'saida_almoco' || registro.tipo === 'saida') { + // Calcular diferença entre saída e entrada + const minutosEntrada = entradaAtual.hora * 60 + entradaAtual.minuto; + const minutosSaida = registro.hora * 60 + registro.minuto; + + let saldoMinutos = minutosSaida - minutosEntrada; + if (saldoMinutos < 0) { + saldoMinutos += 24 * 60; // Adicionar um dia em minutos + } + + const horas = Math.floor(saldoMinutos / 60); + const minutos = saldoMinutos % 60; + + // Salvar saldo no índice original do registro de saída + saldos.set(registro.originalIndex, { + saldoMinutos, + horas, + minutos, + positivo: true, + parNumero + }); + + entradaAtual = null; // Resetar para próximo par + parNumero++; + } + } + } + + return saldos; + } + function calcularSaldoDiario(registros: Array<{ tipo: string; hora: number; minuto: number }>): { saldoMinutos: number; horas: number; minutos: number; positivo: boolean } | null { if (registros.length === 0) return null; @@ -2173,27 +2237,31 @@ {#each registrosAgrupados as grupo}
-
-
-
-
- + +
+
+
+
+
+ +
+
+

+ {grupo.funcionario?.nome || 'Funcionário não encontrado'} +

+ {#if grupo.funcionario?.matricula} +

+ Matrícula: {grupo.funcionario.matricula} +

+ {/if} +
-

- {grupo.funcionario?.nome || 'Funcionário não encontrado'} -

+ {#if grupo.funcionario?.descricaoCargo} +

+ {grupo.funcionario.descricaoCargo} +

+ {/if}
- {#if grupo.funcionario?.matricula} -

- Matrícula: {grupo.funcionario.matricula} -

- {/if} - {#if grupo.funcionario?.descricaoCargo} -

- {grupo.funcionario.descricaoCargo} -

- {/if} -
@@ -2244,6 +2312,7 @@ Data Tipo Horário + Saldo Parcial Saldo Diário Localização Status @@ -2254,7 +2323,9 @@ {#each Object.values(grupo.registrosPorData) as grupoData} {@const totalRegistros = grupoData.registros.length} {@const dataFormatada = formatarDataDDMMAAAA(grupoData.data)} + {@const saldosParciais = calcularSaldosParciais(grupoData.registros)} {#each grupoData.registros as registro, index} + {@const saldoParcial = saldosParciais.get(index)} {dataFormatada} @@ -2268,6 +2339,15 @@ : getTipoRegistroLabel(registro.tipo)} {formatarHoraPonto(registro.hora, registro.minuto)} + + {#if saldoParcial} + + Par {saldoParcial.parNumero}: +{saldoParcial.horas}h {saldoParcial.minutos}min + + {:else} + - + {/if} + {#if index === 0}