feat: Ajout d'un nouveau status avec envoi de mandat SEPA + envoi de

mail
This commit is contained in:
N3WT DE COMPET
2025-04-11 20:02:03 +02:00
parent 4f774c18e4
commit 4c2e2f8756
17 changed files with 415 additions and 81 deletions

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Finalisation de l'inscription</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
background-color: #f4f4f4;
padding: 10px;
text-align: center;
}
.content {
padding: 20px;
}
.footer {
font-size: 12px;
text-align: center;
margin-top: 30px;
color: #777;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Finalisation de l'inscription</h1>
</div>
<div class="content">
<p>Bonjour,</p>
<p>Un mandat de prélèvement SEPA vous a été envoyé</p>
<p>Le document est à votre disposition sur votre espace parent : <a href="{{BASE_URL}}/users/login">{{BASE_URL}}/users/login</a></p>
<p>Merci de compléter puis de signer le document afin de valider votre inscription</p>
<p>Cordialement,</p>
<p>L'équipe N3wt School</p>
</div>
<div class="footer">
<p>Ce message est généré automatiquement, merci de ne pas y répondre.</p>
</div>
</div>
</body>
</html>

View File

@ -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)