From 0fcc7ae97b46330aae6073f2d3aa5bc57fdfce16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Deir=C3=B3=20Rodrigues?= Date: Mon, 10 Nov 2025 15:36:00 -0300 Subject: [PATCH] =?UTF-8?q?configura=C3=A7=C3=A3o=20do=20envio=20de=20sms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/schedule/schedule-form.tsx | 121 +++++++++++++++++++------- services/appointmentsApi.mjs | 3 + 2 files changed, 91 insertions(+), 33 deletions(-) diff --git a/components/schedule/schedule-form.tsx b/components/schedule/schedule-form.tsx index becac35..af89a24 100644 --- a/components/schedule/schedule-form.tsx +++ b/components/schedule/schedule-form.tsx @@ -207,46 +207,101 @@ export default function ScheduleForm() { }, [selectedDoctor, selectedDate, fetchAvailableSlots]); // 🔹 Submeter agendamento - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); + // 🔹 Submeter agendamento + // 🔹 Submeter agendamento +// 🔹 Submeter agendamento +// 🔹 Submeter agendamento +const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); - const isSecretaryLike = ["secretaria", "admin", "gestor"].includes(role); - const patientId = isSecretaryLike ? selectedPatient : userId; + const isSecretaryLike = ["secretaria", "admin", "gestor"].includes(role); + const patientId = isSecretaryLike ? selectedPatient : userId; - if (!patientId || !selectedDoctor || !selectedDate || !selectedTime) { - toast({ title: "Campos obrigatórios", description: "Preencha todos os campos." }); - return; - } + if (!patientId || !selectedDoctor || !selectedDate || !selectedTime) { + toast({ title: "Campos obrigatórios", description: "Preencha todos os campos." }); + return; + } + + try { + const body = { + doctor_id: selectedDoctor, + patient_id: patientId, + scheduled_at: `${selectedDate}T${selectedTime}:00`, + duration_minutes: Number(duracao), + notes, + appointment_type: tipoConsulta, + }; + + // ✅ mantém o fluxo original de criação (funcional) + await appointmentsService.create(body); + + const dateFormatted = selectedDate.split("-").reverse().join("/"); + + toast({ + title: "Consulta agendada!", + description: `Consulta marcada para ${dateFormatted} às ${selectedTime} com o(a) médico(a) ${ + doctors.find((d) => d.id === selectedDoctor)?.full_name || "" + }.`, + }); + + // 📞 busca o telefone corretamente + let phoneNumber = "+5511999999999"; // fallback try { - const body = { - doctor_id: selectedDoctor, - patient_id: patientId, - scheduled_at: `${selectedDate}T${selectedTime}:00`, - duration_minutes: Number(duracao), - notes, - appointment_type: tipoConsulta, - }; + if (isSecretaryLike) { + // se for secretária/admin → usa paciente selecionado + const patient = patients.find((p: any) => p.id === patientId); + if (patient?.phone_number) phoneNumber = patient.phone_number; + } else { + // se for paciente → usa o service do próprio user + const me = await usersService.getMe(); + if (me?.profile?.phone) phoneNumber = me.profile.phone; + } - await appointmentsService.create(body); - const dateFormatted = selectedDate.split("-").reverse().join("/"); - toast({ - title: "Consulta agendada!", - description: `Consulta marcada para ${dateFormatted} às ${selectedTime} com o(a) médico(a) ${ - doctors.find((d) => d.id === selectedDoctor)?.full_name || "" - }.`, - }); - - setSelectedDoctor(""); - setSelectedDate(""); - setSelectedTime(""); - setNotes(""); - setSelectedPatient(""); + // padroniza número para formato internacional (+55) + if (phoneNumber) { + phoneNumber = phoneNumber.replace(/\D/g, ""); // remove caracteres não numéricos + if (!phoneNumber.startsWith("55")) phoneNumber = `55${phoneNumber}`; + phoneNumber = `+${phoneNumber}`; + } } catch (err) { - console.error(err); - toast({ title: "Erro", description: "Falha ao agendar consulta." }); + console.warn("Não foi possível obter telefone do paciente:", err); } - }; + + // 💬 envia o SMS de confirmação + // 💬 Envia o SMS de lembrete (sem mostrar nada ao paciente) +try { + const smsRes = await appointmentsService.send_sms({ + phone_number: phoneNumber, + message: `Lembrete: sua consulta é em ${dateFormatted} às ${selectedTime} na Clínica MediConnect.`, + patient_id: patientId, + }); + + if (smsRes?.success) { + console.log("✅ SMS enviado com sucesso:", smsRes.message_sid || smsRes.sid || "(sem SID retornado)"); + } else { + console.warn("⚠️ Falha no envio do SMS:", smsRes); + } +} catch (smsErr) { + console.error("❌ Erro ao enviar SMS:", smsErr); +} + + + // 🧹 limpa os campos + setSelectedDoctor(""); + setSelectedDate(""); + setSelectedTime(""); + setNotes(""); + setSelectedPatient(""); + } catch (err) { + console.error("❌ Erro ao agendar consulta:", err); + toast({ title: "Erro", description: "Falha ao agendar consulta." }); + } +}; + + + + // 🔹 Tooltip no calendário useEffect(() => { diff --git a/services/appointmentsApi.mjs b/services/appointmentsApi.mjs index 5180c6e..bebf986 100644 --- a/services/appointmentsApi.mjs +++ b/services/appointmentsApi.mjs @@ -45,4 +45,7 @@ export const appointmentsService = { * @returns {Promise} - Uma promessa que resolve com a resposta da API. */ delete: (id) => api.delete(`/rest/v1/appointments?id=eq.${id}`), + + send_sms: (data) => api.post("/functions/v1/send-sms", data) + }; \ No newline at end of file