Registro de Pontos

Gerencie e visualize os registros de ponto dos funcionários

{#if estatisticas}
Total de Registros
{estatisticas.totalRegistros}
Dentro do Prazo
{estatisticas.dentroDoPrazo}
{estatisticas.totalRegistros > 0 ? ((estatisticas.dentroDoPrazo / estatisticas.totalRegistros) * 100).toFixed(1) : 0}%
Fora do Prazo
{estatisticas.foraDoPrazo}
{estatisticas.totalRegistros > 0 ? ((estatisticas.foraDoPrazo / estatisticas.totalRegistros) * 100).toFixed(1) : 0}%
Funcionários
{estatisticas.totalFuncionarios}
{estatisticas.funcionariosDentroPrazo} dentro do prazo, {estatisticas.funcionariosForaPrazo} fora
{/if} {#if estatisticas}

Visão Geral das Estatísticas

{#if !chartInstance && estatisticas}
{/if}
Total
{estatisticas.totalRegistros}
Dentro do Prazo
{estatisticas.dentroDoPrazo}
{estatisticas.totalRegistros > 0 ? ((estatisticas.dentroDoPrazo / estatisticas.totalRegistros) * 100).toFixed(1) : 0}%
Fora do Prazo
{estatisticas.foraDoPrazo}
{estatisticas.totalRegistros > 0 ? ((estatisticas.foraDoPrazo / estatisticas.totalRegistros) * 100).toFixed(1) : 0}%
Funcionários
{estatisticas.totalFuncionarios}
{estatisticas.funcionariosDentroPrazo} dentro, {estatisticas.funcionariosForaPrazo} fora
{/if}

Filtros

Registros

{#if funcionarioIdFiltro || dataInicio || dataFim}
{#if funcionarioIdFiltro && funcionarioSelecionadoNome}
{funcionarioSelecionadoNome}
{/if} {#if dataInicio}
De: {formatarData(dataInicio)}
{/if} {#if dataFim}
Até: {formatarData(dataFim)}
{/if}
{/if}
{#if registrosQuery?.status === 'Loading'}
Carregando registros...
{:else if registrosQuery?.error}
Erro ao carregar registros: {registrosQuery.error.message || 'Erro desconhecido'}
{:else if !registrosQuery?.data}
Aguardando dados da consulta...
{:else if registros.length === 0}
Nenhum registro encontrado para o período selecionado
Período: {formatarData(dataInicio)} até {formatarData(dataFim)} {#if funcionarioIdFiltro && funcionarioSelecionadoNome}
Funcionário: {funcionarioSelecionadoNome} {/if}
{:else if registrosAgrupados.length === 0}
Registros encontrados, mas não foi possível agrupá-los
Total de registros: {registros.length}
{:else}
{#each registrosAgrupados as grupo}

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

{#if grupo.funcionario?.matricula}

Matrícula: {grupo.funcionario.matricula}

{/if}
{#key grupo.funcionarioId} {@const bancoHorasQuery = useQuery( api.pontos.obterBancoHorasFuncionario, { funcionarioId: grupo.funcionarioId } )} {@const bancoHoras = bancoHorasQuery?.data} {@const saldoAcumulado = bancoHoras?.saldoAcumuladoMinutos ?? 0} {@const saldoPositivo = saldoAcumulado >= 0} {#if bancoHoras}
{#if saldoPositivo} {:else} {/if}

Banco de Horas

{formatarSaldoHoras(saldoAcumulado)}

{/if} {/key}
{#each Object.values(grupo.registrosPorData) as grupoData} {@const totalRegistros = grupoData.registros.length} {@const dataParts = grupoData.data.split('-')} {@const dataFormatada = `${dataParts[2]}/${dataParts[1]}/${dataParts[0]}`} {#each grupoData.registros as registro, index} {#if index === 0} {/if} {/each} {/each}
Data Tipo Horário Saldo Diário Status Ações
{dataFormatada} {config ? getTipoRegistroLabel(registro.tipo, { nomeEntrada: config.nomeEntrada, nomeSaidaAlmoco: config.nomeSaidaAlmoco, nomeRetornoAlmoco: config.nomeRetornoAlmoco, nomeSaida: config.nomeSaida, }) : getTipoRegistroLabel(registro.tipo)} {formatarHoraPonto(registro.hora, registro.minuto)} {#if grupoData.saldoDiario} {formatarSaldoDiario(grupoData.saldoDiario)} {:else} - {/if} {registro.dentroDoPrazo ? 'Dentro do Prazo' : 'Fora do Prazo'}
{/each}
{/if}
{#if mostrarModalImpressao && funcionarioParaImprimir} { mostrarModalImpressao = false; funcionarioParaImprimir = ''; }} onGenerate={gerarPDFComSelecao} /> {/if}