v11: affectation établissements depuis Admin + filtrage par rôle + icônes solutions vertes [1777031753]
This commit is contained in:
82
server/db.ts
82
server/db.ts
@@ -183,6 +183,21 @@ export async function searchEtablissements(filters: {
|
||||
if (filters.sonumRole !== "gestionnaire") {
|
||||
conditions.push(eq(etablissements.visibilite, "tous"));
|
||||
}
|
||||
|
||||
// Filtrage par affectations : les adhérents ne voient que leurs établissements affectés
|
||||
if (filters.sonumRole === "adherent" && filters.userId) {
|
||||
const affectations = await getAffectationsByUser(filters.userId);
|
||||
if (affectations.length === 0) {
|
||||
return []; // Aucun établissement affecté
|
||||
}
|
||||
conditions.push(inArray(etablissements.id, affectations));
|
||||
}
|
||||
|
||||
// Filtrage par référent : les référents ne voient que leurs établissements
|
||||
if (filters.sonumRole === "referent" && filters.userId) {
|
||||
conditions.push(eq(etablissements.referentId, filters.userId));
|
||||
}
|
||||
|
||||
if (filters.region) conditions.push(eq(etablissements.region, filters.region));
|
||||
if (filters.typeActivite) conditions.push(eq(etablissements.typeActivite, filters.typeActivite));
|
||||
if (filters.tailleEffectifs) conditions.push(eq(etablissements.tailleEffectifs, filters.tailleEffectifs));
|
||||
@@ -949,3 +964,70 @@ export async function getStatistiques() {
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
// ─── Affectations depuis l'établissement ─────────────────────────────────────
|
||||
|
||||
/**
|
||||
* Retourne les utilisateurs (adhérents + référent) associés à un établissement.
|
||||
*/
|
||||
export async function getUsersForEtablissement(etablissementId: number) {
|
||||
const db = await getDb();
|
||||
if (!db) return { adherents: [], referentId: null as number | null };
|
||||
|
||||
// Adhérents affectés via user_etablissements
|
||||
const adherentsRows = await db
|
||||
.select({
|
||||
id: users.id,
|
||||
name: users.name,
|
||||
firstName: users.firstName,
|
||||
lastName: users.lastName,
|
||||
email: users.email,
|
||||
sonumRole: users.sonumRole,
|
||||
})
|
||||
.from(userEtablissements)
|
||||
.innerJoin(users, eq(userEtablissements.userId, users.id))
|
||||
.where(eq(userEtablissements.etablissementId, etablissementId));
|
||||
|
||||
// Référent via etablissements.referentId
|
||||
const etabRow = await db
|
||||
.select({ referentId: etablissements.referentId })
|
||||
.from(etablissements)
|
||||
.where(eq(etablissements.id, etablissementId))
|
||||
.limit(1);
|
||||
|
||||
return {
|
||||
adherents: adherentsRows,
|
||||
referentId: etabRow[0]?.referentId ?? null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Définit le référent numérique d'un établissement.
|
||||
*/
|
||||
export async function setReferentForEtablissement(etablissementId: number, referentId: number | null) {
|
||||
const db = await getDb();
|
||||
if (!db) return;
|
||||
await db
|
||||
.update(etablissements)
|
||||
.set({ referentId: referentId ?? undefined })
|
||||
.where(eq(etablissements.id, etablissementId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remplace tous les adhérents affectés à un établissement.
|
||||
*/
|
||||
export async function setAdherentsForEtablissement(etablissementId: number, userIds: number[]) {
|
||||
const db = await getDb();
|
||||
if (!db) return;
|
||||
// Supprimer les affectations existantes pour cet établissement (seulement les adhérents)
|
||||
// On supprime toutes les lignes user_etablissements pour cet établissement
|
||||
await db
|
||||
.delete(userEtablissements)
|
||||
.where(eq(userEtablissements.etablissementId, etablissementId));
|
||||
// Réinsérer
|
||||
if (userIds.length > 0) {
|
||||
await db.insert(userEtablissements).values(
|
||||
userIds.map((uid) => ({ userId: uid, etablissementId }))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,9 @@ import {
|
||||
removeEtablissementFromUser,
|
||||
repondreDemandeContact,
|
||||
setAffectationsForUser,
|
||||
getUsersForEtablissement,
|
||||
setReferentForEtablissement,
|
||||
setAdherentsForEtablissement,
|
||||
updateLocalPassword,
|
||||
updateUser,
|
||||
updateUserCgu,
|
||||
@@ -564,6 +567,33 @@ export const appRouter = router({
|
||||
await removeEtablissementFromUser(input.userId, input.etablissementId);
|
||||
return { success: true };
|
||||
}),
|
||||
|
||||
/** Retourne les utilisateurs (adhérents + référent) d'un établissement */
|
||||
getUsersForEtablissement: gestionnaireProcedure
|
||||
.input(z.object({ etablissementId: z.number().int() }))
|
||||
.query(({ input }) => getUsersForEtablissement(input.etablissementId)),
|
||||
|
||||
/** Définit le référent numérique d'un établissement */
|
||||
setReferentForEtablissement: gestionnaireProcedure
|
||||
.input(z.object({
|
||||
etablissementId: z.number().int(),
|
||||
referentId: z.number().int().nullable(),
|
||||
}))
|
||||
.mutation(async ({ input }) => {
|
||||
await setReferentForEtablissement(input.etablissementId, input.referentId);
|
||||
return { success: true };
|
||||
}),
|
||||
|
||||
/** Remplace tous les adhérents affectés à un établissement */
|
||||
setAdherentsForEtablissement: gestionnaireProcedure
|
||||
.input(z.object({
|
||||
etablissementId: z.number().int(),
|
||||
userIds: z.array(z.number().int()),
|
||||
}))
|
||||
.mutation(async ({ input }) => {
|
||||
await setAdherentsForEtablissement(input.etablissementId, input.userIds);
|
||||
return { success: true };
|
||||
}),
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user