Files
webval/import_classes_json.php

289 lines
9.1 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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>
";
?>