//ExcecoesDisponibilidade.jsx import { useState, useEffect, useCallback, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../../_assets/utils/AuthProvider'; import { GetAllDoctors } from '../../_assets/utils/Functions-Endpoints/Doctor'; import API_KEY from '../../_assets/utils/apiKeys'; import FormCriarExcecao from '../../components/medico/FormExcecaoDisponibilidade'; import '../../_assets/css/components/agendamento/FormAgendamento.css'; import '../../_assets/css/pages/agendamento/Agendamento.css'; import '../../_assets/css/pages/agendamento/FilaEspera.css'; import 'dayjs/locale/pt-br'; import weekday from 'dayjs/plugin/weekday'; import dayjs from 'dayjs'; dayjs.extend(weekday); dayjs.locale('pt-br'); const ENDPOINT_BASE = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions"; const getDateRange = (date, view) => { const startDayjs = dayjs(date); let fromDate, toDate, titleRange; if (view === 'diario') { fromDate = startDayjs.format('YYYY-MM-DD'); toDate = startDayjs.format('YYYY-MM-DD'); titleRange = startDayjs.format('DD/MM/YYYY'); } else if (view === 'semanal') { let weekStart = startDayjs.startOf('week'); if (weekStart.day() !== 1) { weekStart = startDayjs.weekday(1); } const weekEnd = weekStart.add(6, 'day'); fromDate = weekStart.format('YYYY-MM-DD'); toDate = weekEnd.format('YYYY-MM-DD'); titleRange = `Semana de ${weekStart.format('DD/MM')} a ${weekEnd.format('DD/MM')}`; } else if (view === 'mensal') { const monthStart = startDayjs.startOf('month'); const monthEnd = startDayjs.endOf('month'); fromDate = monthStart.format('YYYY-MM-DD'); toDate = monthEnd.format('YYYY-MM-DD'); titleRange = startDayjs.format('MMMM/YYYY').toUpperCase(); } return { fromDate, toDate, titleRange }; }; const ExcecoesDisponibilidade = () => { const { getAuthorizationHeader } = useAuth(); const navigate = useNavigate(); const [pageNovaExcecao, setPageNovaExcecao] = useState(false); const [excecoes, setExcecoes] = useState([]); const [loading, setLoading] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); const [selectedExceptionId, setSelectedExceptionId] = useState(null); const [showSuccessModal, setShowSuccessModal] = useState(false); const [successMessage, setSuccessMessage] = useState(''); const [filtroMedicoId, setFiltroMedicoId] = useState(''); const [filtroData, setFiltroData] = useState(dayjs().format('YYYY-MM-DD')); const [listaDeMedicos, setListaDeMedicos] = useState([]); const [searchTermDoctor, setSearchTermDoctor] = useState(''); const [filteredDoctors, setFilteredDoctors] = useState([]); const [selectedDoctor, setSelectedDoctor] = useState(null); const [visualizacao, setVisualizacao] = useState('diario'); const resolveAuthHeader = () => { try { const h = getAuthorizationHeader(); return h || ''; } catch { return ''; } } const fetchExcecoes = useCallback(async (fromDate, toDate, doctorId) => { setLoading(true); let url = `${ENDPOINT_BASE}?select=*`; if (doctorId) { url += `&doctor_id=eq.${doctorId}`; } url += `&date=gte.${fromDate}&date=lte.${toDate}`; const myHeaders = new Headers(); const authHeader = resolveAuthHeader(); if (authHeader) myHeaders.append("Authorization", authHeader); myHeaders.append("Content-Type", "application/json"); if (API_KEY) myHeaders.append("apikey", API_KEY); try { const requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; const response = await fetch(url, requestOptions); const result = await response.json(); if (response.ok && Array.isArray(result)) { setExcecoes(result); } else { setExcecoes([]); console.error("Erro ao listar exceções (Status:", response.status, "):", result); alert(`Erro ao carregar lista de exceções. Status: ${response.status}. Detalhes: ${result.message || JSON.stringify(result)}`); } } catch (error) { console.error('Erro na requisição de listagem de exceções:', error); setExcecoes([]); alert("Erro de comunicação com o servidor ao listar exceções."); } finally { setLoading(false); } }, [getAuthorizationHeader]); const { fromDate, toDate, titleRange } = useMemo(() => getDateRange(filtroData, visualizacao), [filtroData, visualizacao] ); useEffect(() => { fetchExcecoes(fromDate, toDate, filtroMedicoId); }, [fetchExcecoes, filtroMedicoId, fromDate, toDate]); useEffect(() => { const fetchDoctors = async () => { const myHeaders = new Headers(); const authHeader = resolveAuthHeader(); if (authHeader) myHeaders.append("Authorization", authHeader); if (API_KEY) myHeaders.append("apikey", API_KEY); try { const response = await fetch('https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctors?select=id,full_name', { method: 'GET', headers: myHeaders }); if (response.ok) { const doctors = await response.json(); setListaDeMedicos(doctors); } } catch (error) { console.error('Erro ao buscar médicos:', error); } }; fetchDoctors(); }, []); const handleSearchDoctors = (term) => { setSearchTermDoctor(term); if (term.trim() === '') { setFilteredDoctors([]); return; } const filtered = listaDeMedicos.filter(doc => doc.full_name.toLowerCase().includes(term.toLowerCase()) ); setFilteredDoctors(filtered); }; const limparFiltros = () => { setSearchTermDoctor(''); setFilteredDoctors([]); setSelectedDoctor(null); setFiltroMedicoId(''); setFiltroData(dayjs().format('YYYY-MM-DD')); setVisualizacao('diario'); }; const deleteExcecao = async (id) => { const myHeaders = new Headers(); const authHeader = resolveAuthHeader(); if (authHeader) myHeaders.append("Authorization", authHeader); if (API_KEY) myHeaders.append("apikey", API_KEY); myHeaders.append("Content-Type", "application/json"); try { const res = await fetch(`${ENDPOINT_BASE}?id=eq.${id}`, { method: 'DELETE', headers: myHeaders, redirect: 'follow' }); if (res.ok) { setExcecoes(prev => prev.filter(x => x.id !== id)); setShowDeleteModal(false); setSuccessMessage('Exceção excluída com sucesso!'); setShowSuccessModal(true); } else { const text = await res.text(); console.error('Erro ao deletar exceção', res.status, text); alert(`Erro ao excluir exceção. Status: ${res.status}. ${text}`); } } catch (err) { console.error('Erro na requisição de exclusão:', err); alert('Erro ao excluir exceção.'); } } const handleCancelForm = (recarregar = false) => { setPageNovaExcecao(false); if (recarregar) { fetchExcecoes(fromDate, toDate, filtroMedicoId); } } if (pageNovaExcecao) { return ; } return (

Gerenciar Exceções de Disponibilidade

Filtros
handleSearchDoctors(e.target.value)} /> Filtre as exceções por médico {searchTermDoctor && filteredDoctors.length > 0 && (
{filteredDoctors.map((doc) => ( ))}
)}
setFiltroData(e.target.value)} /> Selecione a data base para visualização
{selectedDoctor && ( {selectedDoctor.full_name} )}
{excecoes.length} DE {excecoes.length} EXCEÇÕES ENCONTRADAS

Exceções em {titleRange} ({excecoes.length})

{loading ? (

Carregando exceções...

) : excecoes.length === 0 ? (

Nenhuma exceção encontrada para os filtros aplicados.

) : ( {excecoes.map((exc) => ( ))}
Médico (ID) Data Início Término Motivo Criado por Ações

{exc.doctor_id}

{dayjs(exc.date).format('DD/MM/YYYY')} {exc.start_time ? dayjs(exc.start_time, 'HH:mm:ss').format('HH:mm') : '—'} {exc.end_time ? dayjs(exc.end_time, 'HH:mm:ss').format('HH:mm') : '—'}

{exc.reason}

{exc.created_by || '—'}
)}
{showDeleteModal && (
Confirmação de Exclusão

Tem certeza que deseja excluir esta exceção?

)} {showSuccessModal && (
Sucesso

{successMessage}

)}
); } export default ExcecoesDisponibilidade;