v11: affectation établissements depuis Admin + filtrage par rôle + icônes solutions vertes [1777031753]

This commit is contained in:
Manus Deploy
2026-04-24 07:55:53 -04:00
parent 968b6ca2a3
commit 43a85f6150
4 changed files with 371 additions and 36 deletions

View File

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