feat: enhance point registration and location validation features

- Refactored the RegistroPonto component to improve the layout and user experience, including a new section for displaying standard hours.
- Updated RelogioSincronizado to include GMT offset adjustments for accurate time display.
- Introduced new location validation logic in the backend to ensure point registrations are within allowed geofenced areas.
- Enhanced the device information schema to capture additional GPS data, improving the reliability of location checks.
- Added new endpoints for managing allowed marking addresses, facilitating better control over where points can be registered.
This commit is contained in:
2025-11-21 05:12:27 -03:00
parent 3da364fb02
commit d6aaa15cf4
17 changed files with 4347 additions and 568 deletions

View File

@@ -34,17 +34,21 @@ export const obterConfiguracao = query({
nomeSaidaAlmoco: 'Saída 1',
nomeRetornoAlmoco: 'Entrada 2',
nomeSaida: 'Saída 2',
validarLocalizacao: true,
toleranciaDistanciaMetros: 100,
ativo: false,
};
}
// Garantir que os nomes padrão estejam definidos
// Garantir que os nomes padrão e valores padrão estejam definidos
return {
...config,
nomeEntrada: config.nomeEntrada || 'Entrada 1',
nomeSaidaAlmoco: config.nomeSaidaAlmoco || 'Saída 1',
nomeRetornoAlmoco: config.nomeRetornoAlmoco || 'Entrada 2',
nomeSaida: config.nomeSaida || 'Saída 2',
validarLocalizacao: config.validarLocalizacao ?? true,
toleranciaDistanciaMetros: config.toleranciaDistanciaMetros ?? 100,
};
},
});
@@ -63,6 +67,8 @@ export const salvarConfiguracao = mutation({
nomeSaidaAlmoco: v.optional(v.string()),
nomeRetornoAlmoco: v.optional(v.string()),
nomeSaida: v.optional(v.string()),
validarLocalizacao: v.optional(v.boolean()),
toleranciaDistanciaMetros: v.optional(v.number()),
},
handler: async (ctx, args) => {
const usuario = await getCurrentUserFunction(ctx);
@@ -113,6 +119,13 @@ export const salvarConfiguracao = mutation({
throw new Error('Horário de retorno do almoço deve ser anterior à saída');
}
// Validar tolerância de distância se fornecida
if (args.toleranciaDistanciaMetros !== undefined) {
if (args.toleranciaDistanciaMetros < 0 || args.toleranciaDistanciaMetros > 50000) {
throw new Error('Tolerância de distância deve estar entre 0 e 50000 metros');
}
}
// Desativar configurações antigas
const configsAntigas = await ctx.db
.query('configuracaoPonto')
@@ -134,6 +147,8 @@ export const salvarConfiguracao = mutation({
nomeSaidaAlmoco: args.nomeSaidaAlmoco || 'Saída 1',
nomeRetornoAlmoco: args.nomeRetornoAlmoco || 'Entrada 2',
nomeSaida: args.nomeSaida || 'Saída 2',
validarLocalizacao: args.validarLocalizacao ?? true,
toleranciaDistanciaMetros: args.toleranciaDistanciaMetros ?? 100,
ativo: true,
atualizadoPor: usuario._id as Id<'usuarios'>,
atualizadoEm: Date.now(),