Checkpoint: Implémentation de l'émargement formateur par QR code avec signature tactile

Modifications principales :
- Ajout des champs typeUtilisateur et formateurId dans la table presences pour distinguer formateurs et apprenants
- Détection automatique du rôle (formateur/apprenant) via l'email lors du scan du QR code
- Interface de signature tactile réutilisée pour les formateurs
- Intégration des signatures tactiles formateur dans la génération PDF de la feuille de présence
- QR code dans l'espace formateur accessible pour l'émargement
- Tests unitaires validés avec succès

Le système permet maintenant aux formateurs d'émarger (matin et après-midi) via le même QR code que les apprenants, avec détection automatique du rôle et intégration des signatures dans le PDF.
This commit is contained in:
Manus
2026-02-02 13:24:08 -05:00
parent eebcb64848
commit e8410230a9
11 changed files with 2765 additions and 75 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -120,6 +120,13 @@
"when": 1770047974825,
"tag": "0016_aromatic_king_cobra",
"breakpoints": true
},
{
"idx": 17,
"version": "5",
"when": 1770056161269,
"tag": "0017_lethal_namor",
"breakpoints": true
}
]
}

View File

@@ -414,8 +414,12 @@ export type InsertSupportFormation = typeof supportsFormation.$inferInsert;
*/
export const presences = mysqlTable("presences", {
id: int("id").autoincrement().primaryKey(),
inscriptionId: int("inscriptionId").notNull(),
inscriptionId: int("inscriptionId"),
dateFormationId: int("dateFormationId").notNull(),
/** Type d'utilisateur qui s'émarge (apprenant ou formateur) */
typeUtilisateur: mysqlEnum("typeUtilisateur", ["apprenant", "formateur"]).notNull().default("apprenant"),
/** ID du formateur (si typeUtilisateur = formateur) */
formateurId: int("formateurId"),
/** Période de la journée (matin ou après-midi) */
periode: mysqlEnum("periode", ["matin", "apres_midi"]).notNull().default("matin"),
heurePresence: timestamp("heurePresence").defaultNow().notNull(),
@@ -424,7 +428,7 @@ export const presences = mysqlTable("presences", {
/** ID de l'utilisateur qui a validé (formateur ou admin) */
validateurId: int("validateurId"),
commentaire: text("commentaire"),
/** URL de la signature manuscrite de l'apprenant */
/** URL de la signature manuscrite (apprenant ou formateur) */
signatureUrl: varchar("signatureUrl", { length: 500 }),
/** Clé S3 de la signature manuscrite */
signatureS3Key: varchar("signatureS3Key", { length: 500 }),