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' && (
| Nom |
Prénom |
{students.map((student, index) => (
handleEleveSelection(student)}
>
| {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}
| Nom |
Prénom |
Email |
{existingGuardians.filter(guardian => formData.selectedGuardians.includes(guardian.id)).map((guardian) => (
| {guardian.last_name} |
{guardian.first_name} |
{guardian.email} |
))}
)}
)}
{step > 1 && (
)}
{step < steps.length ? (
) : (
)}
);
}
export default InscriptionForm;