Initial commit (code), runtime ignoré, secrets exclus

This commit is contained in:
nicoboy
2026-01-02 15:05:25 +01:00
commit 2fdcf50bc1
87 changed files with 11525 additions and 0 deletions

288
import_classes_json.php Normal file
View 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>
";
?>