From 4c95b6a83f15a9989fac5f69a9386664d25ec9f6 Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Thu, 13 Feb 2025 21:59:25 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20Mise=20=C3=A0=20jour=20de=20la=20do?= =?UTF-8?q?c=20swagger=20/=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Back-End/Auth/views.py | 10 +- Back-End/School/serializers.py | 17 +- Back-End/School/urls.py | 84 ++-- Back-End/School/views.py | 473 +++++++++--------- Front-End/src/app/lib/schoolAction.js | 16 +- .../Structure/Configuration/ClassesSection.js | 5 +- .../Configuration/StructureManagement.js | 20 +- .../Structure/Planning/ScheduleManagement.js | 4 +- .../Planning/SpecialityEventModal.js | 4 +- .../Tarification/DiscountsSection.js | 4 +- .../Structure/Tarification/FeesManagement.js | 34 +- .../Structure/Tarification/FeesSection.js | 4 +- Front-End/src/utils/Url.js | 10 +- 13 files changed, 326 insertions(+), 359 deletions(-) diff --git a/Back-End/Auth/views.py b/Back-End/Auth/views.py index 52536b2..14b0a21 100644 --- a/Back-End/Auth/views.py +++ b/Back-End/Auth/views.py @@ -40,8 +40,8 @@ class SessionView(APIView): try: decoded_token = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256']) print(f'decode : {decoded_token}') - user_id = decoded_token.get('id') - user = Profile.objects.get(id=user_id) + userid = decoded_token.get('id') + user = Profile.objects.get(id=userid) response_data = { 'user': { @@ -84,7 +84,7 @@ class ProfileSimpleView(APIView): def put(self, request, id): data=JSONParser().parse(request) - profil = Profile.objects.get(id=_id) + profil = Profile.objects.get(id=id) profil_serializer = ProfilUpdateSerializer(profil, data=data) if profil_serializer.is_valid(): profil_serializer.save() @@ -108,7 +108,7 @@ class LoginView(APIView): def post(self, request): data=JSONParser().parse(request) validatorAuthentication = validator.ValidatorAuthentication(data=data) - retour = error.returnMessage[error.WRONG_ID] + retour = error.returnMessage[error.WRONGid] validationOk, errorFields = validatorAuthentication.validate() user = None if validationOk: @@ -133,7 +133,7 @@ class LoginView(APIView): # 'role': "admin" # }, settings.SECRET_KEY, algorithm='HS256') else: - retour = error.returnMessage[error.WRONG_ID] + retour = error.returnMessage[error.WRONGid] return JsonResponse({ diff --git a/Back-End/School/serializers.py b/Back-End/School/serializers.py index f91d430..4a0bfd9 100644 --- a/Back-End/School/serializers.py +++ b/Back-End/School/serializers.py @@ -87,6 +87,7 @@ class PlanningSerializer(serializers.ModelSerializer): class SchoolClassSerializer(serializers.ModelSerializer): updated_date_formatted = serializers.SerializerMethodField() teachers = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all(), many=True, required=False) + establishment = serializers.PrimaryKeyRelatedField(queryset=Establishment.objects.all(), required=False) teachers_details = serializers.SerializerMethodField() class Meta: @@ -105,9 +106,10 @@ class SchoolClassSerializer(serializers.ModelSerializer): teaching_language=validated_data.get('teaching_language', ''), school_year=validated_data.get('school_year', ''), levels=levels_data, - type=validated_data.get('type', 1), # Added here - time_range=validated_data.get('time_range', ['08:30', '17:30']), # Added here - opening_days=validated_data.get('opening_days', [1, 2, 4, 5]) # Added here + type=validated_data.get('type', 1), + time_range=validated_data.get('time_range', ['08:30', '17:30']), + opening_days=validated_data.get('opening_days', [1, 2, 4, 5]), + establishment=validated_data.get('establishment', None) ) school_class.teachers.set(teachers_data) @@ -132,9 +134,10 @@ class SchoolClassSerializer(serializers.ModelSerializer): instance.teaching_language = validated_data.get('teaching_language', instance.teaching_language) instance.school_year = validated_data.get('school_year', instance.school_year) instance.levels = levels_data - instance.type = validated_data.get('type', instance.type) # Added here - instance.time_range = validated_data.get('time_range', instance.time_range) # Added here - instance.opening_days = validated_data.get('opening_days', instance.opening_days) # Added here + instance.type = validated_data.get('type', instance.type) + instance.time_range = validated_data.get('time_range', instance.time_range) + instance.opening_days = validated_data.get('opening_days', instance.opening_days) + instance.establishment = validated_data.get('establishment', instance.establishment) instance.save() instance.teachers.set(teachers_data) @@ -169,6 +172,7 @@ class SchoolClassSerializer(serializers.ModelSerializer): class DiscountSerializer(serializers.ModelSerializer): updated_at_formatted = serializers.SerializerMethodField() + establishment = serializers.PrimaryKeyRelatedField(queryset=Establishment.objects.all(), required=False) class Meta: model = Discount fields = '__all__' @@ -181,6 +185,7 @@ class DiscountSerializer(serializers.ModelSerializer): class FeeSerializer(serializers.ModelSerializer): updated_at_formatted = serializers.SerializerMethodField() + establishment = serializers.PrimaryKeyRelatedField(queryset=Establishment.objects.all(), required=False) class Meta: model = Fee diff --git a/Back-End/School/urls.py b/Back-End/School/urls.py index 5757ef1..dbf34cd 100644 --- a/Back-End/School/urls.py +++ b/Back-End/School/urls.py @@ -1,61 +1,51 @@ from django.urls import path, re_path -from School.views import ( - TeachersView, - TeacherView, - SpecialitiesView, - SpecialityView, - ClassesView, - ClasseView, - PlanningsView, - PlanningView, - FeesView, - FeeView, - DiscountsView, - DiscountView, - PaymentPlansView, - PaymentPlanView, - PaymentModesView, - PaymentModeView, - EstablishmentsView, - EstablishmentView +from .views import ( + TeacherListCreateView, + TeacherDetailView, + SpecialityListCreateView, + SpecialityDetailView, + SchoolClassListCreateView, + SchoolClassDetailView, + PlanningListCreateView, + PlanningDetailView, + FeeListCreateView, + FeeDetailView, + DiscountListCreateView, + DiscountDetailView, + PaymentPlanListCreateView, + PaymentPlanDetailView, + PaymentModeListCreateView, + PaymentModeDetailView, + EstablishmentListCreateView, + EstablishmentDetailView ) urlpatterns = [ - re_path(r'^specialities$', SpecialitiesView.as_view(), name="specialities"), - re_path(r'^speciality$', SpecialityView.as_view(), name="speciality"), - re_path(r'^speciality/([0-9]+)$', SpecialityView.as_view(), name="speciality"), + re_path(r'^specialities$', SpecialityListCreateView.as_view(), name="speciality_list_create"), + re_path(r'^specialities/(?P[0-9]+)$', SpecialityDetailView.as_view(), name="speciality_detail"), - re_path(r'^teachers$', TeachersView.as_view(), name="teachers"), - re_path(r'^teacher$', TeacherView.as_view(), name="teacher"), - re_path(r'^teacher/([0-9]+)$', TeacherView.as_view(), name="teacher"), + re_path(r'^teachers$', TeacherListCreateView.as_view(), name="teacher_list_create"), + re_path(r'^teachers/(?P[0-9]+)', TeacherDetailView.as_view(), name="teacher_detail"), - re_path(r'^schoolClasses$', ClassesView.as_view(), name="schoolClasses"), - re_path(r'^schoolClass$', ClasseView.as_view(), name="schoolClass"), - re_path(r'^schoolClass/([0-9]+)$', ClasseView.as_view(), name="schoolClass"), + re_path(r'^schoolClasses$', SchoolClassListCreateView.as_view(), name="school_class_list_create"), + re_path(r'^schoolClasses/(?P[0-9]+)', SchoolClassDetailView.as_view(), name="school_class_detail"), - re_path(r'^plannings$', PlanningsView.as_view(), name="plannings"), - re_path(r'^planning$', PlanningView.as_view(), name="planning"), - re_path(r'^planning/([0-9]+)$', PlanningView.as_view(), name="planning"), + re_path(r'^plannings$', PlanningListCreateView.as_view(), name="planninglist_create"), + re_path(r'^plannings/(?P[0-9]+)$', PlanningDetailView.as_view(), name="planning_detail"), - re_path(r'^fees/(?P<_filter>[a-zA-z]+)$', FeesView.as_view(), name="fees"), - re_path(r'^fee$', FeeView.as_view(), name="fee"), - re_path(r'^fee/([0-9]+)$', FeeView.as_view(), name="fee"), + re_path(r'^fees$', FeeListCreateView.as_view(), name="fee_list_create"), + re_path(r'^fees/(?P[0-9]+)$', FeeDetailView.as_view(), name="fee_detail"), - re_path(r'^discounts/(?P<_filter>[a-zA-z]+)$$', DiscountsView.as_view(), name="discounts"), - re_path(r'^discount$', DiscountView.as_view(), name="discount"), - re_path(r'^discount/([0-9]+)$', DiscountView.as_view(), name="discount"), + re_path(r'^discounts$', DiscountListCreateView.as_view(), name="discount_list_create"), + re_path(r'^discounts/(?P[0-9]+)$', DiscountDetailView.as_view(), name="discount_detail"), - re_path(r'^paymentPlans/(?P<_filter>[a-zA-z]+)$', PaymentPlansView.as_view(), name="paymentPlans"), - re_path(r'^paymentPlan$', PaymentPlanView.as_view(), name="paymentPlan"), - re_path(r'^paymentPlan/([0-9]+)$', PaymentPlanView.as_view(), name="paymentPlan"), + re_path(r'^paymentPlans$', PaymentPlanListCreateView.as_view(), name="payment_plan_list_create"), + re_path(r'^paymentPlans/(?P[0-9]+)$', PaymentPlanDetailView.as_view(), name="payment_plan_detail"), - re_path(r'^paymentModes/(?P<_filter>[a-zA-z]+)$', PaymentModesView.as_view(), name="paymentModes"), - re_path(r'^paymentMode$', PaymentModeView.as_view(), name="paymentMode"), - re_path(r'^paymentMode/([0-9]+)$', PaymentModeView.as_view(), name="paymentMode"), - - re_path(r'^establishments$', EstablishmentsView.as_view(), name="establishments"), - re_path(r'^establishment$', EstablishmentView.as_view(), name='establishment'), - re_path(r'^establishment/([0-9]+)$', EstablishmentView.as_view(), name='establishment') + re_path(r'^paymentModes$', PaymentModeListCreateView.as_view(), name="payment_mode_list_create"), + re_path(r'^paymentModes/(?P[0-9]+)$', PaymentModeDetailView.as_view(), name="payment_mode_detail"), + re_path(r'^establishments$', EstablishmentListCreateView.as_view(), name='establishment_list_create'), + re_path(r'^establishments/(?P[0-9]+)$', EstablishmentDetailView.as_view(), name="establishment_detail"), ] \ No newline at end of file diff --git a/Back-End/School/views.py b/Back-End/School/views.py index a4993cf..f2e00a2 100644 --- a/Back-End/School/views.py +++ b/Back-End/School/views.py @@ -3,58 +3,60 @@ from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect from django.utils.decorators import method_decorator from rest_framework.parsers import JSONParser from rest_framework.views import APIView -from django.core.cache import cache -from django.core.exceptions import ObjectDoesNotExist -from .models import Teacher, Speciality, SchoolClass, Planning, Discount, Fee, PaymentPlan, PaymentMode, Establishment -from .serializers import TeacherSerializer, SpecialitySerializer, SchoolClassSerializer, PlanningSerializer, DiscountSerializer, FeeSerializer, PaymentPlanSerializer, PaymentModeSerializer, EstablishmentSerializer -from N3wtSchool import bdd +from rest_framework import status +from .models import ( + Teacher, + Speciality, + SchoolClass, + Planning, + Discount, + Fee, + PaymentPlan, + PaymentMode, + Establishment +) +from .serializers import ( + TeacherSerializer, + SpecialitySerializer, + SchoolClassSerializer, + PlanningSerializer, + DiscountSerializer, + FeeSerializer, + PaymentPlanSerializer, + PaymentModeSerializer, + EstablishmentSerializer +) from N3wtSchool.bdd import delete_object, getAllObjects, getObject @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class SpecialitiesView(APIView): +class SpecialityListCreateView(APIView): def get(self, request): specialitiesList = getAllObjects(Speciality) specialities_serializer = SpecialitySerializer(specialitiesList, many=True) return JsonResponse(specialities_serializer.data, safe=False) - def post(self, request): - specialities_data = JSONParser().parse(request) - all_valid = True - for speciality_data in specialities_data: - speciality_serializer = SpecialitySerializer(data=speciality_data) - if speciality_serializer.is_valid(): - speciality_serializer.save() - else: - all_valid = False - break - if all_valid: - specialitiesList = getAllObjects(Speciality) - specialities_serializer = SpecialitySerializer(specialitiesList, many=True) - return JsonResponse(specialities_serializer.data, safe=False) - return JsonResponse(speciality_serializer.errors, safe=False) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class SpecialityView(APIView): - def get(self, request, _id): - speciality = getObject(_objectName=Speciality, _columnName='id', _value=_id) - speciality_serializer = SpecialitySerializer(speciality) - return JsonResponse(speciality_serializer.data, safe=False) - def post(self, request): speciality_data=JSONParser().parse(request) speciality_serializer = SpecialitySerializer(data=speciality_data) if speciality_serializer.is_valid(): speciality_serializer.save() - return JsonResponse(speciality_serializer.data, safe=False, status=201) + return JsonResponse(speciality_serializer.data, safe=False, status=status.HTTP_201_CREATED) - return JsonResponse(speciality_serializer.errors, safe=False, status=400) + return JsonResponse(speciality_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class SpecialityDetailView(APIView): + def get(self, request, id): + speciality = getObject(_objectName=Speciality, _columnName='id', _value=id) + speciality_serializer = SpecialitySerializer(speciality) + return JsonResponse(speciality_serializer.data, safe=False) + + def put(self, request, id): speciality_data=JSONParser().parse(request) - speciality = getObject(_objectName=Speciality, _columnName='id', _value=_id) + speciality = getObject(_objectName=Speciality, _columnName='id', _value=id) speciality_serializer = SpecialitySerializer(speciality, data=speciality_data) if speciality_serializer.is_valid(): speciality_serializer.save() @@ -62,25 +64,18 @@ class SpecialityView(APIView): return JsonResponse(speciality_serializer.errors, safe=False) - def delete(self, request, _id): - return delete_object(Speciality, _id) + def delete(self, request, id): + return delete_object(Speciality, id) -class TeachersView(APIView): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class TeacherListCreateView(APIView): def get(self, request): teachersList=getAllObjects(Teacher) teachers_serializer=TeacherSerializer(teachersList, many=True) return JsonResponse(teachers_serializer.data, safe=False) -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class TeacherView(APIView): - def get (self, request, _id): - teacher = getObject(_objectName=Teacher, _columnName='id', _value=_id) - teacher_serializer=TeacherSerializer(teacher) - - return JsonResponse(teacher_serializer.data, safe=False) - def post(self, request): teacher_data=JSONParser().parse(request) teacher_serializer = TeacherSerializer(data=teacher_data) @@ -92,9 +87,18 @@ class TeacherView(APIView): return JsonResponse(teacher_serializer.errors, safe=False) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class TeacherDetailView(APIView): + def get (self, request, id): + teacher = getObject(_objectName=Teacher, _columnName='id', _value=id) + teacher_serializer=TeacherSerializer(teacher) + + return JsonResponse(teacher_serializer.data, safe=False) + + def put(self, request, id): teacher_data=JSONParser().parse(request) - teacher = getObject(_objectName=Teacher, _columnName='id', _value=_id) + teacher = getObject(_objectName=Teacher, _columnName='id', _value=id) teacher_serializer = TeacherSerializer(teacher, data=teacher_data) if teacher_serializer.is_valid(): teacher_serializer.save() @@ -102,46 +106,17 @@ class TeacherView(APIView): return JsonResponse(teacher_serializer.errors, safe=False) - def delete(self, request, _id): - return delete_object(Teacher, _id, related_field='associated_profile') + def delete(self, request, id): + return delete_object(Teacher, id, related_field='associated_profile') @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class ClassesView(APIView): +class SchoolClassListCreateView(APIView): def get(self, request): classesList=getAllObjects(SchoolClass) classes_serializer=SchoolClassSerializer(classesList, many=True) return JsonResponse(classes_serializer.data, safe=False) - def post(self, request): - all_valid = True - classes_data=JSONParser().parse(request) - for classe_data in classes_data: - classe_serializer = SchoolClassSerializer(data=classe_data) - - if classe_serializer.is_valid(): - classe_serializer.save() - else: - all_valid = False - break - - if all_valid: - classesList = getAllObjects(SchoolClass) - classes_serializer = SchoolClassSerializer(classesList, many=True) - - return JsonResponse(classes_serializer.data, safe=False) - - return JsonResponse(classe_serializer.errors, safe=False) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class ClasseView(APIView): - def get (self, request, _id): - schoolClass = getObject(_objectName=SchoolClass, _columnName='id', _value=_id) - classe_serializer=SchoolClassSerializer(schoolClass) - - return JsonResponse(classe_serializer.data, safe=False) - def post(self, request): classe_data=JSONParser().parse(request) classe_serializer = SchoolClassSerializer(data=classe_data) @@ -152,9 +127,18 @@ class ClasseView(APIView): return JsonResponse(classe_serializer.errors, safe=False) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class SchoolClassDetailView(APIView): + def get (self, request, id): + schoolClass = getObject(_objectName=SchoolClass, _columnName='id', _value=id) + classe_serializer=SchoolClassSerializer(schoolClass) + + return JsonResponse(classe_serializer.data, safe=False) + + def put(self, request, id): classe_data=JSONParser().parse(request) - schoolClass = getObject(_objectName=SchoolClass, _columnName='id', _value=_id) + schoolClass = getObject(_objectName=SchoolClass, _columnName='id', _value=id) classe_serializer = SchoolClassSerializer(schoolClass, data=classe_data) if classe_serializer.is_valid(): classe_serializer.save() @@ -162,27 +146,17 @@ class ClasseView(APIView): return JsonResponse(classe_serializer.errors, safe=False) - def delete(self, request, _id): - return delete_object(SchoolClass, _id) - + def delete(self, request, id): + return delete_object(SchoolClass, id) @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class PlanningsView(APIView): +class PlanningListCreateView(APIView): def get(self, request): schedulesList=getAllObjects(Planning) schedules_serializer=PlanningSerializer(schedulesList, many=True) return JsonResponse(schedules_serializer.data, safe=False) -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class PlanningView(APIView): - def get (self, request, _id): - planning = getObject(_objectName=Planning, _columnName='classe__id', _value=_id) - planning_serializer=PlanningSerializer(planning) - - return JsonResponse(planning_serializer.data, safe=False) - def post(self, request): planning_data=JSONParser().parse(request) planning_serializer = PlanningSerializer(data=planning_data) @@ -193,15 +167,24 @@ class PlanningView(APIView): return JsonResponse(planning_serializer.errors, safe=False) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class PlanningDetailView(APIView): + def get (self, request, id): + planning = getObject(_objectName=Planning, _columnName='classe_id', _value=id) + planning_serializer=PlanningSerializer(planning) + + return JsonResponse(planning_serializer.data, safe=False) + + def put(self, request, id): planning_data = JSONParser().parse(request) try: - planning = Planning.objects.get(id=_id) + planning = Planning.objects.get(id=id) except Planning.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) except Planning.MultipleObjectsReturned: - return JsonResponse({'error': 'Multiple objects found'}, status=400) + return JsonResponse({'error': 'Multiple objects found'}, status=status.HTTP_400_BAD_REQUEST) planning_serializer = PlanningSerializer(planning, data=planning_data) @@ -210,236 +193,228 @@ class PlanningView(APIView): return JsonResponse(planning_serializer.data, safe=False) return JsonResponse(planning_serializer.errors, safe=False) - - -# Vues pour les réductions (Discount) -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class DiscountsView(APIView): - def get(self, request, _filter, *args, **kwargs): - - if _filter not in ['registration', 'tuition']: - return JsonResponse({"error": "Invalid type parameter. Must be 'registration' or 'tuition'."}, safe=False, status=400) - - discount_type_value = 0 if _filter == 'registration' else 1 - discounts = Discount.objects.filter(type=discount_type_value) - discounts_serializer = DiscountSerializer(discounts, many=True) - - return JsonResponse(discounts_serializer.data, safe=False, status=200) + + def delete(self, request, id): + return delete_object(Planning, id) @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class DiscountView(APIView): - def get(self, request, _id): - try: - discount = Discount.objects.get(id=_id) - discount_serializer = DiscountSerializer(discount) - return JsonResponse(discount_serializer.data, safe=False) - except Discount.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) - - def post(self, request): - discount_data = JSONParser().parse(request) - discount_serializer = DiscountSerializer(data=discount_data) - if discount_serializer.is_valid(): - discount_serializer.save() - return JsonResponse(discount_serializer.data, safe=False, status=201) - return JsonResponse(discount_serializer.errors, safe=False, status=400) - - def put(self, request, _id): - discount_data = JSONParser().parse(request) - try: - discount = Discount.objects.get(id=_id) - except Discount.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) - discount_serializer = DiscountSerializer(discount, data=discount_data, partial=True) # Utilisation de partial=True - if discount_serializer.is_valid(): - discount_serializer.save() - return JsonResponse(discount_serializer.data, safe=False) - return JsonResponse(discount_serializer.errors, safe=False, status=400) - - def delete(self, request, _id): - return delete_object(Discount, _id) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class FeesView(APIView): - def get(self, request, _filter, *args, **kwargs): - - if _filter not in ['registration', 'tuition']: - return JsonResponse({"error": "Invalid type parameter. Must be 'registration' or 'tuition'."}, safe=False, status=400) - - fee_type_value = 0 if _filter == 'registration' else 1 +class FeeListCreateView(APIView): + def get(self, request, *args, **kwargs): + filter = request.GET.get('filter', '').strip() + fee_type_value = 0 if filter == 'registration' else 1 fees = Fee.objects.filter(type=fee_type_value) fee_serializer = FeeSerializer(fees, many=True) - return JsonResponse(fee_serializer.data, safe=False, status=200) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class FeeView(APIView): - def get(self, request, _id): - try: - fee = Fee.objects.get(id=_id) - fee_serializer = FeeSerializer(fee) - return JsonResponse(fee_serializer.data, safe=False) - except Fee.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse(fee_serializer.data, safe=False, status=status.HTTP_200_OK) def post(self, request): fee_data = JSONParser().parse(request) fee_serializer = FeeSerializer(data=fee_data) if fee_serializer.is_valid(): fee_serializer.save() - return JsonResponse(fee_serializer.data, safe=False, status=201) - return JsonResponse(fee_serializer.errors, safe=False, status=400) + return JsonResponse(fee_serializer.data, safe=False, status=status.HTTP_201_CREATED) + return JsonResponse(fee_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class FeeDetailView(APIView): + def get(self, request, id): + try: + fee = Fee.objects.get(id=id) + fee_serializer = FeeSerializer(fee) + return JsonResponse(fee_serializer.data, safe=False) + except Fee.DoesNotExist: + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) + + def put(self, request, id): fee_data = JSONParser().parse(request) try: - fee = Fee.objects.get(id=_id) + fee = Fee.objects.get(id=id) except Fee.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) fee_serializer = FeeSerializer(fee, data=fee_data, partial=True) if fee_serializer.is_valid(): fee_serializer.save() return JsonResponse(fee_serializer.data, safe=False) - return JsonResponse(fee_serializer.errors, safe=False, status=400) + return JsonResponse(fee_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, _id): - return delete_object(Fee, _id) + def delete(self, request, id): + return delete_object(Fee, id) @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class PaymentPlansView(APIView): - def get(self, request, _filter, *args, **kwargs): +class DiscountListCreateView(APIView): + def get(self, request, *args, **kwargs): + filter = request.GET.get('filter', '').strip() + discount_type_value = 0 if filter == 'registration' else 1 + discounts = Discount.objects.filter(type=discount_type_value) + discounts_serializer = DiscountSerializer(discounts, many=True) + + return JsonResponse(discounts_serializer.data, safe=False, status=status.HTTP_200_OK) - if _filter not in ['registration', 'tuition']: - return JsonResponse({"error": "Invalid type parameter. Must be 'registration' or 'tuition'."}, safe=False, status=400) - - type_value = 0 if _filter == 'registration' else 1 + def post(self, request): + discount_data = JSONParser().parse(request) + discount_serializer = DiscountSerializer(data=discount_data) + if discount_serializer.is_valid(): + discount_serializer.save() + return JsonResponse(discount_serializer.data, safe=False, status=status.HTTP_201_CREATED) + return JsonResponse(discount_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) + +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class DiscountDetailView(APIView): + def get(self, request, id): + try: + discount = Discount.objects.get(id=id) + discount_serializer = DiscountSerializer(discount) + return JsonResponse(discount_serializer.data, safe=False) + except Discount.DoesNotExist: + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) + + def put(self, request, id): + discount_data = JSONParser().parse(request) + try: + discount = Discount.objects.get(id=id) + except Discount.DoesNotExist: + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) + discount_serializer = DiscountSerializer(discount, data=discount_data, partial=True) # Utilisation de partial=True + if discount_serializer.is_valid(): + discount_serializer.save() + return JsonResponse(discount_serializer.data, safe=False) + return JsonResponse(discount_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) + + def delete(self, request, id): + return delete_object(Discount, id) + +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class PaymentPlanListCreateView(APIView): + def get(self, request, *args, **kwargs): + filter = request.GET.get('filter', '').strip() + type_value = 0 if filter == 'registration' else 1 paymentPlans = PaymentPlan.objects.filter(type=type_value) payment_plans_serializer = PaymentPlanSerializer(paymentPlans, many=True) - return JsonResponse(payment_plans_serializer.data, safe=False, status=200) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class PaymentPlanView(APIView): - def get(self, request, _id): - try: - payment_plan = PaymentPlan.objects.get(id=_id) - payment_plan_serializer = PaymentPlanSerializer(payment_plan) - return JsonResponse(payment_plan_serializer.data, safe=False) - except PaymentPlan.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse(payment_plans_serializer.data, safe=False, status=status.HTTP_200_OK) def post(self, request): payment_plan_data = JSONParser().parse(request) payment_plan_serializer = PaymentPlanSerializer(data=payment_plan_data) if payment_plan_serializer.is_valid(): payment_plan_serializer.save() - return JsonResponse(payment_plan_serializer.data, safe=False, status=201) - return JsonResponse(payment_plan_serializer.errors, safe=False, status=400) + return JsonResponse(payment_plan_serializer.data, safe=False, status=status.HTTP_201_CREATED) + return JsonResponse(payment_plan_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class PaymentPlanDetailView(APIView): + def get(self, request, id): + try: + payment_plan = PaymentPlan.objects.get(id=id) + payment_plan_serializer = PaymentPlanSerializer(payment_plan) + return JsonResponse(payment_plan_serializer.data, safe=False) + except PaymentPlan.DoesNotExist: + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) + + def put(self, request, id): payment_plan_data = JSONParser().parse(request) try: - payment_plan = PaymentPlan.objects.get(id=_id) + payment_plan = PaymentPlan.objects.get(id=id) except PaymentPlan.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) payment_plan_serializer = PaymentPlanSerializer(payment_plan, data=payment_plan_data, partial=True) if payment_plan_serializer.is_valid(): payment_plan_serializer.save() return JsonResponse(payment_plan_serializer.data, safe=False) - return JsonResponse(payment_plan_serializer.errors, safe=False, status=400) + return JsonResponse(payment_plan_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, _id): - return delete_object(PaymentPlan, _id) + def delete(self, request, id): + return delete_object(PaymentPlan, id) @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class PaymentModesView(APIView): - def get(self, request, _filter, *args, **kwargs): - - if _filter not in ['registration', 'tuition']: - return JsonResponse({"error": "Invalid type parameter. Must be 'registration' or 'tuition'."}, safe=False, status=400) - - type_value = 0 if _filter == 'registration' else 1 +class PaymentModeListCreateView(APIView): + def get(self, request): + filter = request.GET.get('filter', '').strip() + type_value = 0 if filter == 'registration' else 1 paymentModes = PaymentMode.objects.filter(type=type_value) payment_modes_serializer = PaymentModeSerializer(paymentModes, many=True) - return JsonResponse(payment_modes_serializer.data, safe=False, status=200) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class PaymentModeView(APIView): - def get(self, request, _id): - try: - payment_mode = PaymentMode.objects.get(id=_id) - payment_mode_serializer = PaymentModeSerializer(payment_mode) - return JsonResponse(payment_mode_serializer.data, safe=False) - except PaymentMode.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse(payment_modes_serializer.data, safe=False, status=status.HTTP_200_OK) def post(self, request): payment_mode_data = JSONParser().parse(request) payment_mode_serializer = PaymentModeSerializer(data=payment_mode_data) if payment_mode_serializer.is_valid(): payment_mode_serializer.save() - return JsonResponse(payment_mode_serializer.data, safe=False, status=201) - return JsonResponse(payment_mode_serializer.errors, safe=False, status=400) + return JsonResponse(payment_mode_serializer.data, safe=False, status=status.HTTP_201_CREATED) + return JsonResponse(payment_mode_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class PaymentModeDetailView(APIView): + def get(self, request, id): + try: + payment_mode = PaymentMode.objects.get(id=id) + payment_mode_serializer = PaymentModeSerializer(payment_mode) + return JsonResponse(payment_mode_serializer.data, safe=False) + except PaymentMode.DoesNotExist: + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) + + def put(self, request, id): payment_mode_data = JSONParser().parse(request) try: - payment_mode = PaymentMode.objects.get(id=_id) + payment_mode = PaymentMode.objects.get(id=id) except PaymentMode.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) payment_mode_serializer = PaymentModeSerializer(payment_mode, data=payment_mode_data, partial=True) if payment_mode_serializer.is_valid(): payment_mode_serializer.save() return JsonResponse(payment_mode_serializer.data, safe=False) - return JsonResponse(payment_mode_serializer.errors, safe=False, status=400) + return JsonResponse(payment_mode_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) + + def delete(self, request, id): + return delete_object(PaymentMode, id) @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') -class EstablishmentsView(APIView): - def get(self, request): +class EstablishmentListCreateView(APIView): + def get(self, request): establishments=getAllObjects(Establishment) establishments_serializer=EstablishmentSerializer(establishments, many=True) - return JsonResponse(establishments_serializer.data, safe=False, status=200) - -@method_decorator(csrf_protect, name='dispatch') -@method_decorator(ensure_csrf_cookie, name='dispatch') -class EstablishmentView(APIView): - def get(self, request, _id): - try: - establishment = Establishment.objects.get(id=_id) - establishment_serializer = EstablishmentSerializer(establishment) - return JsonResponse(establishment_serializer.data, safe=False) - except Establishment.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse(establishments_serializer.data, safe=False, status=status.HTTP_200_OK) def post(self, request): establishment_data = JSONParser().parse(request) establishment_serializer = EstablishmentSerializer(data=establishment_data) if establishment_serializer.is_valid(): establishment_serializer.save() - return JsonResponse(establishment_serializer.data, safe=False, status=201) - return JsonResponse(establishment_serializer.errors, safe=False, status=400) + return JsonResponse(establishment_serializer.data, safe=False, status=status.HTTP_201_CREATED) + return JsonResponse(establishment_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def put(self, request, _id): +@method_decorator(csrf_protect, name='dispatch') +@method_decorator(ensure_csrf_cookie, name='dispatch') +class EstablishmentDetailView(APIView): + def get(self, request, id=None): + try: + establishment = Establishment.objects.get(id=id) + establishment_serializer = EstablishmentSerializer(establishment) + return JsonResponse(establishment_serializer.data, safe=False) + except Establishment.DoesNotExist: + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) + + def put(self, request, id): establishment_data = JSONParser().parse(request) try: - establishment = Establishment.objects.get(id=_id) + establishment = Establishment.objects.get(id=id) except Establishment.DoesNotExist: - return JsonResponse({'error': 'No object found'}, status=404) + return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND) establishment_serializer = EstablishmentSerializer(establishment, data=establishment_data, partial=True) if establishment_serializer.is_valid(): establishment_serializer.save() return JsonResponse(establishment_serializer.data, safe=False) - return JsonResponse(establishment_serializer.errors, safe=False, status=400) + return JsonResponse(establishment_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, _id): - return delete_object(Establishment, _id) \ No newline at end of file + def delete(self, request, id): + return delete_object(Establishment, id) \ No newline at end of file diff --git a/Front-End/src/app/lib/schoolAction.js b/Front-End/src/app/lib/schoolAction.js index c4091bc..47c8270 100644 --- a/Front-End/src/app/lib/schoolAction.js +++ b/Front-End/src/app/lib/schoolAction.js @@ -45,42 +45,42 @@ export const fetchSchedules = () => { }; export const fetchRegistrationDiscounts = () => { - return fetch(`${BE_SCHOOL_DISCOUNTS_URL}/registration`) + return fetch(`${BE_SCHOOL_DISCOUNTS_URL}?filter=registration`) .then(requestResponseHandler) }; export const fetchTuitionDiscounts = () => { - return fetch(`${BE_SCHOOL_DISCOUNTS_URL}/tuition`) + return fetch(`${BE_SCHOOL_DISCOUNTS_URL}?filter=tuition`) .then(requestResponseHandler) }; export const fetchRegistrationFees = () => { - return fetch(`${BE_SCHOOL_FEES_URL}/registration`) + return fetch(`${BE_SCHOOL_FEES_URL}?filter=registration`) .then(requestResponseHandler) }; export const fetchTuitionFees = () => { - return fetch(`${BE_SCHOOL_FEES_URL}/tuition`) + return fetch(`${BE_SCHOOL_FEES_URL}?filter=tuition`) .then(requestResponseHandler) }; export const fetchRegistrationPaymentPlans = () => { - return fetch(`${BE_SCHOOL_PAYMENT_PLANS_URL}/registration`) + return fetch(`${BE_SCHOOL_PAYMENT_PLANS_URL}?filter=registration`) .then(requestResponseHandler) } export const fetchTuitionPaymentPlans = () => { - return fetch(`${BE_SCHOOL_PAYMENT_PLANS_URL}/tuition`) + return fetch(`${BE_SCHOOL_PAYMENT_PLANS_URL}?filter=tuition`) .then(requestResponseHandler) } export const fetchRegistrationPaymentModes = () => { - return fetch(`${BE_SCHOOL_PAYMENT_MODES_URL}/registration`) + return fetch(`${BE_SCHOOL_PAYMENT_MODES_URL}?filter=registration`) .then(requestResponseHandler) } export const fetchTuitionPaymentModes = () => { - return fetch(`${BE_SCHOOL_PAYMENT_MODES_URL}/tuition`) + return fetch(`${BE_SCHOOL_PAYMENT_MODES_URL}?filter=tuition`) .then(requestResponseHandler) } diff --git a/Front-End/src/components/Structure/Configuration/ClassesSection.js b/Front-End/src/components/Structure/Configuration/ClassesSection.js index 385ccd6..7380b36 100644 --- a/Front-End/src/components/Structure/Configuration/ClassesSection.js +++ b/Front-End/src/components/Structure/Configuration/ClassesSection.js @@ -8,6 +8,7 @@ import TeacherItem from '@/components/Structure/Configuration/TeacherItem'; import MultiSelect from '@/components/MultiSelect'; import LevelLabel from '@/components/CustomLabels/LevelLabel'; import { DndProvider, HTML5Backend, useDrop } from 'react-dnd'; +import { ESTABLISHMENT_ID } from '@/utils/Url'; const ItemTypes = { TEACHER: 'teacher', @@ -148,8 +149,8 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi }; const handleAddClass = () => { - setNewClass({ id: Date.now(), atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] }); - setFormData({ atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] }); + setNewClass({ id: Date.now(), atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [], establishment: ESTABLISHMENT_ID }); + setFormData({ atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [], establishment: ESTABLISHMENT_ID }); }; const handleChange = (e) => { diff --git a/Front-End/src/components/Structure/Configuration/StructureManagement.js b/Front-End/src/components/Structure/Configuration/StructureManagement.js index bde54ca..dd2378e 100644 --- a/Front-End/src/components/Structure/Configuration/StructureManagement.js +++ b/Front-End/src/components/Structure/Configuration/StructureManagement.js @@ -3,7 +3,7 @@ import SpecialitiesSection from '@/components/Structure/Configuration/Specialiti import TeachersSection from '@/components/Structure/Configuration/TeachersSection'; import ClassesSection from '@/components/Structure/Configuration/ClassesSection'; import { ClassesProvider } from '@/context/ClassesContext'; -import { BE_SCHOOL_SPECIALITY_URL, BE_SCHOOL_TEACHER_URL, BE_SCHOOL_SCHOOLCLASS_URL } from '@/utils/Url'; +import { BE_SCHOOL_SPECIALITIES_URL, BE_SCHOOL_TEACHERS_URL, BE_SCHOOL_SCHOOLCLASSES_URL } from '@/utils/Url'; const StructureManagement = ({ specialities, setSpecialities, teachers, setTeachers, classes, setClasses, handleCreate, handleEdit, handleDelete }) => { return ( @@ -13,9 +13,9 @@ const StructureManagement = ({ specialities, setSpecialities, teachers, setTeach handleCreate(`${BE_SCHOOL_SPECIALITY_URL}`, newData, setSpecialities)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_SPECIALITY_URL}`, id, updatedData, setSpecialities)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_SPECIALITY_URL}`, id, setSpecialities)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_SPECIALITIES_URL}`, newData, setSpecialities)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_SPECIALITIES_URL}`, id, updatedData, setSpecialities)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_SPECIALITIES_URL}`, id, setSpecialities)} />
@@ -23,9 +23,9 @@ const StructureManagement = ({ specialities, setSpecialities, teachers, setTeach teachers={teachers} setTeachers={setTeachers} specialities={specialities} - handleCreate={(newData) => handleCreate(`${BE_SCHOOL_TEACHER_URL}`, newData, setTeachers)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_TEACHER_URL}`, id, updatedData, setTeachers)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_TEACHER_URL}`, id, setTeachers)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_TEACHERS_URL}`, newData, setTeachers)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_TEACHERS_URL}`, id, updatedData, setTeachers)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_TEACHERS_URL}`, id, setTeachers)} />
@@ -33,9 +33,9 @@ const StructureManagement = ({ specialities, setSpecialities, teachers, setTeach classes={classes} setClasses={setClasses} teachers={teachers} - handleCreate={(newData) => handleCreate(`${BE_SCHOOL_SCHOOLCLASS_URL}`, newData, setClasses)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_SCHOOLCLASS_URL}`, id, updatedData, setClasses)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_SCHOOLCLASS_URL}`, id, setClasses)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_SCHOOLCLASSES_URL}`, newData, setClasses)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_SCHOOLCLASSES_URL}`, id, updatedData, setClasses)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_SCHOOLCLASSES_URL}`, id, setClasses)} />
diff --git a/Front-End/src/components/Structure/Planning/ScheduleManagement.js b/Front-End/src/components/Structure/Planning/ScheduleManagement.js index 01fd463..a3a3283 100644 --- a/Front-End/src/components/Structure/Planning/ScheduleManagement.js +++ b/Front-End/src/components/Structure/Planning/ScheduleManagement.js @@ -6,7 +6,7 @@ import { DndProvider } from 'react-dnd'; import { AnimatePresence, motion } from 'framer-motion'; import PlanningClassView from '@/components/Structure/Planning/PlanningClassView'; import SpecialitiesList from '@/components/Structure/Planning/SpecialitiesList'; -import { BE_SCHOOL_PLANNING_URL } from '@/utils/Url'; +import { BE_SCHOOL_PLANNINGS_URL } from '@/utils/Url'; import { useClasses } from '@/context/ClassesContext'; import { ClasseFormProvider } from '@/context/ClasseFormContext'; import TabsStructure from '@/components/Structure/Configuration/TabsStructure'; @@ -89,7 +89,7 @@ const ScheduleManagement = ({ handleUpdatePlanning, classes }) => { const planningId = selectedClass.plannings_read.find(planning => planning.niveau === selectedLevel)?.planning.id; if (planningId) { console.log('newSchedule : ', newSchedule) - handleUpdatePlanning(BE_SCHOOL_PLANNING_URL, planningId, newSchedule); + handleUpdatePlanning(BE_SCHOOL_PLANNINGS_URL, planningId, newSchedule); } }; diff --git a/Front-End/src/components/Structure/Planning/SpecialityEventModal.js b/Front-End/src/components/Structure/Planning/SpecialityEventModal.js index 3c93d1b..f002f00 100644 --- a/Front-End/src/components/Structure/Planning/SpecialityEventModal.js +++ b/Front-End/src/components/Structure/Planning/SpecialityEventModal.js @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import SelectChoice from '@/components/SelectChoice'; import { useClasses } from '@/context/ClassesContext'; import { useClasseForm } from '@/context/ClasseFormContext'; -import { BE_SCHOOL_PLANNING_URL } from '@/utils/Url'; +import { BE_SCHOOL_PLANNINGS_URL } from '@/utils/Url'; import { BookOpen, Users } from 'lucide-react'; const SpecialityEventModal = ({ isOpen, onClose, selectedCell, existingEvent, handleUpdatePlanning, classe }) => { @@ -114,7 +114,7 @@ const SpecialityEventModal = ({ isOpen, onClose, selectedCell, existingEvent, ha const planningId = updatedPlanning ? updatedPlanning.planning.id : null; console.log("id : ", planningId) if (planningId) { - handleUpdatePlanning(BE_SCHOOL_PLANNING_URL, planningId, updatedPlanning.emploiDuTemps); + handleUpdatePlanning(BE_SCHOOL_PLANNINGS_URL, planningId, updatedPlanning.emploiDuTemps); } onClose(); diff --git a/Front-End/src/components/Structure/Tarification/DiscountsSection.js b/Front-End/src/components/Structure/Tarification/DiscountsSection.js index 8b31aee..f8d5d25 100644 --- a/Front-End/src/components/Structure/Tarification/DiscountsSection.js +++ b/Front-End/src/components/Structure/Tarification/DiscountsSection.js @@ -5,6 +5,8 @@ import Popup from '@/components/Popup'; import CheckBox from '@/components/CheckBox'; import InputText from '@/components/InputText'; +import { ESTABLISHMENT_ID } from '@/utils/Url'; + const DiscountsSection = ({ discounts, setDiscounts, handleCreate, handleEdit, handleDelete, type, subscriptionMode = false, selectedDiscounts, handleDiscountSelection }) => { const [editingDiscount, setEditingDiscount] = useState(null); const [newDiscount, setNewDiscount] = useState(null); @@ -17,7 +19,7 @@ const DiscountsSection = ({ discounts, setDiscounts, handleCreate, handleEdit, h const [removePopupOnConfirm, setRemovePopupOnConfirm] = useState(() => {}); const handleAddDiscount = () => { - setNewDiscount({ id: Date.now(), name: '', amount: '', description: '', discount_type: 0, type: type }); + setNewDiscount({ id: Date.now(), name: '', amount: '', description: '', discount_type: 0, type: type, establishment: ESTABLISHMENT_ID }); }; const handleRemoveDiscount = (id) => { diff --git a/Front-End/src/components/Structure/Tarification/FeesManagement.js b/Front-End/src/components/Structure/Tarification/FeesManagement.js index 4c47f93..f7f6f7a 100644 --- a/Front-End/src/components/Structure/Tarification/FeesManagement.js +++ b/Front-End/src/components/Structure/Tarification/FeesManagement.js @@ -3,7 +3,7 @@ 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_FEE_URL, BE_SCHOOL_DISCOUNT_URL, BE_SCHOOL_PAYMENT_PLAN_URL, BE_SCHOOL_PAYMENT_MODE_URL } from '@/utils/Url'; +import { BE_SCHOOL_FEES_URL, BE_SCHOOL_DISCOUNTS_URL, BE_SCHOOL_PAYMENT_PLANS_URL, BE_SCHOOL_PAYMENT_MODES_URL } from '@/utils/Url'; import { set } from 'lodash'; const FeesManagement = ({ registrationDiscounts, @@ -54,9 +54,9 @@ const FeesManagement = ({ registrationDiscounts, fees={registrationFees} setFees={setRegistrationFees} discounts={registrationDiscounts} - handleCreate={(newData) => handleCreate(`${BE_SCHOOL_FEE_URL}`, newData, setRegistrationFees)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_FEE_URL}`, id, updatedData, setRegistrationFees)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_FEE_URL}`, id, setRegistrationFees)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_FEES_URL}`, newData, setRegistrationFees)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_FEES_URL}`, id, updatedData, setRegistrationFees)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_FEES_URL}`, id, setRegistrationFees)} type={0} /> @@ -64,9 +64,9 @@ const FeesManagement = ({ registrationDiscounts, handleCreate(`${BE_SCHOOL_DISCOUNT_URL}`, newData, setRegistrationDiscounts)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_DISCOUNT_URL}`, id, updatedData, setRegistrationDiscounts)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_DISCOUNT_URL}`, id, setRegistrationDiscounts)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_DISCOUNTS_URL}`, newData, setRegistrationDiscounts)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_DISCOUNTS_URL}`, id, updatedData, setRegistrationDiscounts)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_DISCOUNTS_URL}`, id, setRegistrationDiscounts)} onDiscountDelete={(id) => handleDiscountDelete(id, 0)} type={0} /> @@ -75,7 +75,7 @@ const FeesManagement = ({ registrationDiscounts, handleEdit(`${BE_SCHOOL_PAYMENT_PLAN_URL}`, id, updatedData, setRegistrationPaymentPlans)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_PAYMENT_PLANS_URL}`, id, updatedData, setRegistrationPaymentPlans)} type={0} /> @@ -83,7 +83,7 @@ const FeesManagement = ({ registrationDiscounts, handleEdit(`${BE_SCHOOL_PAYMENT_MODE_URL}`, id, updatedData, setRegistrationPaymentModes)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_PAYMENT_MODES_URL}`, id, updatedData, setRegistrationPaymentModes)} type={0} /> @@ -97,9 +97,9 @@ const FeesManagement = ({ registrationDiscounts, fees={tuitionFees} setFees={setTuitionFees} discounts={tuitionDiscounts} - handleCreate={(newData) => handleCreate(`${BE_SCHOOL_FEE_URL}`, newData, setTuitionFees)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_FEE_URL}`, id, updatedData, setTuitionFees)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_FEE_URL}`, id, setTuitionFees)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_FEES_URL}`, newData, setTuitionFees)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_FEES_URL}`, id, updatedData, setTuitionFees)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_FEES_URL}`, id, setTuitionFees)} type={1} /> @@ -107,9 +107,9 @@ const FeesManagement = ({ registrationDiscounts, handleCreate(`${BE_SCHOOL_DISCOUNT_URL}`, newData, setTuitionDiscounts)} - handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_DISCOUNT_URL}`, id, updatedData, setTuitionDiscounts)} - handleDelete={(id) => handleDelete(`${BE_SCHOOL_DISCOUNT_URL}`, id, setTuitionDiscounts)} + handleCreate={(newData) => handleCreate(`${BE_SCHOOL_DISCOUNTS_URL}`, newData, setTuitionDiscounts)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_DISCOUNTS_URL}`, id, updatedData, setTuitionDiscounts)} + handleDelete={(id) => handleDelete(`${BE_SCHOOL_DISCOUNTS_URL}`, id, setTuitionDiscounts)} onDiscountDelete={(id) => handleDiscountDelete(id, 1)} type={1} /> @@ -118,7 +118,7 @@ const FeesManagement = ({ registrationDiscounts, handleEdit(`${BE_SCHOOL_PAYMENT_PLAN_URL}`, id, updatedData, setRegistrationPaymentPlans)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_PAYMENT_PLANS_URL}`, id, updatedData, setRegistrationPaymentPlans)} type={1} /> @@ -126,7 +126,7 @@ const FeesManagement = ({ registrationDiscounts, handleEdit(`${BE_SCHOOL_PAYMENT_MODE_URL}`, id, updatedData, setTuitionPaymentModes)} + handleEdit={(id, updatedData) => handleEdit(`${BE_SCHOOL_PAYMENT_MODES_URL}`, id, updatedData, setTuitionPaymentModes)} type={1} /> diff --git a/Front-End/src/components/Structure/Tarification/FeesSection.js b/Front-End/src/components/Structure/Tarification/FeesSection.js index adf9297..ba83d11 100644 --- a/Front-End/src/components/Structure/Tarification/FeesSection.js +++ b/Front-End/src/components/Structure/Tarification/FeesSection.js @@ -5,6 +5,8 @@ import Popup from '@/components/Popup'; import CheckBox from '@/components/CheckBox'; import InputText from '@/components/InputText'; +import { ESTABLISHMENT_ID } from '@/utils/Url'; + const FeesSection = ({ fees, setFees, discounts, handleCreate, handleEdit, handleDelete, type, subscriptionMode = false, selectedFees, handleFeeSelection }) => { const [editingFee, setEditingFee] = useState(null); const [newFee, setNewFee] = useState(null); @@ -23,7 +25,7 @@ const FeesSection = ({ fees, setFees, discounts, handleCreate, handleEdit, handl }; const handleAddFee = () => { - setNewFee({ id: Date.now(), name: '', base_amount: '', description: '', validity_start_date: '', validity_end_date: '', discounts: [], type: type }); + setNewFee({ id: Date.now(), name: '', base_amount: '', description: '', validity_start_date: '', validity_end_date: '', discounts: [], type: type, establishment: ESTABLISHMENT_ID }); }; const handleRemoveFee = (id) => { diff --git a/Front-End/src/utils/Url.js b/Front-End/src/utils/Url.js index 56d947a..0266d87 100644 --- a/Front-End/src/utils/Url.js +++ b/Front-End/src/utils/Url.js @@ -25,23 +25,15 @@ export const BE_SUBSCRIPTION_LAST_GUARDIAN_ID_URL = `${BASE_URL}/Subscriptions/l //GESTION ECOLE -export const BE_SCHOOL_SPECIALITY_URL = `${BASE_URL}/School/speciality` export const BE_SCHOOL_SPECIALITIES_URL = `${BASE_URL}/School/specialities` -export const BE_SCHOOL_SCHOOLCLASS_URL = `${BASE_URL}/School/schoolClass` export const BE_SCHOOL_SCHOOLCLASSES_URL = `${BASE_URL}/School/schoolClasses` -export const BE_SCHOOL_TEACHER_URL = `${BASE_URL}/School/teacher` export const BE_SCHOOL_TEACHERS_URL = `${BASE_URL}/School/teachers` -export const BE_SCHOOL_PLANNING_URL = `${BASE_URL}/School/planning` export const BE_SCHOOL_PLANNINGS_URL = `${BASE_URL}/School/plannings` -export const BE_SCHOOL_FEE_URL = `${BASE_URL}/School/fee`; export const BE_SCHOOL_FEES_URL = `${BASE_URL}/School/fees`; -export const BE_SCHOOL_DISCOUNT_URL = `${BASE_URL}/School/discount`; export const BE_SCHOOL_DISCOUNTS_URL = `${BASE_URL}/School/discounts`; -export const BE_SCHOOL_PAYMENT_PLAN_URL = `${BASE_URL}/School/paymentPlan`; export const BE_SCHOOL_PAYMENT_PLANS_URL = `${BASE_URL}/School/paymentPlans`; -export const BE_SCHOOL_PAYMENT_MODE_URL = `${BASE_URL}/School/paymentMode`; export const BE_SCHOOL_PAYMENT_MODES_URL = `${BASE_URL}/School/paymentModes`; -export const BE_SCHOOL_ESTABLISHMENT_URL = `${BASE_URL}/School/establishment`; +export const BE_SCHOOL_ESTABLISHMENT_URL = `${BASE_URL}/School/establishments`; // En attendant la gestion des sessions export const ESTABLISHMENT_ID = 1;