edumanagerpro2/manager/scratch/update_students_tsx.js

203 lines
7.7 KiB
JavaScript

import fs from 'fs';
import path from 'path';
const filePath = 'manager/components/Students.tsx';
let content = fs.readFileSync(filePath, 'utf8');
// 1. ADICIONAR ESTADO dbStudents E LOAD
const stateAnchor = " const [dbClasses, setDbClasses] = useState<any[]>(dbClasses || []);";
if(content.includes(stateAnchor) && !content.includes("const [dbStudents, setDbStudents]")) {
const injection = ` const [dbStudents, setDbStudents] = useState<any[]>([]);
const loadStudents = async () => {
try {
const res = await fetch('/api/alunos');
if (res.ok) {
const json = await res.json();
setDbStudents(json.alunos || []);
}
} catch(e) { console.error(e); }
};
useEffect(() => { loadStudents(); }, []);
` + stateAnchor;
content = content.replace(stateAnchor, injection);
}
// 2. SUBSTITUIR data.students POR dbStudents EM LEITURAS (menos nas props)
// cuidado para nao substituir data.students.find no deepLink se nao carregar dbStudents antes
content = content.replace(/data\.students\.find/g, 'dbStudents.find');
content = content.replace(/data\.students\.filter/g, 'dbStudents.filter');
content = content.replace(/data\.students\.reduce/g, 'dbStudents.reduce');
content = content.replace(/data\.students\.length/g, 'dbStudents.length');
content = content.replace(/data\.students\.map/g, 'dbStudents.map');
// 3. ATUALIZAR handleSave PARA USAR API
const saveAnchor1 = ` if (editingStudent) {
updatedStudents = data.students.map(s =>
s.id === editingStudent.id ? studentToSave : s
);
} else {
updatedStudents = [...data.students, studentToSave];
}`;
const saveReplace1 = ` // Salvar no Backend via API (Fase 4)
try {
const isNew = !editingStudent;
const endpoint = isNew ? '/api/alunos' : \`/api/alunos/\${studentToSave.id}\`;
const method = isNew ? 'POST' : 'PUT';
const response = await fetch(endpoint, {
method,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(studentToSave)
});
if (!response.ok) throw new Error('Erro ao salvar no backend');
await loadStudents(); // Recarrega lista
} catch(e) {
console.error(e);
showAlert('Erro', 'Falha ao salvar aluno no banco de dados.', 'error');
return;
}
// Fallback retrocompatibilidade - remover depois que tudo for SQL
if (editingStudent) {
updatedStudents = data.students.map(s => s.id === editingStudent.id ? studentToSave : s);
} else {
updatedStudents = [...data.students, studentToSave];
}`;
content = content.replace(saveAnchor1, saveReplace1);
// 4. ATUALIZAR handleDelete PARA USAR API (linha 968)
const delAnchor1 = ` const handleDelete = (student: Student) => {
showConfirm(
'Mover para Inativos',
\`Tem certeza que deseja inativar o(a) aluno(a) \${student.name}?\`,
() => {
const updatedStudents = data.students.map(s =>
s.id === student.id ? { ...s, status: 'cancelled', cancellationReason: cancellationReason || 'Cancelado pelo administrador' } : s
);
updateData({ students: updatedStudents });
dbService.saveData({ ...data, students: updatedStudents });
closeDeleteModal();
showAlert('Sucesso', 'Aluno(a) inativado(a) com sucesso!', 'success');
}
);
};`;
const delReplace1 = ` const handleDelete = (student: Student) => {
showConfirm(
'Mover para Inativos',
\`Tem certeza que deseja inativar o(a) aluno(a) \${student.name}?\`,
async () => {
try {
// Atualiza status via PUT
const updated = { ...student, status: 'cancelled', cancellationReason: cancellationReason || 'Cancelado pelo administrador' };
await fetch(\`/api/alunos/\${student.id}\`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updated)
});
await loadStudents();
// Legacy update
const updatedStudents = data.students.map(s => s.id === student.id ? updated : s);
updateData({ students: updatedStudents });
dbService.saveData({ ...data, students: updatedStudents });
closeDeleteModal();
showAlert('Sucesso', 'Aluno(a) inativado(a) com sucesso!', 'success');
} catch(e) {
showAlert('Erro', 'Falha ao inativar aluno.', 'error');
}
}
);
};`;
content = content.replace(delAnchor1, delReplace1);
// 5. ATUALIZAR handleDeletePermanently PARA USAR API (linha 1029)
const delPermAnchor = ` const handleDeletePermanently = (student: Student) => {
showConfirm(
'Exclusão Permanente',
\`Tem certeza que deseja excluir \${student.name} DEFINITIVAMENTE?\`,
() => {
const updatedStudents = data.students.filter(s => s.id !== student.id);
updateData({ students: updatedStudents });
dbService.saveData({ ...data, students: updatedStudents });
closeDeleteModal();
showAlert('Sucesso', 'Aluno(a) excluído(a) com sucesso!', 'success');
}
);
};`;
const delPermReplace = ` const handleDeletePermanently = (student: Student) => {
showConfirm(
'Exclusão Permanente',
\`Tem certeza que deseja excluir \${student.name} DEFINITIVAMENTE?\`,
async () => {
try {
await fetch(\`/api/alunos/\${student.id}\`, { method: 'DELETE' });
await loadStudents();
const updatedStudents = data.students.filter(s => s.id !== student.id);
updateData({ students: updatedStudents });
dbService.saveData({ ...data, students: updatedStudents });
closeDeleteModal();
showAlert('Sucesso', 'Aluno(a) excluído(a) com sucesso!', 'success');
} catch(e) {
showAlert('Erro', 'Falha ao excluir permanentemente.', 'error');
}
}
);
};`;
content = content.replace(delPermAnchor, delPermReplace);
// 6. ATUALIZAR handleRematricular PARA USAR API
const rematAnchor = ` const handleRematricular = async (student: Student) => {
showConfirm(
'Reativar Matrícula',
\`Tem certeza que deseja reativar a matrícula de \${student.name}?\`,
async () => {
const updatedStudents = data.students.map(s =>
s.id === student.id ? { ...s, status: 'active', cancellationReason: undefined } : s
);
updateData({ students: updatedStudents });
await dbService.saveData({ ...data, students: updatedStudents });
showAlert('Sucesso', 'Matrícula reativada com sucesso!', 'success');
}
);
};`;
const rematReplace = ` const handleRematricular = async (student: Student) => {
showConfirm(
'Reativar Matrícula',
\`Tem certeza que deseja reativar a matrícula de \${student.name}?\`,
async () => {
try {
const updated = { ...student, status: 'active', cancellationReason: undefined };
await fetch(\`/api/alunos/\${student.id}\`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updated)
});
await loadStudents();
const updatedStudents = data.students.map(s => s.id === student.id ? updated : s);
updateData({ students: updatedStudents });
await dbService.saveData({ ...data, students: updatedStudents });
showAlert('Sucesso', 'Matrícula reativada com sucesso!', 'success');
} catch(e) {
showAlert('Erro', 'Erro ao reativar', 'error');
}
}
);
};`;
content = content.replace(rematAnchor, rematReplace);
fs.writeFileSync(filePath, content, 'utf8');
console.log('Students.tsx atualizado com sucesso.');