Initial commit (code), runtime ignoré, secrets exclus
This commit is contained in:
288
import_classes_json.php
Normal file
288
import_classes_json.php
Normal file
@ -0,0 +1,288 @@
|
||||
<?php
|
||||
/**
|
||||
* Script d'import des classes et élèves depuis fichiers JSON
|
||||
* Version FINALE - Utilise $db au lieu de $pdo
|
||||
*/
|
||||
|
||||
require_once 'config/config.php';
|
||||
require_once 'config/database.php';
|
||||
|
||||
// Récupérer la connexion BDD (variable $db)
|
||||
$db = Database::getInstance()->getConnection();
|
||||
|
||||
// Configuration
|
||||
$upload_dir = '/var/www/mathematiques/uploads/classes/';
|
||||
$fichiers_json = ['2CV.json', 'TCV.json', '3PM.json', '1V.json','TCFA.json'];
|
||||
$mot_de_passe_defaut = 'eleve2025';
|
||||
|
||||
// Statistiques
|
||||
$stats = [
|
||||
'classes_creees' => 0,
|
||||
'eleves_crees' => 0,
|
||||
'erreurs' => 0,
|
||||
'details' => []
|
||||
];
|
||||
|
||||
/**
|
||||
* Convertit un nom de classe en niveau complet
|
||||
*/
|
||||
function niveau_complet($nom_classe) {
|
||||
$premier_char = strtoupper(substr($nom_classe, 0, 1));
|
||||
|
||||
switch($premier_char) {
|
||||
case '3':
|
||||
return 'Troisième';
|
||||
case '2':
|
||||
return 'Seconde';
|
||||
case '1':
|
||||
return 'Première';
|
||||
case 'T':
|
||||
return 'Terminale';
|
||||
default:
|
||||
return 'Autre';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Génère un login unique
|
||||
*/
|
||||
function generer_login_unique($prenom, $nom, $db) {
|
||||
$prenom_clean = strtolower(transliterate($prenom));
|
||||
$nom_clean = strtolower(transliterate($nom));
|
||||
|
||||
$initiale = substr($prenom_clean, 0, 1);
|
||||
$login_base = $initiale . '.' . $nom_clean;
|
||||
|
||||
$login = $login_base;
|
||||
$suffixe = 1;
|
||||
|
||||
while (login_existe($login, $db)) {
|
||||
$suffixe++;
|
||||
$login = $login_base . $suffixe;
|
||||
}
|
||||
|
||||
return $login;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enlève les accents
|
||||
*/
|
||||
function transliterate($str) {
|
||||
$unwanted_array = [
|
||||
'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z',
|
||||
'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A',
|
||||
'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E',
|
||||
'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N',
|
||||
'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O',
|
||||
'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y',
|
||||
'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a',
|
||||
'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
|
||||
'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i',
|
||||
'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
|
||||
'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y',
|
||||
'þ'=>'b', 'ÿ'=>'y'
|
||||
];
|
||||
return strtr($str, $unwanted_array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si un login existe
|
||||
*/
|
||||
function login_existe($login, $db) {
|
||||
$stmt = $db->prepare("SELECT COUNT(*) FROM utilisateurs WHERE login = ?");
|
||||
$stmt->execute([$login]);
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crée ou récupère une classe
|
||||
*/
|
||||
function creer_ou_recuperer_classe($nom_classe, $annee_scolaire, $db) {
|
||||
$stmt = $db->prepare("
|
||||
SELECT id_classe
|
||||
FROM classes
|
||||
WHERE nom_classe = ? AND annee_scolaire = ?
|
||||
");
|
||||
$stmt->execute([$nom_classe, $annee_scolaire]);
|
||||
$classe_existante = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($classe_existante) {
|
||||
return [
|
||||
'id' => $classe_existante['id_classe'],
|
||||
'nouveau' => false
|
||||
];
|
||||
}
|
||||
|
||||
$niveau = niveau_complet($nom_classe);
|
||||
|
||||
$stmt = $db->prepare("
|
||||
INSERT INTO classes (nom_classe, niveau, annee_scolaire, type_classe, actif)
|
||||
VALUES (?, ?, ?, 'reguliere', 1)
|
||||
");
|
||||
$stmt->execute([$nom_classe, $niveau, $annee_scolaire]);
|
||||
|
||||
return [
|
||||
'id' => $db->lastInsertId(),
|
||||
'nouveau' => true
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Crée un élève
|
||||
*/
|
||||
function creer_eleve($eleve_data, $id_classe, $mot_de_passe, $db) {
|
||||
$prenom = trim($eleve_data['prenom']);
|
||||
$nom = trim($eleve_data['nom']);
|
||||
|
||||
$login = generer_login_unique($prenom, $nom, $db);
|
||||
$mot_de_passe_hash = password_hash($mot_de_passe, PASSWORD_DEFAULT);
|
||||
|
||||
$stmt = $db->prepare("
|
||||
INSERT INTO utilisateurs (login, mot_de_passe, nom, prenom, id_type, id_classe, actif)
|
||||
VALUES (?, ?, ?, ?, 2, ?, 1)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
$login,
|
||||
$mot_de_passe_hash,
|
||||
$nom,
|
||||
$prenom,
|
||||
$id_classe
|
||||
]);
|
||||
|
||||
return [
|
||||
'id' => $db->lastInsertId(),
|
||||
'login' => $login,
|
||||
'nom' => $nom,
|
||||
'prenom' => $prenom
|
||||
];
|
||||
}
|
||||
|
||||
// Début du traitement
|
||||
echo "<!DOCTYPE html>
|
||||
<html lang='fr'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Import des classes</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
|
||||
.container { max-width: 1000px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
||||
h1 { color: #2c3e50; border-bottom: 3px solid #3498db; padding-bottom: 10px; }
|
||||
.classe { margin: 20px 0; padding: 15px; background: #ecf0f1; border-left: 4px solid #3498db; border-radius: 5px; }
|
||||
.success { color: #27ae60; font-weight: bold; }
|
||||
.error { color: #e74c3c; font-weight: bold; }
|
||||
.info { color: #2980b9; }
|
||||
.eleve { margin: 5px 0; padding: 8px; background: white; border-radius: 3px; font-size: 0.9em; }
|
||||
.stats { background: #3498db; color: white; padding: 20px; border-radius: 5px; margin: 20px 0; }
|
||||
.stats h2 { margin-top: 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class='container'>
|
||||
<h1>🔧 Import des classes et élèves</h1>
|
||||
";
|
||||
|
||||
try {
|
||||
foreach ($fichiers_json as $fichier) {
|
||||
$chemin_complet = $upload_dir . $fichier;
|
||||
|
||||
echo "<div class='classe'>";
|
||||
echo "<h2>📁 Traitement de : $fichier</h2>";
|
||||
|
||||
if (!file_exists($chemin_complet)) {
|
||||
echo "<p class='error'>❌ Fichier non trouvé : $chemin_complet</p>";
|
||||
$stats['erreurs']++;
|
||||
echo "</div>";
|
||||
continue;
|
||||
}
|
||||
|
||||
$json_content = file_get_contents($chemin_complet);
|
||||
$data = json_decode($json_content, true);
|
||||
|
||||
if (!$data || !isset($data['classe'])) {
|
||||
echo "<p class='error'>❌ Format JSON invalide</p>";
|
||||
$stats['erreurs']++;
|
||||
echo "</div>";
|
||||
continue;
|
||||
}
|
||||
|
||||
$classe_data = $data['classe'];
|
||||
$nom_classe = $classe_data['nom'];
|
||||
$annee_scolaire = $classe_data['annee_scolaire'];
|
||||
$eleves = $classe_data['eleves'];
|
||||
|
||||
echo "<p class='info'>📚 Classe: <strong>$nom_classe</strong> ($annee_scolaire)</p>";
|
||||
echo "<p class='info'>👥 Nombre d'élèves: <strong>" . count($eleves) . "</strong></p>";
|
||||
|
||||
$result_classe = creer_ou_recuperer_classe($nom_classe, $annee_scolaire, $db);
|
||||
$id_classe = $result_classe['id'];
|
||||
|
||||
if ($result_classe['nouveau']) {
|
||||
echo "<p class='success'>✅ Classe créée (ID: $id_classe)</p>";
|
||||
$stats['classes_creees']++;
|
||||
} else {
|
||||
echo "<p class='info'>ℹ️ Classe existante (ID: $id_classe)</p>";
|
||||
}
|
||||
|
||||
echo "<div style='margin-top: 15px;'>";
|
||||
echo "<strong>Import des élèves :</strong><br>";
|
||||
|
||||
$eleves_crees_classe = 0;
|
||||
foreach ($eleves as $eleve) {
|
||||
try {
|
||||
$result_eleve = creer_eleve($eleve, $id_classe, $mot_de_passe_defaut, $db);
|
||||
|
||||
echo "<div class='eleve'>";
|
||||
echo "✅ {$result_eleve['prenom']} {$result_eleve['nom']} → ";
|
||||
echo "<code>{$result_eleve['login']}</code> (ID: {$result_eleve['id']})";
|
||||
echo "</div>";
|
||||
|
||||
$stats['eleves_crees']++;
|
||||
$eleves_crees_classe++;
|
||||
} catch (Exception $e) {
|
||||
echo "<div class='eleve error'>";
|
||||
echo "❌ {$eleve['prenom']} {$eleve['nom']} : " . $e->getMessage();
|
||||
echo "</div>";
|
||||
$stats['erreurs']++;
|
||||
}
|
||||
}
|
||||
|
||||
echo "</div>";
|
||||
echo "<p class='success' style='margin-top: 10px;'>✅ $eleves_crees_classe élève(s) créé(s)</p>";
|
||||
echo "</div>";
|
||||
}
|
||||
|
||||
echo "
|
||||
<div class='stats'>
|
||||
<h2>📊 Statistiques d'import</h2>
|
||||
<p><strong>Classes créées :</strong> {$stats['classes_creees']}</p>
|
||||
<p><strong>Élèves créés :</strong> {$stats['eleves_crees']}</p>
|
||||
<p><strong>Erreurs :</strong> {$stats['erreurs']}</p>
|
||||
<p><strong>Mot de passe par défaut :</strong> <code>$mot_de_passe_defaut</code></p>
|
||||
</div>
|
||||
";
|
||||
|
||||
if ($stats['eleves_crees'] > 0) {
|
||||
echo "
|
||||
<div style='background: #27ae60; color: white; padding: 20px; border-radius: 5px; margin-top: 20px;'>
|
||||
<h3 style='margin-top: 0;'>🎉 Import réussi !</h3>
|
||||
<p><strong>{$stats['eleves_crees']} élèves</strong> importés avec succès.</p>
|
||||
<p>Login : initiale_prenom.nom (ex: j.dupont)</p>
|
||||
<p>Mot de passe : $mot_de_passe_defaut</p>
|
||||
</div>
|
||||
";
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "<div class='error'>";
|
||||
echo "<h2>❌ Erreur fatale</h2>";
|
||||
echo "<p>" . htmlspecialchars($e->getMessage()) . "</p>";
|
||||
echo "</div>";
|
||||
}
|
||||
|
||||
echo "
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
";
|
||||
?>
|
||||
Reference in New Issue
Block a user