Checkpoint: Checkpoint saved: Correction complète de la cohérence des types de rappels entre l'interface et le backend :

**Modifications du schéma Drizzle :**
- logsrappels.type : enum('rappel1','rappel2','rappel3','rappel4','rappel5','rappel6')
- emailTemplates.type : enum('inscription','teaser','rappel1','rappel2','rappel3','rappel4','rappel5','rappel6','reset_password')
- rappels.templateType : enum('rappel1','rappel2','rappel3','rappel4','rappel5','rappel6')

**Modifications du code :**
- server/routers.ts : mise à jour des enums Zod
- server/db.ts : renommage des templates par défaut (rappel → rappel1, rappelJ1 → rappel2)
- server/rappelRetry.ts : correction de la condition rappelJ1 → rappel2
- drizzle/schema.ts : mise à jour de tous les enums

**Migration de la base de données MySQL :**
- Script SQL créé et exécuté avec succès sur le VPS
- Migration en 3 étapes : élargir enum → mettre à jour données → restreindre enum
- Toutes les données existantes migrées correctement

**Résultat :**
-  Plus d'erreur "Unknown column 'type'" dans les logs
-  Cohérence parfaite entre l'interface (Rappel 1, Rappel 2) et le backend (rappel1, rappel2)
-  Système de rappels fonctionnel
-  Déployé et testé sur le VPS de production (https://formations.itinova.org)
This commit is contained in:
Manus
2026-01-19 06:39:00 -05:00
parent 43c655a427
commit 92362ec1d2
5 changed files with 42 additions and 27 deletions

View File

@@ -190,8 +190,8 @@ export type InsertEmailConfig = typeof emailConfig.$inferInsert;
*/
export const emailTemplates = mysqlTable("emailTemplates", {
id: int("id").autoincrement().primaryKey(),
/** Type de template (inscription, teaser, rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6, reset_password) */
type: mysqlEnum("type", ["inscription", "teaser", "rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6", "reset_password"]).notNull().unique(),
/** Type de template (inscription, teaser, rappel1, rappel2, rappel3, rappel4, rappel5, rappel6, reset_password) */
type: mysqlEnum("type", ["inscription", "teaser", "rappel1", "rappel2", "rappel3", "rappel4", "rappel5", "rappel6", "reset_password"]).notNull().unique(),
titre: varchar("titre", { length: 255 }).notNull(),
/** Corps du message avec variables dynamiques */
bodyContent: text("bodyContent").notNull(),
@@ -225,8 +225,8 @@ export type InsertFormateur = typeof formateurs.$inferInsert;
export const rappels = mysqlTable("rappels", {
id: int("id").autoincrement().primaryKey(),
nom: varchar("nom", { length: 255 }).notNull(),
/** Type de template d'email à utiliser (rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6) */
templateType: mysqlEnum("templateType", ["rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull(),
/** Type de template d'email à utiliser (rappel1, rappel2, rappel3, rappel4, rappel5, rappel6) */
templateType: mysqlEnum("templateType", ["rappel1", "rappel2", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull(),
/** Nombre de jours avant la séquence */
joursAvant: int("joursAvant").notNull(),
/** Heure d'envoi (format HH:mm) */
@@ -275,8 +275,8 @@ export const logsRappels = mysqlTable("logsrappels", {
sequenceId: int("sequenceId").notNull(),
apprenantId: int("apprenantId").notNull(),
email: varchar("email", { length: 320 }).notNull(),
/** Type de rappel (rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6) */
type: mysqlEnum("type", ["rappel", "rappelJ1", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull(),
/** Type de rappel (rappel1, rappel2, rappel3, rappel4, rappel5, rappel6) */
type: mysqlEnum("type", ["rappel1", "rappel2", "rappel3", "rappel4", "rappel5", "rappel6"]).notNull(),
/** Type d'envoi (automatique, test) - les tests ne bloquent pas les envois automatiques */
typeEnvoi: mysqlEnum("typeEnvoi", ["automatique", "test"]).default("automatique").notNull(),
statut: mysqlEnum("statut", ["succes", "echec"]).notNull(),