From 4c2e2f87565dc6e2be501839c274a5aa6969a9ec Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Fri, 11 Apr 2025 20:02:03 +0200 Subject: [PATCH] feat: Ajout d'un nouveau status avec envoi de mandat SEPA + envoi de mail --- ...andat_prelevement_sepa_interentreprise.pdf | Bin 0 -> 63216 bytes Back-End/Subscriptions/mailManager.py | 24 ++- Back-End/Subscriptions/models.py | 5 + Back-End/Subscriptions/serializers.py | 4 + .../Subscriptions/templates/emails/sepa.html | 51 +++++ .../views/register_form_views.py | 22 ++- .../app/[locale]/admin/subscriptions/page.js | 10 +- .../validateSubscription/page.js | 53 ++++++ .../[locale]/parents/editInscription/page.js | 3 + Front-End/src/app/[locale]/parents/page.js | 21 +-- .../app/actions/registerFileGroupAction.js | 15 +- .../src/app/actions/subscriptionAction.js | 11 ++ .../Inscription/ValidateSubscription.js | 175 ++++++++++++++++++ Front-End/src/components/StatusLabel.js | 66 ++++--- .../components/Structure/Files/FileUpload.js | 33 +--- .../src/pages/api/docuseal/cloneTemplate.js | 1 - Front-End/src/utils/Url.js | 2 + 17 files changed, 415 insertions(+), 81 deletions(-) create mode 100644 Back-End/School/management/commands/References/LMDE/mandat_prelevement_sepa_interentreprise.pdf create mode 100644 Back-End/Subscriptions/templates/emails/sepa.html create mode 100644 Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js create mode 100644 Front-End/src/components/Inscription/ValidateSubscription.js diff --git a/Back-End/School/management/commands/References/LMDE/mandat_prelevement_sepa_interentreprise.pdf b/Back-End/School/management/commands/References/LMDE/mandat_prelevement_sepa_interentreprise.pdf new file mode 100644 index 0000000000000000000000000000000000000000..71d16dc256b8500e9dcc4733817a56b1212f2f80 GIT binary patch literal 63216 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
vKwJ7LuZ? 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 z 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 z%0D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 literal 0 HcmV?d00001 diff --git a/Back-End/Subscriptions/mailManager.py b/Back-End/Subscriptions/mailManager.py index 3d393dc..ddd0648 100644 --- a/Back-End/Subscriptions/mailManager.py +++ b/Back-End/Subscriptions/mailManager.py @@ -26,7 +26,6 @@ def envoieReinitMotDePasse(recipients, code): def sendRegisterForm(recipients, establishment_id): errorMessage = '' try: - print(f'{settings.EMAIL_HOST_USER}') # Préparation du contexte pour le template EMAIL_INSCRIPTION_SUBJECT = '[N3WT-SCHOOL] Dossier Inscription' context = { @@ -47,6 +46,29 @@ def sendRegisterForm(recipients, establishment_id): return errorMessage +def sendMandatSEPA(recipients, establishment_id): + errorMessage = '' + try: + # Préparation du contexte pour le template + EMAIL_INSCRIPTION_SUBJECT = '[N3WT-SCHOOL] Mandat de prélèvement SEPA' + context = { + 'BASE_URL': settings.BASE_URL, + 'email': recipients, + 'establishment': establishment_id + } + + subject = EMAIL_INSCRIPTION_SUBJECT + html_message = render_to_string('emails/sepa.html', context) + plain_message = strip_tags(html_message) + from_email = settings.EMAIL_HOST_USER + + send_mail(subject, plain_message, from_email, [recipients], html_message=html_message) + + except Exception as e: + errorMessage = str(e) + + return errorMessage + def envoieRelanceDossierInscription(recipients, code): EMAIL_RELANCE_SUBJECT = '[N3WT-SCHOOL] Relance - Dossier Inscription' EMAIL_RELANCE_CORPUS = 'Bonjour,\nN\'ayant pas eu de retour de votre part, nous vous renvoyons le lien vers le formulaire d\'inscription : ' + BASE_URL + '/users/login\nCordialement' diff --git a/Back-End/Subscriptions/models.py b/Back-End/Subscriptions/models.py index 42de8e4..86f5b85 100644 --- a/Back-End/Subscriptions/models.py +++ b/Back-End/Subscriptions/models.py @@ -198,6 +198,11 @@ class RegistrationForm(models.Model): null=True, blank=True ) + sepa_file = models.FileField( + upload_to=registration_file_path, + null=True, + blank=True + ) associated_rf = models.CharField(max_length=200, default="", blank=True) # Many-to-Many Relationship diff --git a/Back-End/Subscriptions/serializers.py b/Back-End/Subscriptions/serializers.py index c80357a..36519df 100644 --- a/Back-End/Subscriptions/serializers.py +++ b/Back-End/Subscriptions/serializers.py @@ -10,6 +10,7 @@ from N3wtSchool import settings from django.utils import timezone import pytz from datetime import datetime +import Subscriptions.util as util class RegistrationTemplateMasterSerializer(serializers.ModelSerializer): id = serializers.IntegerField(required=False) @@ -195,6 +196,7 @@ class StudentSerializer(serializers.ModelSerializer): class RegistrationFormSerializer(serializers.ModelSerializer): student = StudentSerializer(many=False, required=False) registration_file = serializers.FileField(required=False) + sepa_file = serializers.FileField(required=False) status_label = serializers.SerializerMethodField() formatted_last_update = serializers.SerializerMethodField() registration_files = RegistrationTemplateSerializer(many=True, required=False) @@ -232,6 +234,8 @@ class RegistrationFormSerializer(serializers.ModelSerializer): setattr(instance, field, validated_data[field]) except KeyError: pass + + instance.last_update = util.convertToStr(util._now(), '%d-%m-%Y %H:%M') instance.save() # Associer les IDs des objets Fee et Discount au RegistrationForm diff --git a/Back-End/Subscriptions/templates/emails/sepa.html b/Back-End/Subscriptions/templates/emails/sepa.html new file mode 100644 index 0000000..556e185 --- /dev/null +++ b/Back-End/Subscriptions/templates/emails/sepa.html @@ -0,0 +1,51 @@ + + + + + Finalisation de l'inscription + + + +
+
+

Finalisation de l'inscription

+
+
+

Bonjour,

+

Un mandat de prélèvement SEPA vous a été envoyé

+

Le document est à votre disposition sur votre espace parent : {{BASE_URL}}/users/login

+

Merci de compléter puis de signer le document afin de valider votre inscription

+

Cordialement,

+

L'équipe N3wt School

+
+ +
+ + \ No newline at end of file diff --git a/Back-End/Subscriptions/views/register_form_views.py b/Back-End/Subscriptions/views/register_form_views.py index bb30d4c..b803cde 100644 --- a/Back-End/Subscriptions/views/register_form_views.py +++ b/Back-End/Subscriptions/views/register_form_views.py @@ -1,7 +1,6 @@ from django.http.response import JsonResponse 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 rest_framework.decorators import action, api_view from rest_framework import status @@ -230,10 +229,16 @@ class RegisterFormWithIdView(APIView): """ Modifie un dossier d'inscription donné. """ - studentForm_data = JSONParser().parse(request) + # Récupérer les données de la requête + studentForm_data = request.data.copy() + + logger.info(f"Mise à jour du dossier d'inscription {studentForm_data}") _status = studentForm_data.pop('status', 0) - studentForm_data["last_update"] = str(util.convertToStr(util._now(), '%d-%m-%Y %H:%M')) + if isinstance(_status, list): # Cas Multipart/data, les données sont envoyées sous forme de liste, c'est nul + _status = int(_status[0]) + else: + _status = int(_status) # Récupérer le dossier d'inscription registerForm = bdd.getObject(_objectName=RegistrationForm, _columnName='student__id', _value=id) @@ -282,6 +287,17 @@ class RegisterFormWithIdView(APIView): if registerForm.status == RegistrationForm.RegistrationFormStatus.RF_UNDER_REVIEW: updateStateMachine(registerForm, 'EVENT_REFUSE') util.delete_registration_files(registerForm) + elif _status == RegistrationForm.RegistrationFormStatus.RF_SEPA_SENT: + # Sauvegarde du mandat SEPA + student = registerForm.student + guardian = student.getMainGuardian() + email = guardian.profile_role.profile.email + errorMessage = mailer.sendMandatSEPA(email, registerForm.establishment.pk) + if errorMessage == '': + registerForm.last_update=util.convertToStr(util._now(), '%d-%m-%Y %H:%M') + updateStateMachine(registerForm, 'EVENT_SEND_SEPA') + return JsonResponse({"message": f"Le mandat SEPA a bien été envoyé à l'addresse {email}"}, safe=False) + return JsonResponse({"errorMessage":errorMessage}, safe=False, status=status.HTTP_400_BAD_REQUEST) # Retourner les données mises à jour return JsonResponse(studentForm_serializer.data, safe=False) diff --git a/Front-End/src/app/[locale]/admin/subscriptions/page.js b/Front-End/src/app/[locale]/admin/subscriptions/page.js index c02ee1a..680c723 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/page.js @@ -14,6 +14,7 @@ import Modal from '@/components/Modal'; import InscriptionForm from '@/components/Inscription/InscriptionForm' import AffectationClasseForm from '@/components/AffectationClasseForm' import { useEstablishment } from '@/context/EstablishmentContext'; +import ValidateSubscription from '@/components/Inscription/ValidateSubscription'; import { PENDING, @@ -44,7 +45,8 @@ import { createProfile, deleteProfile, fetchProfiles } from '@/app/actions/authA import { BASE_URL, - FE_ADMIN_SUBSCRIPTIONS_EDIT_URL } from '@/utils/Url'; + FE_ADMIN_SUBSCRIPTIONS_EDIT_URL, + FE_ADMIN_SUBSCRIPTIONS_VALIDATE_URL } from '@/utils/Url'; import DjangoCSRFToken from '@/components/DjangoCSRFToken' import { useCsrfToken } from '@/context/CsrfContext'; @@ -594,11 +596,7 @@ useEffect(()=>{ 3: [ { icon: , - onClick: () => openModalAssociationEleve(row.student), - }, - { - icon: , - onClick: () => refuseRegistrationForm(row.student.id, row.student.last_name, row.student.first_name, row.student.guardians[0].associated_profile_email), + onClick: () => window.location.href = `${FE_ADMIN_SUBSCRIPTIONS_VALIDATE_URL}?studentId=${row.student.id}&firstName=${row.student.first_name}&lastName=${row.student.last_name}&paymentMode=${row.registration_payment}&file=${row.registration_file}`, }, ], 5: [ diff --git a/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js b/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js new file mode 100644 index 0000000..fe5c8e1 --- /dev/null +++ b/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js @@ -0,0 +1,53 @@ +'use client' +import React from 'react'; +import { useSearchParams, useRouter } from 'next/navigation'; +import ValidateSubscription from '@/components/Inscription/ValidateSubscription'; +import { sendSEPARegisterForm } from "@/app/actions/subscriptionAction" +import { useCsrfToken } from '@/context/CsrfContext'; +import logger from '@/utils/logger'; +import { FE_ADMIN_SUBSCRIPTIONS_URL} from '@/utils/Url'; + +export default function Page() { + const searchParams = useSearchParams(); + const router = useRouter(); + + // Récupérer les paramètres de la requête + const studentId = searchParams.get('studentId'); + const firstName = searchParams.get('firstName'); + const lastName = searchParams.get('lastName'); + const paymentMode = searchParams.get('paymentMode'); + const file = searchParams.get('file'); + + const csrfToken = useCsrfToken(); + + const handleAcceptRF = (data) => { + logger.debug('Mise à jour du RF avec les données:', data); + + const {status, sepa_file} = data + const formData = new FormData(); + formData.append('status', status); // Ajoute le statut + formData.append('sepa_file', sepa_file); // Ajoute le fichier SEPA + + // Appeler l'API pour mettre à jour le RF + sendSEPARegisterForm(studentId, formData, csrfToken) + .then((response) => { + logger.debug('RF mis à jour avec succès:', response); + router.push(FE_ADMIN_SUBSCRIPTIONS_URL); + // Logique supplémentaire après la mise à jour (par exemple, redirection ou notification) + }) + .catch((error) => { + logger.error('Erreur lors de la mise à jour du RF:', error); + }); + }; + + return ( + + ); +} \ No newline at end of file diff --git a/Front-End/src/app/[locale]/parents/editInscription/page.js b/Front-End/src/app/[locale]/parents/editInscription/page.js index 8feaf4c..490fc46 100644 --- a/Front-End/src/app/[locale]/parents/editInscription/page.js +++ b/Front-End/src/app/[locale]/parents/editInscription/page.js @@ -3,6 +3,7 @@ import React, { useState } from 'react'; import InscriptionFormShared from '@/components/Inscription/InscriptionFormShared'; import { useSearchParams, useRouter } from 'next/navigation'; import { useCsrfToken } from '@/context/CsrfContext'; +import { useEstablishment } from '@/context/EstablishmentContext'; import { FE_PARENTS_HOME_URL} from '@/utils/Url'; import { editRegisterForm} from '@/app/actions/subscriptionAction'; import logger from '@/utils/logger'; @@ -13,6 +14,7 @@ export default function Page() { const studentId = searchParams.get('studentId'); const router = useRouter(); const csrfToken = useCsrfToken(); + const { selectedEstablishmentId } = useEstablishment(); const handleSubmit = async (data) => { try { @@ -28,6 +30,7 @@ export default function Page() { diff --git a/Front-End/src/app/[locale]/parents/page.js b/Front-End/src/app/[locale]/parents/page.js index ac8b1ea..2fabe0d 100644 --- a/Front-End/src/app/[locale]/parents/page.js +++ b/Front-End/src/app/[locale]/parents/page.js @@ -62,25 +62,6 @@ export default function ParentHomePage() { { name: 'Action', transform: (row) => row.action }, ]; - const getShadowColor = (status) => { - switch (status) { - case 1: - return 'shadow-blue-500'; // Couleur d'ombre plus visible - case 2: - return 'shadow-orange-500'; // Couleur d'ombre plus visible - case 3: - return 'shadow-purple-500'; // Couleur d'ombre plus visible - case 4: - return 'shadow-red-500'; // Couleur d'ombre plus visible - case 5: - return 'shadow-green-500'; // Couleur d'ombre plus visible - case 6: - return 'shadow-red-500'; // Couleur d'ombre plus visible - default: - return 'shadow-green-500'; // Couleur d'ombre plus visible - } - }; - // Définir les colonnes du tableau const childrenColumns = [ { name: 'Nom', transform: (row) => `${row.student.last_name}` }, @@ -89,7 +70,7 @@ export default function ParentHomePage() { name: 'Statut', transform: (row) => (
- +
) }, diff --git a/Front-End/src/app/actions/registerFileGroupAction.js b/Front-End/src/app/actions/registerFileGroupAction.js index a22fb9d..604ca7b 100644 --- a/Front-End/src/app/actions/registerFileGroupAction.js +++ b/Front-End/src/app/actions/registerFileGroupAction.js @@ -2,7 +2,8 @@ import { BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL, BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL, BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL, FE_API_DOCUSEAL_CLONE_URL, - FE_API_DOCUSEAL_DOWNLOAD_URL + FE_API_DOCUSEAL_DOWNLOAD_URL, + FE_API_DOCUSEAL_GENERATE_TOKEN } from '@/utils/Url'; const requestResponseHandler = async (response) => { @@ -220,4 +221,14 @@ export const downloadTemplate = (slug) => { } }) .then(requestResponseHandler) -} \ No newline at end of file +} + +export const generateToken = (email, id = null) => { + return fetch(`${FE_API_DOCUSEAL_GENERATE_TOKEN}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ user_email: email, id }), + }).then(requestResponseHandler); +}; \ No newline at end of file diff --git a/Front-End/src/app/actions/subscriptionAction.js b/Front-End/src/app/actions/subscriptionAction.js index 9024fa5..7309b38 100644 --- a/Front-End/src/app/actions/subscriptionAction.js +++ b/Front-End/src/app/actions/subscriptionAction.js @@ -56,6 +56,17 @@ export const editRegisterForm=(id, data, csrfToken)=>{ .then(requestResponseHandler) }; +export const sendSEPARegisterForm=(id, data, csrfToken)=>{ + return fetch(`${BE_SUBSCRIPTION_REGISTERFORMS_URL}/${id}`, { + method: 'PUT', + headers: { + 'X-CSRFToken': csrfToken + }, + body: data, + credentials: 'include' + }) + .then(requestResponseHandler) +}; export const createRegisterForm=(data, csrfToken)=>{ const url = `${BE_SUBSCRIPTION_REGISTERFORMS_URL}`; diff --git a/Front-End/src/components/Inscription/ValidateSubscription.js b/Front-End/src/components/Inscription/ValidateSubscription.js new file mode 100644 index 0000000..536ce23 --- /dev/null +++ b/Front-End/src/components/Inscription/ValidateSubscription.js @@ -0,0 +1,175 @@ +'use client' +import React, { useState, useEffect } from 'react'; +import { DocusealBuilder } from '@docuseal/react'; +import Button from '@/components/Button'; +import { BASE_URL } from '@/utils/Url'; +import { generateToken } from '@/app/actions/registerFileGroupAction'; +import logger from '@/utils/logger'; +import { GraduationCap, CloudUpload } from 'lucide-react'; + +export default function ValidateSubscription({ studentId, firstName, lastName, paymentMode, file, onAccept }) { + const [token, setToken] = useState(null); + const [uploadedFileName, setUploadedFileName] = useState(''); + const [pdfUrl, setPdfUrl] = useState(`${BASE_URL}/${file}`); + const [isSepa, setIsSepa] = useState(paymentMode === '1'); // Vérifie si le mode de paiement est SEPA + const [currentPage, setCurrentPage] = useState(1); // Gestion des pages + + useEffect(() => { + if (isSepa) { + generateToken('n3wt.school@gmail.com') + .then((data) => { + setToken(data.token); + }) + .catch((error) => logger.error('Erreur lors de la génération du token:', error)); + } + }, [isSepa]); + + const handleUpload = (detail) => { + logger.debug('Uploaded file detail:', detail); + setUploadedFileName(detail.name); + }; + + const handleAccept = () => { + const fileInput = document.getElementById('fileInput'); // Récupère l'élément input + const file = fileInput?.files[0]; // Récupère le fichier sélectionné + + if (!file) { + logger.error('Aucun fichier sélectionné pour le champ SEPA.'); + return; + } + + const data = { + status: 7, + sepa_file: file, + }; + + // Appeler la fonction passée par le parent pour mettre à jour le RF + onAccept(data); + }; + + const handleRefuse = () => { + logger.debug('Dossier refusé pour l\'étudiant:', studentId); + // Logique pour refuser l'inscription + }; + + const isValidateButtonDisabled = isSepa && !uploadedFileName; + + const goToNextPage = () => { + if (currentPage < (isSepa ? 2 : 1)) { + setCurrentPage(currentPage + 1); + } + }; + + const goToPreviousPage = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + return ( +
+ {/* Titre */} +
+
+ +
+
+

+ Dossier scolaire de {firstName} {lastName} +

+

+ Année scolaire {new Date().getFullYear()}-{new Date().getFullYear() + 1} +

+
+
+ + {/* Contenu principal */} + {currentPage === 1 && ( +
+