From b38a7abf357105cef3cc5b9d427caf31dbac6cdc Mon Sep 17 00:00:00 2001 From: Sidney Date: Sun, 7 Jun 2026 15:46:53 -0300 Subject: [PATCH] feat(mensagens): adiciona suporte para disparo em massa para pre-matriculas --- manager/components/Messages.tsx | 108 +++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 36 deletions(-) diff --git a/manager/components/Messages.tsx b/manager/components/Messages.tsx index 9ac5e5b..56fe481 100644 --- a/manager/components/Messages.tsx +++ b/manager/components/Messages.tsx @@ -31,15 +31,16 @@ const Messages: React.FC = ({ data, updateData }) => { const [dbClasses, setDbClasses] = useState(data?.classes || []); const [dbCourses, setDbCourses] = useState(data?.courses || []); + const [dbPreMatriculas, setDbPreMatriculas] = useState([]); React.useEffect(() => { Promise.all([ fetch('/api/turmas').catch(() => ({ ok: false, json: async () => ({}) })), fetch('/api/cursos').catch(() => ({ ok: false, json: async () => ({}) })), - + fetch('/api/prematricula/inscricoes').catch(() => ({ ok: false, json: async () => ({}) })) ]).then(async (responses) => { - const [resT, resC] = responses; + const [resT, resC, resP] = responses; if (resT && resT.ok) { const jsonT = await resT.json(); if (jsonT.turmas) setDbClasses(jsonT.turmas.map((t: any) => ({ @@ -52,7 +53,10 @@ const Messages: React.FC = ({ data, updateData }) => { id: c.id, name: c.nome, monthlyFee: Number(c.mensalidade || 0), registrationFee: Number(c.taxa_matricula || 0) }))); } - + if (resP && resP.ok) { + const jsonP = await resP.json(); + if (jsonP.inscricoes) setDbPreMatriculas(jsonP.inscricoes); + } }).catch(console.error); }, []); @@ -240,6 +244,8 @@ const Messages: React.FC = ({ data, updateData }) => { } let targetStudents = []; + let isPreMatricula = false; + if (targetType === 'todos') { targetStudents = data.students || []; } else if (targetType === 'turma') { @@ -248,37 +254,62 @@ const Messages: React.FC = ({ data, updateData }) => { } else if (targetType === 'aluno') { if (!targetId) return showAlert('Aviso', 'Selecione um aluno.', 'warning'); targetStudents = (data.students || []).filter(s => s.id === targetId); + } else if (targetType === 'prematricula_todos') { + targetStudents = dbPreMatriculas; + isPreMatricula = true; + } else if (targetType === 'prematricula_turma') { + if (!targetId) return showAlert('Aviso', 'Selecione uma turma.', 'warning'); + targetStudents = dbPreMatriculas.filter(p => p.turmaId === targetId); + isPreMatricula = true; + } else if (targetType === 'prematricula_aluno') { + if (!targetId) return showAlert('Aviso', 'Selecione uma pré-matrícula.', 'warning'); + targetStudents = dbPreMatriculas.filter(p => p.id === targetId); + isPreMatricula = true; } - const validStudents = targetStudents.filter(a => a.phone || a.guardianPhone); - if (validStudents.length === 0) { - return showAlert('Erro', 'Nenhum aluno com telefone cadastrado foi selecionado.', 'error'); + let payloadAlunos = []; + + if (isPreMatricula) { + const validPre = targetStudents.filter(p => p.telefone); + if (validPre.length === 0) { + return showAlert('Erro', 'Nenhuma pré-matrícula com telefone válido foi selecionada.', 'error'); + } + payloadAlunos = validPre.map(p => ({ + nome: p.nome.split(' ')[0], + telefone: p.telefone, + matricula: 'Pré-Matrícula' + })); + } else { + const validStudents = targetStudents.filter(a => a.phone || a.guardianPhone); + if (validStudents.length === 0) { + return showAlert('Erro', 'Nenhum aluno com telefone cadastrado foi selecionado.', 'error'); + } + + payloadAlunos = validStudents.flatMap(a => { + const entries = []; + + // Entrada para o Aluno + if (a.phone) { + entries.push({ + nome: a.name.split(' ')[0], + telefone: a.phone, + matricula: a.enrollmentNumber || '—' + }); + } + + // Entrada para o Responsável (apenas se for um número diferente ou se o aluno não tiver número) + if (a.guardianPhone && a.guardianPhone !== a.phone) { + entries.push({ + nome: (a.guardianName || a.name).split(' ')[0], + telefone: a.guardianPhone, + matricula: a.enrollmentNumber || '—' + }); + } + + return entries; + }); } - const payloadAlunos = validStudents.flatMap(a => { - const entries = []; - - // Entrada para o Aluno - if (a.phone) { - entries.push({ - nome: a.name.split(' ')[0], - telefone: a.phone, - matricula: a.enrollmentNumber || '—' - }); - } - - // Entrada para o Responsável (apenas se for um número diferente ou se o aluno não tiver número) - if (a.guardianPhone && a.guardianPhone !== a.phone) { - entries.push({ - nome: (a.guardianName || a.name).split(' ')[0], - telefone: a.guardianPhone, - matricula: a.enrollmentNumber || '—' - }); - } - - return entries; - }); - setIsSendingMass(true); try { const formData = new FormData(); @@ -371,21 +402,26 @@ const Messages: React.FC = ({ data, updateData }) => { value={targetType} onChange={(e) => { setTargetType(e.target.value); setTargetId(''); }} > - - - + + + + + + - {targetType !== 'todos' && ( + {targetType !== 'todos' && targetType !== 'prematricula_todos' && ( )}