acesso de agendamento para o médico

This commit is contained in:
joao_pedro 2025-11-02 14:34:23 -03:00
parent 0f94fc4446
commit 0b7e863461
7 changed files with 118 additions and 259 deletions

View File

@ -41,6 +41,12 @@ const Agendamento = ({setDictInfo}) => {
const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([]) const [FiltredTodosMedicos, setFiltredTodosMedicos] = useState([])
const [searchTermDoctor, setSearchTermDoctor] = useState(''); const [searchTermDoctor, setSearchTermDoctor] = useState('');
const [coresConsultas, setCoresConsultas] = useState([])
const [listaConsultasID, setListaConsultaID] = useState([])
const [motivoCancelamento, setMotivoCancelamento] = useState("")
let authHeader = getAuthorizationHeader() let authHeader = getAuthorizationHeader()
@ -51,14 +57,14 @@ const Agendamento = ({setDictInfo}) => {
let paciente = await GetPatientByID(patient_id, authHeader); let paciente = await GetPatientByID(patient_id, authHeader);
let dicionario = { let dicionario = {
agendamento: agendamento, ...agendamento,
Infos: {
nome_nedico: medico.full_name, nome_medico: medico[0].full_name,
doctor_id: medico.id, doctor_id: medico.id,
patient_id: paciente[0].id, patient_id: paciente[0].id,
paciente_nome: paciente[0].full_name, paciente_nome: paciente[0].full_name,
paciente_cpf: paciente[0].cpf paciente_cpf: paciente[0].cpf
}
}; };
return dicionario; return dicionario;
}; };
@ -69,17 +75,19 @@ const Agendamento = ({setDictInfo}) => {
// 1. Agrupamento (igual ao seu código original) // 1. Agrupamento (igual ao seu código original)
for (const agendamento of listaTodosAgendamentos) { for (const agendamento of listaTodosAgendamentos) {
if (agendamento.status === 'requested') { if (agendamento.status === 'requested') {
// Recomenda-se usar Promise.all para melhorar a performance
// mas, para manter a estrutura, mantemos o await no loop.
let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento); let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento);
ListaFilaDeEspera.push(v); ListaFilaDeEspera.push(v);
} else { } else {
const DiaAgendamento = agendamento.scheduled_at.split("T")[0];
const DiaAgendamento = agendamento.scheduled_at?.split("T")[0];
let novoAgendamento = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento);
if (DiaAgendamento in DictAgendamentosOrganizados) { if (DiaAgendamento in DictAgendamentosOrganizados) {
DictAgendamentosOrganizados[DiaAgendamento].push(agendamento); DictAgendamentosOrganizados[DiaAgendamento].push(novoAgendamento);
} else { } else {
DictAgendamentosOrganizados[DiaAgendamento] = [agendamento]; DictAgendamentosOrganizados[DiaAgendamento] = [novoAgendamento];
} }
} }
} }
@ -129,85 +137,42 @@ const Agendamento = ({setDictInfo}) => {
redirect: 'follow' redirect: 'follow'
}; };
fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?select&doctor_id&patient_id&status&scheduled_at&order&limit&offset", requestOptions) fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?doctor_id=eq.${"078d2a67-b4c1-43c8-ae32-c1e75bb5b3df"}`, requestOptions)
.then(response => response.json()) .then(response => response.json())
.then(result => {FiltrarAgendamentos(result);}) .then(result => {FiltrarAgendamentos(result); console.log(result, "RESULTRADO DA API")})
.catch(error => console.log('error', error)); .catch(error => console.log('error', error));
const PegarTodosOsMedicos = async () => {
let lista = []
const TodosOsMedicos = await GetAllDoctors(authHeader)
for(let d = 0; TodosOsMedicos.length > d; d++){
lista.push({nomeMedico: TodosOsMedicos[d].full_name, idMedico: TodosOsMedicos[d].id })}
setListaDeMedicos(lista)
}
PegarTodosOsMedicos()
}, []) }, [])
useEffect(() => {
console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos);
if (FiltredTodosMedicos.length === 1) {
const unicoMedico = FiltredTodosMedicos[0];
console.log(unicoMedico)
const idMedicoFiltrado = unicoMedico.idMedico;
console.log(`Médico único encontrado: ${unicoMedico.nomeMedico}. ID: ${idMedicoFiltrado}`);
const agendamentosDoMedico = filtrarAgendamentosPorMedico(
DictAgendamentosOrganizados,
idMedicoFiltrado
);
console.log(`Total de agendamentos filtrados para este médico: ${agendamentosDoMedico.length}`);
console.log("Lista completa de Agendamentos do Médico:", agendamentosDoMedico);
FiltrarAgendamentos(agendamentosDoMedico)
}
}, [FiltredTodosMedicos]);
const deleteConsulta = (selectedPatientId) => { const deleteConsulta = (selectedPatientId) => {
console.log("tentando apagar")
var myHeaders = new Headers(); var myHeaders = new Headers();
myHeaders.append("Authorization", authHeader); myHeaders.append("Content-Type", "application/json");
myHeaders.append("apikey", API_KEY) myHeaders.append('apikey', API_KEY)
myHeaders.append("authorization", authHeader)
var raw = JSON.stringify({ "status":"cancelled",
"cancellation_reason": motivoCancelamento
});
var requestOptions = { var requestOptions = {
method: 'DELETE', method: 'PATCH',
redirect: 'follow', headers: myHeaders,
headers: myHeaders body: raw,
redirect: 'follow'
}; };
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions) fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions)
.then(response => response.json()) .then(response => {if(response.status !== 200)(console.log(response))})
.then(result => console.log(result)) .then(result => console.log(result))
.catch(error => console.log('error', error)); .catch(error => console.log('error', error));
} }
/**
* Filtra todos os agendamentos em um objeto aninhado (data -> [agendamentos])
* com base no ID do médico.
*
* @param {Object} dictAgendamentos - O dicionário de agendamentos.
* @param {string} idMedicoFiltrado - O ID do médico (doctor_id) para ser usado como filtro.
* @returns {Array} Um array contendo todos os agendamentos que correspondem ao idMedicoFiltrado.
*/
const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => {
// O corpo da função deve usar esses nomes de variáveis:
const todasAsListasDeAgendamentos = Object.values(dictAgendamentos);
const todosOsAgendamentos = todasAsListasDeAgendamentos.flat();
const agendamentosFiltrados = todosOsAgendamentos.filter(agendamento =>
agendamento.doctor_id === idMedicoFiltrado
);
return agendamentosFiltrados;
};
// Lógica para filtrar os dados da AGENDA (AgendamentosMes) // Lógica para filtrar os dados da AGENDA (AgendamentosMes)
const filteredAgendamentos = useMemo(() => { const filteredAgendamentos = useMemo(() => {
@ -255,20 +220,6 @@ const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => {
}; };
const handleSearchMedicos = (term) => {
setSearchTermDoctor(term);
if (term.trim() === '') {
setFiltredTodosMedicos([]);
return;
}
// Lógica simples de filtragem:
const filtered = ListaDeMedicos.filter(medico =>
medico.nomeMedico.toLowerCase().includes(term.toLowerCase())
);
setFiltredTodosMedicos(filtered);
};
const handleClickCancel = () => setPageConsulta(false) const handleClickCancel = () => setPageConsulta(false)
@ -289,78 +240,10 @@ const handleSearchMedicos = (term) => {
<div className='atendimento-eprocura'> <div className='atendimento-eprocura'>
<div className='busca-atendimento-container'> <div className='busca-atendimento-container'>
<div className='input-e-dropdown-wrapper'>
<div className='busca-atendimento'>
<div>
<i className="fa-solid fa-calendar-day"></i>
<input
type="text"
placeholder="Filtrar atendimento por médico..."
value={searchTermDoctor}
onChange={(e) => handleSearchMedicos(e.target.value)} // Chama a nova função de filtro
/>
</div>
</div>
{/* DROPDOWN (RENDERIZAÇÃO CONDICIONAL) */}
{searchTermDoctor && FiltredTodosMedicos.length > 0 && (
<div className='dropdown-medicos'>
{FiltredTodosMedicos.map((medico) => (
<div
key={medico.id}
className='dropdown-item'
onClick={() => {
// Ação ao selecionar o médico
setSearchTermDoctor(medico.nomeMedico); // Preenche o input
//setFiltredTodosMedicos([]); // Fecha o dropdown
// Lógica adicional, como selecionar o ID do médico...
}}
>
<p>{medico.nomeMedico} </p>
</div>
))}
</div>
)}
</div>
</div>
<div className='unidade-selecionarprofissional'>
<select>
<option value="" disabled selected >Unidade</option>
<option value="">Unidade Central</option>
<option value="">Unidade Zona Norte</option>
<option value="">Unidade Zona Oeste</option>
</select>
<input type="text" placeholder='Selecionar profissional' />
</div>
<div className='container-btns-agenda-fila_esepera'>
<button
className={`btn-agenda ${FiladeEspera === false ? "opc-agenda-ativo" : ""}`}
onClick={() => {
setFiladeEspera(false);
setSearchTerm('');
}}
>
Agenda
</button>
<button
className={`btn-fila-espera ${FiladeEspera === true ? "opc-filaespera-ativo" : ""}`}
onClick={() => {
setFiladeEspera(true);
setSearchTerm('');
}}
>
Fila de espera
</button>
</div> </div>
<section className='calendario-ou-filaespera'> <section className='calendario-ou-filaespera'>
{FiladeEspera === false ?
(
<div className='calendario'> <div className='calendario'>
<div> <div>
<section className='btns-e-legenda-container'> <section className='btns-e-legenda-container'>
@ -383,73 +266,22 @@ const handleSearchMedicos = (term) => {
</div> </div>
</section> </section>
{tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} />} {tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={DictAgendamentosOrganizados}
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo}/>} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo}
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} />} listaConsultasID={[]} setListaConsultaID={setListaConsultaID} coresConsultas={coresConsultas}/>}
</div>
</div>
)
:
(
<div className="fila-container">
<div className="fila-header">
<input
type="text"
placeholder="Pesquisar na fila de espera..."
className="busca-fila-espera"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<h2 className="fila-titulo">Fila de Espera</h2>
</div>
<table className="fila-tabela">
<thead>
<tr>
<th>Nome</th>
<th>Telefone</th>
<th>Telefone</th>
<th>Entrou na fila de espera</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
{filaEsperaData.map((item, index) => (
<tr key={index}>
<td> <p>{item.Infos?.paciente_nome} </p> </td>
<td><p>{} </p></td>
<td>{}</td>
<td>{}</td>
<td> <div className="d-flex gap-2">
<button className="btn btn-sm btn-edit"
onClick={() => {
console.log(item, 'item')
navigate(`${2}/edit`)
setDictInfo(item)
}}
>
<i className="bi bi-pencil me-1"></i> Editar
</button>
<button {tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes}
className="btn btn-sm btn-delete" setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo}
onClick={() => { listaConsultasID={[]} setListaConsultaID={setListaConsultaID} coresConsultas={coresConsultas} />}
setSelectedId(item.agendamento.id)
setShowDeleteModal(true);
}} {tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados}
> setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} setDictInfo={setDictInfo} listaConsultasID={[]}
<i className="bi bi-trash me-1"></i> Excluir setListaConsultaID={setListaConsultaID} coresConsultas={coresConsultas}/>}
</button>
</div></td>
</tr>
))}
</tbody>
</table>
</div> </div>
) </div>
}
</section> </section>
</div> </div>
) : ( ) : (
@ -473,7 +305,7 @@ const handleSearchMedicos = (term) => {
<div className="modal-header bg-danger bg-opacity-25"> <div className="modal-header bg-danger bg-opacity-25">
<h5 className="modal-title text-danger"> <h5 className="modal-title text-danger">
Confirmação de Exclusão Confirmação de Cancelamento
</h5> </h5>
<button <button
type="button" type="button"
@ -484,8 +316,12 @@ const handleSearchMedicos = (term) => {
<div className="modal-body"> <div className="modal-body">
<p className="mb-0 fs-5"> <p className="mb-0 fs-5">
Tem certeza que deseja excluir este agendamento? Qual o motivo do cancelamento?
</p> </p>
<div className='campo-de-input'>
<textarea className='input-modal' value={motivoCancelamento} onChange={(e) => setMotivoCancelamento(e.target.value)} />
</div>
</div> </div>
<div className="modal-footer"> <div className="modal-footer">
@ -493,7 +329,9 @@ const handleSearchMedicos = (term) => {
<button <button
type="button" type="button"
className="btn btn-primary" className="btn btn-primary"
onClick={() => setShowDeleteModal(false)} onClick={() => {setShowDeleteModal(false);
}}
> >
Cancelar Cancelar
</button> </button>
@ -502,7 +340,22 @@ const handleSearchMedicos = (term) => {
<button <button
type="button" type="button"
className="btn btn-danger" className="btn btn-danger"
onClick={() => {deleteConsulta(selectedID);setShowDeleteModal(false)}} onClick={() => {deleteConsulta(selectedID);
setShowDeleteModal(false)
let lista_cores = coresConsultas
let lista = listaConsultasID
lista.push(selectedID)
lista_cores.push("cancelled")
setCoresConsultas(lista_cores)
setListaConsultaID(lista)
console.log("lista", lista)
}}
> >
<i className="bi bi-trash me-1"></i> Excluir <i className="bi bi-trash me-1"></i> Excluir

View File

@ -34,27 +34,24 @@ const ConsultasPaciente = ({ setConsulta }) => {
let filaEspera = [] let filaEspera = []
const fetchInfosConsultas = async (consulta) => { const fetchInfosConsultas = async (consulta) => {
let doctor = await GetDoctorByID(consulta.doctor_id, authHeader)
let paciente = await GetPatientByID(consulta.patient_id, authHeader)
console.log(doctor, "PACIENTE TRAZIDO PELO ")
let consultaMelhorada = {...consulta, paciente_nome:paciente[0].full_name, medico_nome:doctor[0].full_name }
console.log(consultaMelhorada,"ID DO MEDICO")
} //console.log(doctor, "PACIENTE TRAZIDO PELO ")
console.log("so muda") // let consultaMelhorada = {...consulta, paciente_nome:paciente[0].full_name, medico_nome:doctor[0].full_name }
if(!listaTodasConsultas.length) return
//console.log(consultaMelhorada,"ID DO MEDICO")
for(let i = 0; listaTodasConsultas.length > i; i++){ for(let i = 0; listaTodasConsultas.length > i; i++){
let consulta = listaTodasConsultas[i] let consulta = listaTodasConsultas[i]
fetchInfosConsultas(consulta); let doctor = await GetDoctorByID(consulta.doctor_id, authHeader)
let paciente = await GetPatientByID(consulta.patient_id, authHeader)
consulta = {...consulta, medico_nome:doctor[0]?.full_name, paciente_nome:paciente[0]?.full_name}
if(consulta.status === "requested"){ if(consulta.status === "requested"){
@ -82,9 +79,13 @@ const ConsultasPaciente = ({ setConsulta }) => {
setConsultasOrganizadas(conjuntoConsultas) setConsultasOrganizadas(conjuntoConsultas)
setFilaDeEspera(filaEspera) setFilaDeEspera(filaEspera)
}
console.log("so muda")
if(!listaTodasConsultas.length) return
console.log(filaEspera, "fila de espera") console.log(filaEspera, "fila de espera")
fetchInfosConsultas();
}, [listaTodasConsultas]) }, [listaTodasConsultas])
@ -186,10 +187,10 @@ const ConsultasPaciente = ({ setConsulta }) => {
<tbody> <tbody>
{filaDeEspera.map((item, index) => ( {filaDeEspera.map((item, index) => (
<tr key={index}> <tr key={index}>
<td> <p>{item?.patient_id} </p> </td> <td> <p>{item?.paciente_nome} </p> </td>
<td><p>{item?.paciente_cpf} </p></td> <td><p>{item?.paciente_cpf} </p></td>
<td><p>{item.Infos?.nome_medico} </p></td> <td><p>{item?.medico_nome} </p></td>
<td>{dayjs(item.agendamento?.created_at).format('DD/MM/YYYY HH:mm')}</td> <td>{dayjs(item?.created_at).format('DD/MM/YYYY HH:mm')}</td>
<td> <div className="d-flex gap-2"> <td> <div className="d-flex gap-2">
<button className="btn btn-sm btn-edit" <button className="btn btn-sm btn-edit"

View File

@ -7,7 +7,7 @@ import "./style/card-consulta.css"
const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, setDictInfo, setSelectedId, setShowConfirmModal, corModal, selectedID, coresConsultas, setListaConsultaID, listaConsultasID} ) => { const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, setDictInfo, setSelectedId, setShowConfirmModal, corModal, selectedID, coresConsultas, setListaConsultaID, listaConsultasID} ) => {
const navigate = useNavigate(); const navigate = useNavigate();
console.log(DadosConsulta)
const {getAuthorizationHeader} = useAuth() const {getAuthorizationHeader} = useAuth()
const authHeader = getAuthorizationHeader() const authHeader = getAuthorizationHeader()
@ -47,9 +47,9 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, se
BuscarMedicoEPaciente(); BuscarMedicoEPaciente();
}, [ids, authHeader]); }, [ids, authHeader]);
let nameArrayPaciente = Paciente?.full_name.split(' ') let nameArrayPaciente = DadosConsulta.medico_nome?.split(' ')
let nameArrayMedico = Medico?.full_name.split(' ') let nameArrayMedico = DadosConsulta?.paciente_nome.split(' ')
let indice_cor = listaConsultasID.indexOf(DadosConsulta.id) let indice_cor = listaConsultasID.indexOf(DadosConsulta.id)

View File

@ -90,7 +90,9 @@ const [isDropdownOpen, setIsDropdownOpen] = useState(false);
// Se estiver na página de edição esse useEffect pega o horario de inicio para coloca-lo no horarioInicio // Se estiver na página de edição esse useEffect pega o horario de inicio para coloca-lo no horarioInicio
useEffect(() => { useEffect(() => {
console.log("Horario", ) console.log("Horario", )
setHorarioInicio(formatarHora(agendamento.scheduled_at)) if (agendamento?.scheduled_at) {
setHorarioInicio(formatarHora(agendamento.scheduled_at));
}
}, []) }, [])

View File

@ -10,7 +10,6 @@ const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDel
let ListaDiasComAgendamentos = Object.keys(agendamentos) let ListaDiasComAgendamentos = Object.keys(agendamentos)
console.log(agendamentos, "tentativa colocar consultas")
//console.log(Dia, "hshdhshhsdhs") //console.log(Dia, "hshdhshhsdhs")

View File

@ -325,7 +325,6 @@ const handleSearchMedicos = (term) => {
<div className='spinner'></div> <div className='spinner'></div>
<h1>Agendar nova consulta</h1> <h1>Agendar nova consulta</h1>
<div className="btns-gerenciamento-e-consulta" style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}> <div className="btns-gerenciamento-e-consulta" style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}>
<button className="btn btn-primary" onClick={() => setPageConsulta(true)}> <button className="btn btn-primary" onClick={() => setPageConsulta(true)}>
<i className="bi bi-plus-circle"></i> Adicionar Consulta <i className="bi bi-plus-circle"></i> Adicionar Consulta

View File

@ -5,7 +5,7 @@ import { useAuth } from '../components/utils/AuthProvider'
import { useEffect,useState } from 'react' import { useEffect,useState } from 'react'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { UserInfos } from '../components/utils/Functions-Endpoints/General' import { UserInfos } from '../components/utils/Functions-Endpoints/General'
const AgendamentoCadastroManager = ({setPageConsulta}) => { const AgendamentoCadastroManager = ({setPageConsulta, Dict}) => {
const {getAuthorizationHeader} = useAuth() const {getAuthorizationHeader} = useAuth()
const [agendamento, setAgendamento] = useState({status:'confirmed'}) const [agendamento, setAgendamento] = useState({status:'confirmed'})
@ -16,6 +16,11 @@ const AgendamentoCadastroManager = ({setPageConsulta}) => {
useEffect(() => { useEffect(() => {
if(!Dict){setAgendamento({})}
else{
setAgendamento(...Dict)
}
const ColherInfoUsuario =async () => { const ColherInfoUsuario =async () => {
const result = await UserInfos(authHeader) const result = await UserInfos(authHeader)
@ -43,7 +48,7 @@ const AgendamentoCadastroManager = ({setPageConsulta}) => {
"duration_minutes": 30, "duration_minutes": 30,
"appointment_type": Dict.tipo_consulta, "appointment_type": Dict.tipo_consulta,
"patient_notes": "Prefiro horário pela manhã", "patient_notes": "",
"insurance_provider": Dict.convenio, "insurance_provider": Dict.convenio,
"status": Dict.status, "status": Dict.status,
"created_by": idUsuario "created_by": idUsuario