import React, { useState, useEffect } from 'react'; import { SchoolData, Course } from '../types'; import { useDialog } from '../DialogContext'; import { Plus, Edit2, Trash2, X, Clock, DollarSign, BookText, Info, AlertTriangle } from 'lucide-react'; interface CoursesProps { data: SchoolData; // mantido para classes e afins updateData: (newData: Partial) => void; } const Courses: React.FC = ({ data, updateData }) => { const { showAlert, showConfirm } = useDialog(); const [isModalOpen, setIsModalOpen] = useState(false); const [isClosing, setIsClosing] = useState(false); const [editingCourse, setEditingCourse] = useState(null); const [formData, setFormData] = useState>({ name: '', duration: '', durationMonths: 12, // Default value registrationFee: 0, monthlyFee: 0, description: '', finePercentage: 0, interestPercentage: 0 }); const extractMonths = (text: string): number => { const match = text.match(/\d+/); return match ? parseInt(match[0]) : 12; }; const [courses, setCourses] = useState([]); const [isLoadingData, setIsLoadingData] = useState(true); const loadData = async () => { try { setIsLoadingData(true); const res = await fetch('/api/cursos'); const json = await res.json(); const mappedCourses = (json.cursos || []).map((c: any) => ({ id: c.id, name: c.nome, duration: c.duracao, durationMonths: c.duracao_meses, registrationFee: Number(c.taxa_matricula || 0), monthlyFee: Number(c.mensalidade || 0), description: c.descricao, finePercentage: Number(c.multa_percentual || 0), interestPercentage: Number(c.juros_percentual || 0) })); setCourses(mappedCourses); } catch (err) { console.error('Erro ao buscar cursos:', err); showAlert('Erro', 'Falha ao carregar cursos do servidor.', 'error'); } finally { setIsLoadingData(false); } }; useEffect(() => { loadData(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.name || !formData.duration || formData.monthlyFee <= 0) { showAlert('Atenção', '⚠️ Por favor, preencha o nome, duração e valor da mensalidade.', 'warning'); return; } // Auto-calculate months from text if possible, otherwise keep default or existing const calculatedMonths = extractMonths(formData.duration); const finalData = { ...formData, durationMonths: calculatedMonths }; const payload = { nome: finalData.name, duracao: finalData.duration, duracao_meses: finalData.durationMonths, taxa_matricula: finalData.registrationFee, mensalidade: finalData.monthlyFee, descricao: finalData.description, multa_percentual: finalData.finePercentage, juros_percentual: finalData.interestPercentage }; try { if (editingCourse) { const res = await fetch(`/api/cursos/${editingCourse.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); if (!res.ok) throw new Error('Failed'); } else { const res = await fetch('/api/cursos', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...payload, id: crypto.randomUUID() }) }); if (!res.ok) throw new Error('Failed'); } await loadData(); closeModal(); } catch (err) { showAlert('Erro', 'Ocorreu um erro ao salvar o curso.', 'error'); } }; const closeModal = () => { setIsClosing(true); setTimeout(() => { setIsModalOpen(false); setIsClosing(false); setEditingCourse(null); setFormData({ name: '', duration: '', durationMonths: 12, registrationFee: 0, monthlyFee: 0, description: '', finePercentage: 0, interestPercentage: 0 }); }, 400); }; const handleEdit = (course: Course) => { setEditingCourse(course); setFormData({ name: course.name || '', duration: course.duration || '', durationMonths: course.durationMonths || 12, registrationFee: course.registrationFee || 0, monthlyFee: course.monthlyFee || 0, description: course.description || '', finePercentage: course.finePercentage || 0, interestPercentage: course.interestPercentage || 0 }); setIsModalOpen(true); }; const checkAndDelete = (id: string) => { const hasClasses = data.classes.some(c => c.courseId === id); if (hasClasses) { showAlert('Atenção', 'Não é possível excluir um curso que possui turmas vinculadas.', 'warning'); return; } showConfirm( 'Excluir Curso', 'Tem certeza que deseja excluir este curso?', async () => { try { const res = await fetch(`/api/cursos/${id}`, { method: 'DELETE' }); if (!res.ok) throw new Error('Failed to delete'); await loadData(); } catch (err) { showAlert('Erro', 'Ocorreu um erro ao excluir o curso.', 'error'); } } ); }; const inputClass = "w-full px-4 py-3 bg-white text-black border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 transition-all shadow-sm"; return (

Cursos PostgreSQL

Gerencie os cursos oferecidos pela escola.

{courses.map(course => (

{course.name}

{course.description || 'Sem descrição definida.'}

Duração

{course.duration}

Investimento Mensal

R$ {course.monthlyFee.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}

))}
{isModalOpen && (
{/* Blue Top Bar */}

{editingCourse ? 'Editar Curso' : 'Novo Curso'}

Defina os detalhes e valores do curso.

setFormData({...formData, name: e.target.value})} />