import { query } from "./_generated/server"; import { v } from "convex/values"; // Obter estatísticas gerais do sistema export const getStats = query({ args: {}, returns: v.object({ totalFuncionarios: v.number(), totalSimbolos: v.number(), totalSolicitacoesAcesso: v.number(), solicitacoesPendentes: v.number(), funcionariosAtivos: v.number(), funcionariosDesligados: v.number(), cargoComissionado: v.number(), funcaoGratificada: v.number(), }), handler: async (ctx) => { // Contar funcionários const funcionarios = await ctx.db.query("funcionarios").collect(); const totalFuncionarios = funcionarios.length; // Funcionários ativos (sem data de desligamento) const funcionariosAtivos = funcionarios.filter( (f) => !f.desligamentoData ).length; // Funcionários desligados const funcionariosDesligados = funcionarios.filter( (f) => f.desligamentoData ).length; // Contar por tipo de símbolo const cargoComissionado = funcionarios.filter( (f) => f.simboloTipo === "cargo_comissionado" ).length; const funcaoGratificada = funcionarios.filter( (f) => f.simboloTipo === "funcao_gratificada" ).length; // Contar símbolos const simbolos = await ctx.db.query("simbolos").collect(); const totalSimbolos = simbolos.length; // Contar solicitações de acesso const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect(); const totalSolicitacoesAcesso = solicitacoes.length; const solicitacoesPendentes = solicitacoes.filter( (s) => s.status === "pendente" ).length; return { totalFuncionarios, totalSimbolos, totalSolicitacoesAcesso, solicitacoesPendentes, funcionariosAtivos, funcionariosDesligados, cargoComissionado, funcaoGratificada, }; }, }); // Obter atividades recentes (últimas 24 horas) export const getRecentActivity = query({ args: {}, returns: v.object({ funcionariosCadastrados24h: v.number(), solicitacoesAcesso24h: v.number(), simbolosCadastrados24h: v.number(), }), handler: async (ctx) => { const now = Date.now(); const last24h = now - 24 * 60 * 60 * 1000; // Funcionários cadastrados nas últimas 24h const funcionarios = await ctx.db.query("funcionarios").collect(); const funcionariosCadastrados24h = funcionarios.filter( (f) => f._creationTime >= last24h ).length; // Solicitações de acesso nas últimas 24h const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect(); const solicitacoesAcesso24h = solicitacoes.filter( (s) => s.dataSolicitacao >= last24h ).length; // Símbolos cadastrados nas últimas 24h const simbolos = await ctx.db.query("simbolos").collect(); const simbolosCadastrados24h = simbolos.filter( (s) => s._creationTime >= last24h ).length; return { funcionariosCadastrados24h, solicitacoesAcesso24h, simbolosCadastrados24h, }; }, }); // Obter distribuição de funcionários por cidade export const getFuncionariosPorCidade = query({ args: {}, returns: v.array( v.object({ cidade: v.string(), quantidade: v.number(), }) ), handler: async (ctx) => { const funcionarios = await ctx.db.query("funcionarios").collect(); const cidadesMap: Record = {}; for (const func of funcionarios) { if (!func.desligamentoData) { cidadesMap[func.cidade] = (cidadesMap[func.cidade] || 0) + 1; } } const result = Object.entries(cidadesMap) .map(([cidade, quantidade]) => ({ cidade, quantidade })) .sort((a, b) => b.quantidade - a.quantidade) .slice(0, 5); // Top 5 cidades return result; }, }); // Obter evolução de cadastros por mês export const getEvolucaoCadastros = query({ args: {}, returns: v.array( v.object({ mes: v.string(), funcionarios: v.number(), solicitacoes: v.number(), }) ), handler: async (ctx) => { const funcionarios = await ctx.db.query("funcionarios").collect(); const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect(); const now = new Date(); const meses: Array<{ mes: string; funcionarios: number; solicitacoes: number }> = []; // Últimos 6 meses for (let i = 5; i >= 0; i--) { const date = new Date(now.getFullYear(), now.getMonth() - i, 1); const nextDate = new Date(now.getFullYear(), now.getMonth() - i + 1, 1); const mesNome = date.toLocaleDateString("pt-BR", { month: "short", year: "2-digit", }); const funcCount = funcionarios.filter( (f) => f._creationTime >= date.getTime() && f._creationTime < nextDate.getTime() ).length; const solCount = solicitacoes.filter( (s) => s.dataSolicitacao >= date.getTime() && s.dataSolicitacao < nextDate.getTime() ).length; meses.push({ mes: mesNome, funcionarios: funcCount, solicitacoes: solCount, }); } return meses; }, });