#!/bin/bash # Script de correction COMPLÈTE et DÉFINITIVE du schéma de base de données # Formation Manager Itinova - Janvier 2026 # Ce script corrige TOUTES les colonnes manquantes identifiées DB_USER="app_user" DB_PASS="Itinova69!" DB_NAME="formation_manager" echo "==========================================" echo "CORRECTION DÉFINITIVE DU SCHÉMA" echo "Formation Manager Itinova" echo "==========================================" echo "" echo "⚠️ Ce script va MODIFIER la base de données" echo "Appuyez sur Entrée pour continuer ou Ctrl+C pour annuler..." read echo "" echo "=== DÉBUT DES CORRECTIONS ===" echo "" # Fonction pour exécuter une requête SQL avec gestion d'erreur execute_sql() { local description="$1" local query="$2" echo "→ $description" result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$query" 2>&1 | grep -v "Warning: Using a password") if [ -z "$result" ]; then echo " ✓ OK" return 0 else if echo "$result" | grep -q "Duplicate column name"; then echo " ⚠ Colonne existe déjà" return 0 elif echo "$result" | grep -q "Can't DROP"; then echo " ⚠ Colonne n'existe pas" return 0 else echo " ✗ Erreur: $result" return 1 fi fi } echo "==========================================" echo "1. CORRECTION DE LA TABLE formateurs" echo "==========================================" # CRITIQUE: La colonne email manque dans formateurs execute_sql "Ajout de la colonne email" \ "ALTER TABLE formateurs ADD COLUMN email VARCHAR(320) AFTER nom;" echo "" echo "==========================================" echo "2. CORRECTION DE LA TABLE rappels" echo "==========================================" # CRITIQUE: La colonne timing manque dans rappels execute_sql "Ajout de la colonne timing" \ "ALTER TABLE rappels ADD COLUMN timing ENUM('pre_formation', 'post_formation') NOT NULL DEFAULT 'pre_formation' AFTER heureEnvoi;" execute_sql "Ajout de la colonne nomFichier" \ "ALTER TABLE rappels ADD COLUMN nomFichier VARCHAR(255) AFTER timing;" execute_sql "Ajout de la colonne urlFichier" \ "ALTER TABLE rappels ADD COLUMN urlFichier VARCHAR(500) AFTER nomFichier;" execute_sql "Ajout de la colonne s3Key" \ "ALTER TABLE rappels ADD COLUMN s3Key VARCHAR(500) AFTER urlFichier;" execute_sql "Ajout de la colonne typeFichier" \ "ALTER TABLE rappels ADD COLUMN typeFichier VARCHAR(100) AFTER s3Key;" execute_sql "Ajout de la colonne tailleFichier" \ "ALTER TABLE rappels ADD COLUMN tailleFichier INT AFTER typeFichier;" execute_sql "Ajout de la colonne derniereExecution" \ "ALTER TABLE rappels ADD COLUMN derniereExecution DATETIME AFTER actif;" execute_sql "Modification de l'ENUM templateType" \ "ALTER TABLE rappels MODIFY COLUMN templateType ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;" echo "" echo "==========================================" echo "3. CORRECTION DE LA TABLE sequences" echo "==========================================" execute_sql "Modification de l'ENUM statut" \ "ALTER TABLE sequences MODIFY COLUMN statut ENUM('ouverte','bloquee','terminee','fermee','annulee') NOT NULL DEFAULT 'ouverte';" execute_sql "Modification de l'ENUM publicCible" \ "ALTER TABLE sequences MODIFY COLUMN publicCible ENUM('directeur','chef_service','autre','tous') NOT NULL DEFAULT 'tous';" execute_sql "Modification de la taille de lieu" \ "ALTER TABLE sequences MODIFY COLUMN lieu VARCHAR(255) NOT NULL;" execute_sql "Modification de la taille de qrCodeToken" \ "ALTER TABLE sequences MODIFY COLUMN qrCodeToken VARCHAR(100) UNIQUE;" echo "" echo "==========================================" echo "4. CORRECTION DE LA TABLE formations" echo "==========================================" execute_sql "Ajout de la colonne modeAttestation" \ "ALTER TABLE formations ADD COLUMN modeAttestation ENUM('auto', 'manuel') NOT NULL DEFAULT 'auto' AFTER actif;" execute_sql "Ajout de la colonne modeEnvoi" \ "ALTER TABLE formations ADD COLUMN modeEnvoi ENUM('auto', 'manuel') NOT NULL DEFAULT 'manuel' AFTER modeAttestation;" echo "" echo "==========================================" echo "5. CORRECTION DE LA TABLE users" echo "==========================================" execute_sql "Ajout de la colonne username" \ "ALTER TABLE users ADD COLUMN username VARCHAR(100) UNIQUE AFTER email;" execute_sql "Ajout de la colonne password" \ "ALTER TABLE users ADD COLUMN password VARCHAR(255) AFTER username;" execute_sql "Ajout de la colonne isActive" \ "ALTER TABLE users ADD COLUMN isActive BOOLEAN NOT NULL DEFAULT TRUE AFTER role;" execute_sql "Ajout de la colonne formateurId" \ "ALTER TABLE users ADD COLUMN formateurId INT AFTER isActive;" execute_sql "Modification de l'ENUM role" \ "ALTER TABLE users MODIFY COLUMN role ENUM('user', 'admin', 'formateur') NOT NULL DEFAULT 'user';" echo "" echo "==========================================" echo "6. CORRECTION DE LA TABLE apprenants" echo "==========================================" execute_sql "Modification de codeEtablissement" \ "ALTER TABLE apprenants MODIFY COLUMN codeEtablissement VARCHAR(50) NULL;" execute_sql "Modification de fonction" \ "ALTER TABLE apprenants MODIFY COLUMN fonction VARCHAR(100) NULL;" echo "" echo "==========================================" echo "7. CORRECTION DE LA TABLE emailConfig" echo "==========================================" execute_sql "Modification de l'ENUM provider" \ "ALTER TABLE emailConfig MODIFY COLUMN provider ENUM('resend', 'smtp', 'simulation') NOT NULL DEFAULT 'simulation';" echo "" echo "==========================================" echo "8. CORRECTION DE LA TABLE emailTemplates" echo "==========================================" execute_sql "Modification de l'ENUM type" \ "ALTER TABLE emailTemplates MODIFY COLUMN type ENUM('inscription', 'teaser', 'rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL UNIQUE;" echo "" echo "==========================================" echo "9. CORRECTION DE LA TABLE logsRappels" echo "==========================================" execute_sql "Ajout de la colonne email" \ "ALTER TABLE logsRappels ADD COLUMN email VARCHAR(320) NOT NULL AFTER apprenantId;" execute_sql "Modification de l'ENUM type" \ "ALTER TABLE logsRappels MODIFY COLUMN type ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;" echo "" echo "==========================================" echo "10. CORRECTION DE LA TABLE questionnaires" echo "==========================================" # Vérifier si la colonne nom existe et la renommer en titre result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='questionnaires' AND COLUMN_NAME='nom';" 2>/dev/null) if [ "$result" = "1" ]; then execute_sql "Renommage de nom en titre" \ "ALTER TABLE questionnaires CHANGE COLUMN nom titre VARCHAR(255) NOT NULL;" else echo "→ La colonne titre existe déjà" fi echo "" echo "==========================================" echo "11. CORRECTION DE LA TABLE reponsesQuestionnaires" echo "==========================================" # Vérifier si la colonne complete existe et la supprimer result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='reponsesQuestionnaires' AND COLUMN_NAME='complete';" 2>/dev/null) if [ "$result" = "1" ]; then execute_sql "Suppression de la colonne complete" \ "ALTER TABLE reponsesQuestionnaires DROP COLUMN complete;" else echo "→ La colonne complete n'existe pas (OK)" fi echo "" echo "==========================================" echo "12. CORRECTION DE LA TABLE attestations" echo "==========================================" execute_sql "Ajout de la colonne documentUrl" \ "ALTER TABLE attestations ADD COLUMN documentUrl VARCHAR(500) AFTER s3Key;" execute_sql "Ajout de la colonne documentS3Key" \ "ALTER TABLE attestations ADD COLUMN documentS3Key VARCHAR(500) AFTER documentUrl;" execute_sql "Ajout de la colonne uploadedBy" \ "ALTER TABLE attestations ADD COLUMN uploadedBy INT AFTER documentS3Key;" execute_sql "Ajout de la colonne uploadedAt" \ "ALTER TABLE attestations ADD COLUMN uploadedAt TIMESTAMP AFTER uploadedBy;" execute_sql "Ajout de la colonne emailEnvoye" \ "ALTER TABLE attestations ADD COLUMN emailEnvoye BOOLEAN NOT NULL DEFAULT FALSE AFTER uploadedAt;" execute_sql "Ajout de la colonne dateEnvoiEmail" \ "ALTER TABLE attestations ADD COLUMN dateEnvoiEmail TIMESTAMP AFTER emailEnvoye;" echo "" echo "==========================================" echo "13. CORRECTION DE LA TABLE parametres" echo "==========================================" # Supprimer envoiAutomatiqueAttestations si elle existe result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='parametres' AND COLUMN_NAME='envoiAutomatiqueAttestations';" 2>/dev/null) if [ "$result" = "1" ]; then execute_sql "Suppression de la colonne envoiAutomatiqueAttestations" \ "ALTER TABLE parametres DROP COLUMN envoiAutomatiqueAttestations;" else echo "→ La colonne envoiAutomatiqueAttestations n'existe pas (OK)" fi execute_sql "Ajout de la colonne urlPublique" \ "ALTER TABLE parametres ADD COLUMN urlPublique VARCHAR(500) NOT NULL DEFAULT 'https://formations.itinova.org' AFTER id;" execute_sql "Ajout de la colonne delaiExpirationQR" \ "ALTER TABLE parametres ADD COLUMN delaiExpirationQR INT NOT NULL DEFAULT 30 AFTER urlPublique;" execute_sql "Ajout de la colonne dureeValiditeToken" \ "ALTER TABLE parametres ADD COLUMN dureeValiditeToken INT NOT NULL DEFAULT 24 AFTER delaiExpirationQR;" execute_sql "Ajout de la colonne notificationsActives" \ "ALTER TABLE parametres ADD COLUMN notificationsActives BOOLEAN NOT NULL DEFAULT TRUE AFTER dureeValiditeToken;" echo "" echo "==========================================" echo "14. CORRECTION DES AUTRES TABLES" echo "==========================================" execute_sql "Ajout de userId dans passwordResetTokens" \ "ALTER TABLE passwordResetTokens ADD COLUMN userId INT NOT NULL AFTER id;" execute_sql "Ajout de ordre dans datesFormation" \ "ALTER TABLE datesFormation ADD COLUMN ordre INT NOT NULL AFTER sequenceId;" execute_sql "Ajout de validateurId dans presences" \ "ALTER TABLE presences ADD COLUMN validateurId INT AFTER modeValidation;" echo "" echo "==========================================" echo "✅ TOUTES LES CORRECTIONS APPLIQUÉES" echo "==========================================" echo "" # Compter les tables total_tables=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$DB_NAME';" 2>/dev/null) echo "✓ Nombre total de tables: $total_tables" echo "" echo "=== PROCHAINES ÉTAPES ===" echo "1. Redémarrer l'application: pm2 restart formation-manager" echo "2. Vérifier les logs: pm2 logs formation-manager --lines 30" echo "3. Tester l'application dans le navigateur" echo "" echo "=========================================="