+
{#each Array(totalPassos) as _, i (i)}
-
+ {@const labels = ['Ano & Saldo', 'Períodos', 'Confirmação']}
+
i + 1}
class:text-white={passoAtual > i + 1}
class:border-4={passoAtual === i + 1}
@@ -261,10 +262,16 @@
{/if}
+
+
+ {labels[i]}
+
+
{#if i < totalPassos - 1}
i + 1}
class:bg-base-300={passoAtual <= i + 1}
>
@@ -272,19 +279,6 @@
{/each}
-
-
-
diff --git a/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte b/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte
index a60e04a..97f0d08 100644
--- a/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte
+++ b/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte
@@ -896,7 +896,7 @@
doc.setFontSize(8);
doc.setFont('helvetica', 'normal');
doc.setTextColor(128, 128, 128);
- doc.text('SGSE - Sistema de Gerenciamento da Secretaria de Esportes', 105, 285, {
+ doc.text('SGSE - Sistema de Gerenciamento de Secretaria', 105, 285, {
align: 'center'
});
doc.text(`Gerado em: ${agoraStr}`, 105, 290, { align: 'center' });
diff --git a/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte b/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte
index bf566b2..edd26a3 100644
--- a/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte
+++ b/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte
@@ -197,7 +197,7 @@
doc.setFontSize(8);
doc.setTextColor(128, 128, 128);
doc.text(
- `SGSE - Sistema de Gestão da Secretaria de Esportes | Página ${i} de ${pageCount}`,
+ `SGSE - Sistema de Gerenciamento de Secretaria | Página ${i} de ${pageCount}`,
doc.internal.pageSize.getWidth() / 2,
doc.internal.pageSize.getHeight() - 10,
{ align: 'center' }
diff --git a/apps/web/src/lib/utils/declaracoesGenerator.ts b/apps/web/src/lib/utils/declaracoesGenerator.ts
index d4fd33a..530df2f 100644
--- a/apps/web/src/lib/utils/declaracoesGenerator.ts
+++ b/apps/web/src/lib/utils/declaracoesGenerator.ts
@@ -172,7 +172,7 @@ export async function gerarDeclaracaoAcumulacaoCargo(funcionario: Funcionario):
// Rodapé
doc.setFontSize(8);
doc.setTextColor(100);
- doc.text('SGSE - Sistema de Gerenciamento da Secretaria de Esportes', 105, 285, { align: 'center' });
+ doc.text('SGSE - Sistema de Gerenciamento de Secretaria', 105, 285, { align: 'center' });
return doc.output('blob');
}
@@ -260,7 +260,7 @@ export async function gerarDeclaracaoDependentesIR(funcionario: Funcionario): Pr
// Rodapé
doc.setFontSize(8);
doc.setTextColor(100);
- doc.text('SGSE - Sistema de Gerenciamento da Secretaria de Esportes', 105, 285, { align: 'center' });
+ doc.text('SGSE - Sistema de Gerenciamento de Secretaria', 105, 285, { align: 'center' });
return doc.output('blob');
}
@@ -341,7 +341,7 @@ export async function gerarDeclaracaoIdoneidade(funcionario: Funcionario): Promi
// Rodapé
doc.setFontSize(8);
doc.setTextColor(100);
- doc.text('SGSE - Sistema de Gerenciamento da Secretaria de Esportes', 105, 285, { align: 'center' });
+ doc.text('SGSE - Sistema de Gerenciamento de Secretaria', 105, 285, { align: 'center' });
return doc.output('blob');
}
@@ -440,7 +440,7 @@ export async function gerarTermoNepotismo(funcionario: Funcionario): Promise
- import { useQuery } from "convex-svelte";
- import { api } from "@sgse-app/backend/convex/_generated/api";
- import { onMount } from "svelte";
- import { page } from "$app/stores";
- import { goto } from "$app/navigation";
- import { resolve } from "$app/paths";
- import { UserPlus, Mail } from "lucide-svelte";
- import { useAuth } from "@mmailaender/convex-better-auth-svelte/svelte";
- import ProtectedRoute from "$lib/components/ProtectedRoute.svelte";
-
- let { data } = $props();
-
- const auth = useAuth();
- const isLoading = $derived(auth.isLoading && !data.currentUser);
- const isAuthenticated = $derived(auth.isAuthenticated || !!data.currentUser);
-
- $inspect({ isLoading, isAuthenticated });
-
- // Queries para dados do dashboard
- const statsQuery = useQuery(api.dashboard.getStats, {});
- const activityQuery = useQuery(api.dashboard.getRecentActivity, {});
-
- // Queries para monitoramento em tempo real
- const statusSistemaQuery = useQuery(api.monitoramento.getStatusSistema, {});
- const atividadeBDQuery = useQuery(
- api.monitoramento.getAtividadeBancoDados,
- {},
- );
- const distribuicaoQuery = useQuery(
- api.monitoramento.getDistribuicaoRequisicoes,
- {},
- );
-
- // Estado para animações
- let mounted = $state(false);
- let currentTime = $state(new Date());
- let showAlert = $state(false);
- let alertType = $state<
- "auth_required" | "access_denied" | "invalid_token" | null
- >(null);
- let redirectRoute = $state("");
-
- // Forçar atualização das queries de monitoramento a cada 1 segundo
- let refreshKey = $state(0);
-
- onMount(() => {
- mounted = true;
-
- // Verificar se há mensagem de erro na URL
- const urlParams = new URLSearchParams(window.location.search);
- const error = urlParams.get("error");
- const route = urlParams.get("route") || urlParams.get("redirect") || "";
-
- if (error) {
- alertType = error as any;
- redirectRoute = route;
- showAlert = true;
-
- // Limpar URL
- const newUrl = window.location.pathname;
- window.history.replaceState({}, "", newUrl);
-
- // Auto-fechar após 10 segundos
- setTimeout(() => {
- showAlert = false;
- }, 10000);
- }
-
- // Atualizar relógio e forçar refresh das queries a cada segundo
- const interval = setInterval(() => {
- currentTime = new Date();
- refreshKey = (refreshKey + 1) % 1000; // Incrementar para forçar re-render
- }, 1000);
-
- return () => clearInterval(interval);
- });
-
- function closeAlert() {
- showAlert = false;
- }
-
- function getAlertMessage(): { title: string; message: string; icon: string } {
- switch (alertType) {
- case "auth_required":
- return {
- title: "Autenticação Necessária",
- message: `Para acessar "${redirectRoute}", você precisa fazer login no sistema.`,
- icon: "🔐",
- };
- case "access_denied":
- return {
- title: "Acesso Negado",
- message: `Você não tem permissão para acessar "${redirectRoute}". Entre em contato com a equipe de TI para solicitar acesso.`,
- icon: "⛔",
- };
- case "invalid_token":
- return {
- title: "Sessão Expirada",
- message: "Sua sessão expirou. Por favor, faça login novamente.",
- icon: "⏰",
- };
- default:
- return {
- title: "Aviso",
- message: "Ocorreu um erro. Tente novamente.",
- icon: "⚠️",
- };
- }
- }
-
- // Função para formatar números
- function formatNumber(num: number): string {
- return new Intl.NumberFormat("pt-BR").format(num);
- }
-
- // Função para calcular porcentagem
- function calcPercentage(value: number, total: number): number {
- if (total === 0) return 0;
- return Math.round((value / total) * 100);
- }
-
- // Obter saudação baseada na hora
- function getSaudacao(): string {
- const hora = currentTime.getHours();
- if (hora < 12) return "Bom dia";
- if (hora < 18) return "Boa tarde";
- return "Boa noite";
- }
-
-
-
-
-
- {#if showAlert}
- {@const alertData = getAlertMessage()}
-
-
-
{alertData.icon}
-
-
{alertData.title}
-
{alertData.message}
- {#if alertType === "access_denied"}
-
- {/if}
-
-
✕
-
-
- {/if}
-
-
-
-
-
-
- {getSaudacao()}! 👋
-
-
- Bem-vindo ao Sistema de Gerenciamento da Secretaria de Esportes
-
-
- {currentTime.toLocaleDateString("pt-BR", {
- weekday: "long",
- year: "numeric",
- month: "long",
- day: "numeric",
- })}
- {" - "}
- {currentTime.toLocaleTimeString("pt-BR")}
-
-
-
-
Sistema Online
-
Atualizado
-
-
-
-
-
- {#if statsQuery.isLoading}
-
-
-
- {:else if statsQuery.data}
-
-
-
-
-
-
-
-
-
-
-
- {#if activityQuery.data}
-
- {/if}
-
-
-
- {#if statusSistemaQuery.data && atividadeBDQuery.data && distribuicaoQuery.data}
- {@const status = statusSistemaQuery.data}
- {@const atividade = atividadeBDQuery.data}
- {@const distribuicao = distribuicaoQuery.data}
-
-
-
-
-
-
- Monitoramento em Tempo Real
-
-
- Atualizado a cada segundo • {new Date(
- status.ultimaAtualizacao,
- ).toLocaleTimeString("pt-BR")}
-
-
-
-
-
- LIVE
-
-
-
-
-
-
-
-
-
-
-
- Usuários Online
-
-
- {status.usuariosOnline}
-
-
- sessões ativas
-
-
-
-
-
-
-
-
-
-
-
-
-
- Total Registros
-
-
- {status.totalRegistros.toLocaleString("pt-BR")}
-
-
- no banco de dados
-
-
-
-
-
-
-
-
-
-
-
-
-
- Tempo Resposta
-
-
- {status.tempoMedioResposta}ms
-
-
média atual
-
-
-
-
-
-
-
-
-
-
-
- Uso do Sistema
-
-
-
-
- CPU
- {status.cpuUsada}%
-
-
-
-
-
- Memória
- {status.memoriaUsada}%
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Atividade do Banco de Dados
-
-
- Entradas e saídas em tempo real (último minuto)
-
-
-
-
- Atualizando
-
-
-
-
-
-
- {#each [10, 8, 6, 4, 2, 0] as val}
- {val}
- {/each}
-
-
-
-
-
- {#each Array.from({ length: 6 }) as _, i}
-
- {/each}
-
-
-
- {#each atividade.historico as ponto, idx}
- {@const maxAtividade = Math.max(
- ...atividade.historico.map((p) =>
- Math.max(p.entradas, p.saidas),
- ),
- )}
-
-
-
-
-
-
-
-
-
↑ {ponto.entradas} entradas
-
↓ {ponto.saidas} saídas
-
-
- {/each}
-
-
-
-
-
-
-
-
- -60s
- -30s
- agora
-
-
-
-
-
-
-
-
-
-
-
-
-
- Tipos de Operações
-
-
-
-
- Queries (Leituras)
- {distribuicao.queries}
-
-
-
-
-
- Mutations (Escritas)
- {distribuicao.mutations}
-
-
-
-
-
-
-
-
-
-
- Operações no Banco
-
-
-
-
- Leituras
- {distribuicao.leituras}
-
-
-
-
-
- Escritas
- {distribuicao.escritas}
-
-
-
-
-
-
-
-
- {/if}
-
-
-
-
-
-
Status do Sistema
-
-
- Banco de Dados
- Online
-
-
- API
- Operacional
-
-
- Backup
- Atualizado
-
-
-
-
-
-
-
-
-
-
Informações
-
-
- Versão: 1.0.0
-
-
- Última Atualização:
- {new Date().toLocaleDateString("pt-BR")}
-
-
- Suporte: TI SGSE
-
-
-
-
-
- {/if}
-
-
-
-
+
+
+
+
+
+ {#if showAlert}
+ {@const alertData = getAlertMessage()}
+
+
+
{alertData.icon}
+
+
{alertData.title}
+
{alertData.message}
+ {#if alertType === "access_denied"}
+
+ {/if}
+
+
✕
+
+
+ {/if}
+
+
+
+
+
+
+ {getSaudacao()}! 👋
+
+
+ Bem-vindo ao SGSE - Sistema de Gerenciamento de Secretaria
+
+
+ {currentTime.toLocaleDateString("pt-BR", {
+ weekday: "long",
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ })}
+ {" - "}
+ {currentTime.toLocaleTimeString("pt-BR")}
+
+
+
+
Sistema Online
+
Atualizado
+
+
+
+
+
+ {#if statsQuery.isLoading}
+
+
+
+ {:else if statsQuery.data}
+
+
+
+
+
+
+
+
+
+
+
+ {#if activityQuery.data}
+
+ {/if}
+
+
+
+ {#if statusSistemaQuery.data}
+ {@const status = statusSistemaQuery.data}
+ {@const atividade = atividadeBDQuery.data || { historico: Array.from({ length: 30 }, () => ({ entradas: 0, saidas: 0 })) }}
+ {@const distribuicao = distribuicaoQuery.data || { queries: 0, mutations: 0, leituras: 0, escritas: 0 }}
+ {@const maxAtividade = Math.max(
+ 1,
+ ...atividade.historico.map((p) =>
+ Math.max(p.entradas, p.saidas),
+ ),
+ )}
+
+
+
+
+
+
+ Monitoramento em Tempo Real
+
+
+ Atualizado a cada segundo • {new Date(
+ status.ultimaAtualizacao,
+ ).toLocaleTimeString("pt-BR")}
+
+
+
+
+
+ LIVE
+
+
+
+
+
+
+
+
+
+
+
+ Usuários Online
+
+
+ {status.usuariosOnline}
+
+
+ sessões ativas
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total Registros
+
+
+ {status.totalRegistros.toLocaleString("pt-BR")}
+
+
+ no banco de dados
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tempo Resposta
+
+
+ {status.tempoMedioResposta}ms
+
+
média atual
+
+
+
+
+
+
+
+
+
+
+
+ Uso do Sistema
+
+
+
+
+ CPU
+ {status.cpuUsada}%
+
+
+
+
+
+ Memória
+ {status.memoriaUsada}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Atividade do Banco de Dados
+
+
+ Entradas e saídas em tempo real (último minuto)
+
+
+
+
+ Atualizando
+
+
+
+
+
+
+ {#each [10, 8, 6, 4, 2, 0] as val}
+ {val}
+ {/each}
+
+
+
+
+
+ {#each Array.from({ length: 6 }) as _, i}
+
+ {/each}
+
+
+
+ {#each atividade.historico as ponto, idx}
+
+
+
+
+
+
+
+
+
↑ {ponto.entradas} entradas
+
↓ {ponto.saidas} saídas
+
+
+ {/each}
+
+
+
+
+
+
+
+
+ -60s
+ -30s
+ agora
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tipos de Operações
+
+
+
+
+ Queries (Leituras)
+ {distribuicao.queries}
+
+
+
+
+
+ Mutations (Escritas)
+ {distribuicao.mutations}
+
+
+
+
+
+
+
+
+
+
+ Operações no Banco
+
+
+
+
+ Leituras
+ {distribuicao.leituras}
+
+
+
+
+
+ Escritas
+ {distribuicao.escritas}
+
+
+
+
+
+
+
+
+ {/if}
+
+
+
+
+
+
Status do Sistema
+
+
+ Banco de Dados
+ Online
+
+
+ API
+ Operacional
+
+
+ Backup
+ Atualizado
+
+
+
+
+
+
+
+
+
+
Informações
+
+
+ Versão: 1.0.0
+
+
+ Última Atualização:
+ {new Date().toLocaleDateString("pt-BR")}
+
+
+ Suporte: TI SGSE
+
+
+
+
+
+ {/if}
+
+
+
+
diff --git a/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte b/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte
index 83af3b3..7df3090 100644
--- a/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte
+++ b/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte
@@ -136,7 +136,7 @@
Registre reclamações, sugestões, elogios ou chamados técnicos. Toda interação gera
- notificações automáticas via e-mail e chat com a assinatura do SGSE.
+ notificações automáticas via e-mail e chat com a assinatura do SGSE - Sistema de Gerenciamento de Secretaria.
Resposta ágil
@@ -164,11 +164,31 @@
-
-
Formulário
-
- Informe os detalhes para que nossa equipe possa priorizar o atendimento.
-
+
+
+
+
+
Formulário
+
+ Informe os detalhes para que nossa equipe possa priorizar o atendimento.
+
+
+
{#if resetSignal % 2 === 0}
@@ -180,13 +200,37 @@