mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
fix: conflits + closeModal lors de la création d'un RF
This commit is contained in:
@ -262,21 +262,6 @@ class RegisterFormWithIdView(APIView):
|
||||
registerForm.registration_file = util.rfToPDF(registerForm, initial_pdf)
|
||||
registerForm.save()
|
||||
|
||||
# Récupération des fichiers d'inscription
|
||||
# fileNames = RegistrationSchoolFileTemplate.get_files_from_rf(registerForm.pk)
|
||||
# if registerForm.registration_file:
|
||||
# fileNames.insert(0, registerForm.registration_file.path)
|
||||
|
||||
# # Création du fichier PDF Fusionné
|
||||
# merged_pdf_content = util.merge_files_pdf(fileNames)
|
||||
|
||||
# # Mise à jour du champ registration_file avec le fichier fusionné
|
||||
# registerForm.registration_file.save(
|
||||
# f"dossier_complet.pdf",
|
||||
# File(merged_pdf_content),
|
||||
# save=True
|
||||
# )
|
||||
|
||||
# Mise à jour de l'automate
|
||||
# Vérification de la présence du fichier SEPA
|
||||
if registerForm.sepa_file:
|
||||
@ -295,6 +280,25 @@ class RegisterFormWithIdView(APIView):
|
||||
updateStateMachine(registerForm, 'EVENT_REFUSE')
|
||||
util.delete_registration_files(registerForm)
|
||||
elif _status == RegistrationForm.RegistrationFormStatus.RF_SEPA_SENT:
|
||||
# Vérifier si le paramètre fusion est activé via l'URL
|
||||
fusion = studentForm_data.get('fusion', False)
|
||||
if fusion:
|
||||
# Fusion des documents
|
||||
# Récupération des fichiers d'inscription
|
||||
fileNames = RegistrationSchoolFileTemplate.get_files_from_rf(registerForm.pk)
|
||||
if registerForm.registration_file:
|
||||
fileNames.insert(0, registerForm.registration_file.path)
|
||||
|
||||
# Création du fichier PDF Fusionné
|
||||
merged_pdf_content = util.merge_files_pdf(fileNames)
|
||||
|
||||
# Mise à jour du champ registration_file avec le fichier fusionné
|
||||
registerForm.registration_file.save(
|
||||
f"dossier_complet.pdf",
|
||||
File(merged_pdf_content),
|
||||
save=True
|
||||
)
|
||||
|
||||
# Sauvegarde du mandat SEPA
|
||||
student = registerForm.student
|
||||
guardian = student.getMainGuardian()
|
||||
@ -303,7 +307,7 @@ class RegisterFormWithIdView(APIView):
|
||||
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({"message": f"Le mandat SEPA a bien été envoyé à l'adresse {email}"}, safe=False)
|
||||
return JsonResponse({"errorMessage": errorMessage}, safe=False, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
# Retourner les données mises à jour
|
||||
|
||||
@ -24,7 +24,6 @@ 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,
|
||||
@ -56,8 +55,6 @@ import {
|
||||
} from '@/app/actions/schoolAction';
|
||||
|
||||
import {
|
||||
createProfile,
|
||||
deleteProfile,
|
||||
fetchProfiles,
|
||||
} from '@/app/actions/authAction';
|
||||
|
||||
@ -115,6 +112,9 @@ export default function Page({ params: { locale } }) {
|
||||
const [profiles, setProfiles] = useState([]);
|
||||
const [isOpenAddGuardian, setIsOpenAddGuardian] = useState(false);
|
||||
|
||||
const [isFilesModalOpen, setIsFilesModalOpen] = useState(false);
|
||||
const [selectedRowFiles, setSelectedRowFiles] = useState([]);
|
||||
|
||||
const csrfToken = useCsrfToken();
|
||||
const router = useRouter();
|
||||
const { selectedEstablishmentId } = useEstablishment();
|
||||
@ -141,6 +141,29 @@ export default function Page({ params: { locale } }) {
|
||||
setStudent(eleveSelected);
|
||||
};
|
||||
|
||||
const openFilesModal = (row) => {
|
||||
const files = [];
|
||||
if (row.registration_file) {
|
||||
files.push({
|
||||
name: 'Fichier d\'inscription',
|
||||
url: `${BASE_URL}${row.registration_file}`,
|
||||
});
|
||||
}
|
||||
if (row.sepa_file) {
|
||||
files.push({
|
||||
name: 'Mandat SEPA',
|
||||
url: `${BASE_URL}${row.sepa_file}`,
|
||||
});
|
||||
}
|
||||
setSelectedRowFiles(files);
|
||||
setIsFilesModalOpen(true);
|
||||
};
|
||||
|
||||
const closeFilesModal = () => {
|
||||
setIsFilesModalOpen(false);
|
||||
setSelectedRowFiles([]);
|
||||
};
|
||||
|
||||
const requestErrorHandler = (err)=>{
|
||||
logger.error('Error fetching data:', err);
|
||||
};
|
||||
@ -451,6 +474,7 @@ export default function Page({ params: { locale } }) {
|
||||
|
||||
const createRF = (updatedData) => {
|
||||
logger.debug('createRF updatedData:', updatedData);
|
||||
|
||||
const selectedRegistrationFeesIds =
|
||||
updatedData.selectedRegistrationFees.map((feeId) => feeId);
|
||||
const selectedRegistrationDiscountsIds =
|
||||
@ -538,8 +562,8 @@ export default function Page({ params: { locale } }) {
|
||||
const parent_masters = parentFileMasters.filter((file) =>
|
||||
file.groups.includes(selectedFileGroup)
|
||||
);
|
||||
const clonePromises = masters
|
||||
.map((templateMaster, index) => {
|
||||
|
||||
const clonePromises = masters.map((templateMaster) => {
|
||||
return cloneTemplate(
|
||||
templateMaster.id,
|
||||
updatedData.guardianEmail,
|
||||
@ -555,16 +579,13 @@ export default function Page({ params: { locale } }) {
|
||||
registration_form: data.student.id,
|
||||
};
|
||||
|
||||
return createRegistrationSchoolFileTemplate(
|
||||
cloneData,
|
||||
csrfToken
|
||||
)
|
||||
return createRegistrationSchoolFileTemplate(cloneData, csrfToken)
|
||||
.then((response) => {
|
||||
logger.debug('Template enregistré avec succès:', response);
|
||||
})
|
||||
.catch((error) => {
|
||||
logger.error(
|
||||
"Erreur lors de l'enregistrement du template:",
|
||||
'Erreur lors de l\'enregistrement du template:',
|
||||
error
|
||||
);
|
||||
});
|
||||
@ -572,14 +593,10 @@ export default function Page({ params: { locale } }) {
|
||||
.catch((error) => {
|
||||
logger.error('Error during cloning or sending:', error);
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
logger.error('Error:', error);
|
||||
});
|
||||
|
||||
// Créer les parentFileTemplates pour chaque parentMaster
|
||||
const parentClonePromises = parent_masters.map(
|
||||
(parentMaster, index) => {
|
||||
const parentClonePromises = parent_masters.map((parentMaster) => {
|
||||
const parentTemplateData = {
|
||||
master: parentMaster.id,
|
||||
registration_form: data.student.id,
|
||||
@ -597,15 +614,14 @@ export default function Page({ params: { locale } }) {
|
||||
})
|
||||
.catch((error) => {
|
||||
logger.error(
|
||||
"Erreur lors de l'enregistrement du parent template:",
|
||||
'Erreur lors de l\'enregistrement du parent template:',
|
||||
error
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Attendre que tous les clones soient créés
|
||||
Promise.all(clonePromises)
|
||||
// Attendre que tous les clones (school et parent) soient créés
|
||||
Promise.all([...clonePromises, ...parentClonePromises])
|
||||
.then(() => {
|
||||
// Mise à jour immédiate des données
|
||||
setRegistrationFormsDataPending((prevState) => [
|
||||
@ -620,7 +636,7 @@ export default function Page({ params: { locale } }) {
|
||||
updatedData.studentFirstName
|
||||
);
|
||||
}
|
||||
closeModal();
|
||||
closeModal(); // Appeler closeModal ici après que tout soit terminé
|
||||
// Forcer le rechargement complet des données
|
||||
setReloadFetch(true);
|
||||
})
|
||||
@ -755,6 +771,14 @@ export default function Page({ params: { locale } }) {
|
||||
},
|
||||
],
|
||||
3: [
|
||||
{
|
||||
icon: (
|
||||
<span title="Voir les fichiers">
|
||||
<FileText className="w-5 h-5 text-cyan-500 hover:text-cyan-700" />
|
||||
</span>
|
||||
),
|
||||
onClick: () => openFilesModal(row),
|
||||
},
|
||||
{
|
||||
icon: (
|
||||
<span title="Valider le dossier">
|
||||
@ -781,6 +805,16 @@ export default function Page({ params: { locale } }) {
|
||||
onClick: () => openModalAssociationEleve(row.student),
|
||||
},
|
||||
],
|
||||
7: [
|
||||
{
|
||||
icon: (
|
||||
<span title="Voir les fichiers">
|
||||
<FileText className="w-5 h-5 text-cyan-500 hover:text-cyan-700" />
|
||||
</span>
|
||||
),
|
||||
onClick: () => openFilesModal(row),
|
||||
},
|
||||
],
|
||||
default: [
|
||||
{
|
||||
icon: (
|
||||
@ -1147,6 +1181,30 @@ export default function Page({ params: { locale } }) {
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
{isFilesModalOpen && (
|
||||
<Modal
|
||||
isOpen={isFilesModalOpen}
|
||||
setIsOpen={setIsFilesModalOpen}
|
||||
title="Fichiers disponibles"
|
||||
ContentComponent={() => (
|
||||
<ul className="space-y-4">
|
||||
{selectedRowFiles.map((file, index) => (
|
||||
<li key={index} className="flex items-center gap-2">
|
||||
<FileText className="w-5 h-5 text-gray-500" />
|
||||
<a
|
||||
href={file.url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-blue-500 hover:text-blue-700 underline"
|
||||
>
|
||||
{file.name}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@ -23,10 +23,11 @@ export default function Page() {
|
||||
const handleAcceptRF = (data) => {
|
||||
logger.debug('Mise à jour du RF avec les données:', data);
|
||||
|
||||
const { status, sepa_file } = data;
|
||||
const {status, sepa_file, fusionParam} = data
|
||||
const formData = new FormData();
|
||||
formData.append('status', status); // Ajoute le statut
|
||||
formData.append('sepa_file', sepa_file); // Ajoute le fichier SEPA
|
||||
formData.append('fusion', fusionParam);
|
||||
|
||||
// Appeler l'API pour mettre à jour le RF
|
||||
sendSEPARegisterForm(studentId, formData, csrfToken)
|
||||
|
||||
@ -4,10 +4,7 @@ import Button from '@/components/Button';
|
||||
import ToggleSwitch from '@/components/ToggleSwitch'; // Import du composant ToggleSwitch
|
||||
import { BASE_URL } from '@/utils/Url';
|
||||
import { generateToken } from '@/app/actions/registerFileGroupAction';
|
||||
import {
|
||||
fetchSchoolFileTemplatesFromRegistrationFiles,
|
||||
fetchParentFileTemplatesFromRegistrationFiles,
|
||||
} from '@/app/actions/subscriptionAction';
|
||||
import { fetchSchoolFileTemplatesFromRegistrationFiles, fetchParentFileTemplatesFromRegistrationFiles } from '@/app/actions/subscriptionAction';
|
||||
import logger from '@/utils/logger';
|
||||
import { GraduationCap } from 'lucide-react';
|
||||
import FileUpload from '@/components/FileUpload';
|
||||
@ -50,12 +47,7 @@ export default function ValidateSubscription({
|
||||
setSchoolFileTemplates(data);
|
||||
logger.debug('Fichiers schoolFileTemplates récupérés:', data);
|
||||
})
|
||||
.catch((error) =>
|
||||
logger.error(
|
||||
'Erreur lors de la récupération des schoolFileTemplates:',
|
||||
error
|
||||
)
|
||||
);
|
||||
.catch((error) => logger.error('Erreur lors de la récupération des schoolFileTemplates:', error));
|
||||
|
||||
// Récupérer les fichiers parentFileTemplates pour l'étudiant
|
||||
fetchParentFileTemplatesFromRegistrationFiles(studentId)
|
||||
@ -63,12 +55,7 @@ export default function ValidateSubscription({
|
||||
setParentFileTemplates(data);
|
||||
logger.debug('Fichiers parentFileTemplates récupérés:', data);
|
||||
})
|
||||
.catch((error) =>
|
||||
logger.error(
|
||||
'Erreur lors de la récupération des parentFileTemplates:',
|
||||
error
|
||||
)
|
||||
);
|
||||
.catch((error) => logger.error('Erreur lors de la récupération des parentFileTemplates:', error));
|
||||
}, [studentId]);
|
||||
|
||||
const handleAccept = () => {
|
||||
@ -83,7 +70,7 @@ export default function ValidateSubscription({
|
||||
const data = {
|
||||
status: 7,
|
||||
sepa_file: selectedFile, // Utilise le fichier sélectionné depuis l'état
|
||||
fusionParam: fusionParam,
|
||||
fusionParam: fusionParam
|
||||
};
|
||||
|
||||
// Appeler la fonction passée par le parent pour mettre à jour le RF
|
||||
@ -98,11 +85,7 @@ export default function ValidateSubscription({
|
||||
const isValidateButtonDisabled = isSepa && !uploadedFileName;
|
||||
|
||||
const goToNextPage = () => {
|
||||
const totalPages =
|
||||
1 +
|
||||
schoolFileTemplates.length +
|
||||
parentFileTemplates.length +
|
||||
(isSepa ? 1 : 0);
|
||||
const totalPages = 1 + schoolFileTemplates.length + parentFileTemplates.length + (isSepa ? 1 : 0);
|
||||
if (currentPage < totalPages) {
|
||||
setCurrentPage(currentPage + 1);
|
||||
}
|
||||
@ -114,11 +97,7 @@ export default function ValidateSubscription({
|
||||
}
|
||||
};
|
||||
|
||||
const totalPages =
|
||||
1 +
|
||||
schoolFileTemplates.length +
|
||||
parentFileTemplates.length +
|
||||
(isSepa ? 1 : 0);
|
||||
const totalPages = 1 + schoolFileTemplates.length + parentFileTemplates.length + (isSepa ? 1 : 0);
|
||||
|
||||
const renderContent = () => {
|
||||
if (currentPage === 1) {
|
||||
@ -135,10 +114,7 @@ export default function ValidateSubscription({
|
||||
}}
|
||||
/>
|
||||
);
|
||||
} else if (
|
||||
currentPage > 1 &&
|
||||
currentPage <= 1 + schoolFileTemplates.length
|
||||
) {
|
||||
} else if (currentPage > 1 && currentPage <= 1 + schoolFileTemplates.length) {
|
||||
// Pages des schoolFileTemplates
|
||||
const index = currentPage - 2; // Décalage pour correspondre à l'index du tableau
|
||||
return (
|
||||
@ -153,10 +129,7 @@ export default function ValidateSubscription({
|
||||
}}
|
||||
/>
|
||||
);
|
||||
} else if (
|
||||
currentPage > 1 + schoolFileTemplates.length &&
|
||||
currentPage <= 1 + schoolFileTemplates.length + parentFileTemplates.length
|
||||
) {
|
||||
} else if (currentPage > 1 + schoolFileTemplates.length && currentPage <= 1 + schoolFileTemplates.length + parentFileTemplates.length) {
|
||||
// Pages des parentFileTemplates
|
||||
const index = currentPage - 2 - schoolFileTemplates.length; // Décalage pour correspondre à l'index du tableau
|
||||
return (
|
||||
@ -202,9 +175,7 @@ export default function ValidateSubscription({
|
||||
{/* Option de fusion des documents (affichée uniquement sur la dernière page) */}
|
||||
{currentPage === totalPages && (
|
||||
<div className="flex items-center justify-between mt-6">
|
||||
<span className="text-gray-700">
|
||||
Fusionner les documents en un seul fichier PDF
|
||||
</span>
|
||||
<span className="text-gray-700">Fusionner les documents en un seul fichier PDF</span>
|
||||
<ToggleSwitch
|
||||
label="Fusionner"
|
||||
checked={mergeDocuments}
|
||||
|
||||
Reference in New Issue
Block a user