Files
sgse-app/packages/backend/convex/seed.ts

619 lines
19 KiB
TypeScript

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)");
// 3. Inserir símbolos
console.log("📝 Inserindo símbolos...");
const simbolosMap = new Map<string, string>();
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<string, string>();
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;
},
});