Checkpoint: Trois améliorations majeures pour la gestion des séquences :
✅ **1. Indicateur visuel de remplissage** - Composant CapacityProgressBar avec barre de progression colorée - Affichage "X / Y" avec pourcentage - Couleurs automatiques : vert (<70%), orange (70-90%), rouge (>90%) - Intégré dans la colonne capacité du tableau des séquences ✅ **2. Vue calendrier mensuel** - Nouvelle page AdminCalendrier accessible depuis le menu - Calendrier mensuel avec navigation (mois précédent/suivant, aujourd'hui) - Affichage des séquences sur leurs dates respectives - Dialog de détails au clic sur une séquence - Vue complète avec toutes les informations (lieu, formateur, capacité, dates) ✅ **3. Système de rappels automatiques personnalisables** - Tables rappels et rappelsEnvoyes créées - Procédures tRPC complètes (list, create, update, delete) - Page AdminRappels avec interface de gestion - Configuration de rappels multiples (J-15, J-7, J-1, etc.) - Templates d'emails personnalisables avec variables dynamiques - Activation/désactivation des rappels - Infrastructure prête pour l'envoi automatique (nécessite service de planification externe) Ces améliorations facilitent grandement la planification et le suivi des formations.
This commit is contained in:
@@ -158,6 +158,41 @@ export const passwordResetTokens = mysqlTable("passwordResetTokens", {
|
||||
export type PasswordResetToken = typeof passwordResetTokens.$inferSelect;
|
||||
export type InsertPasswordResetToken = typeof passwordResetTokens.$inferInsert;
|
||||
|
||||
/**
|
||||
* Table des rappels automatiques
|
||||
* Configure les rappels à envoyer avant les formations
|
||||
*/
|
||||
export const rappels = mysqlTable("rappels", {
|
||||
id: int("id").autoincrement().primaryKey(),
|
||||
/** Nom du rappel (ex: "Rappel J-15") */
|
||||
nom: varchar("nom", { length: 255 }).notNull(),
|
||||
/** Nombre de jours avant la formation (ex: 15 pour J-15) */
|
||||
joursAvant: int("joursAvant").notNull(),
|
||||
/** Template d'email à utiliser */
|
||||
emailTemplate: text("emailTemplate").notNull(),
|
||||
/** Actif ou non */
|
||||
actif: boolean("actif").default(true).notNull(),
|
||||
createdAt: timestamp("createdAt").defaultNow().notNull(),
|
||||
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
|
||||
});
|
||||
|
||||
export type Rappel = typeof rappels.$inferSelect;
|
||||
export type InsertRappel = typeof rappels.$inferInsert;
|
||||
|
||||
/**
|
||||
* Table des envois de rappels
|
||||
* Historique des rappels envoyés pour éviter les doublons
|
||||
*/
|
||||
export const rappelsEnvoyes = mysqlTable("rappelsEnvoyes", {
|
||||
id: int("id").autoincrement().primaryKey(),
|
||||
rappelId: int("rappelId").notNull(),
|
||||
inscriptionId: int("inscriptionId").notNull(),
|
||||
dateEnvoi: timestamp("dateEnvoi").defaultNow().notNull(),
|
||||
});
|
||||
|
||||
export type RappelEnvoye = typeof rappelsEnvoyes.$inferSelect;
|
||||
export type InsertRappelEnvoye = typeof rappelsEnvoyes.$inferInsert;
|
||||
|
||||
/**
|
||||
* Table des templates d'emails personnalisables
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user