Checkpoint: Corrections multiples :
- Renommage questionnaire.nom → questionnaire.titre dans QuestionnaireReponse.tsx, AdminQuestionnaireEdit.tsx, questionnaireScheduler.ts, questionnaireExport.ts - Correction des requêtes SQL dans questionnaireDb.ts (suppression de la condition complete inexistante) - Ajout des colonnes valeurMin et valeurMax dans la table questions - Renommage de la colonne nom en titre dans la table questionnaires
This commit is contained in:
110
deployment-package/source_server/etablissementsDb.ts
Normal file
110
deployment-package/source_server/etablissementsDb.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
import { eq, sql } from "drizzle-orm";
|
||||
import { getDb } from "./db";
|
||||
import { apprenants, inscriptions } from "../drizzle/schema";
|
||||
|
||||
export async function getEtablissementsStats() {
|
||||
const db = await getDb();
|
||||
if (!db) return [];
|
||||
|
||||
// Récupérer tous les apprenants groupés par établissement
|
||||
const apprenantsData = await db.select().from(apprenants);
|
||||
|
||||
// Grouper par code établissement
|
||||
const etablissementsMap = new Map<string, {
|
||||
codeEtablissement: string;
|
||||
nombreApprenants: number;
|
||||
apprenantsActifs: number;
|
||||
apprenantIds: number[];
|
||||
}>();
|
||||
|
||||
for (const apprenant of apprenantsData) {
|
||||
const code = apprenant.codeEtablissement;
|
||||
|
||||
if (!etablissementsMap.has(code)) {
|
||||
etablissementsMap.set(code, {
|
||||
codeEtablissement: code,
|
||||
nombreApprenants: 0,
|
||||
apprenantsActifs: 0,
|
||||
apprenantIds: [],
|
||||
});
|
||||
}
|
||||
|
||||
const etab = etablissementsMap.get(code)!;
|
||||
etab.nombreApprenants++;
|
||||
etab.apprenantIds.push(apprenant.id);
|
||||
}
|
||||
|
||||
// Pour chaque établissement, compter les apprenants actifs
|
||||
const etablissementsStats = await Promise.all(
|
||||
Array.from(etablissementsMap.values()).map(async (etab) => {
|
||||
// Compter le nombre d'apprenants ayant au moins une inscription
|
||||
const apprenantsActifsCount = await Promise.all(
|
||||
etab.apprenantIds.map(async (apprenantId) => {
|
||||
const inscriptionsData = await db
|
||||
.select()
|
||||
.from(inscriptions)
|
||||
.where(eq(inscriptions.apprenantId, apprenantId))
|
||||
.limit(1);
|
||||
return inscriptionsData.length > 0 ? 1 : 0;
|
||||
})
|
||||
);
|
||||
|
||||
const nombreActifs = apprenantsActifsCount.reduce((sum: number, count) => sum + count, 0);
|
||||
const tauxParticipation = etab.nombreApprenants > 0
|
||||
? Math.round((nombreActifs / etab.nombreApprenants) * 100)
|
||||
: 0;
|
||||
|
||||
return {
|
||||
codeEtablissement: etab.codeEtablissement,
|
||||
nombreApprenants: etab.nombreApprenants,
|
||||
apprenantsActifs: nombreActifs,
|
||||
tauxParticipation,
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
// Trier par nombre d'apprenants décroissant
|
||||
return etablissementsStats.sort((a, b) => b.nombreApprenants - a.nombreApprenants);
|
||||
}
|
||||
|
||||
export async function getEtablissementDetail(codeEtablissement: string) {
|
||||
const db = await getDb();
|
||||
if (!db) return null;
|
||||
|
||||
// Récupérer tous les apprenants de cet établissement
|
||||
const apprenantsData = await db
|
||||
.select()
|
||||
.from(apprenants)
|
||||
.where(eq(apprenants.codeEtablissement, codeEtablissement));
|
||||
|
||||
// Pour chaque apprenant, récupérer ses inscriptions
|
||||
const apprenantsWithInscriptions = await Promise.all(
|
||||
apprenantsData.map(async (apprenant) => {
|
||||
const inscriptionsData = await db
|
||||
.select()
|
||||
.from(inscriptions)
|
||||
.where(eq(inscriptions.apprenantId, apprenant.id));
|
||||
|
||||
return {
|
||||
...apprenant,
|
||||
inscriptions: inscriptionsData,
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
const nombreApprenants = apprenantsData.length;
|
||||
const apprenantsActifs = apprenantsWithInscriptions.filter(
|
||||
(a) => a.inscriptions.length > 0
|
||||
).length;
|
||||
const tauxParticipation = nombreApprenants > 0
|
||||
? Math.round((apprenantsActifs / nombreApprenants) * 100)
|
||||
: 0;
|
||||
|
||||
return {
|
||||
codeEtablissement,
|
||||
nombreApprenants,
|
||||
apprenantsActifs,
|
||||
tauxParticipation,
|
||||
apprenants: apprenantsWithInscriptions,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user