Checkpoint: Corrections multiples : template reset_password, bugs UI templates d'email, schémas DB, et table logsRappels

**Ajouts :**
- Template "Réinitialisation de mot de passe" (reset_password) ajouté à l'enum et au système

**Corrections de bugs :**
- Bug de mise à jour du type de template (ajout de key={selectedType} pour forcer remontage)
- Erreur SQL configuration SMTP (correction schéma emailConfig avec champs active, domainVerified, apiKey)
- Erreur de type formateurId (conversion string → number dans AdminSequences.tsx)
- Date de blocage non sauvegardée (ajout champ dateBlocage au schéma sequences)
- Table logsRappels incohérente (suppression colonnes obsolètes, correction enum statut)

**Schémas Drizzle mis à jour :**
- emailTemplates : ajout reset_password à l'enum type
- emailConfig : ajout active, domainVerified, correction apiKey
- sequences : ajout dateBlocage (datetime)
- logsRappels : structure nettoyée et conforme

**Déploiement VPS :**
- Toutes les migrations SQL exécutées avec succès
- Application redémarrée et fonctionnelle
- Historique des rappels prêt à fonctionner (table logsRappels corrigée)
This commit is contained in:
Manus
2026-01-15 10:00:03 -05:00
parent 4dc5aff7b5
commit 6068b0772a
5 changed files with 34 additions and 13 deletions

View File

@@ -83,6 +83,8 @@ export const sequences = mysqlTable("sequences", {
publicCible: mysqlEnum("publicCible", ["directeur", "chef_service", "autre", "tous"]).default("tous").notNull(),
/** ID du formateur assigné à cette séquence */
formateurId: int("formateurId"),
/** Date limite d'inscription (blocage) */
dateBlocage: datetime("dateBlocage"),
/** Token unique pour le QR code d'émargement */
qrCodeToken: varchar("qrCodeToken", { length: 100 }).unique(),
createdAt: timestamp("createdAt").defaultNow().notNull(),
@@ -149,24 +151,28 @@ export const emailConfig = mysqlTable("emailConfig", {
id: int("id").autoincrement().primaryKey(),
/** Provider d'envoi d'emails (resend, smtp, simulation) */
provider: mysqlEnum("provider", ["resend", "smtp", "simulation"]).default("simulation").notNull(),
/** Clé API Resend */
resendApiKey: varchar("resendApiKey", { length: 255 }),
/** Clé API (pour Resend ou autres) */
apiKey: text("apiKey"),
/** Hôte SMTP */
smtpHost: varchar("smtpHost", { length: 255 }),
/** Port SMTP */
smtpPort: int("smtpPort"),
/** Sécurité SMTP (TLS, SSL, None) */
smtpSecure: mysqlEnum("smtpSecure", ["tls", "ssl", "none"]),
smtpSecure: mysqlEnum("smtpSecure", ["none", "tls", "ssl"]),
/** Utilisateur SMTP */
smtpUser: varchar("smtpUser", { length: 255 }),
smtpUser: varchar("smtpUser", { length: 320 }),
/** Mot de passe SMTP */
smtpPassword: varchar("smtpPassword", { length: 255 }),
smtpPassword: text("smtpPassword"),
/** Email expéditeur */
fromEmail: varchar("fromEmail", { length: 320 }).notNull(),
/** Nom de l'expéditeur */
fromName: varchar("fromName", { length: 255 }).notNull(),
fromName: varchar("fromName", { length: 255 }).default("Formation Manager Itinova").notNull(),
/** Mode de fonctionnement (simulation ou production) */
mode: mysqlEnum("mode", ["simulation", "production"]).default("simulation").notNull(),
/** Domaine vérifié */
domainVerified: boolean("domainVerified").default(false).notNull(),
/** Configuration active */
active: boolean("active").default(true).notNull(),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});