From 40bf3e0e6f6b250fb0eeebc1c1218f41f4fd4d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= <166467972+JoaoGustavo-dev@users.noreply.github.com> Date: Tue, 7 Oct 2025 00:16:39 -0300 Subject: [PATCH] fix-report-page --- .../dashboard/relatorios/page.tsx | 311 ++++++++++++++---- susconecta/app/profissional/page.tsx | 18 +- susconecta/components/dashboard/header.tsx | 8 +- 3 files changed, 262 insertions(+), 75 deletions(-) diff --git a/susconecta/app/(main-routes)/dashboard/relatorios/page.tsx b/susconecta/app/(main-routes)/dashboard/relatorios/page.tsx index 808ca1f..473cbde 100644 --- a/susconecta/app/(main-routes)/dashboard/relatorios/page.tsx +++ b/susconecta/app/(main-routes)/dashboard/relatorios/page.tsx @@ -1,86 +1,263 @@ + "use client"; - import { Button } from "@/components/ui/button"; -import { FileDown } from "lucide-react"; +import { FileDown, BarChart2, Users, DollarSign, TrendingUp, UserCheck, CalendarCheck, ThumbsUp, User, Briefcase } from "lucide-react"; import jsPDF from "jspdf"; -import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from "recharts"; +import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line, PieChart, Pie, Cell } from "recharts"; + +// Dados fictícios para demonstração +const metricas = [ + { label: "Atendimentos", value: 1240, icon: }, + { label: "Absenteísmo", value: "7,2%", icon: }, + { label: "Satisfação", value: "92%", icon: }, + { label: "Faturamento (Mês)", value: "R$ 45.000", icon: }, + { label: "No-show", value: "5,1%", icon: }, +]; + +const consultasPorPeriodo = [ + { periodo: "Jan", consultas: 210 }, + { periodo: "Fev", consultas: 180 }, + { periodo: "Mar", consultas: 250 }, + { periodo: "Abr", consultas: 230 }, + { periodo: "Mai", consultas: 270 }, + { periodo: "Jun", consultas: 220 }, +]; + +const faturamentoMensal = [ + { mes: "Jan", valor: 35000 }, + { mes: "Fev", valor: 29000 }, + { mes: "Mar", valor: 42000 }, + { mes: "Abr", valor: 38000 }, + { mes: "Mai", valor: 45000 }, + { mes: "Jun", valor: 41000 }, +]; + +const taxaNoShow = [ + { mes: "Jan", noShow: 6.2 }, + { mes: "Fev", noShow: 5.8 }, + { mes: "Mar", noShow: 4.9 }, + { mes: "Abr", noShow: 5.5 }, + { mes: "Mai", noShow: 5.1 }, + { mes: "Jun", noShow: 4.7 }, +]; + +const pacientesMaisAtendidos = [ + { nome: "Ana Souza", consultas: 18 }, + { nome: "Bruno Lima", consultas: 15 }, + { nome: "Carla Menezes", consultas: 13 }, + { nome: "Diego Alves", consultas: 12 }, + { nome: "Fernanda Dias", consultas: 11 }, +]; + +const medicosMaisProdutivos = [ + { nome: "Dr. Carlos Andrade", consultas: 62 }, + { nome: "Dra. Paula Silva", consultas: 58 }, + { nome: "Dr. João Pedro", consultas: 54 }, + { nome: "Dra. Marina Costa", consultas: 51 }, +]; + +const convenios = [ + { nome: "Unimed", valor: 18000 }, + { nome: "Bradesco", valor: 12000 }, + { nome: "SulAmérica", valor: 9000 }, + { nome: "Particular", valor: 15000 }, +]; + +const performancePorMedico = [ + { nome: "Dr. Carlos Andrade", consultas: 62, absenteismo: 4.8 }, + { nome: "Dra. Paula Silva", consultas: 58, absenteismo: 6.1 }, + { nome: "Dr. João Pedro", consultas: 54, absenteismo: 7.5 }, + { nome: "Dra. Marina Costa", consultas: 51, absenteismo: 5.2 }, +]; + +const COLORS = ["#10b981", "#6366f1", "#f59e42", "#ef4444"]; + +function exportPDF(title: string, content: string) { + const doc = new jsPDF(); + doc.text(title, 10, 10); + doc.text(content, 10, 20); + doc.save(`${title.toLowerCase().replace(/ /g, '-')}.pdf`); +} export default function RelatoriosPage() { - // Dados fictícios para o gráfico financeiro - const financeiro = [ - { mes: "Jan", faturamento: 35000, despesas: 12000 }, - { mes: "Fev", faturamento: 29000, despesas: 15000 }, - { mes: "Mar", faturamento: 42000, despesas: 18000 }, - { mes: "Abr", faturamento: 38000, despesas: 14000 }, - { mes: "Mai", faturamento: 45000, despesas: 20000 }, - { mes: "Jun", faturamento: 41000, despesas: 17000 }, - ]; - // ============================ - // PASSO 3 - Funções de exportar - // ============================ - const exportConsultasPDF = () => { - const doc = new jsPDF(); - doc.text("Relatório de Consultas", 10, 10); - doc.text("Resumo das consultas realizadas.", 10, 20); - doc.save("relatorio-consultas.pdf"); - }; - - const exportPacientesPDF = () => { - const doc = new jsPDF(); - doc.text("Relatório de Pacientes", 10, 10); - doc.text("Informações gerais dos pacientes cadastrados.", 10, 20); - doc.save("relatorio-pacientes.pdf"); - }; - - const exportFinanceiroPDF = () => { - const doc = new jsPDF(); - doc.text("Relatório Financeiro", 10, 10); - doc.text("Receitas e despesas da clínica.", 10, 20); - doc.save("relatorio-financeiro.pdf"); - }; - return (
-

Relatórios

+

Dashboard Executivo de Relatórios

-
- {/* Card Consultas */} -
-

Relatório de Consultas

-

Resumo das consultas realizadas.

- {/* PASSO 4 - Botão chama a função */} - + {/* Métricas principais */} +
+ {metricas.map((m) => ( +
+ {m.icon} + {m.value} + {m.label} +
+ ))} +
+ + {/* Gráficos e Relatórios */} +
+ {/* Consultas realizadas por período */} +
+
+

Consultas por Período

+ +
+ + + + + + + + +
- {/* Card Pacientes */} -
-

Relatório de Pacientes

-

Informações gerais dos pacientes cadastrados.

- -
- - {/* Card Financeiro com gráfico */} -
-

Relatório Financeiro

- - + {/* Faturamento mensal/anual */} +
+
+

Faturamento Mensal

+ +
+ + - - - - + + - +
+
+ +
+ {/* Taxa de no-show */} +
+
+

Taxa de No-show

+ +
+ + + + + + + + + +
+ + {/* Indicadores de satisfação */} +
+
+

Satisfação dos Pacientes

+ +
+
+ 92% + Índice de satisfação geral +
+
+
+ +
+ {/* Pacientes mais atendidos */} +
+
+

Pacientes Mais Atendidos

+ +
+ + + + + + + + + {pacientesMaisAtendidos.map((p) => ( + + + + + ))} + +
PacienteConsultas
{p.nome}{p.consultas}
+
+ + {/* Médicos mais produtivos */} +
+
+

Médicos Mais Produtivos

+ +
+ + + + + + + + + {medicosMaisProdutivos.map((m) => ( + + + + + ))} + +
MédicoConsultas
{m.nome}{m.consultas}
+
+
+ +
+ {/* Análise de convênios */} +
+
+

Análise de Convênios

+ +
+ + + + {convenios.map((entry, index) => ( + + ))} + + + + + +
+ + {/* Performance por médico */} +
+
+

Performance por Médico

+ +
+ + + + + + + + + + {performancePorMedico.map((m) => ( + + + + + + ))} + +
MédicoConsultasAbsenteísmo (%)
{m.nome}{m.consultas}{m.absenteismo}
diff --git a/susconecta/app/profissional/page.tsx b/susconecta/app/profissional/page.tsx index d81f419..7976db9 100644 --- a/susconecta/app/profissional/page.tsx +++ b/susconecta/app/profissional/page.tsx @@ -10,6 +10,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; +import { SimpleThemeToggle } from "@/components/simple-theme-toggle"; import { Table, TableBody, @@ -3270,13 +3271,16 @@ Nevo melanocítico benigno. Seguimento clínico recomendado. )}
- +
+ + +
diff --git a/susconecta/components/dashboard/header.tsx b/susconecta/components/dashboard/header.tsx index 5e23a67..0872b66 100644 --- a/susconecta/components/dashboard/header.tsx +++ b/susconecta/components/dashboard/header.tsx @@ -7,6 +7,7 @@ import { Input } from "@/components/ui/input" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { useState, useEffect, useRef } from "react" import { SidebarTrigger } from "../ui/sidebar" +import { SimpleThemeToggle } from "@/components/simple-theme-toggle"; export function PagesHeader({ title = "", subtitle = "" }: { title?: string, subtitle?: string }) { const { logout, user } = useAuth(); @@ -44,7 +45,12 @@ export function PagesHeader({ title = "", subtitle = "" }: { title?: string, sub - + + {/* Avatar Dropdown Simples */}