fix(principal): integra auth, agenda e laudos com a api

This commit is contained in:
EdilbertoC
2026-04-28 10:22:54 -03:00
parent d576fb9784
commit 7199c107f2
20 changed files with 1121 additions and 331 deletions

View File

@@ -1,121 +1,142 @@
const reportTypes = [
'Atestado Medico',
'Laudo de Exame',
'Laudo de Imagem',
'Relatorio Cirurgico',
'Declaracao de Acompanhante',
'Encaminhamento',
]
const doctors = ['Dra. Ana Silva', 'Dr. Carlos Mendes', 'Dr. Roberto Nunes']
const currentUser = 'Dra. Ana Silva'
const adminUsers = ['Dr. Roberto Nunes']
import { apiConfig, apiEndpoint, getAuthenticatedHeaders } from '../config/api.js'
import { reportMapper } from '../mappers/reportMapper.js'
import { fetchJsonWithFallback, normalizeCollection, normalizeItem } from './repositoryUtils.js'
export const reportRepository = {
getAdminUsers() {
return adminUsers
async getInitialReports() {
const data = await fetchJsonWithFallback(
[
{
url: apiEndpoint('/reports'),
options: { headers: getAuthenticatedHeaders() },
},
{
url: `${apiConfig.restUrl}/reports?select=*,patients(full_name),doctors(name)`,
options: { headers: getAuthenticatedHeaders() },
},
],
'Falha ao buscar laudos da API.',
)
return normalizeCollection(data, ['reports', 'relatorios', 'laudos', 'data']).map(reportMapper.toUi)
},
getCurrentUser() {
return currentUser
async create(uiData) {
const data = await fetchJsonWithFallback(
[
{
url: apiEndpoint('/reports'),
options: {
method: 'POST',
headers: getAuthenticatedHeaders(),
body: JSON.stringify(reportMapper.toApi(uiData)),
},
},
{
url: `${apiConfig.restUrl}/reports`,
options: {
method: 'POST',
headers: getAuthenticatedHeaders({ Prefer: 'return=representation' }),
body: JSON.stringify(reportMapper.toApi(uiData, 'supabase')),
},
},
],
'Falha ao salvar laudo.',
)
return reportMapper.toUi(normalizeItem(data, ['report', 'relatorio', 'laudo', 'data']))
},
getDoctors() {
return doctors
},
async update(id, uiData) {
const data = await fetchJsonWithFallback(
[
{
url: apiEndpoint(`/reports/${id}`),
options: {
method: 'PATCH',
headers: getAuthenticatedHeaders(),
body: JSON.stringify(reportMapper.toApi({ ...uiData, id })),
},
},
{
url: apiEndpoint('/reports'),
options: {
method: 'PATCH',
headers: getAuthenticatedHeaders(),
body: JSON.stringify({ id, ...reportMapper.toApi(uiData) }),
},
},
{
url: `${apiConfig.restUrl}/reports?id=eq.${id}`,
options: {
method: 'PATCH',
headers: getAuthenticatedHeaders({ Prefer: 'return=representation' }),
body: JSON.stringify(reportMapper.toApi(uiData, 'supabase')),
},
},
],
'Falha ao atualizar o laudo.',
)
getInitialReports() {
return [
{
id: 'report-1',
type: 'Atestado Medico',
patient: 'Carlos Eduardo Santos',
doctor: 'Dra. Ana Silva',
date: '27/03/2026',
status: 'finalizado',
content: 'Atesto que o paciente esteve em consulta medica nesta data, necessitando de repouso por 2 dias.',
showDate: true,
signDigital: true,
versions: [
{ version: 1, action: 'Criado', user: 'Dra. Ana Silva', summary: 'Laudo criado' },
{ version: 2, action: 'Editado', user: 'Dra. Ana Silva', summary: 'Ajuste no periodo de repouso' },
{ version: 3, action: 'Liberado', user: 'Dra. Ana Silva', summary: 'Laudo liberado e finalizado' },
],
},
{
id: 'report-2',
type: 'Laudo de Exame',
patient: 'Mariana Costa',
doctor: 'Dra. Ana Silva',
date: '26/03/2026',
status: 'enviado',
content: 'Laudo referente ao exame de ecocardiograma. Resultado dentro dos parametros normais.',
showDate: true,
signDigital: true,
versions: [
{ version: 1, action: 'Criado', user: 'Dr. Carlos Mendes', summary: 'Laudo criado' },
{ version: 2, action: 'Editado', user: 'Dra. Ana Silva', summary: 'Adicao da data do exame' },
{ version: 3, action: 'Liberado', user: 'Dra. Ana Silva', summary: 'Conclusao incluida' },
{ version: 4, action: 'Enviado', user: 'Dr. Roberto Nunes', summary: 'Laudo enviado ao paciente' },
],
},
{
id: 'report-3',
type: 'Relatorio Cirurgico',
patient: 'Fernanda Lima',
doctor: 'Dr. Carlos Mendes',
date: '25/03/2026',
status: 'rascunho',
content: 'Relatorio do procedimento de colecistectomia laparoscopica realizado sob anestesia geral.',
showDate: false,
signDigital: true,
versions: [
{ version: 1, action: 'Criado', user: 'Dr. Carlos Mendes', summary: 'Relatorio criado' },
{ version: 2, action: 'Rascunho', user: 'Dr. Carlos Mendes', summary: 'Detalhamento do procedimento' },
],
},
{
id: 'report-4',
type: 'Declaracao de Acompanhante',
patient: 'Joao Pedro Alves',
doctor: 'Dr. Roberto Nunes',
date: '24/03/2026',
status: 'finalizado',
content: 'Declaro que o acompanhante esteve presente durante todo o periodo de internacao.',
showDate: true,
signDigital: false,
versions: [
{ version: 1, action: 'Criado', user: 'Dr. Roberto Nunes', summary: 'Declaracao criada e liberada' },
],
},
{
id: 'report-5',
type: 'Laudo de Imagem',
patient: 'Roberto Campos',
doctor: 'Dra. Ana Silva',
date: '22/03/2026',
status: 'enviado',
content: 'Ultrassonografia de abdomen total sem achados patologicos relevantes.',
showDate: true,
signDigital: true,
versions: [
{ version: 1, action: 'Criado', user: 'Dra. Ana Silva', summary: 'Laudo criado' },
{ version: 2, action: 'Liberado', user: 'Dra. Ana Silva', summary: 'Conclusao adicionada' },
{ version: 3, action: 'Enviado', user: 'Dr. Roberto Nunes', summary: 'Laudo enviado ao paciente' },
],
},
]
},
getReportTypes() {
return reportTypes
return reportMapper.toUi(normalizeItem(data, ['report', 'relatorio', 'laudo', 'data']))
},
getTemplates() {
return [
{ id: 'template-1', name: 'Atestado de Repouso Simples', type: 'Atestado Medico', description: 'Atestado padrao concedendo dias de repouso ao paciente.', content: 'Atesto, para os devidos fins, que o(a) paciente necessita de repouso pelo periodo indicado.' },
{ id: 'template-2', name: 'Laudo de Hemograma', type: 'Laudo de Exame', description: 'Resultado de hemograma completo com interpretacao clinica.', content: 'Laudo de hemograma completo com parametros avaliados e interpretacao clinica.' },
{ id: 'template-3', name: 'Relatorio Cirurgico', type: 'Relatorio Cirurgico', description: 'Relatorio padronizado para procedimento cirurgico.', content: 'Relatorio do procedimento cirurgico, achados, conduta e evolucao imediata.' },
{
id: 't1',
name: 'Atestado Medico Padrao',
type: 'Atestado Medico',
description: 'Atestado simples para repouso, consulta e CID.',
content:
'Atesto para os devidos fins que o(a) paciente [NOME DO PACIENTE] esteve em consulta medica nesta data, necessitando de [DIAS] dias de repouso por motivo de saude (CID: [CODIGO]).',
},
{
id: 't2',
name: 'Encaminhamento Especializado',
type: 'Encaminhamento',
description: 'Encaminhamento para avaliacao de especialidade.',
content:
'Encaminho o(a) paciente [NOME DO PACIENTE] para avaliacao da especialidade de [ESPECIALIDADE] devido ao quadro clinico de [SINTOMAS/DIAGNOSTICO PREVIO].\n\nConduta mantida ate o momento: [MEDICACOES]',
},
{
id: 't3',
name: 'Laudo de Evolucao Diaria',
type: 'Evolucao Clinica',
description: 'Modelo para evolucao clinica diaria.',
content:
'Paciente evolui [BEM/MAL], [COM/SEM] queixas no momento.\nSinais vitais: PA [VALOR], FC [VALOR] bpm, SatO2 [VALOR]%.\nExame fisico: [DESCRICAO].\nConduta: [MANTER/ALTERAR TRATAMENTO OPCOES].',
},
{
id: 't4',
name: 'Receituario de Uso Continuo',
type: 'Receituario Fixado',
description: 'Lista de medicamentos de uso continuo.',
content:
'Uso continuo:\n1. [MEDICAMENTO] - [DOSE] - Tomar [POSOLOGIA]\n2. [MEDICAMENTO] - [DOSE] - Tomar [POSOLOGIA]',
},
]
},
getAdminUsers() {
return ['Dr. Henrique Cardoso', 'Dra. Marina Lopes', 'Dra. Ana Silva']
},
getCurrentUser() {
return 'Dr. Henrique Cardoso'
},
getDoctors() {
return ['Dr. Henrique Cardoso', 'Dra. Marina Lopes', 'Dra. Ana Silva', 'Dr. Roberto Santos']
},
getReportTypes() {
return [
'Atestado Medico',
'Encaminhamento',
'Evolucao Clinica',
'Receituario Fixado',
'Laudo de Procedimento',
]
},
}