feat: implement LGPD compliance features including data request management, consent tracking, and statistics display in the dashboard for enhanced data protection compliance
This commit is contained in:
@@ -1873,4 +1873,95 @@ export default defineSchema({
|
||||
.index("by_ativo", ["ativo"])
|
||||
.index("by_data_inicio", ["dataInicio"])
|
||||
.index("by_data_fim", ["dataFim"]),
|
||||
|
||||
// ========== LGPD - Lei Geral de Proteção de Dados ==========
|
||||
|
||||
// Solicitações de direitos LGPD
|
||||
solicitacoesLGPD: defineTable({
|
||||
tipo: v.union(
|
||||
v.literal("acesso"),
|
||||
v.literal("correcao"),
|
||||
v.literal("exclusao"),
|
||||
v.literal("portabilidade"),
|
||||
v.literal("revogacao_consentimento"),
|
||||
v.literal("informacao_compartilhamento")
|
||||
),
|
||||
usuarioId: v.id("usuarios"),
|
||||
funcionarioId: v.optional(v.id("funcionarios")),
|
||||
status: v.union(
|
||||
v.literal("pendente"),
|
||||
v.literal("em_analise"),
|
||||
v.literal("concluida"),
|
||||
v.literal("rejeitada")
|
||||
),
|
||||
dadosSolicitados: v.optional(v.string()), // JSON com detalhes da solicitação
|
||||
resposta: v.optional(v.string()), // Resposta da solicitação
|
||||
arquivoResposta: v.optional(v.id("_storage")), // Arquivo gerado (ex: exportação de dados)
|
||||
respondidoPor: v.optional(v.id("usuarios")),
|
||||
respondidoEm: v.optional(v.number()),
|
||||
criadoEm: v.number(),
|
||||
prazoResposta: v.number(), // Prazo legal (15 dias) - timestamp
|
||||
observacoes: v.optional(v.string()),
|
||||
})
|
||||
.index("by_usuario", ["usuarioId"])
|
||||
.index("by_status", ["status"])
|
||||
.index("by_tipo", ["tipo"])
|
||||
.index("by_prazo", ["prazoResposta"])
|
||||
.index("by_funcionario", ["funcionarioId"]),
|
||||
|
||||
// Consentimentos dos usuários
|
||||
consentimentos: defineTable({
|
||||
usuarioId: v.id("usuarios"),
|
||||
tipo: v.union(
|
||||
v.literal("termo_uso"),
|
||||
v.literal("politica_privacidade"),
|
||||
v.literal("comunicacoes"),
|
||||
v.literal("compartilhamento_dados")
|
||||
),
|
||||
aceito: v.boolean(),
|
||||
versao: v.string(), // Versão do documento aceito (ex: "1.0")
|
||||
ipAddress: v.optional(v.string()),
|
||||
userAgent: v.optional(v.string()),
|
||||
aceitoEm: v.number(),
|
||||
revogadoEm: v.optional(v.number()),
|
||||
revogadoPor: v.optional(v.id("usuarios")), // Se revogado pelo próprio usuário ou por TI
|
||||
})
|
||||
.index("by_usuario", ["usuarioId"])
|
||||
.index("by_tipo", ["tipo"])
|
||||
.index("by_usuario_tipo", ["usuarioId", "tipo"])
|
||||
.index("by_versao", ["versao"]),
|
||||
|
||||
// Registro de Operações de Tratamento (ROT)
|
||||
registrosTratamento: defineTable({
|
||||
finalidade: v.string(), // Finalidade do tratamento
|
||||
baseLegal: v.string(), // Base legal (ex: "Art. 7º, II - Execução de políticas públicas")
|
||||
categoriasDados: v.array(v.string()), // ["dados_identificacao", "dados_contato", "dados_profissionais"]
|
||||
categoriasTitulares: v.array(v.string()), // ["funcionarios", "servidores", "colaboradores"]
|
||||
medidasSeguranca: v.array(v.string()), // ["criptografia", "controle_acesso", "logs_auditoria"]
|
||||
prazoRetencao: v.number(), // em dias
|
||||
compartilhamentoTerceiros: v.boolean(),
|
||||
terceiros: v.optional(v.array(v.string())), // Lista de terceiros com quem compartilha
|
||||
responsavel: v.id("usuarios"), // Responsável pelo tratamento
|
||||
criadoEm: v.number(),
|
||||
atualizadoEm: v.number(),
|
||||
ativo: v.boolean(),
|
||||
descricao: v.optional(v.string()), // Descrição detalhada
|
||||
})
|
||||
.index("by_finalidade", ["finalidade"])
|
||||
.index("by_ativo", ["ativo"])
|
||||
.index("by_responsavel", ["responsavel"]),
|
||||
|
||||
// Configurações LGPD
|
||||
configuracaoLGPD: defineTable({
|
||||
encarregadoNome: v.optional(v.string()),
|
||||
encarregadoEmail: v.optional(v.string()),
|
||||
encarregadoTelefone: v.optional(v.string()),
|
||||
prazoRespostaPadrao: v.number(), // em dias (padrão: 15)
|
||||
diasAlertaVencimento: v.number(), // dias antes do prazo para alertar (padrão: 3)
|
||||
politicaRetencao: v.optional(v.string()), // JSON com política de retenção por tipo de dado
|
||||
ativo: v.boolean(),
|
||||
atualizadoPor: v.id("usuarios"),
|
||||
atualizadoEm: v.number(),
|
||||
})
|
||||
.index("by_ativo", ["ativo"]),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user