diff --git a/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte b/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte index ecfd7fb..6d20698 100644 --- a/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte +++ b/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte @@ -5,6 +5,8 @@ import { api } from '@sgse-app/backend/convex/_generated/api'; import type { AtaqueCiberneticoTipo, SeveridadeSeguranca } from '@sgse-app/backend/convex/schema'; import { authStore } from '$lib/stores/auth.svelte'; + import jsPDF from 'jspdf'; + import autoTable from 'jspdf-autotable'; const client = useConvexClient(); const visaoCamadas = useQuery(api.security.obterVisaoCamadas, { periodoHoras: 6, buckets: 28 }); @@ -507,8 +509,8 @@ const data = new Date(valor); return Number.isNaN(data.getTime()) ? Date.now() : data.getTime(); } - // Imprimir conteúdo do relatório (usa campo observações JSON estruturado) - function imprimirRelatorio(r: { + // Gerar PDF do relatório com detalhes completos + async function imprimirRelatorio(r: { _id: Id<'reportRequests'>; status: 'pendente' | 'processando' | 'concluido' | 'falhou'; criadoEm: number; @@ -516,80 +518,361 @@ observacoes?: string; }) { if (typeof window === 'undefined') return; - const win = window.open('', '_blank', 'noopener,noreferrer,width=900,height=700'); - if (!win) return; - let conteudo: string; + try { - const data = r.observacoes ? (JSON.parse(r.observacoes) as any) : null; - const total = data?.total ?? '—'; - const porSeveridade = data?.porSeveridade ?? {}; - const porAtaque = data?.porAtaque ?? {}; - const linhasSev = Object.entries(porSeveridade) - .map(([k, v]) => `
Total de eventos no período: ' + - total + - '
' + - '| Severidade | Qtde |
|---|---|
| — | |
| Tipo | Qtde |
|---|---|
| — | |
' + - obs + - '' + - scriptOpen + - 'window.print()' + - scriptClose; + + doc.setFontSize(9); + doc.setTextColor(100, 100, 100); + doc.text(`Status: ${r.status}`, 20, yPosition); + doc.text(`Criado: ${criadoStr}`, 105, yPosition, { align: 'center' }); + doc.text(`Concluído: ${concluidoStr}`, 190, yPosition, { align: 'right' }); + yPosition += 10; + + // Parse dos dados + type RelatorioData = { + total?: number | string; + porSeveridade?: Record
- Configure destinatários, níveis e tipos de alarme e reenvio. -
-+ Configure destinatários, níveis e tipos de alarme e reenvio para monitoramento de + segurança. +
+ Emails adicionados ({emailsAdicionados.length}): +
++ Usuários adicionados ({usuariosAdicionados.length}): +
+{cfg.nome}
-- Canais: {cfg.canais.email ? 'Email' : ''}{cfg.canais.email && cfg.canais.chat - ? ' + ' - : ''}{cfg.canais.chat ? 'Chat' : ''} - • Sev. mínima: {severityLabels[cfg.severidadeMin]} - • Reenvio: {cfg.reenvioMin} min -
- {#if cfg.emails.length} -Emails: {cfg.emails.join(', ')}
- {/if} - {#if cfg.chatUsers.length} -Chat: {cfg.chatUsers.join(', ')}
- {/if} +Nenhuma configuração salva.
+Nenhuma configuração salva
++ Configure e salve suas preferências de alertas acima +
+