import { useState, useEffect } from 'react'; import { User, Mail, Phone, UserCheck, DollarSign, Percent } from 'lucide-react'; import InputTextIcon from '@/components/InputTextIcon'; import ToggleSwitch from '@/components/ToggleSwitch'; import Button from '@/components/Button'; import Table from '@/components/Table'; import FeesSection from '@/components/Structure/Tarification/FeesSection'; import DiscountsSection from '@/components/Structure/Tarification/DiscountsSection'; import SectionTitle from '@/components/SectionTitle'; import ProgressStep from '@/components/ProgressStep'; const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, registrationFees, tuitionFees, onSubmit, currentStep, groups }) => { const [formData, setFormData] = useState({ studentLastName: '', studentFirstName: '', guardianEmail: '', guardianPhone: '', selectedGuardians: [], responsableType: 'new', autoMail: false, selectedRegistrationDiscounts: [], selectedRegistrationFees: registrationFees.map(fee => fee.id), selectedTuitionDiscounts: [], selectedTuitionFees: [], selectedFileGroup: null // Ajout du groupe de fichiers sélectionné }); const [step, setStep] = useState(currentStep || 1); const [selectedStudent, setSelectedEleve] = useState(''); const [existingGuardians, setExistingGuardians] = useState([]); const [totalRegistrationAmount, setTotalRegistrationAmount] = useState(0); const [totalTuitionAmount, setTotalTuitionAmount] = useState(0); const stepTitles = { 1: 'Nouvel élève', 2: 'Nouveau Responsable', 3: "Frais d'inscription", 4: 'Frais de scolarité', 5: 'Documents requis', 6: 'Récapitulatif' }; const steps = ['Élève', 'Responsable', 'Inscription', 'Scolarité', 'Documents', 'Récap']; const isStep1Valid = formData.studentLastName && formData.studentFirstName; const isStep2Valid = ( (formData.responsableType === "new" && formData.guardianEmail.length > 0) || (formData.responsableType === "existing" && formData.selectedGuardians.length > 0) ); const isStep3Valid = formData.selectedRegistrationFees.length > 0; const isStep4Valid = formData.selectedTuitionFees.length > 0; const isStep5Valid = formData.selectedFileGroup !== null; const isStep6Valid = isStep1Valid && isStep2Valid && isStep3Valid && isStep4Valid && isStep5Valid; const isStepValid = (stepNumber) => { switch (stepNumber) { case 1: return isStep1Valid; case 2: return isStep2Valid; case 3: return isStep3Valid; case 4: return isStep4Valid; case 5: return isStep5Valid; case 6: return isStep6Valid; default: return false; } }; useEffect(() => { // Calcul du montant total des frais d'inscription lors de l'initialisation const initialTotalRegistrationAmount = calculateFinalRegistrationAmount( registrationFees.map(fee => fee.id), [] ); setTotalRegistrationAmount(initialTotalRegistrationAmount); }, [registrationDiscounts, registrationFees]); useEffect(() => { setStep(currentStep || 1); }, [currentStep]); const handleToggleChange = () => { setFormData({ ...formData, autoMail: !formData.autoMail }); }; const handleChange = (e) => { const { name, value, type } = e.target; setFormData((prevState) => ({ ...prevState, [name]: value, })); }; const nextStep = () => { if (step < steps.length) { setStep(step + 1); } }; const prevStep = () => { if (step > 1) { setStep(step - 1); } }; const handleEleveSelection = (student) => { setSelectedEleve(student); setFormData((prevData) => ({ ...prevData, selectedGuardians: [] })); setExistingGuardians(student.guardians); }; const handleResponsableSelection = (guardianId) => { setFormData((prevData) => { const selectedGuardians = prevData.selectedGuardians.includes(guardianId) ? prevData.selectedGuardians.filter(id => id !== guardianId) : [...prevData.selectedGuardians, guardianId]; return { ...prevData, selectedGuardians }; }); }; const submit = () => { console.log('Submitting form data:', formData); onSubmit(formData); } const handleRegistrationFeeSelection = (feeId) => { setFormData((prevData) => { const selectedRegistrationFees = prevData.selectedRegistrationFees.includes(feeId) ? prevData.selectedRegistrationFees.filter(id => id !== feeId) : [...prevData.selectedRegistrationFees, feeId]; const finalAmount = calculateFinalRegistrationAmount(selectedRegistrationFees, prevData.selectedRegistrationDiscounts); setTotalRegistrationAmount(finalAmount); return { ...prevData, selectedRegistrationFees }; }); }; const handleTuitionFeeSelection = (feeId) => { setFormData((prevData) => { const selectedTuitionFees = prevData.selectedTuitionFees.includes(feeId) ? prevData.selectedTuitionFees.filter(id => id !== feeId) : [...prevData.selectedTuitionFees, feeId]; const finalAmount = calculateFinalTuitionAmount(selectedTuitionFees, prevData.selectedTuitionDiscounts); setTotalTuitionAmount(finalAmount); return { ...prevData, selectedTuitionFees }; }); }; const handleRegistrationDiscountSelection = (discountId) => { setFormData((prevData) => { const selectedRegistrationDiscounts = prevData.selectedRegistrationDiscounts.includes(discountId) ? prevData.selectedRegistrationDiscounts.filter(id => id !== discountId) : [...prevData.selectedRegistrationDiscounts, discountId]; const finalAmount = calculateFinalRegistrationAmount(prevData.selectedRegistrationFees, selectedRegistrationDiscounts); setTotalRegistrationAmount(finalAmount); return { ...prevData, selectedRegistrationDiscounts }; }); }; const handleTuitionDiscountSelection = (discountId) => { setFormData((prevData) => { const selectedTuitionDiscounts = prevData.selectedTuitionDiscounts.includes(discountId) ? prevData.selectedTuitionDiscounts.filter(id => id !== discountId) : [...prevData.selectedTuitionDiscounts, discountId]; const finalAmount = calculateFinalTuitionAmount(prevData.selectedTuitionFees, selectedTuitionDiscounts); setTotalTuitionAmount(finalAmount); return { ...prevData, selectedTuitionDiscounts }; }); }; const calculateFinalRegistrationAmount = (selectedRegistrationFees, selectedRegistrationDiscounts) => { const totalFees = selectedRegistrationFees.reduce((sum, feeId) => { const fee = registrationFees.find(f => f.id === feeId); if (fee && !isNaN(parseFloat(fee.base_amount))) { return sum + parseFloat(fee.base_amount); } return sum; }, 0); const totalDiscounts = selectedRegistrationDiscounts.reduce((sum, discountId) => { const discount = registrationDiscounts.find(d => d.id === discountId); if (discount) { if (discount.discount_type === 0 && !isNaN(parseFloat(discount.amount))) { // Currency return sum + parseFloat(discount.amount); } else if (discount.discount_type === 1 && !isNaN(parseFloat(discount.amount))) { // Percent return sum + (totalFees * parseFloat(discount.amount) / 100); } } return sum; }, 0); const finalAmount = totalFees - totalDiscounts; return finalAmount.toFixed(2); }; const calculateFinalTuitionAmount = (selectedTuitionFees, selectedTuitionDiscounts) => { const totalFees = selectedTuitionFees.reduce((sum, feeId) => { const fee = tuitionFees.find(f => f.id === feeId); if (fee && !isNaN(parseFloat(fee.base_amount))) { return sum + parseFloat(fee.base_amount); } return sum; }, 0); const totalDiscounts = selectedTuitionDiscounts.reduce((sum, discountId) => { const discount = tuitionDiscounts.find(d => d.id === discountId); if (discount) { if (discount.discount_type === 0 && !isNaN(parseFloat(discount.amount))) { // Currency return sum + parseFloat(discount.amount); } else if (discount.discount_type === 1 && !isNaN(parseFloat(discount.amount))) { // Percent return sum + (totalFees * parseFloat(discount.amount) / 100); } } return sum; }, 0); const finalAmount = totalFees - totalDiscounts; return finalAmount.toFixed(2); }; return (
{step === 1 && (
)} {step === 2 && (
{formData.responsableType === 'new' && ( <> )} {formData.responsableType === 'existing' && (
{students.map((student, index) => ( handleEleveSelection(student)} > ))}
Nom Prénom
{student.last_name} {student.first_name}
{selectedStudent && (

Responsables associés à {selectedStudent.last_name} {selectedStudent.first_name} :

{existingGuardians.map((guardian) => (
))}
)}
)}
)} {step === 3 && (
{registrationFees.length > 0 ? ( <>
{registrationDiscounts.length > 0 ? ( ) : (

Information Aucune réduction n'a été créée sur les frais d'inscription.

)}
MONTANT TOTAL }, { name: 'TOTAL', transform: () => {totalRegistrationAmount} € } ]} defaultTheme='bg-cyan-100' /> ) : (

Attention! Aucun frais d'inscription n'a été créé.

)} )} {step === 4 && (
{tuitionFees.length > 0 ? ( <>
{tuitionDiscounts.length > 0 ? ( ) : (

Information Aucune réduction n'a été créée sur les frais de scolarité.

)}
MONTANT TOTAL }, { name: 'TOTAL', transform: () => {totalTuitionAmount} € } ]} defaultTheme='bg-cyan-100' /> ) : (

Attention! Aucun frais de scolarité n'a été créé.

)} )} {step === 5 && (
{groups.length > 0 ? (

Sélectionnez un groupe de documents

{groups.map((group) => (
setFormData({ ...formData, selectedFileGroup: parseInt(e.target.value) })} className="form-radio h-4 w-4 text-emerald-600" />
))}
) : (

Attention! Aucun groupe de documents n'a été créé.

)}
)} {step === steps.length && (

Élève

Nom Prénom
{formData.studentLastName} {formData.studentFirstName}

Responsable(s)

{formData.responsableType === 'new' && (
Email Téléphone
{formData.guardianEmail} {formData.guardianPhone}
)} {formData.responsableType === 'existing' && selectedStudent && (

Associé(s) à : {selectedStudent.nom} {selectedStudent.prenom}

{existingGuardians.filter(guardian => formData.selectedGuardians.includes(guardian.id)).map((guardian) => ( ))}
Nom Prénom Email
{guardian.last_name} {guardian.first_name} {guardian.email}
)}
)}
{step > 1 && (
); } export default InscriptionForm;