feat: Ajout des frais de scolarité dans le dossier d'inscription [#18]

This commit is contained in:
N3WT DE COMPET
2025-01-25 17:23:15 +01:00
parent ece23deb19
commit 0c2e0b92f4
2 changed files with 188 additions and 77 deletions

View File

@ -355,6 +355,11 @@ useEffect(()=>{
console.log('createRF updatedData:', updatedData); console.log('createRF updatedData:', updatedData);
const selectedRegistrationFeesIds = updatedData.selectedRegistrationFees.map(feeId => feeId) const selectedRegistrationFeesIds = updatedData.selectedRegistrationFees.map(feeId => feeId)
const selectedRegistrationDiscountsIds = updatedData.selectedRegistrationDiscounts.map(discountId => discountId) const selectedRegistrationDiscountsIds = updatedData.selectedRegistrationDiscounts.map(discountId => discountId)
const selectedTuitionFeesIds = updatedData.selectedTuitionFees.map(feeId => feeId)
const selectedTuitionDiscountsIds = updatedData.selectedTuitionDiscounts.map(discountId => discountId)
const allFeesIds = [...selectedRegistrationFeesIds, ...selectedTuitionFeesIds];
const allDiscountsds = [...selectedRegistrationDiscountsIds, ...selectedTuitionDiscountsIds];
if (updatedData.selectedGuardians.length !== 0) { if (updatedData.selectedGuardians.length !== 0) {
const selectedGuardiansIds = updatedData.selectedGuardians.map(guardianId => guardianId) const selectedGuardiansIds = updatedData.selectedGuardians.map(guardianId => guardianId)
@ -365,8 +370,8 @@ useEffect(()=>{
first_name: updatedData.studentFirstName, first_name: updatedData.studentFirstName,
}, },
idGuardians: selectedGuardiansIds, idGuardians: selectedGuardiansIds,
fees: selectedRegistrationFeesIds, fees: allFeesIds,
discounts: selectedRegistrationDiscountsIds discounts: allDiscountsds
}; };
createRegisterForm(data,csrfToken) createRegisterForm(data,csrfToken)
@ -416,8 +421,8 @@ useEffect(()=>{
], ],
sibling: [] sibling: []
}, },
fees: selectedRegistrationFeesIds, fees: allFeesIds,
discounts: selectedRegistrationDiscountsIds discounts: allDiscountsds
}; };
createRegisterForm(data,csrfToken) createRegisterForm(data,csrfToken)

View File

@ -17,22 +17,26 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
responsableType: 'new', responsableType: 'new',
autoMail: false, autoMail: false,
selectedRegistrationDiscounts: [], selectedRegistrationDiscounts: [],
selectedRegistrationFees: registrationFees.map(fee => fee.id) selectedRegistrationFees: registrationFees.map(fee => fee.id),
selectedTuitionDiscounts: [],
selectedTuitionFees: []
}); });
const [step, setStep] = useState(0); const [step, setStep] = useState(1);
const [selectedStudent, setSelectedEleve] = useState(''); const [selectedStudent, setSelectedEleve] = useState('');
const [existingGuardians, setExistingGuardians] = useState([]); const [existingGuardians, setExistingGuardians] = useState([]);
const [totalRegistrationAmount, setTotalRegistrationAmount] = useState(0); const [totalRegistrationAmount, setTotalRegistrationAmount] = useState(0);
const maxStep = 4 const [totalTuitionAmount, setTotalTuitionAmount] = useState(0);
const maxStep = 6
useEffect(() => { useEffect(() => {
// Calcul du montant total lors de l'initialisation // Calcul du montant total des frais d'inscription lors de l'initialisation
const initialTotalAmount = calculateFinalRegistrationAmount( const initialTotalRegistrationAmount = calculateFinalRegistrationAmount(
registrationFees.map(fee => fee.id), registrationFees.map(fee => fee.id),
[] []
); );
setTotalRegistrationAmount(initialTotalAmount); setTotalRegistrationAmount(initialTotalRegistrationAmount);
}, [registrationDiscounts, registrationFees]); }, [registrationDiscounts, registrationFees]);
const handleToggleChange = () => { const handleToggleChange = () => {
@ -54,7 +58,7 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
}; };
const prevStep = () => { const prevStep = () => {
if (step >= 1) { if (step > 1) {
setStep(step - 1); setStep(step - 1);
} }
}; };
@ -81,7 +85,7 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
onSubmit(formData); onSubmit(formData);
} }
const handleFeeSelection = (feeId) => { const handleRegistrationFeeSelection = (feeId) => {
setFormData((prevData) => { setFormData((prevData) => {
const selectedRegistrationFees = prevData.selectedRegistrationFees.includes(feeId) const selectedRegistrationFees = prevData.selectedRegistrationFees.includes(feeId)
? prevData.selectedRegistrationFees.filter(id => id !== feeId) ? prevData.selectedRegistrationFees.filter(id => id !== feeId)
@ -90,9 +94,20 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
setTotalRegistrationAmount(finalAmount); setTotalRegistrationAmount(finalAmount);
return { ...prevData, selectedRegistrationFees }; 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 handleDiscountSelection = (discountId) => { const handleRegistrationDiscountSelection = (discountId) => {
setFormData((prevData) => { setFormData((prevData) => {
const selectedRegistrationDiscounts = prevData.selectedRegistrationDiscounts.includes(discountId) const selectedRegistrationDiscounts = prevData.selectedRegistrationDiscounts.includes(discountId)
? prevData.selectedRegistrationDiscounts.filter(id => id !== discountId) ? prevData.selectedRegistrationDiscounts.filter(id => id !== discountId)
@ -101,9 +116,20 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
setTotalRegistrationAmount(finalAmount); setTotalRegistrationAmount(finalAmount);
return { ...prevData, selectedRegistrationDiscounts }; 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 calculateFinalRegistrationAmount = (selectedRegistrationFees, selectedRegistrationDiscounts) => {
const totalFees = selectedRegistrationFees.reduce((sum, feeId) => { const totalFees = selectedRegistrationFees.reduce((sum, feeId) => {
const fee = registrationFees.find(f => f.id === feeId); const fee = registrationFees.find(f => f.id === feeId);
if (fee && !isNaN(parseFloat(fee.base_amount))) { if (fee && !isNaN(parseFloat(fee.base_amount))) {
@ -111,8 +137,6 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
} }
return sum; return sum;
}, 0); }, 0);
console.log(totalFees);
const totalDiscounts = selectedRegistrationDiscounts.reduce((sum, discountId) => { const totalDiscounts = selectedRegistrationDiscounts.reduce((sum, discountId) => {
const discount = registrationDiscounts.find(d => d.id === discountId); const discount = registrationDiscounts.find(d => d.id === discountId);
@ -129,7 +153,33 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
const finalAmount = totalFees - totalDiscounts; const finalAmount = totalFees - totalDiscounts;
return finalAmount.toFixed(2); 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);
};
const isLabelAttenuated = (item) => { const isLabelAttenuated = (item) => {
return !formData.selectedRegistrationDiscounts.includes(parseInt(item.id)); return !formData.selectedRegistrationDiscounts.includes(parseInt(item.id));
@ -140,63 +190,7 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
}; };
return ( return (
<div className="space-y-4 mt-8"> <div className="space-y-4 mt-8">
{step === 0 && (
<div>
<h2 className="text-l font-bold mb-4">Frais d'inscription</h2>
{registrationFees.length > 0 ? (
<>
<div className="mb-4">
<FeesSection
fees={registrationFees}
type={0}
subscriptionMode={true}
selectedFees={formData.selectedRegistrationFees}
handleFeeSelection={handleFeeSelection}
/>
</div>
<h2 className="text-l font-bold mb-4">Réductions</h2>
<div className="mb-4">
{registrationDiscounts.length > 0 ? (
<DiscountsSection
discounts={registrationDiscounts}
type={0}
subscriptionMode={true}
selectedDiscounts={formData.selectedRegistrationDiscounts}
handleDiscountSelection={handleDiscountSelection}
/>
) : (
<p className="bg-orange-100 border border-orange-400 text-orange-700 px-4 py-3 rounded relative" role="alert">
<strong className="font-bold">Information</strong>
<span className="block sm:inline"> Aucune réduction n'a été créée sur les frais d'inscription.</span>
</p>
)}
</div>
<Table
data={[ {id: 1}]}
columns={[
{
name: 'LIBELLE',
transform: () => <span>MONTANT TOTAL</span>
},
{
name: 'TOTAL',
transform: () => <b>{totalRegistrationAmount} €</b>
}
]}
defaultTheme='bg-cyan-100'
/>
</>
) : (
<p className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" role="alert">
<strong className="font-bold">Attention!</strong>
<span className="block sm:inline"> Aucun frais d'inscription n'a été créé.</span>
</p>
)}
</div>
)}
{step === 1 && ( {step === 1 && (
<div> <div>
<h2 className="text-l font-bold mb-4">Nouvel élève</h2> <h2 className="text-l font-bold mb-4">Nouvel élève</h2>
@ -324,6 +318,118 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
</div> </div>
)} )}
{step === 4 && (
<div>
<h2 className="text-l font-bold mb-4">Frais d'inscription</h2>
{registrationFees.length > 0 ? (
<>
<div className="mb-4">
<FeesSection
fees={registrationFees}
type={0}
subscriptionMode={true}
selectedFees={formData.selectedRegistrationFees}
handleFeeSelection={handleRegistrationFeeSelection}
/>
</div>
<h2 className="text-l font-bold mb-4">Réductions</h2>
<div className="mb-4">
{registrationDiscounts.length > 0 ? (
<DiscountsSection
discounts={registrationDiscounts}
type={0}
subscriptionMode={true}
selectedDiscounts={formData.selectedRegistrationDiscounts}
handleDiscountSelection={handleRegistrationDiscountSelection}
/>
) : (
<p className="bg-orange-100 border border-orange-400 text-orange-700 px-4 py-3 rounded relative" role="alert">
<strong className="font-bold">Information</strong>
<span className="block sm:inline"> Aucune réduction n'a été créée sur les frais d'inscription.</span>
</p>
)}
</div>
<Table
data={[ {id: 1}]}
columns={[
{
name: 'LIBELLE',
transform: () => <span>MONTANT TOTAL</span>
},
{
name: 'TOTAL',
transform: () => <b>{totalRegistrationAmount} €</b>
}
]}
defaultTheme='bg-cyan-100'
/>
</>
) : (
<p className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" role="alert">
<strong className="font-bold">Attention!</strong>
<span className="block sm:inline"> Aucun frais d'inscription n'a été créé.</span>
</p>
)}
</div>
)}
{step === 5 && (
<div>
<h2 className="text-l font-bold mb-4">Frais de scolarité</h2>
{tuitionFees.length > 0 ? (
<>
<div className="mb-4">
<FeesSection
fees={tuitionFees}
type={1}
subscriptionMode={true}
selectedFees={formData.selectedTuitionFees}
handleFeeSelection={handleTuitionFeeSelection}
/>
</div>
<h2 className="text-l font-bold mb-4">Réductions</h2>
<div className="mb-4">
{tuitionDiscounts.length > 0 ? (
<DiscountsSection
discounts={tuitionDiscounts}
type={1}
subscriptionMode={true}
selectedDiscounts={formData.selectedTuitionDiscounts}
handleDiscountSelection={handleTuitionDiscountSelection}
/>
) : (
<p className="bg-orange-100 border border-orange-400 text-orange-700 px-4 py-3 rounded relative" role="alert">
<strong className="font-bold">Information</strong>
<span className="block sm:inline"> Aucune réduction n'a été créée sur les frais de scolarité.</span>
</p>
)}
</div>
<Table
data={[ {id: 1}]}
columns={[
{
name: 'LIBELLE',
transform: () => <span>MONTANT TOTAL</span>
},
{
name: 'TOTAL',
transform: () => <b>{totalTuitionAmount} </b>
}
]}
defaultTheme='bg-cyan-100'
/>
</>
) : (
<p className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" role="alert">
<strong className="font-bold">Attention!</strong>
<span className="block sm:inline"> Aucun frais de scolarité n'a été créé.</span>
</p>
)}
</div>
)}
{step === maxStep && ( {step === maxStep && (
<div> <div>
<h2 className="text-l font-bold mb-4">Récapitulatif</h2> <h2 className="text-l font-bold mb-4">Récapitulatif</h2>
@ -399,7 +505,7 @@ const InscriptionForm = ( { students, registrationDiscounts, tuitionDiscounts, r
)} )}
<div className="flex justify-end mt-4 space-x-4"> <div className="flex justify-end mt-4 space-x-4">
{step >= 1 && ( {step > 1 && (
<Button text="Précédent" <Button text="Précédent"
onClick={prevStep} onClick={prevStep}
className="px-4 py-2 bg-gray-300 text-gray-700 rounded-md shadow-sm hover:bg-gray-400 focus:outline-none" className="px-4 py-2 bg-gray-300 text-gray-700 rounded-md shadow-sm hover:bg-gray-400 focus:outline-none"