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:
Manus Sandbox
2025-11-19 09:59:37 -05:00
parent 16351ea3d5
commit 4bf589dde3
15 changed files with 1778 additions and 4 deletions

View File

@@ -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
*/