feat: Création de clones lors de la création de RF [#22]

This commit is contained in:
N3WT DE COMPET
2025-03-01 17:50:54 +01:00
parent b97cf6e02b
commit d1a0067f7b
7 changed files with 145 additions and 64 deletions

View File

@ -28,7 +28,10 @@ import {
editRegisterForm } from "@/app/actions/subscriptionAction"
import {
fetchRegistrationTemplateMaster
fetchRegistrationTemplateMaster,
createRegistrationTemplates,
fetchRegistrationFileGroups,
cloneTemplate
} from "@/app/actions/registerFileGroupAction";
import {
@ -38,7 +41,7 @@ import {
fetchRegistrationFees,
fetchTuitionFees } from '@/app/actions/schoolAction';
import { createProfile } from '@/app/actions/authAction';
import { createProfile, deleteProfile } from '@/app/actions/authAction';
import {
BASE_URL,
@ -46,7 +49,6 @@ import {
import DjangoCSRFToken from '@/components/DjangoCSRFToken'
import { useCsrfToken } from '@/context/CsrfContext';
import { fetchRegistrationFileGroups } from '@/app/actions/registerFileGroupAction';
import { ESTABLISHMENT_ID } from '@/utils/Url';
import logger from '@/utils/logger';
@ -71,7 +73,7 @@ export default function Page({ params: { locale } }) {
const [totalArchives, setTotalArchives] = useState(0);
const [itemsPerPage, setItemsPerPage] = useState(5); // Définir le nombre d'éléments par page
const [fichiers, setFichiers] = useState([]);
const [templateMasters, setTemplateMasters] = useState([]);
const [isOpen, setIsOpen] = useState(false);
const [isOpenAffectationClasse, setIsOpenAffectationClasse] = useState(false);
const [student, setStudent] = useState('');
@ -202,7 +204,7 @@ useEffect(() => {
.then((data)=> {
logger.debug(data);
setFichiers(data)
setTemplateMasters(data)
})
.catch((err)=>{ err = err.message; logger.debug(err);})
fetchRegistrationDiscounts()
@ -258,7 +260,7 @@ useEffect(() => {
.then(registerFormArchivedDataHandler)
.catch(requestErrorHandler)
fetchRegistrationTemplateMaster()
.then((data)=> {setFichiers(data)})
.then((data)=> {setTemplateMasters(data)})
.catch((err)=>{ err = err.message; logger.debug(err);});
} else {
setTimeout(() => {
@ -365,6 +367,8 @@ useEffect(()=>{
if (updatedData.selectedGuardians.length !== 0) {
const selectedGuardiansIds = updatedData.selectedGuardians.map(guardianId => guardianId)
const guardianEmail = updatedData.guardianEmail
const data = {
student: {
last_name: updatedData.studentLastName,
@ -379,15 +383,48 @@ useEffect(()=>{
createRegisterForm(data, csrfToken)
.then(data => {
// Mise à jour immédiate des données
setRegistrationFormsDataPending(prevState => [...(prevState || []), data]);
setTotalPending(prev => prev + 1);
if (updatedData.autoMail) {
sendConfirmRegisterForm(data.student.id, updatedData.studentLastName, updatedData.studentFirstName);
}
closeModal();
// Forcer le rechargement complet des données
setReloadFetch(true);
// Cloner les templates pour chaque templateMaster du fileGroup
const masters = templateMasters.filter(file => file.groups.includes(selectedFileGroup));
const clonePromises = masters.map((templateMaster, index) => {
return cloneTemplate(templateMaster.template_id, guardianEmail)
.then(clonedDocument => {
// Sauvegarde des templates clonés dans la base de données
const cloneData = {
name: `clone_${clonedDocument.id}`,
template_id: clonedDocument.id,
master: templateMaster.template_id,
registration_form: data.student.id
};
return createRegistrationTemplates(cloneData, csrfToken)
.then(response => {
logger.debug('Template enregistré avec succès:', response);
})
.catch(error => {
logger.error('Erreur lors de l\'enregistrement du template:', error);
});
})
.catch(error => {
logger.error('Error during cloning or sending:', error);
});
});
// Attendre que tous les clones soient créés
Promise.all(clonePromises)
.then(() => {
// Mise à jour immédiate des données
setRegistrationFormsDataPending(prevState => [...(prevState || []), data]);
setTotalPending(prev => prev + 1);
if (updatedData.autoMail) {
sendConfirmRegisterForm(data.student.id, updatedData.studentLastName, updatedData.studentFirstName);
}
closeModal();
// Forcer le rechargement complet des données
setReloadFetch(true);
})
.catch(error => {
logger.error('Error during cloning or sending:', error);
});
})
.catch((error) => {
logger.error('Error:', error);
@ -423,20 +460,60 @@ useEffect(()=>{
createRegisterForm(data, csrfToken)
.then(data => {
// Mise à jour immédiate des données
setRegistrationFormsDataPending(prevState => [...(prevState || []), data]);
setTotalPending(prev => prev + 1);
if (updatedData.autoMail) {
sendConfirmRegisterForm(data.student.id, updatedData.studentLastName, updatedData.studentFirstName);
}
closeModal();
logger.debug('Success:', data);
// Forcer le rechargement complet des données
setReloadFetch(true);
// Cloner les templates pour chaque templateMaster du fileGroup
const masters = templateMasters.filter(file => file.groups.includes(selectedFileGroup));
const clonePromises = masters.map((templateMaster, index) => {
return cloneTemplate(templateMaster.template_id, updatedData.guardianEmail)
.then(clonedDocument => {
// Sauvegarde des templates clonés dans la base de données
const cloneData = {
name: `clone_${clonedDocument.id}`,
template_id: clonedDocument.id,
master: templateMaster.template_id,
registration_form: data.student.id
};
return createRegistrationTemplates(cloneData, csrfToken)
.then(response => {
logger.debug('Template enregistré avec succès:', response);
})
.catch(error => {
logger.error('Erreur lors de l\'enregistrement du template:', error);
});
})
.catch(error => {
logger.error('Error during cloning or sending:', error);
});
});
// Attendre que tous les clones soient créés
Promise.all(clonePromises)
.then(() => {
// Mise à jour immédiate des données
setRegistrationFormsDataPending(prevState => [...(prevState || []), data]);
setTotalPending(prev => prev + 1);
if (updatedData.autoMail) {
sendConfirmRegisterForm(data.student.id, updatedData.studentLastName, updatedData.studentFirstName);
}
closeModal();
logger.debug('Success:', data);
// Forcer le rechargement complet des données
setReloadFetch(true);
})
.catch(error => {
logger.error('Error during cloning or sending:', error);
});
})
.catch((error) => {
logger.error('Error:', error);
//deleteProfile(response.id, csrfToken);
deleteProfile(response.id, csrfToken)
.then(() => {
logger.debug('Profile deleted due to RF creation failure');
})
.catch(deleteError => {
logger.error('Error deleting profile:', deleteError);
});
});
}
})

View File

@ -89,6 +89,20 @@ export const createProfile = (data, csrfToken) => {
return fetch(request).then(requestResponseHandler);
};
export const deleteProfile = (id, csrfToken) => {
const request = new Request(
`${BE_AUTH_PROFILES_URL}/${id}`,
{
method: 'DELETE',
headers: {
'X-CSRFToken': csrfToken
},
credentials: 'include'
}
);
return fetch(request).then(requestResponseHandler);
};
export const updateProfile = (id, data, csrfToken) => {
const request = new Request(
`${BE_AUTH_PROFILES_URL}/${id}`,

View File

@ -1,6 +1,7 @@
import { BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL,
BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL,
BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL
BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL,
FE_API_DOCUSEAL_CLONE_URL
} from '@/utils/Url';
const requestResponseHandler = async (response) => {
@ -193,4 +194,18 @@ export const editRegistrationTemplateMaster = (fileId, data, csrfToken) => {
credentials: 'include',
})
.then(requestResponseHandler)
}
export const cloneTemplate = (templateId, email) => {
return fetch(`${FE_API_DOCUSEAL_CLONE_URL}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
templateId,
email
})
})
.then(requestResponseHandler)
}