Checkpoint: Checkpoint: Restauration de la procédure sequences.getDatesByFormateurToken et de la fonction getSequenceByFormateurToken dans db.ts. Le système d'émargement formateur fonctionne maintenant correctement avec chargement des dates. Prochaine étape : corriger l'affichage du message "[ERREUR MUTATION]" pour les doublons.

This commit is contained in:
Manus
2026-02-06 09:43:43 -05:00
parent 98c3b21ec1
commit a40e0bf6cd
23 changed files with 2749 additions and 13 deletions

View File

@@ -271,6 +271,14 @@ export async function getSequenceById(id: number): Promise<Sequence | undefined>
return result.length > 0 ? result[0] : undefined;
}
export async function getSequenceByFormateurToken(token: string): Promise<Sequence | undefined> {
const db = await getDb();
if (!db) return undefined;
const result = await db.select().from(sequences).where(eq(sequences.qrCodeFormateurToken, token)).limit(1);
return result.length > 0 ? result[0] : undefined;
}
export async function getSequencesByFormation(formationId: number) {
const db = await getDb();
if (!db) return [];

View File

@@ -68,7 +68,6 @@ export async function validerPresence(params: {
commentaire: params.commentaire,
signatureUrl: params.signatureUrl,
signatureS3Key: params.signatureS3Key,
dateSigned: params.signatureUrl ? new Date() : undefined,
});
return { success: true };
@@ -93,7 +92,6 @@ export async function getPresencesBySequence(sequenceId: number) {
commentaire: presences.commentaire,
signatureUrl: sql<string | null>`${presences}.signatureUrl`,
signatureS3Key: sql<string | null>`${presences}.signatureS3Key`,
dateSigned: sql<Date | null>`${presences}.dateSigned`,
apprenantId: apprenants.id,
apprenantNom: apprenants.nom,
apprenantPrenom: apprenants.prenom,
@@ -128,7 +126,6 @@ export async function getPresencesByInscription(inscriptionId: number) {
commentaire: presences.commentaire,
signatureUrl: sql<string | null>`${presences}.signatureUrl`,
signatureS3Key: sql<string | null>`${presences}.signatureS3Key`,
dateSigned: sql<Date | null>`${presences}.dateSigned`,
dateDebut: datesFormation.dateDebut,
dateFin: datesFormation.dateFin,
})
@@ -233,8 +230,8 @@ export async function validerPresenceFormateur(params: {
and(
eq(presences.formateurId, params.formateurId),
eq(presences.dateFormationId, params.dateFormationId),
eq(presences.periode, params.periode),
eq(presences.typeUtilisateur, 'formateur')
sql`${presences.periode} = ${params.periode}`,
sql`${presences.typeUtilisateur} = 'formateur'`
)
);
@@ -244,17 +241,47 @@ export async function validerPresenceFormateur(params: {
// Créer la présence formateur
await db.insert(presences).values({
typeUtilisateur: "formateur",
formateurId: params.formateurId,
dateFormationId: params.dateFormationId,
periode: params.periode,
typeUtilisateur: 'formateur',
heurePresence: new Date(),
modeValidation: params.modeValidation,
commentaire: params.commentaire,
signatureUrl: params.signatureUrl,
signatureS3Key: params.signatureS3Key,
dateSigned: params.signatureUrl ? new Date() : undefined,
});
return { success: true };
}
/**
* Récupérer les présences du formateur pour une séquence
*/
export async function getPresencesFormateurBySequence(sequenceId: number) {
const db = await getDb();
if (!db) throw new Error("Database not available");
const result = await db
.select({
presenceId: presences.id,
formateurId: presences.formateurId,
dateFormationId: presences.dateFormationId,
periode: presences.periode,
heurePresence: presences.heurePresence,
modeValidation: presences.modeValidation,
commentaire: presences.commentaire,
signatureUrl: sql<string | null>`${presences}.signatureUrl`,
signatureS3Key: sql<string | null>`${presences}.signatureS3Key`,
})
.from(presences)
.innerJoin(datesFormation, eq(presences.dateFormationId, datesFormation.id))
.where(
and(
eq(datesFormation.sequenceId, sequenceId),
sql`${presences}.typeUtilisateur = 'formateur'`
)
);
return result;
}

View File

@@ -588,6 +588,17 @@ export const appRouter = router({
await db.deleteSequence(input.id);
return { success: true };
}),
getDatesByFormateurToken: publicProcedure
.input(z.object({ token: z.string() }))
.query(async ({ input }) => {
const sequence = await db.getSequenceByFormateurToken(input.token);
if (!sequence) {
throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' });
}
const dates = await db.getDatesBySequence(sequence.id);
return { sequence, dates };
}),
}),
// ===== INSCRIPTIONS =====