Files
n3wt-school/Front-End/src/components/Structure/Tarification/FeesManagement.js

177 lines
5.9 KiB
JavaScript

import React from 'react';
import FeesSection from '@/components/Structure/Tarification/FeesSection';
import DiscountsSection from '@/components/Structure/Tarification/DiscountsSection';
import PaymentPlanSelector from '@/components/PaymentPlanSelector';
import PaymentModeSelector from '@/components/PaymentModeSelector';
import {
BE_SCHOOL_FEES_URL,
BE_SCHOOL_DISCOUNTS_URL,
BE_SCHOOL_PAYMENT_PLANS_URL,
BE_SCHOOL_PAYMENT_MODES_URL,
} from '@/utils/Url';
const FeesManagement = ({
registrationDiscounts,
setRegistrationDiscounts,
tuitionDiscounts,
setTuitionDiscounts,
registrationFees,
setRegistrationFees,
tuitionFees,
setTuitionFees,
registrationPaymentPlans,
setRegistrationPaymentPlans,
tuitionPaymentPlans,
setTuitionPaymentPlans,
registrationPaymentModes,
setRegistrationPaymentModes,
tuitionPaymentModes,
setTuitionPaymentModes,
handleCreate,
handleEdit,
handleDelete,
}) => {
// Liste unique triée par type puis par nom
const allFees = [...(registrationFees ?? []), ...(tuitionFees ?? [])].sort(
(a, b) => a.type - b.type || (a.name ?? '').localeCompare(b.name ?? '')
);
const setAllFees = (updater) => {
const next = typeof updater === 'function' ? updater(allFees) : updater;
setRegistrationFees(next.filter((f) => f.type === 0));
setTuitionFees(next.filter((f) => f.type === 1));
};
const allDiscounts = [
...(registrationDiscounts ?? []),
...(tuitionDiscounts ?? []),
].sort(
(a, b) => a.type - b.type || (a.name ?? '').localeCompare(b.name ?? '')
);
const setAllDiscounts = (updater) => {
const next =
typeof updater === 'function' ? updater(allDiscounts) : updater;
setRegistrationDiscounts(next.filter((d) => d.type === 0));
setTuitionDiscounts(next.filter((d) => d.type === 1));
};
const allPaymentPlans = [
...(registrationPaymentPlans ?? []),
...(tuitionPaymentPlans ?? []),
];
const allPaymentModes = [
...(registrationPaymentModes ?? []),
...(tuitionPaymentModes ?? []),
];
return (
<div className="w-full space-y-12">
{/* Tableau unique des frais */}
<FeesSection
fees={allFees}
setFees={setAllFees}
unified={true}
handleCreate={(feeData) => {
const setter =
feeData.type === 0 ? setRegistrationFees : setTuitionFees;
return handleCreate(BE_SCHOOL_FEES_URL, feeData, setter);
}}
handleEdit={(id, data) => {
const fee = allFees.find((f) => f.id === id);
const feeType = data.type ?? fee?.type;
const setter = feeType === 0 ? setRegistrationFees : setTuitionFees;
return handleEdit(BE_SCHOOL_FEES_URL, id, data, setter);
}}
handleDelete={(id) => {
const fee = allFees.find((f) => f.id === id);
const setter = fee?.type === 0 ? setRegistrationFees : setTuitionFees;
return handleDelete(BE_SCHOOL_FEES_URL, id, setter);
}}
/>
{/* Tableau unique des réductions */}
<DiscountsSection
discounts={allDiscounts}
setDiscounts={setAllDiscounts}
unified={true}
handleCreate={(data) => {
const setter =
data.type === 0 ? setRegistrationDiscounts : setTuitionDiscounts;
return handleCreate(BE_SCHOOL_DISCOUNTS_URL, data, setter);
}}
handleEdit={(id, data) => {
const discount = allDiscounts.find((d) => d.id === id);
const discountType = data.type ?? discount?.type;
const setter =
discountType === 0 ? setRegistrationDiscounts : setTuitionDiscounts;
return handleEdit(BE_SCHOOL_DISCOUNTS_URL, id, data, setter);
}}
handleDelete={(id) => {
const discount = allDiscounts.find((d) => d.id === id);
const setter =
discount?.type === 0
? setRegistrationDiscounts
: setTuitionDiscounts;
return handleDelete(BE_SCHOOL_DISCOUNTS_URL, id, setter);
}}
onDiscountDelete={(id) => {
// Retire la réduction des frais concernés
setAllFees((prevFees) =>
prevFees.map((fee) => ({
...fee,
discounts: fee.discounts.filter((dId) => dId !== id),
}))
);
}}
/>
{/* Plans et modes de paiement communs */}
<div className="mt-12 grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="col-span-1 mt-4">
<PaymentPlanSelector
allPaymentPlans={allPaymentPlans}
handleCreate={(data) => {
const setter =
data.type === 0
? setRegistrationPaymentPlans
: setTuitionPaymentPlans;
return handleCreate(BE_SCHOOL_PAYMENT_PLANS_URL, data, setter);
}}
handleDelete={(id) => {
const plan = allPaymentPlans.find((p) => p.id === id);
const setter =
plan?.type === 0
? setRegistrationPaymentPlans
: setTuitionPaymentPlans;
return handleDelete(BE_SCHOOL_PAYMENT_PLANS_URL, id, setter);
}}
/>
</div>
<div className="col-span-1 mt-4">
<PaymentModeSelector
allPaymentModes={allPaymentModes}
handleCreate={(data) => {
const setter =
data.type === 0
? setRegistrationPaymentModes
: setTuitionPaymentModes;
return handleCreate(BE_SCHOOL_PAYMENT_MODES_URL, data, setter);
}}
handleDelete={(id) => {
const mode = allPaymentModes.find((m) => m.id === id);
const setter =
mode?.type === 0
? setRegistrationPaymentModes
: setTuitionPaymentModes;
return handleDelete(BE_SCHOOL_PAYMENT_MODES_URL, id, setter);
}}
/>
</div>
</div>
</div>
);
};
export default FeesManagement;