diff --git a/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte b/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte
index 130a768..495a86d 100644
--- a/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte
+++ b/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte
@@ -543,7 +543,7 @@
- {:else if catalogoQuery.data}
+ {:else if catalogoQuery.data && catalogoQuery.data.length > 0}
+
- 0
? ((stats.comSetor / stats.total) * 100).toFixed(0) + '% do total'
@@ -209,6 +196,18 @@
color="secondary"
/>
+ {#if stats.niveisLegado > 0}
+
+
+
+
Perfis com níveis legados
+
+ Existem {stats.niveisLegado} perfis com nível acima de 1. Esses perfis continuarão
+ sendo tratados como nível 1 (administrativo) após a migração.
+
+
+
+ {/if}
{/if}
diff --git a/packages/backend/convex/permissoesAcoes.ts b/packages/backend/convex/permissoesAcoes.ts
index f9f0b3c..ee982f4 100644
--- a/packages/backend/convex/permissoesAcoes.ts
+++ b/packages/backend/convex/permissoesAcoes.ts
@@ -3,27 +3,271 @@ import { v } from 'convex/values';
import type { Doc } from './_generated/dataModel';
import { getCurrentUserFunction } from './auth';
-// Catálogo base de recursos e ações
-// Ajuste/expanda conforme os módulos disponíveis no sistema
-export const CATALOGO_RECURSOS = [
- {
- recurso: 'funcionarios',
- acoes: [
- 'dashboard',
- 'ver',
- 'listar',
- 'criar',
- 'editar',
- 'excluir',
- 'aprovar_ausencias',
- 'aprovar_ferias'
- ]
- },
- {
- recurso: 'simbolos',
- acoes: ['dashboard', 'ver', 'listar', 'criar', 'editar', 'excluir']
- }
-] as const;
+// Catálogo de permissões base para seed controlado via mutation
+const PERMISSOES_BASE = {
+ permissoes: [
+ // Funcionários
+ {
+ nome: 'funcionarios.dashboard',
+ recurso: 'funcionarios',
+ acao: 'dashboard',
+ descricao: 'Acessar o painel de funcionários'
+ },
+ {
+ nome: 'funcionarios.ver',
+ recurso: 'funcionarios',
+ acao: 'ver',
+ descricao: 'Visualizar detalhes de funcionários'
+ },
+ {
+ nome: 'funcionarios.listar',
+ recurso: 'funcionarios',
+ acao: 'listar',
+ descricao: 'Listar funcionários'
+ },
+ {
+ nome: 'funcionarios.criar',
+ recurso: 'funcionarios',
+ acao: 'criar',
+ descricao: 'Criar novos funcionários'
+ },
+ {
+ nome: 'funcionarios.editar',
+ recurso: 'funcionarios',
+ acao: 'editar',
+ descricao: 'Editar dados de funcionários'
+ },
+ {
+ nome: 'funcionarios.excluir',
+ recurso: 'funcionarios',
+ acao: 'excluir',
+ descricao: 'Excluir funcionários'
+ },
+ {
+ nome: 'funcionarios.aprovar_ausencias',
+ recurso: 'funcionarios',
+ acao: 'aprovar_ausencias',
+ descricao: 'Aprovar ausências de funcionários'
+ },
+ {
+ nome: 'funcionarios.aprovar_ferias',
+ recurso: 'funcionarios',
+ acao: 'aprovar_ferias',
+ descricao: 'Aprovar férias de funcionários'
+ },
+ // Símbolos
+ {
+ nome: 'simbolos.dashboard',
+ recurso: 'simbolos',
+ acao: 'dashboard',
+ descricao: 'Acessar o painel de símbolos'
+ },
+ {
+ nome: 'simbolos.ver',
+ recurso: 'simbolos',
+ acao: 'ver',
+ descricao: 'Visualizar detalhes de símbolos'
+ },
+ {
+ nome: 'simbolos.listar',
+ recurso: 'simbolos',
+ acao: 'listar',
+ descricao: 'Listar símbolos'
+ },
+ {
+ nome: 'simbolos.criar',
+ recurso: 'simbolos',
+ acao: 'criar',
+ descricao: 'Criar novos símbolos'
+ },
+ {
+ nome: 'simbolos.editar',
+ recurso: 'simbolos',
+ acao: 'editar',
+ descricao: 'Editar símbolos'
+ },
+ {
+ nome: 'simbolos.excluir',
+ recurso: 'simbolos',
+ acao: 'excluir',
+ descricao: 'Excluir símbolos'
+ },
+ // TI - Usuários
+ {
+ nome: 'ti_usuarios.listar',
+ recurso: 'ti_usuarios',
+ acao: 'listar',
+ descricao: 'Listar usuários do sistema'
+ },
+ {
+ nome: 'ti_usuarios.criar',
+ recurso: 'ti_usuarios',
+ acao: 'criar',
+ descricao: 'Criar novos usuários de acesso'
+ },
+ {
+ nome: 'ti_usuarios.editar',
+ recurso: 'ti_usuarios',
+ acao: 'editar',
+ descricao: 'Editar usuários de acesso'
+ },
+ {
+ nome: 'ti_usuarios.bloquear',
+ recurso: 'ti_usuarios',
+ acao: 'bloquear',
+ descricao: 'Bloquear ou desbloquear usuários'
+ },
+ // TI - Perfis
+ {
+ nome: 'ti_perfis.listar',
+ recurso: 'ti_perfis',
+ acao: 'listar',
+ descricao: 'Listar perfis de acesso'
+ },
+ {
+ nome: 'ti_perfis.criar',
+ recurso: 'ti_perfis',
+ acao: 'criar',
+ descricao: 'Criar novos perfis de acesso'
+ },
+ {
+ nome: 'ti_perfis.editar',
+ recurso: 'ti_perfis',
+ acao: 'editar',
+ descricao: 'Editar perfis de acesso'
+ },
+ // TI - Painel de Permissões
+ {
+ nome: 'ti_painel_permissoes.gerenciar',
+ recurso: 'ti_painel_permissoes',
+ acao: 'gerenciar',
+ descricao: 'Gerenciar matriz de permissões por perfil'
+ },
+ // TI - Solicitações de Acesso
+ {
+ nome: 'ti_solicitacoes_acesso.ver',
+ recurso: 'ti_solicitacoes_acesso',
+ acao: 'ver',
+ descricao: 'Visualizar solicitações de acesso'
+ },
+ {
+ nome: 'ti_solicitacoes_acesso.aprovar',
+ recurso: 'ti_solicitacoes_acesso',
+ acao: 'aprovar',
+ descricao: 'Aprovar solicitações de acesso'
+ },
+ {
+ nome: 'ti_solicitacoes_acesso.reprovar',
+ recurso: 'ti_solicitacoes_acesso',
+ acao: 'reprovar',
+ descricao: 'Reprovar solicitações de acesso'
+ },
+ // TI - Configurações de E-mail
+ {
+ nome: 'ti_configuracoes_email.configurar',
+ recurso: 'ti_configuracoes_email',
+ acao: 'configurar',
+ descricao: 'Configurar parâmetros de envio de e-mail'
+ },
+ // TI - Monitoramento
+ {
+ nome: 'ti_monitoramento.ver',
+ recurso: 'ti_monitoramento',
+ acao: 'ver',
+ descricao: 'Acessar painel de monitoramento geral'
+ },
+ {
+ nome: 'ti_monitoramento_emails.ver',
+ recurso: 'ti_monitoramento_emails',
+ acao: 'ver',
+ descricao: 'Acessar monitoramento de envio de e-mails'
+ },
+ // TI - Notificações
+ {
+ nome: 'ti_notificacoes.configurar',
+ recurso: 'ti_notificacoes',
+ acao: 'configurar',
+ descricao: 'Configurar notificações do sistema'
+ },
+ // TI - Times
+ {
+ nome: 'ti_times.gerenciar',
+ recurso: 'ti_times',
+ acao: 'gerenciar',
+ descricao: 'Gerenciar times/equipes de TI'
+ },
+ // TI - Painel Administrativo
+ {
+ nome: 'ti_painel_administrativo.ver',
+ recurso: 'ti_painel_administrativo',
+ acao: 'ver',
+ descricao: 'Acessar painel administrativo de TI'
+ },
+ // Financeiro
+ {
+ nome: 'financeiro.ver',
+ recurso: 'financeiro',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de financeiro'
+ },
+ // Controladoria
+ {
+ nome: 'controladoria.ver',
+ recurso: 'controladoria',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de controladoria'
+ },
+ // Licitações
+ {
+ nome: 'licitacoes.ver',
+ recurso: 'licitacoes',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de licitações'
+ },
+ // Compras
+ {
+ nome: 'compras.ver',
+ recurso: 'compras',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de compras'
+ },
+ // Jurídico
+ {
+ nome: 'juridico.ver',
+ recurso: 'juridico',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo jurídico'
+ },
+ // Comunicação
+ {
+ nome: 'comunicacao.ver',
+ recurso: 'comunicacao',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de comunicação'
+ },
+ // Programas Esportivos
+ {
+ nome: 'programas_esportivos.ver',
+ recurso: 'programas_esportivos',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de programas esportivos'
+ },
+ // Secretaria Executiva
+ {
+ nome: 'secretaria_executiva.ver',
+ recurso: 'secretaria_executiva',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de secretaria executiva'
+ },
+ // Gestão de Pessoas
+ {
+ nome: 'gestao_pessoas.ver',
+ recurso: 'gestao_pessoas',
+ acao: 'ver',
+ descricao: 'Acessar telas do módulo de gestão de pessoas'
+ }
+ ]
+} as const;
export const listarRecursosEAcoes = query({
args: {},
@@ -33,10 +277,18 @@ export const listarRecursosEAcoes = query({
acoes: v.array(v.string())
})
),
- handler: async () => {
- return CATALOGO_RECURSOS.map((r) => ({
- recurso: r.recurso,
- acoes: [...r.acoes]
+ handler: async (ctx) => {
+ const permissoes = await ctx.db.query('permissoes').collect();
+
+ const recursos: Record
> = {};
+ for (const perm of permissoes) {
+ const set = (recursos[perm.recurso] ||= new Set());
+ set.add(perm.acao);
+ }
+
+ return Object.entries(recursos).map(([recurso, acoes]) => ({
+ recurso,
+ acoes: Array.from(acoes).sort()
}));
}
});
@@ -56,7 +308,7 @@ export const listarPermissoesAcoesPorRole = query({
.withIndex('by_role', (q) => q.eq('roleId', args.roleId))
.collect();
- // Carregar documentos de permissões
+ // Carregar documentos de permissões vinculadas a este role
const actionsByResource: Record> = {};
for (const rp of rolePerms) {
const perm = await ctx.db.get(rp.permissaoId);
@@ -65,13 +317,10 @@ export const listarPermissoesAcoesPorRole = query({
set.add(perm.acao);
}
- // Normalizar para todos os recursos do catálogo
- const result: Array<{ recurso: string; acoes: Array }> = [];
- for (const item of CATALOGO_RECURSOS) {
- const granted = Array.from(actionsByResource[item.recurso] ?? new Set());
- result.push({ recurso: item.recurso, acoes: granted });
- }
- return result;
+ return Object.entries(actionsByResource).map(([recurso, acoes]) => ({
+ recurso,
+ acoes: Array.from(acoes).sort()
+ }));
}
});
@@ -84,24 +333,12 @@ export const atualizarPermissaoAcao = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
- // Garantir documento de permissão (recurso+acao)
- let permissao = await ctx.db
+ // Buscar documento de permissão (recurso+acao)
+ const permissao = await ctx.db
.query('permissoes')
.withIndex('by_recurso_e_acao', (q) => q.eq('recurso', args.recurso).eq('acao', args.acao))
.first();
- if (!permissao) {
- const nome = `${args.recurso}.${args.acao}`;
- const descricao = `Permite ${args.acao} em ${args.recurso}`;
- const id = await ctx.db.insert('permissoes', {
- nome,
- descricao,
- recurso: args.recurso,
- acao: args.acao
- });
- permissao = await ctx.db.get(id);
- }
-
if (!permissao) return null;
// Verificar vínculo atual
@@ -128,6 +365,36 @@ export const atualizarPermissaoAcao = mutation({
}
});
+export const seedPermissoesBase = mutation({
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('🔐 Seed de permissões base...');
+
+ for (const perm of PERMISSOES_BASE.permissoes) {
+ const existente = await ctx.db
+ .query('permissoes')
+ .withIndex('by_nome', (q) => q.eq('nome', perm.nome))
+ .first();
+
+ if (existente) {
+ console.log(` ℹ️ Permissão já existe: ${perm.nome}`);
+ continue;
+ }
+
+ await ctx.db.insert('permissoes', {
+ nome: perm.nome,
+ descricao: perm.descricao,
+ recurso: perm.recurso,
+ acao: perm.acao
+ });
+ console.log(` ✅ Permissão criada: ${perm.nome}`);
+ }
+
+ return null;
+ }
+});
+
export const verificarAcao = query({
args: {
usuarioId: v.id('usuarios'),
diff --git a/packages/backend/convex/roles.ts b/packages/backend/convex/roles.ts
index f21547e..6594a96 100644
--- a/packages/backend/convex/roles.ts
+++ b/packages/backend/convex/roles.ts
@@ -1,5 +1,5 @@
import { v } from 'convex/values';
-import { query, mutation } from './_generated/server';
+import { internalMutation, query, mutation } from './_generated/server';
import type { Id } from './_generated/dataModel';
import { getCurrentUserFunction } from './auth';
@@ -98,13 +98,16 @@ export const criar = mutation({
permissoesParaCopiar = permissoesOrigem.map((item) => item.permissaoId);
}
- const nivelAjustado = Math.min(Math.max(Math.round(args.nivel), 0), 10);
+ // Agora só existem níveis 0 e 1.
+ // 0 = máximo (acesso total), 1 = administrativo (também com acesso total).
+ // Qualquer valor informado diferente de 0 é normalizado para 1.
+ const nivelNormalizado = Math.round(args.nivel) <= 0 ? 0 : 1;
const setor = args.setor?.trim();
const roleId = await ctx.db.insert('roles', {
nome: nomeNormalizado,
descricao: args.descricao.trim() || args.nome.trim(),
- nivel: nivelAjustado,
+ nivel: nivelNormalizado,
setor: setor && setor.length > 0 ? setor : undefined,
customizado: true,
criadoPor: usuarioAtual._id,
@@ -123,3 +126,26 @@ export const criar = mutation({
return { sucesso: true as const, roleId };
}
});
+
+/**
+ * Migração de níveis de roles para o novo modelo (apenas 0 e 1).
+ * - Mantém níveis 0 e 1 como estão.
+ * - Converte qualquer nível > 1 para 1.
+ */
+export const migrarNiveisRoles = internalMutation({
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ const roles = await ctx.db.query('roles').collect();
+
+ for (const role of roles) {
+ if (role.nivel <= 1) continue;
+
+ await ctx.db.patch(role._id, {
+ nivel: 1
+ });
+ }
+
+ return null;
+ }
+});
diff --git a/packages/backend/convex/seed.ts b/packages/backend/convex/seed.ts
index 3b19f67..2af404c 100644
--- a/packages/backend/convex/seed.ts
+++ b/packages/backend/convex/seed.ts
@@ -1,484 +1,469 @@
-import {
- action,
- internalAction,
- internalMutation,
- mutation,
- query,
-} from "./_generated/server";
-import { internal } from "./_generated/api";
-import { v } from "convex/values";
-import { hashPassword } from "./auth/utils";
-import { Id } from "./_generated/dataModel";
-import { createAuthUser } from "./auth";
+import { internalAction, internalMutation, mutation, query } from './_generated/server';
+import { internal, api } from './_generated/api';
+import { v } from 'convex/values';
+// import { hashPassword } from './auth/utils';
+import { Id } from './_generated/dataModel';
+import { createAuthUser } from './auth';
// Dados exportados do Convex Cloud
const simbolosData = [
- {
- descricao: "Cargo de Direção e Assessoramento Superior - 5",
- nome: "DAS-5",
- repValor: "4747.84",
- tipo: "cargo_comissionado" as const,
- valor: "5934.80",
- vencValor: "1186.96",
- },
- {
- descricao: "Cargo de Direção e Assessoramento Superior - 3",
- nome: "DAS-3",
- repValor: "6273.92",
- tipo: "cargo_comissionado" as const,
- valor: "7842.40",
- vencValor: "1568.48",
- },
- {
- descricao: "Cargo de Direção e Assessoramento Superior -2",
- nome: "DAS - 2",
- repValor: "7460.87",
- tipo: "cargo_comissionado" as const,
- valor: "9326.09",
- vencValor: "1865.22",
- },
- {
- descricao: "Cargo de Apoio e Assessoramento - 1",
- nome: "CAA-1",
- repValor: "4120.43",
- tipo: "cargo_comissionado" as const,
- valor: "5150.54",
- vencValor: "1030.11",
- },
- {
- descricao: "Função Gratificada de Direção e Assessoramento",
- nome: "FDA",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "7460.87",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Supervisão - 3",
- nome: "CAA - 3",
- repValor: "2204.36",
- tipo: "cargo_comissionado" as const,
- valor: "2755.45",
- vencValor: "551.09",
- },
- {
- descricao: "Função Gratificada de Direção e Assessoramento -1",
- nome: "FDA-1",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "6273.92",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Direção e Assessoramento -2",
- nome: "FDA -2",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "5765.22",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Direção e Assessoramento - 3",
- nome: "FDA - 3",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "4747.83",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Direção e Assessoramento - 4",
- nome: "FDA - 4",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "3391.31",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Supervisão - 1",
- nome: "FGS -1 ",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "1532.08",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Supervisão - 2",
- nome: "FGS - 2",
- repValor: "",
- tipo: "funcao_gratificada" as const,
- valor: "934.74",
- vencValor: "",
- },
- {
- descricao: "Função Gratificada de Supervisão - 2",
- nome: "CAA - 2",
- repValor: "3391.31",
- tipo: "cargo_comissionado" as const,
- valor: "4239.14",
- vencValor: "847.83",
- },
+ {
+ descricao: 'Cargo de Direção e Assessoramento Superior - 5',
+ nome: 'DAS-5',
+ repValor: '4747.84',
+ tipo: 'cargo_comissionado' as const,
+ valor: '5934.80',
+ vencValor: '1186.96'
+ },
+ {
+ descricao: 'Cargo de Direção e Assessoramento Superior - 3',
+ nome: 'DAS-3',
+ repValor: '6273.92',
+ tipo: 'cargo_comissionado' as const,
+ valor: '7842.40',
+ vencValor: '1568.48'
+ },
+ {
+ descricao: 'Cargo de Direção e Assessoramento Superior -2',
+ nome: 'DAS - 2',
+ repValor: '7460.87',
+ tipo: 'cargo_comissionado' as const,
+ valor: '9326.09',
+ vencValor: '1865.22'
+ },
+ {
+ descricao: 'Cargo de Apoio e Assessoramento - 1',
+ nome: 'CAA-1',
+ repValor: '4120.43',
+ tipo: 'cargo_comissionado' as const,
+ valor: '5150.54',
+ vencValor: '1030.11'
+ },
+ {
+ descricao: 'Função Gratificada de Direção e Assessoramento',
+ nome: 'FDA',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '7460.87',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Supervisão - 3',
+ nome: 'CAA - 3',
+ repValor: '2204.36',
+ tipo: 'cargo_comissionado' as const,
+ valor: '2755.45',
+ vencValor: '551.09'
+ },
+ {
+ descricao: 'Função Gratificada de Direção e Assessoramento -1',
+ nome: 'FDA-1',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '6273.92',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Direção e Assessoramento -2',
+ nome: 'FDA -2',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '5765.22',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Direção e Assessoramento - 3',
+ nome: 'FDA - 3',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '4747.83',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Direção e Assessoramento - 4',
+ nome: 'FDA - 4',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '3391.31',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Supervisão - 1',
+ nome: 'FGS -1 ',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '1532.08',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Supervisão - 2',
+ nome: 'FGS - 2',
+ repValor: '',
+ tipo: 'funcao_gratificada' as const,
+ valor: '934.74',
+ vencValor: ''
+ },
+ {
+ descricao: 'Função Gratificada de Supervisão - 2',
+ nome: 'CAA - 2',
+ repValor: '3391.31',
+ tipo: 'cargo_comissionado' as const,
+ valor: '4239.14',
+ vencValor: '847.83'
+ }
];
const funcionariosData = [
- {
- admissaoData: "01/01/2000",
- cep: "50740500",
- cidade: "Recife",
- cpf: "04281554645",
- email: "kilder@kilder.com.br",
- endereco: "Rua Bernardino Alves Maia, Várzea",
- matricula: "4585",
- nascimento: "01/01/2000",
- nome: "Madson Kilder",
- rg: "123456122",
- simboloNome: "DAS-3", // Será convertido para ID
- simboloTipo: "cargo_comissionado" as const,
- telefone: "8101234564",
- uf: "PE",
- },
- {
- admissaoData: "01/01/2000",
- cep: "50740400",
- cidade: "Recife",
- cpf: "05129038401",
- email: "princesalves@gmail.com",
- endereco: "Rua Deputado Cunha Rabelo, Várzea",
- matricula: "123456",
- nascimento: "05/01/1985",
- nome: "Princes Alves rocha wanderley",
- rg: "639541200",
- simboloNome: "FDA-1", // Será convertido para ID
- simboloTipo: "funcao_gratificada" as const,
- telefone: "81123456455",
- uf: "PE",
- },
- {
- admissaoData: "01/10/2025",
- cep: "50740400",
- cidade: "Recife",
- cpf: "06102637496",
- email: "deyvison.wanderley@gmail.com",
- endereco: "Rua Deputado Cunha Rabelo, Várzea",
- matricula: "256220",
- nascimento: "16/03/1985",
- nome: "Deyvison de França Wanderley",
- rg: "6347974",
- simboloNome: "CAA-1", // Será convertido para ID
- simboloTipo: "cargo_comissionado" as const,
- telefone: "81994235551",
- uf: "PE",
- },
+ {
+ admissaoData: '01/01/2000',
+ cep: '50740500',
+ cidade: 'Recife',
+ cpf: '04281554645',
+ email: 'kilder@kilder.com.br',
+ endereco: 'Rua Bernardino Alves Maia, Várzea',
+ matricula: '4585',
+ nascimento: '01/01/2000',
+ nome: 'Madson Kilder',
+ rg: '123456122',
+ simboloNome: 'DAS-3', // Será convertido para ID
+ simboloTipo: 'cargo_comissionado' as const,
+ telefone: '8101234564',
+ uf: 'PE'
+ },
+ {
+ admissaoData: '01/01/2000',
+ cep: '50740400',
+ cidade: 'Recife',
+ cpf: '05129038401',
+ email: 'princesalves@gmail.com',
+ endereco: 'Rua Deputado Cunha Rabelo, Várzea',
+ matricula: '123456',
+ nascimento: '05/01/1985',
+ nome: 'Princes Alves rocha wanderley',
+ rg: '639541200',
+ simboloNome: 'FDA-1', // Será convertido para ID
+ simboloTipo: 'funcao_gratificada' as const,
+ telefone: '81123456455',
+ uf: 'PE'
+ },
+ {
+ admissaoData: '01/10/2025',
+ cep: '50740400',
+ cidade: 'Recife',
+ cpf: '06102637496',
+ email: 'deyvison.wanderley@gmail.com',
+ endereco: 'Rua Deputado Cunha Rabelo, Várzea',
+ matricula: '256220',
+ nascimento: '16/03/1985',
+ nome: 'Deyvison de França Wanderley',
+ rg: '6347974',
+ simboloNome: 'CAA-1', // Será convertido para ID
+ simboloTipo: 'cargo_comissionado' as const,
+ telefone: '81994235551',
+ uf: 'PE'
+ }
];
const solicitacoesAcessoData = [
- {
- dataResposta: 1761445098933,
- dataSolicitacao: 1761445038329,
- email: "severino@gmail.com",
- matricula: "3231",
- nome: "Severino Gates",
- observacoes: "Aprovação realizada por Deyvison",
- status: "aprovado" as const,
- telefone: "(81) 9942-3551",
- },
- {
- dataSolicitacao: 1761445187258,
- email: "michaeljackson@gmail.com",
- matricula: "123321",
- nome: "Michael Jackson",
- status: "pendente" as const,
- telefone: "(81) 99423-5551",
- },
+ {
+ dataResposta: 1761445098933,
+ dataSolicitacao: 1761445038329,
+ email: 'severino@gmail.com',
+ matricula: '3231',
+ nome: 'Severino Gates',
+ observacoes: 'Aprovação realizada por Deyvison',
+ status: 'aprovado' as const,
+ telefone: '(81) 9942-3551'
+ },
+ {
+ dataSolicitacao: 1761445187258,
+ email: 'michaeljackson@gmail.com',
+ matricula: '123321',
+ nome: 'Michael Jackson',
+ status: 'pendente' as const,
+ telefone: '(81) 99423-5551'
+ }
];
/**
* Seed inicial do banco de dados com os dados exportados do Convex Cloud
*/
export const seedCreateRoles = internalMutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("🔐 Criando roles...");
- const ensureRole = async (
- nome: string,
- descricao: string,
- nivel: number,
- setor?: string,
- editavel?: boolean
- ) => {
- const existing = await ctx.db
- .query("roles")
- .withIndex("by_nome", (q) => q.eq("nome", nome))
- .first();
- if (existing) {
- console.log(` ℹ️ Role já existe: ${nome}`);
- return existing._id;
- }
- const id = await ctx.db.insert("roles", {
- nome,
- descricao,
- nivel,
- setor,
- customizado: false,
- editavel,
- });
- console.log(` ✅ Role criada: ${nome}`);
- return id;
- };
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('🔐 Criando roles...');
+ const ensureRole = async (
+ nome: string,
+ descricao: string,
+ nivel: number,
+ setor?: string,
+ editavel?: boolean
+ ) => {
+ const existing = await ctx.db
+ .query('roles')
+ .withIndex('by_nome', (q) => q.eq('nome', nome))
+ .first();
+ if (existing) {
+ console.log(` ℹ️ Role já existe: ${nome}`);
+ return existing._id;
+ }
+ const id = await ctx.db.insert('roles', {
+ nome,
+ descricao,
+ nivel,
+ setor,
+ customizado: false,
+ editavel
+ });
+ console.log(` ✅ Role criada: ${nome}`);
+ return id;
+ };
- await ensureRole("ti_master", "TI Master", 0, "ti", false);
- await ensureRole("admin", "Administrador Geral", 2, "administrativo", true);
- await ensureRole("ti_usuario", "TI Usuário", 2, "ti", true);
- await ensureRole("rh", "Recursos Humanos", 2, "recursos_humanos", false);
- await ensureRole("financeiro", "Financeiro", 2, "financeiro", false);
- await ensureRole("usuario", "Usuário Padrão", 3, undefined, false);
- // Encadeia próxima etapa
- await ctx.scheduler.runAfter(0, internal.seed.seedCreateSimbolos, {});
- return null;
- },
+ // Níveis agora são apenas 0 e 1.
+ // 0 = máximo, 1 = administrativo (ambos com acesso total).
+ await ensureRole('ti_master', 'TI Master', 0, 'ti', false);
+ await ensureRole('admin', 'Administrador Geral', 1, 'administrativo', true);
+ await ensureRole('ti_usuario', 'TI Usuário', 1, 'ti', true);
+ await ensureRole('rh', 'Recursos Humanos', 1, 'recursos_humanos', false);
+ await ensureRole('financeiro', 'Financeiro', 1, 'financeiro', false);
+ await ensureRole('usuario', 'Usuário Padrão', 1, undefined, false);
+ // Encadeia próximas etapas
+ await ctx.scheduler.runAfter(0, internal.seed.seedCreateSimbolos, {});
+ await ctx.scheduler.runAfter(0, internal.seed.seedCreatePermissoesBase, {});
+ return null;
+ }
+});
+
+export const seedCreatePermissoesBase = internalMutation({
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('🔐 Criando permissões base...');
+ await ctx.runMutation(api.permissoesAcoes.seedPermissoesBase, {});
+ return null;
+ }
});
export const seedCreateSimbolos = internalMutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("💰 Criando símbolos...");
- const existentes = await ctx.db.query("simbolos").collect();
- const nomesExistentes = new Set(existentes.map((s) => s.nome));
- for (const simbolo of simbolosData) {
- if (nomesExistentes.has(simbolo.nome)) {
- console.log(` ℹ️ Símbolo já existe: ${simbolo.nome}`);
- continue;
- }
- await ctx.db.insert("simbolos", {
- nome: simbolo.nome,
- descricao: simbolo.descricao,
- tipo: simbolo.tipo,
- valor: simbolo.valor,
- repValor: simbolo.repValor || "",
- vencValor: simbolo.vencValor || "",
- });
- console.log(` ✅ Símbolo criado: ${simbolo.nome}`);
- }
- // Encadeia próxima etapa
- await ctx.scheduler.runAfter(0, internal.seed.seedCreateFuncionarios, {});
- return null;
- },
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('💰 Criando símbolos...');
+ const existentes = await ctx.db.query('simbolos').collect();
+ const nomesExistentes = new Set(existentes.map((s) => s.nome));
+ for (const simbolo of simbolosData) {
+ if (nomesExistentes.has(simbolo.nome)) {
+ console.log(` ℹ️ Símbolo já existe: ${simbolo.nome}`);
+ continue;
+ }
+ await ctx.db.insert('simbolos', {
+ nome: simbolo.nome,
+ descricao: simbolo.descricao,
+ tipo: simbolo.tipo,
+ valor: simbolo.valor,
+ repValor: simbolo.repValor || '',
+ vencValor: simbolo.vencValor || ''
+ });
+ console.log(` ✅ Símbolo criado: ${simbolo.nome}`);
+ }
+ // Encadeia próxima etapa
+ await ctx.scheduler.runAfter(0, internal.seed.seedCreateFuncionarios, {});
+ return null;
+ }
});
export const seedCreateFuncionarios = internalMutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("👥 Criando funcionários...");
- const simbolos = await ctx.db.query("simbolos").collect();
- const simbolosMap = new Map>();
- for (const s of simbolos) {
- simbolosMap.set(s.nome, s._id as Id<"simbolos">);
- }
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('👥 Criando funcionários...');
+ const simbolos = await ctx.db.query('simbolos').collect();
+ const simbolosMap = new Map>();
+ for (const s of simbolos) {
+ simbolosMap.set(s.nome, s._id as Id<'simbolos'>);
+ }
- for (const funcionario of funcionariosData) {
- // Evitar duplicar por CPF
- const existente = await ctx.db
- .query("funcionarios")
- .withIndex("by_cpf", (q) => q.eq("cpf", funcionario.cpf))
- .first();
- if (existente) {
- console.log(
- ` ℹ️ Funcionário já existe (CPF ${funcionario.cpf}): ${existente.nome}`
- );
- continue;
- }
- const simboloId = simbolosMap.get(funcionario.simboloNome);
- if (!simboloId) {
- console.log(` ❌ Símbolo não encontrado: ${funcionario.simboloNome}`);
- continue;
- }
- await ctx.db.insert("funcionarios", {
- admissaoData: funcionario.admissaoData,
- cep: funcionario.cep,
- cidade: funcionario.cidade,
- cpf: funcionario.cpf,
- email: funcionario.email,
- endereco: funcionario.endereco,
- matricula: funcionario.matricula,
- nascimento: funcionario.nascimento,
- nome: funcionario.nome,
- rg: funcionario.rg,
- simboloId: simboloId as Id<"simbolos">,
- simboloTipo: funcionario.simboloTipo,
- telefone: funcionario.telefone,
- uf: funcionario.uf,
- });
- console.log(` ✅ Funcionário criado: ${funcionario.nome}`);
- }
- // Encadeia próxima etapa
- await ctx.scheduler.runAfter(
- 0,
- internal.seed.seedCreateUsuariosParaFuncionarios,
- {}
- );
- return null;
- },
+ for (const funcionario of funcionariosData) {
+ // Evitar duplicar por CPF
+ const existente = await ctx.db
+ .query('funcionarios')
+ .withIndex('by_cpf', (q) => q.eq('cpf', funcionario.cpf))
+ .first();
+ if (existente) {
+ console.log(` ℹ️ Funcionário já existe (CPF ${funcionario.cpf}): ${existente.nome}`);
+ continue;
+ }
+ const simboloId = simbolosMap.get(funcionario.simboloNome);
+ if (!simboloId) {
+ console.log(` ❌ Símbolo não encontrado: ${funcionario.simboloNome}`);
+ continue;
+ }
+ await ctx.db.insert('funcionarios', {
+ admissaoData: funcionario.admissaoData,
+ cep: funcionario.cep,
+ cidade: funcionario.cidade,
+ cpf: funcionario.cpf,
+ email: funcionario.email,
+ endereco: funcionario.endereco,
+ matricula: funcionario.matricula,
+ nascimento: funcionario.nascimento,
+ nome: funcionario.nome,
+ rg: funcionario.rg,
+ simboloId: simboloId as Id<'simbolos'>,
+ simboloTipo: funcionario.simboloTipo,
+ telefone: funcionario.telefone,
+ uf: funcionario.uf
+ });
+ console.log(` ✅ Funcionário criado: ${funcionario.nome}`);
+ }
+ // Encadeia próxima etapa
+ await ctx.scheduler.runAfter(0, internal.seed.seedCreateUsuariosParaFuncionarios, {});
+ return null;
+ }
});
export const seedCreateUsuariosParaFuncionarios = internalMutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("👤 Criando usuários para funcionários...");
- // Agenda criação por funcionário para evitar timeout
- let delay = 0;
- for (const funcionario of funcionariosData) {
- await ctx.scheduler.runAfter(
- delay,
- internal.seed.seedCreateUsuarioParaFuncionario,
- {
- matricula: funcionario.matricula,
- nome: funcionario.nome,
- email: funcionario.email,
- }
- );
- delay += 50;
- }
- // Agenda próxima etapa após as criações individuais
- await ctx.scheduler.runAfter(
- delay + 300,
- internal.seed.seedInserirSolicitacoesAcesso,
- {}
- );
- return null;
- },
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('👤 Criando usuários para funcionários...');
+ // Agenda criação por funcionário para evitar timeout
+ let delay = 0;
+ for (const funcionario of funcionariosData) {
+ await ctx.scheduler.runAfter(delay, internal.seed.seedCreateUsuarioParaFuncionario, {
+ matricula: funcionario.matricula,
+ nome: funcionario.nome,
+ email: funcionario.email
+ });
+ delay += 50;
+ }
+ // Agenda próxima etapa após as criações individuais
+ await ctx.scheduler.runAfter(delay + 300, internal.seed.seedInserirSolicitacoesAcesso, {});
+ return null;
+ }
});
export const seedCreateUsuarioParaFuncionario = internalMutation({
- args: {
- matricula: v.string(),
- nome: v.string(),
- email: v.string(),
- },
- returns: v.null(),
- handler: async (ctx, args) => {
- // Role "usuario"
- const roleUsuario = await ctx.db
- .query("roles")
- .withIndex("by_nome", (q) => q.eq("nome", "usuario"))
- .first();
- if (!roleUsuario) {
- console.log(' ❌ Role "usuario" não encontrada');
- return null;
- }
+ args: {
+ matricula: v.string(),
+ nome: v.string(),
+ email: v.string()
+ },
+ returns: v.null(),
+ handler: async (ctx, args) => {
+ // Role "usuario"
+ const roleUsuario = await ctx.db
+ .query('roles')
+ .withIndex('by_nome', (q) => q.eq('nome', 'usuario'))
+ .first();
+ if (!roleUsuario) {
+ console.log(' ❌ Role "usuario" não encontrada');
+ return null;
+ }
- const funcionarioDoc = await ctx.db
- .query("funcionarios")
- .withIndex("by_matricula", (q) => q.eq("matricula", args.matricula))
- .first();
- if (!funcionarioDoc) {
- console.log(
- ` ❌ Funcionário não encontrado pela matrícula: ${args.matricula}`
- );
- return null;
- }
+ const funcionarioDoc = await ctx.db
+ .query('funcionarios')
+ .withIndex('by_matricula', (q) => q.eq('matricula', args.matricula))
+ .first();
+ if (!funcionarioDoc) {
+ console.log(` ❌ Funcionário não encontrado pela matrícula: ${args.matricula}`);
+ return null;
+ }
- const usuarioExistente = await ctx.db
- .query("usuarios")
- .withIndex("by_email", (q) => q.eq("email", args.email))
- .first();
- if (usuarioExistente) {
- console.log(` ℹ️ Usuário já existe para ${args.email}`);
- return null;
- }
+ const usuarioExistente = await ctx.db
+ .query('usuarios')
+ .withIndex('by_email', (q) => q.eq('email', args.email))
+ .first();
+ if (usuarioExistente) {
+ console.log(` ℹ️ Usuário já existe para ${args.email}`);
+ return null;
+ }
- const authUserId = await createAuthUser(ctx, {
- nome: args.nome,
- email: args.email,
- password: "Mudar@123",
- });
+ const authUserId = await createAuthUser(ctx, {
+ nome: args.nome,
+ email: args.email,
+ password: 'Mudar@123'
+ });
- await ctx.db.insert("usuarios", {
- authId: authUserId,
- nome: args.nome,
- email: args.email,
- funcionarioId: funcionarioDoc._id as Id<"funcionarios">,
- roleId: roleUsuario._id,
- ativo: true,
- primeiroAcesso: true,
- criadoEm: Date.now(),
- atualizadoEm: Date.now(),
- });
- console.log(` ✅ Usuário criado: ${args.nome} (senha: Mudar@123)`);
- return null;
- },
+ await ctx.db.insert('usuarios', {
+ authId: authUserId,
+ nome: args.nome,
+ email: args.email,
+ funcionarioId: funcionarioDoc._id as Id<'funcionarios'>,
+ roleId: roleUsuario._id,
+ ativo: true,
+ primeiroAcesso: true,
+ criadoEm: Date.now(),
+ atualizadoEm: Date.now()
+ });
+ console.log(` ✅ Usuário criado: ${args.nome} (senha: Mudar@123)`);
+ return null;
+ }
});
export const seedInserirSolicitacoesAcesso = internalMutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("📋 Inserindo solicitações de acesso...");
- for (const solicitacao of solicitacoesAcessoData) {
- // Evitar duplicidade por matrícula
- const existente = await ctx.db
- .query("solicitacoesAcesso")
- .withIndex("by_matricula", (q) =>
- q.eq("matricula", solicitacao.matricula)
- )
- .first();
- if (existente) {
- console.log(
- ` ℹ️ Solicitação já existe p/ matrícula ${solicitacao.matricula}`
- );
- continue;
- }
- const dadosSolicitacao: {
- nome: string;
- matricula: string;
- email: string;
- telefone: string;
- status: "pendente" | "aprovado" | "rejeitado";
- dataSolicitacao: number;
- dataResposta?: number;
- observacoes?: string;
- } = {
- nome: solicitacao.nome,
- matricula: solicitacao.matricula,
- email: solicitacao.email,
- telefone: solicitacao.telefone,
- status: solicitacao.status,
- dataSolicitacao: solicitacao.dataSolicitacao,
- };
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('📋 Inserindo solicitações de acesso...');
+ for (const solicitacao of solicitacoesAcessoData) {
+ // Evitar duplicidade por matrícula
+ const existente = await ctx.db
+ .query('solicitacoesAcesso')
+ .withIndex('by_matricula', (q) => q.eq('matricula', solicitacao.matricula))
+ .first();
+ if (existente) {
+ console.log(` ℹ️ Solicitação já existe p/ matrícula ${solicitacao.matricula}`);
+ continue;
+ }
+ const dadosSolicitacao: {
+ nome: string;
+ matricula: string;
+ email: string;
+ telefone: string;
+ status: 'pendente' | 'aprovado' | 'rejeitado';
+ dataSolicitacao: number;
+ dataResposta?: number;
+ observacoes?: string;
+ } = {
+ nome: solicitacao.nome,
+ matricula: solicitacao.matricula,
+ email: solicitacao.email,
+ telefone: solicitacao.telefone,
+ status: solicitacao.status,
+ dataSolicitacao: solicitacao.dataSolicitacao
+ };
- if (solicitacao.dataResposta) {
- dadosSolicitacao.dataResposta = solicitacao.dataResposta;
- }
+ if (solicitacao.dataResposta) {
+ dadosSolicitacao.dataResposta = solicitacao.dataResposta;
+ }
- if (solicitacao.observacoes) {
- dadosSolicitacao.observacoes = solicitacao.observacoes;
- }
+ if (solicitacao.observacoes) {
+ dadosSolicitacao.observacoes = solicitacao.observacoes;
+ }
- await ctx.db.insert("solicitacoesAcesso", dadosSolicitacao);
- console.log(
- ` ✅ Solicitação criada: ${solicitacao.nome} (${solicitacao.status})`
- );
- }
- console.log("✨ Seed concluído!");
- return null;
- },
+ await ctx.db.insert('solicitacoesAcesso', dadosSolicitacao);
+ console.log(` ✅ Solicitação criada: ${solicitacao.nome} (${solicitacao.status})`);
+ }
+ console.log('✨ Seed concluído!');
+ return null;
+ }
});
export const seedDatabase = internalAction({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("🌱 Iniciando seed do banco de dados (action)...");
- await ctx.runMutation(internal.seed.seedCreateRoles, {});
- await ctx.runMutation(internal.seed.seedCreateSimbolos, {});
- await ctx.runMutation(internal.seed.seedCreateFuncionarios, {});
- await ctx.runMutation(internal.seed.seedCreateUsuariosParaFuncionarios, {});
- await ctx.runMutation(internal.seed.seedInserirSolicitacoesAcesso, {});
- console.log("✨ Seed do banco de dados concluído com sucesso pela action!");
- return null;
- },
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('🌱 Iniciando seed do banco de dados (action)...');
+ await ctx.runMutation(internal.seed.seedCreateRoles, {});
+ await ctx.runMutation(internal.seed.seedCreateSimbolos, {});
+ await ctx.runMutation(internal.seed.seedCreateFuncionarios, {});
+ await ctx.runMutation(internal.seed.seedCreateUsuariosParaFuncionarios, {});
+ await ctx.runMutation(internal.seed.seedInserirSolicitacoesAcesso, {});
+ console.log('✨ Seed do banco de dados concluído com sucesso pela action!');
+ return null;
+ }
});
/**
@@ -486,275 +471,243 @@ export const seedDatabase = internalAction({
* Permite executar via CLI: `npx convex run seed:popularBanco`
*/
export const popularBanco = mutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log(
- "🌱 Executando popularBanco (wrapper público para seedDatabase)..."
- );
- // Agenda apenas a primeira etapa; as demais serão encadeadas internamente
- await ctx.scheduler.runAfter(0, internal.seed.seedCreateRoles, {});
- console.log("✅ Seed iniciado (etapa 1 agendada)");
- return null;
- },
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('🌱 Executando popularBanco (wrapper público para seedDatabase)...');
+ // Agenda apenas a primeira etapa; as demais serão encadeadas internamente
+ await ctx.scheduler.runAfter(0, internal.seed.seedCreateRoles, {});
+ console.log('✅ Seed iniciado (etapa 1 agendada)');
+ return null;
+ }
});
/**
* Limpar todos os dados do banco
*/
export const clearDatabase = internalMutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- console.log("🗑️ Limpando banco de dados...");
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ console.log('🗑️ Limpando banco de dados...');
- // Limpar em ordem (respeitando dependências)
+ // Limpar em ordem (respeitando dependências)
- // 1. Tabelas de logs e auditoria
- const logsAcesso = await ctx.db.query("logsAcesso").collect();
- for (const log of logsAcesso) {
- await ctx.db.delete(log._id);
- }
- console.log(` ✅ ${logsAcesso.length} logs de acesso removidos`);
+ // 1. Tabelas de logs e auditoria
+ const logsAcesso = await ctx.db.query('logsAcesso').collect();
+ for (const log of logsAcesso) {
+ await ctx.db.delete(log._id);
+ }
+ console.log(` ✅ ${logsAcesso.length} logs de acesso removidos`);
- const logsLogin = await ctx.db.query("logsLogin").collect();
- for (const log of logsLogin) {
- await ctx.db.delete(log._id);
- }
- console.log(` ✅ ${logsLogin.length} logs de login removidos`);
+ const logsLogin = await ctx.db.query('logsLogin').collect();
+ for (const log of logsLogin) {
+ await ctx.db.delete(log._id);
+ }
+ console.log(` ✅ ${logsLogin.length} logs de login removidos`);
- const logsAtividades = await ctx.db.query("logsAtividades").collect();
- for (const log of logsAtividades) {
- await ctx.db.delete(log._id);
- }
- console.log(` ✅ ${logsAtividades.length} logs de atividades removidos`);
+ const logsAtividades = await ctx.db.query('logsAtividades').collect();
+ for (const log of logsAtividades) {
+ await ctx.db.delete(log._id);
+ }
+ console.log(` ✅ ${logsAtividades.length} logs de atividades removidos`);
- // 2. Sistema de chat
- const leituras = await ctx.db.query("leituras").collect();
- for (const leitura of leituras) {
- await ctx.db.delete(leitura._id);
- }
- console.log(` ✅ ${leituras.length} leituras removidas`);
+ // 2. Sistema de chat
+ const leituras = await ctx.db.query('leituras').collect();
+ for (const leitura of leituras) {
+ await ctx.db.delete(leitura._id);
+ }
+ console.log(` ✅ ${leituras.length} leituras removidas`);
- const mensagens = await ctx.db.query("mensagens").collect();
- for (const mensagem of mensagens) {
- await ctx.db.delete(mensagem._id);
- }
- console.log(` ✅ ${mensagens.length} mensagens removidas`);
+ const mensagens = await ctx.db.query('mensagens').collect();
+ for (const mensagem of mensagens) {
+ await ctx.db.delete(mensagem._id);
+ }
+ console.log(` ✅ ${mensagens.length} mensagens removidas`);
- const digitando = await ctx.db.query("digitando").collect();
- for (const d of digitando) {
- await ctx.db.delete(d._id);
- }
- console.log(` ✅ ${digitando.length} registros de digitando removidos`);
+ const digitando = await ctx.db.query('digitando').collect();
+ for (const d of digitando) {
+ await ctx.db.delete(d._id);
+ }
+ console.log(` ✅ ${digitando.length} registros de digitando removidos`);
- const conversas = await ctx.db.query("conversas").collect();
- for (const conversa of conversas) {
- await ctx.db.delete(conversa._id);
- }
- console.log(` ✅ ${conversas.length} conversas removidas`);
+ const conversas = await ctx.db.query('conversas').collect();
+ for (const conversa of conversas) {
+ await ctx.db.delete(conversa._id);
+ }
+ console.log(` ✅ ${conversas.length} conversas removidas`);
- // 3. Notificações
- const notificacoes = await ctx.db.query("notificacoes").collect();
- for (const notificacao of notificacoes) {
- await ctx.db.delete(notificacao._id);
- }
- console.log(` ✅ ${notificacoes.length} notificações removidas`);
+ // 3. Notificações
+ const notificacoes = await ctx.db.query('notificacoes').collect();
+ for (const notificacao of notificacoes) {
+ await ctx.db.delete(notificacao._id);
+ }
+ console.log(` ✅ ${notificacoes.length} notificações removidas`);
- const notificacoesEmail = await ctx.db.query("notificacoesEmail").collect();
- for (const email of notificacoesEmail) {
- await ctx.db.delete(email._id);
- }
- console.log(
- ` ✅ ${notificacoesEmail.length} notificações de email removidas`
- );
+ const notificacoesEmail = await ctx.db.query('notificacoesEmail').collect();
+ for (const email of notificacoesEmail) {
+ await ctx.db.delete(email._id);
+ }
+ console.log(` ✅ ${notificacoesEmail.length} notificações de email removidas`);
- const notificacoesFerias = await ctx.db
- .query("notificacoesFerias")
- .collect();
- for (const notif of notificacoesFerias) {
- await ctx.db.delete(notif._id);
- }
- console.log(
- ` ✅ ${notificacoesFerias.length} notificações de férias removidas`
- );
+ const notificacoesFerias = await ctx.db.query('notificacoesFerias').collect();
+ for (const notif of notificacoesFerias) {
+ await ctx.db.delete(notif._id);
+ }
+ console.log(` ✅ ${notificacoesFerias.length} notificações de férias removidas`);
- // 4. Férias
- const ferias = await ctx.db
- .query("ferias")
- .collect();
- for (const feriasRegistro of ferias) {
- await ctx.db.delete(feriasRegistro._id);
- }
- console.log(
- ` ✅ ${ferias.length} registros de férias removidos`
- );
+ // 4. Férias
+ const ferias = await ctx.db.query('ferias').collect();
+ for (const feriasRegistro of ferias) {
+ await ctx.db.delete(feriasRegistro._id);
+ }
+ console.log(` ✅ ${ferias.length} registros de férias removidos`);
- // 5. Atestados
- const atestados = await ctx.db.query("atestados").collect();
- for (const atestado of atestados) {
- await ctx.db.delete(atestado._id);
- }
- console.log(` ✅ ${atestados.length} atestados removidos`);
+ // 5. Atestados
+ const atestados = await ctx.db.query('atestados').collect();
+ for (const atestado of atestados) {
+ await ctx.db.delete(atestado._id);
+ }
+ console.log(` ✅ ${atestados.length} atestados removidos`);
- // 6. Times e membros
- const timesMembros = await ctx.db.query("timesMembros").collect();
- for (const membro of timesMembros) {
- await ctx.db.delete(membro._id);
- }
- console.log(` ✅ ${timesMembros.length} membros de times removidos`);
+ // 6. Times e membros
+ const timesMembros = await ctx.db.query('timesMembros').collect();
+ for (const membro of timesMembros) {
+ await ctx.db.delete(membro._id);
+ }
+ console.log(` ✅ ${timesMembros.length} membros de times removidos`);
- const times = await ctx.db.query("times").collect();
- for (const time of times) {
- await ctx.db.delete(time._id);
- }
- console.log(` ✅ ${times.length} times removidos`);
+ const times = await ctx.db.query('times').collect();
+ for (const time of times) {
+ await ctx.db.delete(time._id);
+ }
+ console.log(` ✅ ${times.length} times removidos`);
- // 7. Cursos
- const cursos = await ctx.db.query("cursos").collect();
- for (const curso of cursos) {
- await ctx.db.delete(curso._id);
- }
- console.log(` ✅ ${cursos.length} cursos removidos`);
+ // 7. Cursos
+ const cursos = await ctx.db.query('cursos').collect();
+ for (const curso of cursos) {
+ await ctx.db.delete(curso._id);
+ }
+ console.log(` ✅ ${cursos.length} cursos removidos`);
- // 8. Bloqueios de usuários
- const bloqueiosUsuarios = await ctx.db.query("bloqueiosUsuarios").collect();
- for (const bloqueio of bloqueiosUsuarios) {
- await ctx.db.delete(bloqueio._id);
- }
- console.log(
- ` ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`
- );
+ // 8. Bloqueios de usuários
+ const bloqueiosUsuarios = await ctx.db.query('bloqueiosUsuarios').collect();
+ for (const bloqueio of bloqueiosUsuarios) {
+ await ctx.db.delete(bloqueio._id);
+ }
+ console.log(` ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`);
- // 9. Perfis customizados
+ // 9. Perfis customizados
- // 10. Templates de mensagens
- const templatesMensagens = await ctx.db
- .query("templatesMensagens")
- .collect();
- for (const template of templatesMensagens) {
- await ctx.db.delete(template._id);
- }
- console.log(
- ` ✅ ${templatesMensagens.length} templates de mensagens removidos`
- );
+ // 10. Templates de mensagens
+ const templatesMensagens = await ctx.db.query('templatesMensagens').collect();
+ for (const template of templatesMensagens) {
+ await ctx.db.delete(template._id);
+ }
+ console.log(` ✅ ${templatesMensagens.length} templates de mensagens removidos`);
- // 11. Configurações
- const configuracaoEmail = await ctx.db.query("configuracaoEmail").collect();
- for (const config of configuracaoEmail) {
- await ctx.db.delete(config._id);
- }
- console.log(
- ` ✅ ${configuracaoEmail.length} configurações de email removidas`
- );
+ // 11. Configurações
+ const configuracaoEmail = await ctx.db.query('configuracaoEmail').collect();
+ for (const config of configuracaoEmail) {
+ await ctx.db.delete(config._id);
+ }
+ console.log(` ✅ ${configuracaoEmail.length} configurações de email removidas`);
- const configuracaoAcesso = await ctx.db
- .query("configuracaoAcesso")
- .collect();
- for (const config of configuracaoAcesso) {
- await ctx.db.delete(config._id);
- }
- console.log(
- ` ✅ ${configuracaoAcesso.length} configurações de acesso removidas`
- );
+ const configuracaoAcesso = await ctx.db.query('configuracaoAcesso').collect();
+ for (const config of configuracaoAcesso) {
+ await ctx.db.delete(config._id);
+ }
+ console.log(` ✅ ${configuracaoAcesso.length} configurações de acesso removidas`);
- // 12. Monitoramento
- const alertHistory = await ctx.db.query("alertHistory").collect();
- for (const alert of alertHistory) {
- await ctx.db.delete(alert._id);
- }
- console.log(` ✅ ${alertHistory.length} histórico de alertas removido`);
+ // 12. Monitoramento
+ const alertHistory = await ctx.db.query('alertHistory').collect();
+ for (const alert of alertHistory) {
+ await ctx.db.delete(alert._id);
+ }
+ console.log(` ✅ ${alertHistory.length} histórico de alertas removido`);
- const alertConfigurations = await ctx.db
- .query("alertConfigurations")
- .collect();
- for (const alert of alertConfigurations) {
- await ctx.db.delete(alert._id);
- }
- console.log(
- ` ✅ ${alertConfigurations.length} configurações de alertas removidas`
- );
+ const alertConfigurations = await ctx.db.query('alertConfigurations').collect();
+ for (const alert of alertConfigurations) {
+ await ctx.db.delete(alert._id);
+ }
+ console.log(` ✅ ${alertConfigurations.length} configurações de alertas removidas`);
- const systemMetrics = await ctx.db.query("systemMetrics").collect();
- for (const metric of systemMetrics) {
- await ctx.db.delete(metric._id);
- }
- console.log(` ✅ ${systemMetrics.length} métricas do sistema removidas`);
+ const systemMetrics = await ctx.db.query('systemMetrics').collect();
+ for (const metric of systemMetrics) {
+ await ctx.db.delete(metric._id);
+ }
+ console.log(` ✅ ${systemMetrics.length} métricas do sistema removidas`);
- // 13. Sessões
- const sessoes = await ctx.db.query("sessoes").collect();
- for (const sessao of sessoes) {
- await ctx.db.delete(sessao._id);
- }
- console.log(` ✅ ${sessoes.length} sessões removidas`);
+ // 13. Sessões
+ const sessoes = await ctx.db.query('sessoes').collect();
+ for (const sessao of sessoes) {
+ await ctx.db.delete(sessao._id);
+ }
+ console.log(` ✅ ${sessoes.length} sessões removidas`);
- // 14. Menu-permissões personalizadas
+ // 14. Menu-permissões personalizadas
- // 15. Menu-permissões
+ // 15. Menu-permissões
- // 16. Role-permissões
- const rolePermissoes = await ctx.db.query("rolePermissoes").collect();
- for (const rp of rolePermissoes) {
- await ctx.db.delete(rp._id);
- }
- console.log(` ✅ ${rolePermissoes.length} role-permissões removidas`);
+ // 16. Role-permissões
+ const rolePermissoes = await ctx.db.query('rolePermissoes').collect();
+ for (const rp of rolePermissoes) {
+ await ctx.db.delete(rp._id);
+ }
+ console.log(` ✅ ${rolePermissoes.length} role-permissões removidas`);
- // 17. Permissões
- const permissoes = await ctx.db.query("permissoes").collect();
- for (const permissao of permissoes) {
- await ctx.db.delete(permissao._id);
- }
- console.log(` ✅ ${permissoes.length} permissões removidas`);
+ // 17. Permissões
+ const permissoes = await ctx.db.query('permissoes').collect();
+ for (const permissao of permissoes) {
+ await ctx.db.delete(permissao._id);
+ }
+ console.log(` ✅ ${permissoes.length} permissões removidas`);
- // 18. Usuários (deve vir antes de roles se houver referência)
- const usuarios = await ctx.db.query("usuarios").collect();
- for (const usuario of usuarios) {
- await ctx.db.delete(usuario._id);
- }
- console.log(` ✅ ${usuarios.length} usuários removidos`);
+ // 18. Usuários (deve vir antes de roles se houver referência)
+ const usuarios = await ctx.db.query('usuarios').collect();
+ for (const usuario of usuarios) {
+ await ctx.db.delete(usuario._id);
+ }
+ console.log(` ✅ ${usuarios.length} usuários removidos`);
- // 19. Funcionários
- const funcionarios = await ctx.db.query("funcionarios").collect();
- for (const funcionario of funcionarios) {
- await ctx.db.delete(funcionario._id);
- }
- console.log(` ✅ ${funcionarios.length} funcionários removidos`);
+ // 19. Funcionários
+ const funcionarios = await ctx.db.query('funcionarios').collect();
+ for (const funcionario of funcionarios) {
+ await ctx.db.delete(funcionario._id);
+ }
+ console.log(` ✅ ${funcionarios.length} funcionários removidos`);
- // 20. Solicitações de acesso
- const solicitacoesAcesso = await ctx.db
- .query("solicitacoesAcesso")
- .collect();
- for (const solicitacao of solicitacoesAcesso) {
- await ctx.db.delete(solicitacao._id);
- }
- console.log(
- ` ✅ ${solicitacoesAcesso.length} solicitações de acesso removidas`
- );
+ // 20. Solicitações de acesso
+ const solicitacoesAcesso = await ctx.db.query('solicitacoesAcesso').collect();
+ for (const solicitacao of solicitacoesAcesso) {
+ await ctx.db.delete(solicitacao._id);
+ }
+ console.log(` ✅ ${solicitacoesAcesso.length} solicitações de acesso removidas`);
- // 21. Símbolos
- const simbolos = await ctx.db.query("simbolos").collect();
- for (const simbolo of simbolos) {
- await ctx.db.delete(simbolo._id);
- }
- console.log(` ✅ ${simbolos.length} símbolos removidos`);
+ // 21. Símbolos
+ const simbolos = await ctx.db.query('simbolos').collect();
+ for (const simbolo of simbolos) {
+ await ctx.db.delete(simbolo._id);
+ }
+ console.log(` ✅ ${simbolos.length} símbolos removidos`);
- // 22. Roles (deve vir por último se outras tabelas referenciam)
- const roles = await ctx.db.query("roles").collect();
- for (const role of roles) {
- await ctx.db.delete(role._id);
- }
- console.log(` ✅ ${roles.length} roles removidas`);
+ // 22. Roles (deve vir por último se outras tabelas referenciam)
+ const roles = await ctx.db.query('roles').collect();
+ for (const role of roles) {
+ await ctx.db.delete(role._id);
+ }
+ console.log(` ✅ ${roles.length} roles removidas`);
- // 23. Todos (tabela de exemplo)
- const todos = await ctx.db.query("todos").collect();
- for (const todo of todos) {
- await ctx.db.delete(todo._id);
- }
- console.log(` ✅ ${todos.length} todos removidos`);
+ // 23. Todos (tabela de exemplo)
+ const todos = await ctx.db.query('todos').collect();
+ for (const todo of todos) {
+ await ctx.db.delete(todo._id);
+ }
+ console.log(` ✅ ${todos.length} todos removidos`);
- console.log("✨ Banco de dados completamente limpo!");
- return null;
- },
+ console.log('✨ Banco de dados completamente limpo!');
+ return null;
+ }
});
/**
@@ -762,286 +715,255 @@ export const clearDatabase = internalMutation({
* ATENÇÃO: Esta função deleta TODOS os dados do banco!
*/
export const limparBanco = mutation({
- args: {},
- returns: v.null(),
- handler: async (ctx) => {
- // Executa diretamente a limpeza (mesmo código da internalMutation)
- console.log("🗑️ Limpando banco de dados...");
+ args: {},
+ returns: v.null(),
+ handler: async (ctx) => {
+ // Executa diretamente a limpeza (mesmo código da internalMutation)
+ console.log('🗑️ Limpando banco de dados...');
- // Limpar em ordem (respeitando dependências)
+ // Limpar em ordem (respeitando dependências)
- // 1. Tabelas de logs e auditoria
- const logsAcesso = await ctx.db.query("logsAcesso").collect();
- for (const log of logsAcesso) {
- await ctx.db.delete(log._id);
- }
- console.log(` ✅ ${logsAcesso.length} logs de acesso removidos`);
+ // 1. Tabelas de logs e auditoria
+ const logsAcesso = await ctx.db.query('logsAcesso').collect();
+ for (const log of logsAcesso) {
+ await ctx.db.delete(log._id);
+ }
+ console.log(` ✅ ${logsAcesso.length} logs de acesso removidos`);
- const logsLogin = await ctx.db.query("logsLogin").collect();
- for (const log of logsLogin) {
- await ctx.db.delete(log._id);
- }
- console.log(` ✅ ${logsLogin.length} logs de login removidos`);
+ const logsLogin = await ctx.db.query('logsLogin').collect();
+ for (const log of logsLogin) {
+ await ctx.db.delete(log._id);
+ }
+ console.log(` ✅ ${logsLogin.length} logs de login removidos`);
- const logsAtividades = await ctx.db.query("logsAtividades").collect();
- for (const log of logsAtividades) {
- await ctx.db.delete(log._id);
- }
- console.log(` ✅ ${logsAtividades.length} logs de atividades removidos`);
+ const logsAtividades = await ctx.db.query('logsAtividades').collect();
+ for (const log of logsAtividades) {
+ await ctx.db.delete(log._id);
+ }
+ console.log(` ✅ ${logsAtividades.length} logs de atividades removidos`);
- // 2. Sistema de chat
- const leituras = await ctx.db.query("leituras").collect();
- for (const leitura of leituras) {
- await ctx.db.delete(leitura._id);
- }
- console.log(` ✅ ${leituras.length} leituras removidas`);
+ // 2. Sistema de chat
+ const leituras = await ctx.db.query('leituras').collect();
+ for (const leitura of leituras) {
+ await ctx.db.delete(leitura._id);
+ }
+ console.log(` ✅ ${leituras.length} leituras removidas`);
- const mensagens = await ctx.db.query("mensagens").collect();
- for (const mensagem of mensagens) {
- await ctx.db.delete(mensagem._id);
- }
- console.log(` ✅ ${mensagens.length} mensagens removidas`);
+ const mensagens = await ctx.db.query('mensagens').collect();
+ for (const mensagem of mensagens) {
+ await ctx.db.delete(mensagem._id);
+ }
+ console.log(` ✅ ${mensagens.length} mensagens removidas`);
- const digitando = await ctx.db.query("digitando").collect();
- for (const d of digitando) {
- await ctx.db.delete(d._id);
- }
- console.log(` ✅ ${digitando.length} registros de digitando removidos`);
+ const digitando = await ctx.db.query('digitando').collect();
+ for (const d of digitando) {
+ await ctx.db.delete(d._id);
+ }
+ console.log(` ✅ ${digitando.length} registros de digitando removidos`);
- const conversas = await ctx.db.query("conversas").collect();
- for (const conversa of conversas) {
- await ctx.db.delete(conversa._id);
- }
- console.log(` ✅ ${conversas.length} conversas removidas`);
+ const conversas = await ctx.db.query('conversas').collect();
+ for (const conversa of conversas) {
+ await ctx.db.delete(conversa._id);
+ }
+ console.log(` ✅ ${conversas.length} conversas removidas`);
- // 3. Notificações
- const notificacoes = await ctx.db.query("notificacoes").collect();
- for (const notificacao of notificacoes) {
- await ctx.db.delete(notificacao._id);
- }
- console.log(` ✅ ${notificacoes.length} notificações removidas`);
+ // 3. Notificações
+ const notificacoes = await ctx.db.query('notificacoes').collect();
+ for (const notificacao of notificacoes) {
+ await ctx.db.delete(notificacao._id);
+ }
+ console.log(` ✅ ${notificacoes.length} notificações removidas`);
- const notificacoesEmail = await ctx.db.query("notificacoesEmail").collect();
- for (const email of notificacoesEmail) {
- await ctx.db.delete(email._id);
- }
- console.log(
- ` ✅ ${notificacoesEmail.length} notificações de email removidas`
- );
+ const notificacoesEmail = await ctx.db.query('notificacoesEmail').collect();
+ for (const email of notificacoesEmail) {
+ await ctx.db.delete(email._id);
+ }
+ console.log(` ✅ ${notificacoesEmail.length} notificações de email removidas`);
- const notificacoesFerias = await ctx.db
- .query("notificacoesFerias")
- .collect();
- for (const notif of notificacoesFerias) {
- await ctx.db.delete(notif._id);
- }
- console.log(
- ` ✅ ${notificacoesFerias.length} notificações de férias removidas`
- );
+ const notificacoesFerias = await ctx.db.query('notificacoesFerias').collect();
+ for (const notif of notificacoesFerias) {
+ await ctx.db.delete(notif._id);
+ }
+ console.log(` ✅ ${notificacoesFerias.length} notificações de férias removidas`);
- // 4. Férias
- const ferias = await ctx.db
- .query("ferias")
- .collect();
- for (const feriasRegistro of ferias) {
- await ctx.db.delete(feriasRegistro._id);
- }
- console.log(
- ` ✅ ${ferias.length} registros de férias removidos`
- );
+ // 4. Férias
+ const ferias = await ctx.db.query('ferias').collect();
+ for (const feriasRegistro of ferias) {
+ await ctx.db.delete(feriasRegistro._id);
+ }
+ console.log(` ✅ ${ferias.length} registros de férias removidos`);
- // 5. Atestados
- const atestados = await ctx.db.query("atestados").collect();
- for (const atestado of atestados) {
- await ctx.db.delete(atestado._id);
- }
- console.log(` ✅ ${atestados.length} atestados removidos`);
+ // 5. Atestados
+ const atestados = await ctx.db.query('atestados').collect();
+ for (const atestado of atestados) {
+ await ctx.db.delete(atestado._id);
+ }
+ console.log(` ✅ ${atestados.length} atestados removidos`);
- // 6. Times e membros
- const timesMembros = await ctx.db.query("timesMembros").collect();
- for (const membro of timesMembros) {
- await ctx.db.delete(membro._id);
- }
- console.log(` ✅ ${timesMembros.length} membros de times removidos`);
+ // 6. Times e membros
+ const timesMembros = await ctx.db.query('timesMembros').collect();
+ for (const membro of timesMembros) {
+ await ctx.db.delete(membro._id);
+ }
+ console.log(` ✅ ${timesMembros.length} membros de times removidos`);
- const times = await ctx.db.query("times").collect();
- for (const time of times) {
- await ctx.db.delete(time._id);
- }
- console.log(` ✅ ${times.length} times removidos`);
+ const times = await ctx.db.query('times').collect();
+ for (const time of times) {
+ await ctx.db.delete(time._id);
+ }
+ console.log(` ✅ ${times.length} times removidos`);
- // 7. Cursos
- const cursos = await ctx.db.query("cursos").collect();
- for (const curso of cursos) {
- await ctx.db.delete(curso._id);
- }
- console.log(` ✅ ${cursos.length} cursos removidos`);
+ // 7. Cursos
+ const cursos = await ctx.db.query('cursos').collect();
+ for (const curso of cursos) {
+ await ctx.db.delete(curso._id);
+ }
+ console.log(` ✅ ${cursos.length} cursos removidos`);
- // 8. Bloqueios de usuários
- const bloqueiosUsuarios = await ctx.db.query("bloqueiosUsuarios").collect();
- for (const bloqueio of bloqueiosUsuarios) {
- await ctx.db.delete(bloqueio._id);
- }
- console.log(
- ` ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`
- );
+ // 8. Bloqueios de usuários
+ const bloqueiosUsuarios = await ctx.db.query('bloqueiosUsuarios').collect();
+ for (const bloqueio of bloqueiosUsuarios) {
+ await ctx.db.delete(bloqueio._id);
+ }
+ console.log(` ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`);
- // 9. Perfis customizados (já está no código da internalMutation mas vazio)
+ // 9. Perfis customizados (já está no código da internalMutation mas vazio)
- // 10. Templates de mensagens
- const templatesMensagens = await ctx.db
- .query("templatesMensagens")
- .collect();
- for (const template of templatesMensagens) {
- await ctx.db.delete(template._id);
- }
- console.log(
- ` ✅ ${templatesMensagens.length} templates de mensagens removidos`
- );
+ // 10. Templates de mensagens
+ const templatesMensagens = await ctx.db.query('templatesMensagens').collect();
+ for (const template of templatesMensagens) {
+ await ctx.db.delete(template._id);
+ }
+ console.log(` ✅ ${templatesMensagens.length} templates de mensagens removidos`);
- // 11. Configurações
- const configuracaoEmail = await ctx.db.query("configuracaoEmail").collect();
- for (const config of configuracaoEmail) {
- await ctx.db.delete(config._id);
- }
- console.log(
- ` ✅ ${configuracaoEmail.length} configurações de email removidas`
- );
+ // 11. Configurações
+ const configuracaoEmail = await ctx.db.query('configuracaoEmail').collect();
+ for (const config of configuracaoEmail) {
+ await ctx.db.delete(config._id);
+ }
+ console.log(` ✅ ${configuracaoEmail.length} configurações de email removidas`);
- const configuracaoAcesso = await ctx.db
- .query("configuracaoAcesso")
- .collect();
- for (const config of configuracaoAcesso) {
- await ctx.db.delete(config._id);
- }
- console.log(
- ` ✅ ${configuracaoAcesso.length} configurações de acesso removidas`
- );
+ const configuracaoAcesso = await ctx.db.query('configuracaoAcesso').collect();
+ for (const config of configuracaoAcesso) {
+ await ctx.db.delete(config._id);
+ }
+ console.log(` ✅ ${configuracaoAcesso.length} configurações de acesso removidas`);
- // 12. Monitoramento
- const alertHistory = await ctx.db.query("alertHistory").collect();
- for (const alert of alertHistory) {
- await ctx.db.delete(alert._id);
- }
- console.log(` ✅ ${alertHistory.length} histórico de alertas removido`);
+ // 12. Monitoramento
+ const alertHistory = await ctx.db.query('alertHistory').collect();
+ for (const alert of alertHistory) {
+ await ctx.db.delete(alert._id);
+ }
+ console.log(` ✅ ${alertHistory.length} histórico de alertas removido`);
- const alertConfigurations = await ctx.db
- .query("alertConfigurations")
- .collect();
- for (const alert of alertConfigurations) {
- await ctx.db.delete(alert._id);
- }
- console.log(
- ` ✅ ${alertConfigurations.length} configurações de alertas removidas`
- );
+ const alertConfigurations = await ctx.db.query('alertConfigurations').collect();
+ for (const alert of alertConfigurations) {
+ await ctx.db.delete(alert._id);
+ }
+ console.log(` ✅ ${alertConfigurations.length} configurações de alertas removidas`);
- const systemMetrics = await ctx.db.query("systemMetrics").collect();
- for (const metric of systemMetrics) {
- await ctx.db.delete(metric._id);
- }
- console.log(` ✅ ${systemMetrics.length} métricas do sistema removidas`);
+ const systemMetrics = await ctx.db.query('systemMetrics').collect();
+ for (const metric of systemMetrics) {
+ await ctx.db.delete(metric._id);
+ }
+ console.log(` ✅ ${systemMetrics.length} métricas do sistema removidas`);
- // 13. Sessões
- const sessoes = await ctx.db.query("sessoes").collect();
- for (const sessao of sessoes) {
- await ctx.db.delete(sessao._id);
- }
- console.log(` ✅ ${sessoes.length} sessões removidas`);
+ // 13. Sessões
+ const sessoes = await ctx.db.query('sessoes').collect();
+ for (const sessao of sessoes) {
+ await ctx.db.delete(sessao._id);
+ }
+ console.log(` ✅ ${sessoes.length} sessões removidas`);
- // 14. Menu-permissões personalizadas (já está no código da internalMutation mas vazio)
+ // 14. Menu-permissões personalizadas (já está no código da internalMutation mas vazio)
- // 15. Menu-permissões (já está no código da internalMutation mas vazio)
+ // 15. Menu-permissões (já está no código da internalMutation mas vazio)
- // 16. Role-permissões
- const rolePermissoes = await ctx.db.query("rolePermissoes").collect();
- for (const rp of rolePermissoes) {
- await ctx.db.delete(rp._id);
- }
- console.log(` ✅ ${rolePermissoes.length} role-permissões removidas`);
+ // 16. Role-permissões
+ const rolePermissoes = await ctx.db.query('rolePermissoes').collect();
+ for (const rp of rolePermissoes) {
+ await ctx.db.delete(rp._id);
+ }
+ console.log(` ✅ ${rolePermissoes.length} role-permissões removidas`);
- // 17. Permissões
- const permissoes = await ctx.db.query("permissoes").collect();
- for (const permissao of permissoes) {
- await ctx.db.delete(permissao._id);
- }
- console.log(` ✅ ${permissoes.length} permissões removidas`);
+ // 17. Permissões
+ const permissoes = await ctx.db.query('permissoes').collect();
+ for (const permissao of permissoes) {
+ await ctx.db.delete(permissao._id);
+ }
+ console.log(` ✅ ${permissoes.length} permissões removidas`);
- // 18. Usuários (deve vir antes de roles se houver referência)
- const usuarios = await ctx.db.query("usuarios").collect();
- for (const usuario of usuarios) {
- await ctx.db.delete(usuario._id);
- }
- console.log(` ✅ ${usuarios.length} usuários removidos`);
+ // 18. Usuários (deve vir antes de roles se houver referência)
+ const usuarios = await ctx.db.query('usuarios').collect();
+ for (const usuario of usuarios) {
+ await ctx.db.delete(usuario._id);
+ }
+ console.log(` ✅ ${usuarios.length} usuários removidos`);
- // 19. Funcionários
- const funcionarios = await ctx.db.query("funcionarios").collect();
- for (const funcionario of funcionarios) {
- await ctx.db.delete(funcionario._id);
- }
- console.log(` ✅ ${funcionarios.length} funcionários removidos`);
+ // 19. Funcionários
+ const funcionarios = await ctx.db.query('funcionarios').collect();
+ for (const funcionario of funcionarios) {
+ await ctx.db.delete(funcionario._id);
+ }
+ console.log(` ✅ ${funcionarios.length} funcionários removidos`);
- // 20. Solicitações de acesso
- const solicitacoesAcesso = await ctx.db
- .query("solicitacoesAcesso")
- .collect();
- for (const solicitacao of solicitacoesAcesso) {
- await ctx.db.delete(solicitacao._id);
- }
- console.log(
- ` ✅ ${solicitacoesAcesso.length} solicitações de acesso removidas`
- );
+ // 20. Solicitações de acesso
+ const solicitacoesAcesso = await ctx.db.query('solicitacoesAcesso').collect();
+ for (const solicitacao of solicitacoesAcesso) {
+ await ctx.db.delete(solicitacao._id);
+ }
+ console.log(` ✅ ${solicitacoesAcesso.length} solicitações de acesso removidas`);
- // 21. Símbolos
- const simbolos = await ctx.db.query("simbolos").collect();
- for (const simbolo of simbolos) {
- await ctx.db.delete(simbolo._id);
- }
- console.log(` ✅ ${simbolos.length} símbolos removidos`);
+ // 21. Símbolos
+ const simbolos = await ctx.db.query('simbolos').collect();
+ for (const simbolo of simbolos) {
+ await ctx.db.delete(simbolo._id);
+ }
+ console.log(` ✅ ${simbolos.length} símbolos removidos`);
- // 22. Roles (deve vir por último se outras tabelas referenciam)
- const roles = await ctx.db.query("roles").collect();
- for (const role of roles) {
- await ctx.db.delete(role._id);
- }
- console.log(` ✅ ${roles.length} roles removidas`);
+ // 22. Roles (deve vir por último se outras tabelas referenciam)
+ const roles = await ctx.db.query('roles').collect();
+ for (const role of roles) {
+ await ctx.db.delete(role._id);
+ }
+ console.log(` ✅ ${roles.length} roles removidas`);
- // 23. Todos (tabela de exemplo)
- const todos = await ctx.db.query("todos").collect();
- for (const todo of todos) {
- await ctx.db.delete(todo._id);
- }
- console.log(` ✅ ${todos.length} todos removidos`);
+ // 23. Todos (tabela de exemplo)
+ const todos = await ctx.db.query('todos').collect();
+ for (const todo of todos) {
+ await ctx.db.delete(todo._id);
+ }
+ console.log(` ✅ ${todos.length} todos removidos`);
- console.log("✨ Banco de dados completamente limpo!");
- return null;
- },
+ console.log('✨ Banco de dados completamente limpo!');
+ return null;
+ }
});
/**
* Query para verificar quantos registros existem no banco
*/
export const verificarBanco = query({
- args: {},
- returns: v.object({
- usuarios: v.number(),
- funcionarios: v.number(),
- roles: v.number(),
- simbolos: v.number(),
- total: v.number(),
- }),
- handler: async (ctx) => {
- const usuarios = await ctx.db.query("usuarios").collect();
- const funcionarios = await ctx.db.query("funcionarios").collect();
- const roles = await ctx.db.query("roles").collect();
- const simbolos = await ctx.db.query("simbolos").collect();
+ args: {},
+ returns: v.object({
+ usuarios: v.number(),
+ funcionarios: v.number(),
+ roles: v.number(),
+ simbolos: v.number(),
+ total: v.number()
+ }),
+ handler: async (ctx) => {
+ const usuarios = await ctx.db.query('usuarios').collect();
+ const funcionarios = await ctx.db.query('funcionarios').collect();
+ const roles = await ctx.db.query('roles').collect();
+ const simbolos = await ctx.db.query('simbolos').collect();
- return {
- usuarios: usuarios.length,
- funcionarios: funcionarios.length,
- roles: roles.length,
- simbolos: simbolos.length,
- total:
- usuarios.length + funcionarios.length + roles.length + simbolos.length,
- };
- },
+ return {
+ usuarios: usuarios.length,
+ funcionarios: funcionarios.length,
+ roles: roles.length,
+ simbolos: simbolos.length,
+ total: usuarios.length + funcionarios.length + roles.length + simbolos.length
+ };
+ }
});