mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-04-04 04:01:27 +00:00
177 lines
5.9 KiB
JavaScript
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;
|