From 9b6fa7ff3679c86ed2980b2e27107e8fba66d910 Mon Sep 17 00:00:00 2001 From: Pedro Araujo da Silveira Date: Wed, 5 Nov 2025 21:23:46 -0300 Subject: [PATCH] fix: relatorios --- src/components/AgendamentoConsulta.tsx | 125 +++++++++--------- .../secretaria/SecretaryAppointmentList.tsx | 12 +- .../secretaria/SecretaryDoctorList.tsx | 12 +- .../secretaria/SecretaryDoctorSchedule.tsx | 32 ++--- .../secretaria/SecretaryPatientList.tsx | 20 +-- .../secretaria/SecretaryReportList.tsx | 68 +++++++--- src/pages/AcompanhamentoPaciente.tsx | 6 +- src/pages/PainelSecretaria.tsx | 8 +- 8 files changed, 157 insertions(+), 126 deletions(-) diff --git a/src/components/AgendamentoConsulta.tsx b/src/components/AgendamentoConsulta.tsx index aef484ba2..2784a2105 100644 --- a/src/components/AgendamentoConsulta.tsx +++ b/src/components/AgendamentoConsulta.tsx @@ -65,7 +65,6 @@ export default function AgendamentoConsulta({ >("presencial"); const [motivo, setMotivo] = useState(""); const [showConfirmDialog, setShowConfirmDialog] = useState(false); - const [bookingSuccess, setBookingSuccess] = useState(false); const [bookingError, setBookingError] = useState(""); const [showResultModal, setShowResultModal] = useState(false); const [resultType, setResultType] = useState<"success" | "error">("success"); @@ -133,40 +132,9 @@ export default function AgendamentoConsulta({ return; } - // Mapeamento de string para número (formato da API) - const weekdayMap: Record = { - sunday: 0, - monday: 1, - tuesday: 2, - wednesday: 3, - thursday: 4, - friday: 5, - saturday: 6, - }; - - // Mapeia os dias da semana que o médico atende (converte para número) + // Mapeia os dias da semana que o médico atende (weekday é sempre número 0-6) const availableWeekdays = new Set( - availabilities - .map((avail) => { - // weekday pode vir como número ou string da API - let weekdayNum: number; - - if (typeof avail.weekday === "number") { - weekdayNum = avail.weekday; - } else if (typeof avail.weekday === "string") { - weekdayNum = weekdayMap[avail.weekday.toLowerCase()] ?? -1; - } else { - weekdayNum = -1; - } - - console.log("[AgendamentoConsulta] Convertendo weekday:", { - original: avail.weekday, - type: typeof avail.weekday, - converted: weekdayNum, - }); - return weekdayNum; - }) - .filter((day) => day >= 0 && day <= 6) // Remove valores inválidos + availabilities.map((avail) => avail.weekday) ); console.log( @@ -249,18 +217,8 @@ export default function AgendamentoConsulta({ return; } - // Pega o dia da semana da data selecionada - const weekdayMap: Record = { - 0: "sunday", - 1: "monday", - 2: "tuesday", - 3: "wednesday", - 4: "thursday", - 5: "friday", - 6: "saturday", - }; - - const dayOfWeek = weekdayMap[selectedDate.getDay()]; + // Pega o dia da semana da data selecionada (0-6) + const dayOfWeek = selectedDate.getDay() as 0 | 1 | 2 | 3 | 4 | 5 | 6; console.log( "[AgendamentoConsulta] Dia da semana selecionado:", dayOfWeek @@ -309,6 +267,53 @@ export default function AgendamentoConsulta({ } } + // Busca exceções (bloqueios) para este médico + const exceptions = await availabilityService.listExceptions({ + doctor_id: selectedMedico.id, + }); + + console.log("[AgendamentoConsulta] Exceções encontradas:", exceptions); + + // Verifica se a data está bloqueada (exceção de bloqueio) + const dayException = exceptions.find( + (exc) => exc.date === dateStr && exc.kind === "bloqueio" + ); + + if (dayException) { + console.log( + "[AgendamentoConsulta] Data bloqueada por exceção:", + dayException + ); + + // Se for bloqueio de dia inteiro (start_time e end_time são null), não há horários disponíveis + if (!dayException.start_time || !dayException.end_time) { + console.log("[AgendamentoConsulta] Dia completamente bloqueado"); + setAvailableSlots([]); + return; + } + + // Se for bloqueio parcial, remove os horários bloqueados + if (dayException.start_time && dayException.end_time) { + const [blockStartHour, blockStartMin] = dayException.start_time.split(":").map(Number); + const [blockEndHour, blockEndMin] = dayException.end_time.split(":").map(Number); + const blockStartMinutes = blockStartHour * 60 + blockStartMin; + const blockEndMinutes = blockEndHour * 60 + blockEndMin; + + // Filtra slots que não estão no período bloqueado + const slotsAfterBlock = allSlots.filter(slot => { + const [slotHour, slotMin] = slot.split(":").map(Number); + const slotMinutes = slotHour * 60 + slotMin; + return slotMinutes < blockStartMinutes || slotMinutes >= blockEndMinutes; + }); + + console.log("[AgendamentoConsulta] Slots após remover bloqueio parcial:", slotsAfterBlock); + + // Usa os slots filtrados em vez de todos + allSlots.length = 0; + allSlots.push(...slotsAfterBlock); + } + } + // Busca agendamentos existentes para esta data const appointments = await appointmentService.list({ doctor_id: selectedMedico.id, @@ -402,7 +407,6 @@ export default function AgendamentoConsulta({ setSelectedDate(undefined); setSelectedTime(""); setMotivo(""); - setBookingSuccess(false); setBookingError(""); // Scroll suave para a seção de detalhes @@ -455,7 +459,6 @@ export default function AgendamentoConsulta({ setResultType("success"); setShowResultModal(true); setShowConfirmDialog(false); - setBookingSuccess(true); } catch (error: unknown) { console.error("[AgendamentoConsulta] Erro ao agendar:", error); @@ -478,7 +481,7 @@ export default function AgendamentoConsulta({ {/* Modal de Resultado (Sucesso ou Erro) com Animação */} {showResultModal && (
-
+
{/* Ícone com Animação Giratória (1 volta) */}
@@ -520,7 +523,6 @@ export default function AgendamentoConsulta({
-
+
-