feat: implement customizable point registration labels and GMT offset adjustment

- Added functionality to customize labels for point registration types (Entrada, Saída, etc.) in the configuration settings.
- Introduced a GMT offset adjustment feature to account for time zone differences during point registration.
- Updated the backend to ensure default values for custom labels and GMT offset are set correctly.
- Enhanced the UI to allow users to input and save personalized names for each type of point registration.
- Improved the point registration process to utilize the new configuration settings for displaying labels consistently across the application.
This commit is contained in:
2025-11-19 06:22:07 -03:00
parent f465bd973e
commit 7cdc726781
10 changed files with 311 additions and 93 deletions

View File

@@ -1,5 +1,5 @@
import { v } from 'convex/values';
import { internalMutation, mutation, query } from './_generated/server';
import { mutation, query } from './_generated/server';
import type { MutationCtx, QueryCtx } from './_generated/server';
import { getCurrentUserFunction } from './auth';
import type { Id } from './_generated/dataModel';
@@ -18,38 +18,6 @@ export const generateUploadUrl = mutation({
},
});
interface InformacoesDispositivo {
ipAddress?: string;
ipPublico?: string;
ipLocal?: string;
userAgent?: string;
browser?: string;
browserVersion?: string;
engine?: string;
sistemaOperacional?: string;
osVersion?: string;
arquitetura?: string;
plataforma?: string;
latitude?: number;
longitude?: number;
precisao?: number;
endereco?: string;
cidade?: string;
estado?: string;
pais?: string;
timezone?: string;
deviceType?: string;
deviceModel?: string;
screenResolution?: string;
coresTela?: number;
idioma?: string;
isMobile?: boolean;
isTablet?: boolean;
isDesktop?: boolean;
connectionType?: string;
memoryInfo?: string;
}
/**
* Calcula se o registro está dentro do prazo baseado na configuração
* Se toleranciaMinutos for 0, desconsidera atrasos (sempre retorna true)
@@ -175,12 +143,20 @@ export const registrarPonto = mutation({
throw new Error('Configuração de ponto não encontrada');
}
// Converter timestamp para data/hora
const dataObj = new Date(args.timestamp);
// Obter configuração de ponto para GMT offset (buscar configuração ativa)
const configPonto = await ctx.db
.query('configuracaoPonto')
.withIndex('by_ativo', (q) => q.eq('ativo', true))
.first();
// Converter timestamp para data/hora com ajuste de GMT
const gmtOffset = configPonto?.gmtOffset ?? 0;
const timestampAjustado = args.timestamp + (gmtOffset * 60 * 60 * 1000);
const dataObj = new Date(timestampAjustado);
const data = dataObj.toISOString().split('T')[0]!; // YYYY-MM-DD
const hora = dataObj.getHours();
const minuto = dataObj.getMinutes();
const segundo = dataObj.getSeconds();
const hora = dataObj.getUTCHours();
const minuto = dataObj.getUTCMinutes();
const segundo = dataObj.getUTCSeconds();
// Verificar se já existe registro no mesmo minuto
const funcionarioId = usuario.funcionarioId; // Já verificado acima, não é undefined
@@ -317,7 +293,6 @@ export const listarRegistrosPeriodo = query({
// Por enquanto, permitir se tiver funcionarioId ou for admin
// TODO: Implementar verificação de permissão adequada
const dataInicio = new Date(args.dataInicio);
const dataFim = new Date(args.dataFim);
dataFim.setHours(23, 59, 59, 999);