feat: enhance LGPD compliance features by adding configurable data protection officer details, consent term settings, and improved error handling across various components

This commit is contained in:
2025-12-02 05:54:37 -03:00
parent fec5f5c33d
commit 2825bd0e6e
9 changed files with 270 additions and 62 deletions

View File

@@ -23,7 +23,9 @@ export const verificarConsentimento = query({
v.object({
aceito: v.boolean(),
versao: v.string(),
aceitoEm: v.number()
aceitoEm: v.number(),
termoObrigatorio: v.boolean(),
versaoTermoAtual: v.string()
}),
v.null()
),
@@ -35,6 +37,15 @@ export const verificarConsentimento = query({
const tipo = args.tipo || 'termo_uso';
// Buscar configuração para verificar se termo é obrigatório
const config = await ctx.db
.query('configuracaoLGPD')
.withIndex('by_ativo', (q) => q.eq('ativo', true))
.first();
const termoObrigatorio = config?.termoObrigatorio ?? false;
const versaoTermoAtual = config?.versaoTermoAtual ?? '1.0';
const consentimento = await ctx.db
.query('consentimentos')
.withIndex('by_usuario_tipo', (q) => q.eq('usuarioId', usuario._id).eq('tipo', tipo))
@@ -42,13 +53,21 @@ export const verificarConsentimento = query({
.first();
if (!consentimento || !consentimento.aceito || consentimento.revogadoEm) {
return null;
return {
aceito: false,
versao: '',
aceitoEm: 0,
termoObrigatorio,
versaoTermoAtual
};
}
return {
aceito: consentimento.aceito,
versao: consentimento.versao,
aceitoEm: consentimento.aceitoEm
aceitoEm: consentimento.aceitoEm,
termoObrigatorio,
versaoTermoAtual
};
}
});
@@ -476,15 +495,43 @@ export const exportarDadosUsuario = query({
}
// Buscar todos os dados do usuário
const dadosUsuario: any = {
type DadosUsuario = {
usuario: {
nome: string;
email: string;
setor?: string;
};
consentimentos: Array<{
tipo: string;
aceito: boolean;
versao: string;
aceitoEm: number;
revogadoEm?: number;
}>;
solicitacoes: Array<{
tipo: string;
status: string;
criadoEm: number;
respondidoEm?: number;
}>;
funcionario?: {
nome: string;
matricula?: string;
cpf: string;
email: string;
telefone: string;
descricaoCargo?: string;
};
};
const dadosUsuario: DadosUsuario = {
usuario: {
nome: usuario.nome,
email: usuario.email,
setor: usuario.setor
},
consentimentos: [],
solicitacoes: [],
atividades: []
solicitacoes: []
};
// Consentimentos
@@ -522,8 +569,7 @@ export const exportarDadosUsuario = query({
cpf: funcionario.cpf,
email: funcionario.email,
telefone: funcionario.telefone,
cargo: funcionario.cargo,
setor: funcionario.setor
descricaoCargo: funcionario.descricaoCargo
};
}
}
@@ -655,8 +701,11 @@ export const obterConfiguracaoLGPD = query({
encarregadoNome: v.union(v.string(), v.null()),
encarregadoEmail: v.union(v.string(), v.null()),
encarregadoTelefone: v.union(v.string(), v.null()),
encarregadoHorarioAtendimento: v.union(v.string(), v.null()),
prazoRespostaPadrao: v.number(),
diasAlertaVencimento: v.number()
diasAlertaVencimento: v.number(),
termoObrigatorio: v.boolean(),
versaoTermoAtual: v.string()
}),
v.null()
),
@@ -672,8 +721,11 @@ export const obterConfiguracaoLGPD = query({
encarregadoNome: null,
encarregadoEmail: null,
encarregadoTelefone: null,
encarregadoHorarioAtendimento: null,
prazoRespostaPadrao: 15,
diasAlertaVencimento: 3
diasAlertaVencimento: 3,
termoObrigatorio: false,
versaoTermoAtual: '1.0'
};
}
@@ -681,8 +733,11 @@ export const obterConfiguracaoLGPD = query({
encarregadoNome: config.encarregadoNome ?? null,
encarregadoEmail: config.encarregadoEmail ?? null,
encarregadoTelefone: config.encarregadoTelefone ?? null,
encarregadoHorarioAtendimento: config.encarregadoHorarioAtendimento ?? null,
prazoRespostaPadrao: config.prazoRespostaPadrao,
diasAlertaVencimento: config.diasAlertaVencimento
diasAlertaVencimento: config.diasAlertaVencimento,
termoObrigatorio: config.termoObrigatorio,
versaoTermoAtual: config.versaoTermoAtual
};
}
});
@@ -695,8 +750,11 @@ export const atualizarConfiguracaoLGPD = mutation({
encarregadoNome: v.optional(v.string()),
encarregadoEmail: v.optional(v.string()),
encarregadoTelefone: v.optional(v.string()),
encarregadoHorarioAtendimento: v.optional(v.string()),
prazoRespostaPadrao: v.optional(v.number()),
diasAlertaVencimento: v.optional(v.number())
diasAlertaVencimento: v.optional(v.number()),
termoObrigatorio: v.optional(v.boolean()),
versaoTermoAtual: v.optional(v.string())
},
returns: v.object({ sucesso: v.boolean() }),
handler: async (ctx, args) => {
@@ -716,13 +774,29 @@ export const atualizarConfiguracaoLGPD = mutation({
await ctx.db.patch(config._id, { ativo: false });
}
// Buscar valores atuais para manter os que não foram atualizados
const valoresAtuais = config || {
encarregadoNome: undefined,
encarregadoEmail: undefined,
encarregadoTelefone: undefined,
encarregadoHorarioAtendimento: undefined,
prazoRespostaPadrao: 15,
diasAlertaVencimento: 3,
termoObrigatorio: false,
versaoTermoAtual: '1.0'
};
// Criar nova configuração
await ctx.db.insert('configuracaoLGPD', {
encarregadoNome: args.encarregadoNome,
encarregadoEmail: args.encarregadoEmail,
encarregadoTelefone: args.encarregadoTelefone,
prazoRespostaPadrao: args.prazoRespostaPadrao ?? 15,
diasAlertaVencimento: args.diasAlertaVencimento ?? 3,
encarregadoNome: args.encarregadoNome ?? valoresAtuais.encarregadoNome ?? undefined,
encarregadoEmail: args.encarregadoEmail ?? valoresAtuais.encarregadoEmail ?? undefined,
encarregadoTelefone: args.encarregadoTelefone ?? valoresAtuais.encarregadoTelefone ?? undefined,
encarregadoHorarioAtendimento:
args.encarregadoHorarioAtendimento ?? valoresAtuais.encarregadoHorarioAtendimento ?? undefined,
prazoRespostaPadrao: args.prazoRespostaPadrao ?? valoresAtuais.prazoRespostaPadrao,
diasAlertaVencimento: args.diasAlertaVencimento ?? valoresAtuais.diasAlertaVencimento,
termoObrigatorio: args.termoObrigatorio ?? valoresAtuais.termoObrigatorio ?? false,
versaoTermoAtual: args.versaoTermoAtual ?? valoresAtuais.versaoTermoAtual ?? '1.0',
ativo: true,
atualizadoPor: usuario._id,
atualizadoEm: Date.now()