import { internalMutation } from "./_generated/server"; import { v } from "convex/values"; import { hashPassword } from "./auth/utils"; // 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", }, ]; 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", }, ]; 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", }, ]; /** * Seed inicial do banco de dados com os dados exportados do Convex Cloud */ export const seedDatabase = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log("🌱 Iniciando seed do banco de dados..."); // 1. Criar Roles (Perfis de Acesso) console.log("🔐 Criando roles..."); // TI_MASTER - Nível 0 - Acesso total irrestrito const roleTIMaster = await ctx.db.insert("roles", { nome: "ti_master", descricao: "TI Master", nivel: 0, setor: "ti", customizado: false, editavel: false, }); console.log(" ✅ Role criada: ti_master (Nível 0 - Acesso Total)"); // ADMIN - Nível 2 - Permissões configuráveis const roleAdmin = await ctx.db.insert("roles", { nome: "admin", descricao: "Administrador Geral", nivel: 2, setor: "administrativo", customizado: false, editavel: true, // Permissões configuráveis }); console.log(" ✅ Role criada: admin (Nível 2 - Configurável)"); // TI_USUARIO - Nível 2 - Suporte técnico const roleTIUsuario = await ctx.db.insert("roles", { nome: "ti_usuario", descricao: "TI Usuário", nivel: 2, setor: "ti", customizado: false, editavel: true, }); console.log(" ✅ Role criada: ti_usuario (Nível 2 - Suporte)"); const roleRH = await ctx.db.insert("roles", { nome: "rh", descricao: "Recursos Humanos", nivel: 2, setor: "recursos_humanos", customizado: false, editavel: false, }); console.log(" ✅ Role criada: rh"); const roleFinanceiro = await ctx.db.insert("roles", { nome: "financeiro", descricao: "Financeiro", nivel: 2, setor: "financeiro", customizado: false, editavel: false, }); console.log(" ✅ Role criada: financeiro"); const roleControladoria = await ctx.db.insert("roles", { nome: "controladoria", descricao: "Controladoria", nivel: 2, setor: "controladoria", customizado: false, editavel: false, }); console.log(" ✅ Role criada: controladoria"); const roleLicitacoes = await ctx.db.insert("roles", { nome: "licitacoes", descricao: "Licitações", nivel: 2, setor: "licitacoes", customizado: false, editavel: false, }); console.log(" ✅ Role criada: licitacoes"); const roleCompras = await ctx.db.insert("roles", { nome: "compras", descricao: "Compras", nivel: 2, setor: "compras", customizado: false, editavel: false, }); console.log(" ✅ Role criada: compras"); const roleJuridico = await ctx.db.insert("roles", { nome: "juridico", descricao: "Jurídico", nivel: 2, setor: "juridico", customizado: false, editavel: false, }); console.log(" ✅ Role criada: juridico"); const roleComunicacao = await ctx.db.insert("roles", { nome: "comunicacao", descricao: "Comunicação", nivel: 2, setor: "comunicacao", customizado: false, editavel: false, }); console.log(" ✅ Role criada: comunicacao"); const roleProgramasEsportivos = await ctx.db.insert("roles", { nome: "programas_esportivos", descricao: "Programas Esportivos", nivel: 2, setor: "programas_esportivos", customizado: false, editavel: false, }); console.log(" ✅ Role criada: programas_esportivos"); const roleSecretariaExecutiva = await ctx.db.insert("roles", { nome: "secretaria_executiva", descricao: "Secretaria Executiva", nivel: 2, setor: "secretaria_executiva", customizado: false, editavel: false, }); console.log(" ✅ Role criada: secretaria_executiva"); const roleGestaoPessoas = await ctx.db.insert("roles", { nome: "gestao_pessoas", descricao: "Gestão de Pessoas", nivel: 2, setor: "gestao_pessoas", customizado: false, editavel: false, }); console.log(" ✅ Role criada: gestao_pessoas"); const roleUsuario = await ctx.db.insert("roles", { nome: "usuario", descricao: "Usuário Comum", nivel: 10, customizado: false, editavel: false, }); console.log(" ✅ Role criada: usuario"); // 2. Criar usuários iniciais console.log("👤 Criando usuários iniciais..."); // TI Master const senhaTIMaster = await hashPassword("TI@123"); await ctx.db.insert("usuarios", { matricula: "1000", senhaHash: senhaTIMaster, nome: "Gestor TI Master", email: "ti.master@sgse.pe.gov.br", setor: "ti", roleId: roleTIMaster as any, ativo: true, primeiroAcesso: false, criadoEm: Date.now(), atualizadoEm: Date.now(), }); console.log(" ✅ TI Master criado (matrícula: 1000, senha: TI@123)"); // Admin (permissões configuráveis) const senhaAdmin = await hashPassword("Admin@123"); const adminId = await ctx.db.insert("usuarios", { matricula: "2000", senhaHash: senhaAdmin, nome: "Administrador Geral", email: "admin@sgse.pe.gov.br", setor: "administrativo", roleId: roleAdmin as any, ativo: true, primeiroAcesso: false, criadoEm: Date.now(), atualizadoEm: Date.now(), }); console.log(" ✅ Admin criado (matrícula: 2000, senha: Admin@123)"); // 2.1 Criar catálogo de permissões por ação e conceder a Admin/TI console.log("🔐 Criando permissões por ação..."); const CATALOGO_RECURSOS = [ { recurso: "dashboard", acoes: ["ver"] }, { recurso: "funcionarios", acoes: ["ver", "listar", "criar", "editar", "excluir"], }, { recurso: "simbolos", acoes: ["ver", "listar", "criar", "editar", "excluir"], }, { recurso: "usuarios", acoes: ["ver", "listar", "criar", "editar", "excluir"], }, { recurso: "perfis", acoes: ["ver", "listar", "criar", "editar", "excluir"], }, ] as const; const permissaoKeyToId = new Map(); for (const item of CATALOGO_RECURSOS) { for (const acao of item.acoes) { const nome = `${item.recurso}.${acao}`; const id = await ctx.db.insert("permissoes", { nome, descricao: `Permite ${acao} em ${item.recurso}`, recurso: item.recurso, acao, }); permissaoKeyToId.set(nome, id); } } console.log(` ✅ ${permissaoKeyToId.size} permissões criadas`); // Conceder todas permissões a Admin e TI const rolesParaConceder = [roleAdmin, roleTIUsuario, roleTIMaster]; for (const roleId of rolesParaConceder) { for (const [, permId] of permissaoKeyToId) { await ctx.db.insert("rolePermissoes", { roleId: roleId as any, permissaoId: permId as any, }); } } console.log(" ✅ Todas as permissões concedidas a Admin e TI"); // 3. Inserir símbolos console.log("📝 Inserindo símbolos..."); const simbolosMap = new Map(); for (const simbolo of simbolosData) { const id = await ctx.db.insert("simbolos", { descricao: simbolo.descricao, nome: simbolo.nome, repValor: simbolo.repValor, tipo: simbolo.tipo, valor: simbolo.valor, vencValor: simbolo.vencValor, }); simbolosMap.set(simbolo.nome, id); console.log(` ✅ Símbolo criado: ${simbolo.nome}`); } // 4. Inserir funcionários console.log("👥 Inserindo funcionários..."); const funcionariosMap = new Map(); for (const funcionario of funcionariosData) { const simboloId = simbolosMap.get(funcionario.simboloNome); if (!simboloId) { console.error( ` ❌ Símbolo não encontrado: ${funcionario.simboloNome}` ); continue; } const funcId = 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 any, simboloTipo: funcionario.simboloTipo, telefone: funcionario.telefone, uf: funcionario.uf, }); funcionariosMap.set(funcionario.matricula, funcId); console.log(` ✅ Funcionário criado: ${funcionario.nome}`); } // 5. Criar usuários para os funcionários console.log("👤 Criando usuários para funcionários..."); for (const funcionario of funcionariosData) { const funcId = funcionariosMap.get(funcionario.matricula); if (!funcId) continue; const senhaInicial = await hashPassword("Mudar@123"); await ctx.db.insert("usuarios", { matricula: funcionario.matricula, senhaHash: senhaInicial, nome: funcionario.nome, email: funcionario.email, funcionarioId: funcId as any, roleId: roleUsuario as any, ativo: true, primeiroAcesso: true, criadoEm: Date.now(), atualizadoEm: Date.now(), }); console.log( ` ✅ Usuário criado: ${funcionario.nome} (senha: Mudar@123)` ); } // 6. Inserir solicitações de acesso console.log("📋 Inserindo solicitações de acesso..."); for (const solicitacao of solicitacoesAcessoData) { await ctx.db.insert("solicitacoesAcesso", { dataResposta: solicitacao.dataResposta, dataSolicitacao: solicitacao.dataSolicitacao, email: solicitacao.email, matricula: solicitacao.matricula, nome: solicitacao.nome, observacoes: solicitacao.observacoes, status: solicitacao.status, telefone: solicitacao.telefone, }); console.log(` ✅ Solicitação criada: ${solicitacao.nome}`); } // 7. Criar templates de mensagens padrão console.log("📧 Criando templates de mensagens padrão..."); const templatesPadrao = [ { codigo: "USUARIO_BLOQUEADO", nome: "Usuário Bloqueado", titulo: "Sua conta foi bloqueada", corpo: "Sua conta no SGSE foi bloqueada.\\n\\nMotivo: {{motivo}}\\n\\nPara mais informações, entre em contato com a TI.", variaveis: ["motivo"], }, { codigo: "USUARIO_DESBLOQUEADO", nome: "Usuário Desbloqueado", titulo: "Sua conta foi desbloqueada", corpo: "Sua conta no SGSE foi desbloqueada e você já pode acessar o sistema normalmente.", variaveis: [], }, { codigo: "SENHA_RESETADA", nome: "Senha Resetada", titulo: "Sua senha foi resetada", corpo: "Sua senha foi resetada pela equipe de TI.\\n\\nNova senha temporária: {{senha}}\\n\\nPor favor, altere sua senha no próximo login.", variaveis: ["senha"], }, { codigo: "PERMISSAO_ALTERADA", nome: "Permissão Alterada", titulo: "Suas permissões foram atualizadas", corpo: "Suas permissões de acesso ao sistema foram atualizadas.\\n\\nPara verificar suas novas permissões, acesse o menu de perfil.", variaveis: [], }, { codigo: "AVISO_GERAL", nome: "Aviso Geral", titulo: "{{titulo}}", corpo: "{{mensagem}}", variaveis: ["titulo", "mensagem"], }, { codigo: "BEM_VINDO", nome: "Boas-vindas", titulo: "Bem-vindo ao SGSE", corpo: "Olá {{nome}},\\n\\nSeja bem-vindo ao Sistema de Gestão da Secretaria de Esportes!\\n\\nSuas credenciais de acesso:\\nMatrícula: {{matricula}}\\nSenha temporária: {{senha}}\\n\\nPor favor, altere sua senha no primeiro acesso.\\n\\nEquipe de TI", variaveis: ["nome", "matricula", "senha"], }, ]; for (const template of templatesPadrao) { await ctx.db.insert("templatesMensagens", { codigo: template.codigo, nome: template.nome, tipo: "sistema" as const, titulo: template.titulo, corpo: template.corpo, variaveis: template.variaveis, criadoEm: Date.now(), }); console.log(` ✅ Template criado: ${template.nome}`); } console.log("✨ Seed concluído com sucesso!"); console.log(""); console.log("🔑 CREDENCIAIS DE ACESSO:"); console.log(" Admin: matrícula 0000, senha Admin@123"); console.log(" TI: matrícula 1000, senha TI@123"); console.log(" Funcionários: usar matrícula, senha Mudar@123"); 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..."); // Limpar logs de acesso const logs = await ctx.db.query("logsAcesso").collect(); for (const log of logs) { await ctx.db.delete(log._id); } console.log(` ✅ ${logs.length} logs de acesso removidos`); // Limpar 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`); // Limpar usuários 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`); // Limpar 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`); // Limpar 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`); // Limpar solicitações de acesso const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect(); for (const solicitacao of solicitacoes) { await ctx.db.delete(solicitacao._id); } console.log(` ✅ ${solicitacoes.length} solicitações removidas`); // Limpar menu-permissões const menuPermissoes = await ctx.db.query("menuPermissoes").collect(); for (const mp of menuPermissoes) { await ctx.db.delete(mp._id); } console.log(` ✅ ${menuPermissoes.length} menu-permissões removidas`); // Limpar menu-permissões personalizadas const menuPermissoesPersonalizadas = await ctx.db .query("menuPermissoesPersonalizadas") .collect(); for (const mpp of menuPermissoesPersonalizadas) { await ctx.db.delete(mpp._id); } console.log( ` ✅ ${menuPermissoesPersonalizadas.length} menu-permissões personalizadas removidas` ); // Limpar 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`); // Limpar 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`); // Limpar roles 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`); console.log("✨ Banco de dados limpo!"); return null; }, });