Call audio video jitsi #40

Merged
deyvisonwanderley merged 9 commits from call-audio-video-jitsi into master 2025-11-23 01:41:20 +00:00
30 changed files with 3854 additions and 417 deletions
Showing only changes of commit 5b41d35b6f - Show all commits

View File

@@ -47,11 +47,24 @@ const regimeTrabalhoValidator = v.optional(
export const getAll = query({
args: {},
handler: async (ctx) => {
// Verificar autenticação primeiro
const usuario = await getCurrentUserFunction(ctx);
if (!usuario) {
// Retornar array vazio quando não autenticado
return [];
}
// Autorização: listar funcionários
try {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'funcionarios',
acao: 'listar'
});
} catch (error) {
// Se não tiver permissão, retornar array vazio
return [];
}
const funcionarios = await ctx.db.query('funcionarios').collect();
// Retornar apenas os campos necessários para listagem
return funcionarios.map((f) => ({

View File

@@ -862,15 +862,24 @@ export const listarRegistrosPeriodo = query({
handler: async (ctx, args) => {
const usuario = await getCurrentUserFunction(ctx);
if (!usuario) {
throw new Error('Usuário não autenticado');
// Retornar array vazio quando não autenticado
return [];
}
// Verificar permissão (RH ou TI)
// Por enquanto, permitir se tiver funcionarioId ou for admin
// TODO: Implementar verificação de permissão adequada
const dataFim = new Date(args.dataFim);
dataFim.setHours(23, 59, 59, 999);
// Validar formato das datas
if (!args.dataInicio || !args.dataFim) {
return [];
}
// Validar formato YYYY-MM-DD
const dataInicioRegex = /^\d{4}-\d{2}-\d{2}$/;
if (!dataInicioRegex.test(args.dataInicio) || !dataInicioRegex.test(args.dataFim)) {
return [];
}
let registrosFiltrados;
@@ -885,19 +894,26 @@ export const listarRegistrosPeriodo = query({
.withIndex('by_funcionario_data', (q) => q.eq('funcionarioId', funcionarioId))
.collect();
// Filtrar por período de data
// Filtrar por período de data usando comparação de strings (formato YYYY-MM-DD)
registrosFiltrados = todosRegistrosFuncionario.filter((r) => {
const dataRegistro = new Date(r.data);
return dataRegistro >= new Date(args.dataInicio) && dataRegistro <= dataFim;
// Comparação de strings funciona para formato YYYY-MM-DD
return r.data >= args.dataInicio && r.data <= args.dataFim;
});
} else {
// Se não há funcionário especificado, buscar todos e filtrar (menos eficiente, mas necessário)
// Usar comparação de strings diretamente para datas no formato YYYY-MM-DD
const registros = await ctx.db
.query('registrosPonto')
.withIndex('by_data', (q) => q.gte('data', args.dataInicio).lte('data', args.dataFim))
.withIndex('by_data', (q) =>
q.gte('data', args.dataInicio).lte('data', args.dataFim)
)
.collect();
registrosFiltrados = registros;
// Garantir que as datas estão no formato correto e filtrar novamente para garantir
registrosFiltrados = registros.filter((r) => {
// Comparação de strings funciona para formato YYYY-MM-DD
return r.data >= args.dataInicio && r.data <= args.dataFim;
});
}
// Buscar informações dos funcionários
@@ -964,7 +980,15 @@ export const obterEstatisticas = query({
handler: async (ctx, args) => {
const usuario = await getCurrentUserFunction(ctx);
if (!usuario) {
throw new Error('Usuário não autenticado');
// Retornar estatísticas zeradas quando não autenticado
return {
totalRegistros: 0,
dentroDoPrazo: 0,
foraDoPrazo: 0,
totalFuncionarios: 0,
funcionariosDentroPrazo: 0,
funcionariosForaPrazo: 0,
};
}
// TODO: Verificar permissão (RH ou TI)