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 }))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user