From 735eb521d0acf6455d01f1cbb2b681f5ef1948dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= <166467972+JoaoGustavo-dev@users.noreply.github.com> Date: Thu, 9 Oct 2025 19:01:24 -0300 Subject: [PATCH 1/6] fixing-profissional-page-errors --- susconecta/app/profissional/page.tsx | 16 ++++++++-------- susconecta/package-lock.json | 16 +--------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/susconecta/app/profissional/page.tsx b/susconecta/app/profissional/page.tsx index dffa3ac..a5a6e34 100644 --- a/susconecta/app/profissional/page.tsx +++ b/susconecta/app/profissional/page.tsx @@ -7,7 +7,7 @@ import ProtectedRoute from "@/components/ProtectedRoute"; import { useAuth } from "@/hooks/useAuth"; import { buscarPacientes, listarPacientes, buscarPacientePorId, type Paciente } from "@/lib/api"; import { useReports } from "@/hooks/useReports"; -import { CreateReportData, ReportFormData } from "@/types/report"; +import { CreateReportData, ReportFormData } from "@/types/report-types"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; @@ -2416,13 +2416,13 @@ Nevo melanocítico benigno. Seguimento clínico recomendado. .replace(/\*\*(.*?)\*\*/g, '$1') .replace(/\*(.*?)\*/g, '$1') .replace(/__(.*?)__/g, '$1') - .replace(/\[left\](.*?)\[\/left\]/gs, '
$1
') - .replace(/\[center\](.*?)\[\/center\]/gs, '
$1
') - .replace(/\[right\](.*?)\[\/right\]/gs, '
$1
') - .replace(/\[justify\](.*?)\[\/justify\]/gs, '
$1
') - .replace(/\[size=(\d+)\](.*?)\[\/size\]/gs, '$2') - .replace(/\[font=([^\]]+)\](.*?)\[\/font\]/gs, '$2') - .replace(/\[color=([^\]]+)\](.*?)\[\/color\]/gs, '$2') + .replace(/\[left\]([\s\S]*?)\[\/left\]/g, '
$1
') + .replace(/\[center\]([\s\S]*?)\[\/center\]/g, '
$1
') + .replace(/\[right\]([\s\S]*?)\[\/right\]/g, '
$1
') + .replace(/\[justify\]([\s\S]*?)\[\/justify\]/g, '
$1
') + .replace(/\[size=(\d+)\]([\s\S]*?)\[\/size\]/g, '$2') + .replace(/\[font=([^\]]+)\]([\s\S]*?)\[\/font\]/g, '$2') + .replace(/\[color=([^\]]+)\]([\s\S]*?)\[\/color\]/g, '$2') .replace(/{{sexo_paciente}}/g, pacienteSelecionado?.sexo || laudo?.paciente?.sexo || '[SEXO]') .replace(/{{diagnostico}}/g, campos.diagnostico || '[DIAGNÓSTICO]') .replace(/{{conclusao}}/g, campos.conclusao || '[CONCLUSÃO]') diff --git a/susconecta/package-lock.json b/susconecta/package-lock.json index bb4783c..a205af3 100644 --- a/susconecta/package-lock.json +++ b/susconecta/package-lock.json @@ -68,6 +68,7 @@ "zod": "3.25.67" }, "devDependencies": { + "@eslint/eslintrc": "^3", "@eslint/js": "^9.36.0", "@tailwindcss/postcss": "^4.1.9", "@types/node": "^22", @@ -9402,21 +9403,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.16.tgz", - "integrity": "sha512-jhPl3nN0oKEshJBNDAo0etGMzv0j3q3VYorTSFqH1o3rwv1MQRdor27u1zhkgsHPNeY1jxcgyx1ZsCkDD1IHgg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } From 2bb0b06375c081ea900f0f475cd7a0d8284b8763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= <166467972+JoaoGustavo-dev@users.noreply.github.com> Date: Fri, 10 Oct 2025 03:04:10 -0300 Subject: [PATCH 2/6] add-create-report-endpoints --- susconecta/app/profissional/page.tsx | 2219 +++----------------------- susconecta/hooks/useReports.ts | 3 +- susconecta/lib/api.ts | 28 +- susconecta/lib/reports.ts | 138 +- susconecta/next-env.d.ts | 3 +- susconecta/types/report-types.ts | 130 +- 6 files changed, 366 insertions(+), 2155 deletions(-) diff --git a/susconecta/app/profissional/page.tsx b/susconecta/app/profissional/page.tsx index a5a6e34..1dfee8f 100644 --- a/susconecta/app/profissional/page.tsx +++ b/susconecta/app/profissional/page.tsx @@ -1,5 +1,4 @@ "use client"; - import React, { useState, useRef, useEffect } from "react"; import SignatureCanvas from "react-signature-canvas"; import Link from "next/link"; @@ -7,7 +6,7 @@ import ProtectedRoute from "@/components/ProtectedRoute"; import { useAuth } from "@/hooks/useAuth"; import { buscarPacientes, listarPacientes, buscarPacientePorId, type Paciente } from "@/lib/api"; import { useReports } from "@/hooks/useReports"; -import { CreateReportData, ReportFormData } from "@/types/report-types"; +import { CreateReportData } from "@/types/report-types"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; @@ -71,6 +70,26 @@ const colorsByType = { Oftalmologia: "#2ecc71" }; + // Helpers para normalizar dados de paciente (suporta schema antigo e novo) + const getPatientName = (p: any) => p?.full_name ?? p?.nome ?? ''; + const getPatientCpf = (p: any) => p?.cpf ?? ''; + const getPatientSex = (p: any) => p?.sex ?? p?.sexo ?? ''; + const getPatientId = (p: any) => p?.id ?? ''; + const getPatientAge = (p: any) => { + if (!p) return ''; + // Prefer birth_date (ISO) to calcular idade + const bd = p?.birth_date ?? p?.data_nascimento ?? p?.birthDate; + if (bd) { + const d = new Date(bd); + if (!isNaN(d.getTime())) { + const age = Math.floor((Date.now() - d.getTime()) / (1000 * 60 * 60 * 24 * 365.25)); + return `${age}`; + } + } + // Fallback para campo idade/idade_anterior + return p?.idade ?? p?.age ?? ''; + }; + const ProfissionalPage = () => { const { logout, user } = useAuth(); const [activeSection, setActiveSection] = useState('calendario'); @@ -94,56 +113,23 @@ const ProfissionalPage = () => { biografia: "Médico especialista em cardiologia e dermatologia com mais de 15 anos de experiência em tratamentos clínicos e cirúrgicos." }); - // Estados para relatórios médicos - const [relatorioMedico, setRelatorioMedico] = useState({ - pacienteNome: "", - pacienteCpf: "", - pacienteIdade: "", - profissionalNome: medico.nome, - profissionalCrm: medico.identificacao, - motivoRelatorio: "", - historicoClinico: "", - sinaisSintomas: "", - examesRealizados: "", - resultadosExames: "", - diagnosticos: "", - prognostico: "", - tratamentosRealizados: "", - recomendacoes: "", - cid: "", - dataRelatorio: new Date().toISOString().split('T')[0] - }); - const [relatoriosMedicos, setRelatoriosMedicos] = useState([]); - const [editandoRelatorio, setEditandoRelatorio] = useState(null); - // Estados para integração com API de Relatórios - const [pacientesReais, setPacientesReais] = useState([]); - const [carregandoPacientes, setCarregandoPacientes] = useState(false); - const [pacienteSelecionadoReport, setPacienteSelecionadoReport] = useState(null); - - // Hook personalizado para relatórios - const reportsApi = useReports(); - - // Estados para funcionalidades do prontuário - const [consultasRegistradas, setConsultasRegistradas] = useState([]); - const [historicoMedico, setHistoricoMedico] = useState([]); - const [prescricoesMedicas, setPrescricoesMedicas] = useState([]); - const [examesSolicitados, setExamesSolicitados] = useState([]); - const [diagnosticos, setDiagnosticos] = useState([]); - const [evolucaoQuadro, setEvolucaoQuadro] = useState([]); - const [anexos, setAnexos] = useState([]); - const [abaProntuarioAtiva, setAbaProntuarioAtiva] = useState('nova-consulta'); // Estados para campos principais da consulta const [consultaAtual, setConsultaAtual] = useState({ - dataConsulta: new Date().toISOString().split('T')[0], - anamnese: "", - exameFisico: "", - hipotesesDiagnosticas: "", - condutaMedica: "", - prescricoes: "", - retornoAgendado: "", - cid10: "" + patient_id: "", + order_number: "", + exam: "", + diagnosis: "", + conclusion: "", + cid_code: "", + content_html: "", + content_json: {}, + status: "draft", + requested_by: "", + due_at: new Date().toISOString(), + hide_date: true, + hide_signature: true }); const [events, setEvents] = useState([ @@ -196,24 +182,7 @@ const ProfissionalPage = () => { window.scrollTo({ top: 0, behavior: "smooth" }); }; - const handleAbrirProntuario = (paciente: any) => { - setPacienteSelecionado(paciente); - - const pacienteLaudo = document.getElementById('pacienteLaudo') as HTMLInputElement; - if (pacienteLaudo) pacienteLaudo.value = paciente.nome; - - const destinatario = document.getElementById('destinatario') as HTMLInputElement; - if (destinatario) destinatario.value = `${paciente.nome} - ${paciente.cpf}`; - - const prontuarioSection = document.getElementById('prontuario-paciente'); - if (prontuarioSection) { - prontuarioSection.scrollIntoView({ behavior: 'smooth' }); - } - }; - - const handleFecharProntuario = () => { - setPacienteSelecionado(null); - }; + const handleEditarLaudo = (paciente: any) => { setPatientForLaudo(paciente); @@ -270,351 +239,7 @@ const ProfissionalPage = () => { setIsEditingProfile(false); }; - // Funções para relatórios médicos - const handleRelatorioChange = (field: string, value: string) => { - setRelatorioMedico(prev => ({ - ...prev, - [field]: value - })); - }; - const handleSalvarRelatorio = () => { - if (!relatorioMedico.pacienteNome || !relatorioMedico.motivoRelatorio) { - alert('Por favor, preencha pelo menos o nome do paciente e o motivo do relatório.'); - return; - } - - const novoRelatorio = { - ...relatorioMedico, - id: Date.now(), - dataGeracao: new Date().toLocaleString() - }; - - if (editandoRelatorio) { - setRelatoriosMedicos(prev => - prev.map(rel => rel.id === editandoRelatorio.id ? novoRelatorio : rel) - ); - setEditandoRelatorio(null); - alert('Relatório médico atualizado com sucesso!'); - } else { - setRelatoriosMedicos(prev => [novoRelatorio, ...prev]); - alert('Relatório médico salvo com sucesso!'); - } - - // Limpar formulário - setRelatorioMedico({ - pacienteNome: "", - pacienteCpf: "", - pacienteIdade: "", - profissionalNome: medico.nome, - profissionalCrm: medico.identificacao, - motivoRelatorio: "", - historicoClinico: "", - sinaisSintomas: "", - examesRealizados: "", - resultadosExames: "", - diagnosticos: "", - prognostico: "", - tratamentosRealizados: "", - recomendacoes: "", - cid: "", - dataRelatorio: new Date().toISOString().split('T')[0] - }); - }; - - const handleEditarRelatorio = (relatorio: any) => { - setRelatorioMedico(relatorio); - setEditandoRelatorio(relatorio); - }; - - const handleExcluirRelatorio = (id: number) => { - if (confirm('Tem certeza que deseja excluir este relatório médico?')) { - setRelatoriosMedicos(prev => prev.filter(rel => rel.id !== id)); - alert('Relatório médico excluído com sucesso!'); - } - }; - - const handleCancelarEdicaoRelatorio = () => { - setEditandoRelatorio(null); - setRelatorioMedico({ - pacienteNome: "", - pacienteCpf: "", - pacienteIdade: "", - profissionalNome: medico.nome, - profissionalCrm: medico.identificacao, - motivoRelatorio: "", - historicoClinico: "", - sinaisSintomas: "", - examesRealizados: "", - resultadosExames: "", - diagnosticos: "", - prognostico: "", - tratamentosRealizados: "", - recomendacoes: "", - cid: "", - dataRelatorio: new Date().toISOString().split('T')[0] - }); - }; - - // ===== FUNÇÕES PARA INTEGRAÇÃO COM API DE RELATÓRIOS ===== - - // Carregar pacientes reais do Supabase - const carregarPacientesReais = async () => { - setCarregandoPacientes(true); - try { - console.log('📋 [REPORTS] Carregando pacientes do Supabase...'); - - // Tentar primeiro usando a função da API que já existe - try { - console.log('📋 [REPORTS] Tentando função listarPacientes...'); - const pacientes = await listarPacientes({ limit: 50 }); - console.log('✅ [REPORTS] Pacientes do Supabase via API:', pacientes); - - if (pacientes && pacientes.length > 0) { - setPacientesReais(pacientes); - console.log('✅ [REPORTS] Usando pacientes do Supabase:', pacientes.length); - return; - } - } catch (apiError) { - console.warn('⚠️ [REPORTS] Erro na função listarPacientes:', apiError); - } - - // Se a função da API falhar, tentar diretamente - console.log('📋 [REPORTS] Tentando buscar diretamente do Supabase...'); - const supabaseUrl = 'https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients'; - console.log('📋 [REPORTS] URL do Supabase:', supabaseUrl); - - // Verificar se há token de autenticação - const token = localStorage.getItem("auth_token") || localStorage.getItem("token") || - sessionStorage.getItem("auth_token") || sessionStorage.getItem("token"); - - console.log('🔑 [REPORTS] Token encontrado:', token ? 'SIM' : 'NÃO'); - - const headers: Record = { - 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ', - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const response = await fetch(supabaseUrl, { - method: 'GET', - headers - }); - - console.log('📡 [REPORTS] Status da resposta do Supabase:', response.status, response.statusText); - - if (!response.ok) { - const errorText = await response.text(); - console.error('❌ [REPORTS] Erro detalhado do Supabase:', errorText); - throw new Error(`Supabase HTTP ${response.status}: ${response.statusText} - ${errorText}`); - } - - const data = await response.json(); - console.log('✅ [REPORTS] Resposta completa do Supabase:', data); - console.log('✅ [REPORTS] Tipo da resposta:', Array.isArray(data) ? 'Array' : typeof data); - - let pacientes: Paciente[] = []; - - if (Array.isArray(data)) { - pacientes = data; - } else if (data.data && Array.isArray(data.data)) { - pacientes = data.data; - } else { - console.warn('⚠️ [REPORTS] Formato de resposta inesperado do Supabase:', data); - pacientes = []; - } - - console.log('✅ [REPORTS] Pacientes encontrados no Supabase:', pacientes.length); - if (pacientes.length > 0) { - console.log('✅ [REPORTS] Primeiro paciente:', pacientes[0]); - console.log('✅ [REPORTS] Últimos 3 pacientes:', pacientes.slice(-3)); - } - - setPacientesReais(pacientes); - - if (pacientes.length === 0) { - console.warn('⚠️ [REPORTS] Nenhum paciente encontrado no Supabase - verifique se há dados na tabela patients'); - } - } catch (error) { - console.error('❌ [REPORTS] Erro detalhado ao carregar pacientes:', { - error, - message: error instanceof Error ? error.message : String(error), - stack: error instanceof Error ? error.stack : undefined - }); - - setPacientesReais([]); - alert('Erro ao carregar pacientes do Supabase: ' + (error instanceof Error ? error.message : String(error))); - } finally { - setCarregandoPacientes(false); - } - }; - - // Calcular idade do paciente baseado na data de nascimento - const calcularIdade = (birthDate: string | null | undefined): string => { - if (!birthDate) return ''; - - const hoje = new Date(); - const nascimento = new Date(birthDate); - let idade = hoje.getFullYear() - nascimento.getFullYear(); - const mesAtual = hoje.getMonth(); - const mesNascimento = nascimento.getMonth(); - - if (mesAtual < mesNascimento || (mesAtual === mesNascimento && hoje.getDate() < nascimento.getDate())) { - idade--; - } - - return idade.toString(); - }; - - // Selecionar paciente para o relatório - const selecionarPacienteParaRelatorio = (paciente: Paciente) => { - setPacienteSelecionadoReport(paciente); - - // Atualizar o formulário de relatório com dados do paciente - setRelatorioMedico(prev => ({ - ...prev, - pacienteNome: paciente.full_name, - pacienteCpf: paciente.cpf || '', - pacienteIdade: calcularIdade(paciente.birth_date), - })); - - console.log('👤 [REPORTS] Paciente selecionado:', paciente); - }; - - // Salvar relatório usando a API - const salvarRelatorioAPI = async () => { - if (!pacienteSelecionadoReport) { - alert('Por favor, selecione um paciente.'); - return; - } - - if (!relatorioMedico.motivoRelatorio.trim()) { - alert('Por favor, preencha o motivo do relatório.'); - return; - } - - try { - console.log('💾 [REPORTS] Salvando relatório...'); - - // Dados para enviar à API - const reportData: CreateReportData = { - patient_id: pacienteSelecionadoReport.id, - doctor_id: user?.id || 'temp-doctor-id', // Usar ID do usuário logado - report_type: 'Relatório Médico', - chief_complaint: relatorioMedico.motivoRelatorio, - clinical_history: relatorioMedico.historicoClinico, - symptoms_and_signs: relatorioMedico.sinaisSintomas, - physical_examination: '', // Pode adicionar campo no formulário se necessário - complementary_exams: relatorioMedico.examesRealizados, - exam_results: relatorioMedico.resultadosExames, - diagnosis: relatorioMedico.diagnosticos, - prognosis: relatorioMedico.prognostico, - treatment_performed: relatorioMedico.tratamentosRealizados, - objective_recommendations: relatorioMedico.recomendacoes || '', - icd_code: relatorioMedico.cid, - report_date: relatorioMedico.dataRelatorio, - }; - - const novoRelatorio = await reportsApi.createNewReport(reportData); - - console.log('✅ [REPORTS] Relatório salvo com sucesso:', novoRelatorio); - - // Recarregar a lista de relatórios para garantir que está sincronizada - await reportsApi.loadReports(); - - alert('Relatório médico salvo com sucesso!'); - - // Limpar formulário - limparFormularioRelatorio(); - - } catch (error) { - console.error('❌ [REPORTS] Erro ao salvar relatório:', error); - alert('Erro ao salvar relatório: ' + error); - } - }; - - // Limpar formulário de relatório - const limparFormularioRelatorio = () => { - setRelatorioMedico({ - pacienteNome: "", - pacienteCpf: "", - pacienteIdade: "", - profissionalNome: medico.nome, - profissionalCrm: medico.identificacao, - motivoRelatorio: "", - historicoClinico: "", - sinaisSintomas: "", - examesRealizados: "", - resultadosExames: "", - diagnosticos: "", - prognostico: "", - tratamentosRealizados: "", - recomendacoes: "", - cid: "", - dataRelatorio: new Date().toISOString().split('T')[0] - }); - setPacienteSelecionadoReport(null); - }; - - // Carregar relatórios existentes - const carregarRelatorios = async () => { - try { - await reportsApi.loadReports(); - console.log('✅ [REPORTS] Relatórios carregados:', reportsApi.reports.length); - } catch (error) { - console.error('❌ [REPORTS] Erro ao carregar relatórios:', error); - } - }; - - - // useEffect para carregar dados iniciais - useEffect(() => { - if (activeSection === 'relatorios-medicos') { - console.log('🔄 [REPORTS] Seção de relatórios ativada - carregando dados...'); - carregarPacientesReais(); - carregarRelatorios(); - } - }, [activeSection]); - - // Buscar pacientes faltantes por patient_id após carregar relatórios e pacientes - useEffect(() => { - if (activeSection !== 'relatorios-medicos') return; - if (!reportsApi.reports || reportsApi.reports.length === 0) return; - - // IDs de pacientes já carregados - const idsPacientesReais = new Set(pacientesReais.map(p => String(p.id))); - // IDs de pacientes presentes nos relatórios - const idsRelatorios = Array.from(new Set(reportsApi.reports.map(r => String(r.patient_id)).filter(Boolean))); - // IDs que faltam - const idsFaltantes = idsRelatorios.filter(id => !idsPacientesReais.has(id)); - - if (idsFaltantes.length === 0) return; - - // Buscar pacientes faltantes individualmente, apenas se o ID for string/UUID - (async () => { - const novosPacientes: Paciente[] = []; - for (const id of idsFaltantes) { - // Só busca se for string e não for número - if (typeof id === 'string' && isNaN(Number(id))) { - try { - const paciente = await buscarPacientePorId(id); - if (paciente) novosPacientes.push(paciente); - } catch (e) { - console.warn('⚠️ [REPORTS] Paciente não encontrado para o relatório:', id); - } - } else { - console.warn('⚠️ [REPORTS] Ignorando busca de paciente por ID não-string/UUID:', id); - } - } - if (novosPacientes.length > 0) { - setPacientesReais(prev => ([...prev, ...novosPacientes])); - } - })(); - }, [activeSection, reportsApi.reports, pacientesReais]); const handleDateClick = (arg: any) => { @@ -799,7 +424,7 @@ const ProfissionalPage = () => { {paciente && (
- CPF: {paciente.cpf} • {paciente.idade} anos + CPF: {getPatientCpf(paciente)} • {getPatientAge(paciente)} anos
)} @@ -818,20 +443,6 @@ const ProfissionalPage = () => {
-
Ver informações do paciente
@@ -850,962 +461,7 @@ const ProfissionalPage = () => { }; - function PacientesSection({ - handleAbrirProntuario, - setActiveSection, - }: { - handleAbrirProntuario: (paciente: any) => void; - setActiveSection: (section: string) => void; - }) { - return ( -
-

Gerenciamento de Pacientes

- - - - {/* Tabela de pacientes padrão */} -
-

Pacientes Recentes

- - - - Paciente - CPF - Idade - Status do laudo - Ações - - - - {pacientes.map((paciente) => ( - - {paciente.nome} - {paciente.cpf} - {paciente.idade} - {paciente.statusLaudo} - -
-
- -
- Ver informações do paciente -
-
-
- -
-
-
- ))} -
-
-
-
- ); - }; - - const renderProntuarioSection = () => ( -
-
-

Prontuário do Paciente

- - {/* Informações do Paciente Selecionado */} - {pacienteSelecionado && ( -
-
-

Dados do Paciente

-
- - -
-
-
-
- Nome: -

{pacienteSelecionado.nome}

-
-
- CPF: -

{pacienteSelecionado.cpf}

-
-
- Idade: -

{pacienteSelecionado.idade} anos

-
-
-
- )} - - {/* Seletor de Paciente */} - {!pacienteSelecionado && ( -
-
-
- -

Selecionar Paciente

-

Escolha um paciente para visualizar o prontuário completo

-
- -
- - -
-
- - {/* Cards de pacientes para seleção rápida */} -
-

Ou selecione rapidamente:

-
- {pacientes.map((paciente) => ( -
setPacienteSelecionado(paciente)} - className="border rounded-lg p-4 hover:shadow-md hover:border-primary transition-all cursor-pointer group" - > -
-
- -
-
-

{paciente.nome}

-

CPF: {paciente.cpf}

-

{paciente.idade} anos

-
-
-
- - {paciente.statusLaudo} - - -
-
- ))} -
-
-
- )} - - {/* Tabs de Navegação do Prontuário */} - {pacienteSelecionado && ( -
- -
- )} - - {/* Conteúdo das Abas */} - {pacienteSelecionado && ( -
- {abaProntuarioAtiva === 'nova-consulta' && renderNovaConsultaTab()} - {abaProntuarioAtiva === 'consultas' && renderConsultasTab()} - {abaProntuarioAtiva === 'historico' && renderHistoricoTab()} - {abaProntuarioAtiva === 'prescricoes' && renderPrescricoesTab()} - {abaProntuarioAtiva === 'exames' && renderExamesTab()} - {abaProntuarioAtiva === 'diagnosticos' && renderDiagnosticosTab()} - {abaProntuarioAtiva === 'evolucao' && renderEvolucaoTab()} - {abaProntuarioAtiva === 'anexos' && renderAnexosTab()} -
- )} -
-
- ); - - // Função para alterar campos da consulta atual - const handleConsultaChange = (field: string, value: string) => { - setConsultaAtual(prev => ({ - ...prev, - [field]: value - })); - }; - - // Função para salvar a consulta - const handleSalvarConsulta = () => { - if (!consultaAtual.anamnese || !consultaAtual.exameFisico) { - alert('Por favor, preencha os campos que são obrigatórios.'); - return; - } - - const novaConsulta = { - ...consultaAtual, - id: Date.now(), - paciente: pacienteSelecionado?.nome, - dataCriacao: new Date().toLocaleString(), - profissional: medico.nome - }; - - setConsultasRegistradas(prev => [novaConsulta, ...prev]); - - setConsultaAtual({ - dataConsulta: new Date().toISOString().split('T')[0], - anamnese: "", - exameFisico: "", - hipotesesDiagnosticas: "", - condutaMedica: "", - prescricoes: "", - retornoAgendado: "", - cid10: "" - }); - - alert('Consulta registrada com sucesso!'); - }; - - // Funções para renderizar cada aba do prontuário - const renderNovaConsultaTab = () => ( -
-
-

Registrar Nova Consulta

-
- - -
-
- -
- {/* Data da Consulta */} -
-
- - handleConsultaChange('dataConsulta', e.target.value)} - className="w-full" - /> -
- -
- - handleConsultaChange('cid10', e.target.value)} - placeholder="Ex: I10, E11, etc." - className="w-full" - /> -
-
- - {/* Anamnese */} -
- -