feat: Refactoring de la fonction de création de profil sur guardian côté

FRONT
This commit is contained in:
N3WT DE COMPET
2025-03-11 21:58:09 +01:00
parent 023b46e16e
commit 753a8d647e
18 changed files with 326 additions and 386 deletions

View File

@ -27,14 +27,12 @@ import {
FE_ADMIN_SETTINGS_URL
} from '@/utils/Url';
import { disconnect, getUser } from '@/app/actions/authAction';
import { disconnect } from '@/app/actions/authAction';
import { useSession } from 'next-auth/react';
import { fetchEstablishment } from '@/app/actions/schoolAction';
import ProtectedRoute from '@/components/ProtectedRoute';
import { getGravatarUrl } from '@/utils/gravatar';
import Footer from '@/components/Footer';
import { getRightStr, RIGHTS } from '@/utils/rights';
import { getSession } from 'next-auth/react';
import logger from '@/utils/logger';
import { useEstablishment } from '@/context/EstablishmentContext';
@ -53,12 +51,10 @@ export default function Layout({
"settings": { "id": "settings", "name": t('settings'), "url": FE_ADMIN_SETTINGS_URL, "icon": Settings }
};
const [establishments, setEstablishments] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [isPopupVisible, setIsPopupVisible] = useState(false);
const [user, setUser] = useState(null);
const { data: session } = useSession();
const { selectedEstablishmentId, setSelectedEstablishmentId, profileRole, setProfileRole } = useEstablishment();
const { selectedEstablishmentId, setSelectedEstablishmentId, profileRole, setProfileRole, establishments, user } = useEstablishment();
const pathname = usePathname();
const currentPage = pathname.split('/').pop();
@ -108,39 +104,6 @@ export default function Layout({
setIsSidebarOpen(false);
}, [pathname]);
useEffect(() => {
getSession()
.then(session => {
if (session && session.user) {
setUser(session.user);
setEstablishments(session.user.roles.map(role => ({
id: role.establishment__id,
name: role.establishment__name,
role_type: role.role_type
})));
// Sélectionner l'établissement depuis la session ou le premier établissement par défaut
if (!selectedEstablishmentId && session.user.roles.length > 0) {
setSelectedEstablishmentId(session.user.roles[0].establishment__id);
setProfileRole(session.user.roles[0].role_type);
}
}
})
.catch(err => {
logger.error('Error fetching session:', err);
});
}, []);
useEffect(() => {
const fetchUser = async () => {
if (session) { // Vérifier que la session existe
const userData = await getUser();
setUser(userData);
}
};
fetchUser();
}, [session]);
return (
<ProtectedRoute requiredRight={RIGHTS.ADMIN}>
{!isLoading && (

View File

@ -306,7 +306,7 @@ export default function Page() {
{
id: 'Files',
label: 'Documents d\'inscription',
content: <FilesGroupsManagement csrfToken={csrfToken} />
content: <FilesGroupsManagement csrfToken={csrfToken} selectedEstablishmentId={selectedEstablishmentId} />
}
];

View File

@ -369,164 +369,85 @@ useEffect(()=>{
const allFeesIds = [...selectedRegistrationFeesIds, ...selectedTuitionFeesIds];
const allDiscountsds = [...selectedRegistrationDiscountsIds, ...selectedTuitionDiscountsIds];
if (updatedData.selectedGuardians.length !== 0) {
const selectedGuardiansIds = updatedData.selectedGuardians.map(guardianId => guardianId)
const guardianEmail = updatedData.guardianEmail
const data = {
student: {
last_name: updatedData.studentLastName,
first_name: updatedData.studentFirstName,
const data = {
student: {
last_name: updatedData.studentLastName,
first_name: updatedData.studentFirstName,
guardians: updatedData.selectedGuardians.length !== 0 ? updatedData.selectedGuardians.map(guardianId => ({ id: guardianId })) : [{
profile_role: {
establishment: selectedEstablishmentId,
role_type: 2,
is_active: false,
profile: {
email: updatedData.guardianEmail,
password: 'Provisoire01!',
username: updatedData.guardianEmail,
}
},
idGuardians: selectedGuardiansIds,
fees: allFeesIds,
discounts: allDiscountsds,
fileGroup: selectedFileGroup,
establishment: ESTABLISHMENT_ID
};
last_name: updatedData.guardianLastName,
first_name: updatedData.guardianFirstName,
birth_date: updatedData.guardianBirthDate,
address: updatedData.guardianAddress,
phone: updatedData.guardianPhone,
profession: updatedData.guardianProfession
}],
sibling: []
},
fees: allFeesIds,
discounts: allDiscountsds,
fileGroup: selectedFileGroup,
establishment: selectedEstablishmentId
};
createRegisterForm(data, csrfToken)
.then(data => {
// 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.id, guardianEmail, templateMaster.is_required)
.then(clonedDocument => {
// Sauvegarde des templates clonés dans la base de données
const cloneData = {
name: `clone_${clonedDocument.id}`,
slug: clonedDocument.slug,
id: clonedDocument.id,
master: templateMaster.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);
});
} else {
const data = {
email: updatedData.guardianEmail,
password: 'Provisoire01!',
username: updatedData.guardianEmail,
is_active: 0,
droit: 2
}
createProfile(data, csrfToken)
.then(response => {
if (response.id) {
const data = {
student: {
last_name: updatedData.studentLastName,
first_name: updatedData.studentFirstName,
guardians: [{
email: updatedData.guardianEmail,
phone: updatedData.guardianPhone,
associated_profile: response.id
}],
sibling: []
},
fees: allFeesIds,
discounts: allDiscountsds,
fileGroup: selectedFileGroup,
establishment: ESTABLISHMENT_ID
createRegisterForm(data, csrfToken)
.then(data => {
// 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.id, updatedData.guardianEmail, templateMaster.is_required)
.then(clonedDocument => {
// Sauvegarde des templates clonés dans la base de données
const cloneData = {
name: `clone_${clonedDocument.id}`,
slug: clonedDocument.slug,
id: clonedDocument.id,
master: templateMaster.id,
registration_form: data.student.id
};
createRegisterForm(data, csrfToken)
.then(data => {
// 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.id, updatedData.guardianEmail, templateMaster.is_required)
.then(clonedDocument => {
// Sauvegarde des templates clonés dans la base de données
const cloneData = {
name: `clone_${clonedDocument.id}`,
slug: clonedDocument.slug,
id: clonedDocument.id,
master: templateMaster.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);
});
return createRegistrationTemplates(cloneData, csrfToken)
.then(response => {
logger.debug('Template enregistré avec succès:', response);
})
.catch((error) => {
logger.error('Error:', error);
deleteProfile(response.id, csrfToken)
.then(() => {
logger.debug('Profile deleted due to RF creation failure');
})
.catch(deleteError => {
logger.error('Error deleting profile:', deleteError);
});
.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:', error);
logger.error('Error during cloning or sending:', error);
});
}
})
.catch((error) => {
logger.error('Error:', error);
});
}
const columns = [

View File

@ -8,7 +8,7 @@ import Logo from '@/components/Logo'; // Ajout de l'importation du composant Log
import { FE_PARENTS_HOME_URL,FE_PARENTS_MESSAGERIE_URL,FE_PARENTS_SETTINGS_URL } from '@/utils/Url'; // Ajout de l'importation de l'URL de la page d'accueil parent
import { fetchMessages } from '@/app/actions/messagerieAction';
import ProtectedRoute from '@/components/ProtectedRoute';
import { disconnect, getUser } from '@/app/actions/authAction';
import { disconnect } from '@/app/actions/authAction';
import Popup from '@/components/Popup';
import logger from '@/utils/logger';
import { useSession } from 'next-auth/react';
@ -36,19 +36,7 @@ export default function Layout({
const confirmDisconnect = () => {
setIsPopupVisible(false);
disconnect();
};
useEffect(() => {
const fetchUser = async () => {
if (session) { // Vérifier que la session existe
const userData = await getUser();
setUser(userData);
}
};
fetchUser();
}, [session]);
};
// useEffect(() => {
// if (status === 'loading') return;

View File

@ -179,31 +179,3 @@ export const getResetPassword = (uuid) => {
},
}).then(requestResponseHandler);
};
/**
* Récupère les informations de l'utilisateur connecté depuis la session
* @returns {Promise} Les données de l'utilisateur
*/
export const getUser = async () => {
try {
const session = await getSession();
if (!session || !session.user) {
return null;
}
return {
id: session.user.user_id,
email: session.user.email,
roles: session.user.roles.map(role => ({
role_type: role.role_type,
establishment_id: role.establishment__id,
establishment_name: role.establishment__name
}))
};
} catch (error) {
console.error('Error getting user from session:', error);
throw error;
}
};

View File

@ -17,8 +17,8 @@ const requestResponseHandler = async (response) => {
throw error;
}
export async function fetchRegistrationFileGroups() {
const response = await fetch(`${BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL}`, {
export async function fetchRegistrationFileGroups(establishment) {
const response = await fetch(`${BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL}?establishment_id=${establishment}`, {
credentials: 'include',
headers: {
'Accept': 'application/json',