Checkpoint: Correction du bug d'émargement formateur bloqué sur la saisie d'email

- Ajout de la détection automatique formateur/apprenant dans EmargementScan.tsx
- Nouvelle procédure tRPC getSequenceByToken pour récupérer les infos de séquence
- Interface adaptée selon le type d'utilisateur (apprenant ou formateur)
- Déploiement réussi sur le VPS de production

Le système détecte maintenant automatiquement si l'email correspond à un apprenant ou un formateur, et affiche l'interface appropriée pour chaque cas.
This commit is contained in:
Manus
2026-02-02 14:18:46 -05:00
parent e8410230a9
commit f9983adada
81 changed files with 3734 additions and 27745 deletions

View File

@@ -1,85 +0,0 @@
import { eq, ne, and } from "drizzle-orm";
import { inscriptions, apprenants, sequences, datesFormation } from "../drizzle/schema";
import { getDb } from "./db";
/**
* Récupérer les inscriptions d'une séquence avec les dates de formation
*/
export async function getInscriptionsWithDates(sequenceId: number) {
const db = await getDb();
if (!db) return [];
// Récupérer les inscriptions
const results = await db
.select({
inscription: inscriptions,
apprenant: apprenants,
})
.from(inscriptions)
.leftJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id))
.where(
and(
eq(inscriptions.sequenceId, sequenceId),
ne(inscriptions.statut, "annulee")
)
);
// Récupérer les dates de formation pour cette séquence
const dates = await db
.select()
.from(datesFormation)
.where(eq(datesFormation.sequenceId, sequenceId))
.orderBy(datesFormation.ordre);
// Combiner les données
return results.map((r) => ({
...r,
dates,
}));
}
/**
* Récupérer les inscriptions d'un apprenant avec les détails des séquences et dates
*/
export async function getInscriptionsByApprenantWithDates(apprenantId: number) {
const db = await getDb();
if (!db) return [];
// Récupérer les inscriptions
const results = await db
.select({
inscription: inscriptions,
sequence: sequences,
})
.from(inscriptions)
.leftJoin(sequences, eq(inscriptions.sequenceId, sequences.id))
.where(
and(
eq(inscriptions.apprenantId, apprenantId),
ne(inscriptions.statut, "annulee")
)
);
// Pour chaque inscription, récupérer les dates de formation
const resultsWithDates = await Promise.all(
results.map(async (r) => {
if (!r.sequence) return { ...r, dates: [] };
const dates = await db
.select()
.from(datesFormation)
.where(eq(datesFormation.sequenceId, r.sequence.id))
.orderBy(datesFormation.ordre);
return {
...r,
sequence: {
...r.sequence,
dates,
},
};
})
);
return resultsWithDates;
}