private function import_user_profile_from_scribe() { global $mysqli; # On ne peut arriver ici quand dans le cas où on a une authentification réussie. # L'import d'un utilisateur ne peut se faire qu'à partir d'un LDAP de Scribe, ici. if (!LDAPServer::is_setup()) { return false; die(); } else { // config_cas.inc.php est le fichier d'informations de connexions au serveur cas $path = dirname(__FILE__)."/LDAPServerScribe.class.php"; include($path); # Le serveur LDAP est configuré, on y va. # Encore un dernier petit test quand même : est-ce que l'utilisateur # est bien absent de la base. $sql = "SELECT login FROM utilisateurs WHERE (login = '******')"; $resultat = mysqli_query($mysqli, $sql); if ($resultat->num_rows != "0") { $resultat->close(); return false; die(); } $resultat->close(); $ldap_server = new LDAPServerScribe; $user = $ldap_server->get_user_profile($this->login); if ($user) { # On ne refait pas de tests ou de formattage. La méthode get_user_profile # s'occupe de tout. $errors = false; // On s'occupe de tous les traitements spécifiques à chaque statut // Eleve if ($user['statut'] == 'eleve') { // On a un élève : on vérifie s'il existe dans la table 'eleves', // sur la base de son INE, ou nom et prénom. $sql_test = "SELECT * FROM eleves WHERE (no_gep = '".$user['raw']['ine'][0]."' OR (nom = '".$user['nom']."' AND prenom = '".$user['prenom']."'))"; $resultat = mysqli_query($mysqli, $sql); $test = $resultat->num_rows; $resultat->close(); if ($test == 0) { // L'élève n'existe pas du tout. On va donc le créer. $nouvel_eleve = new Eleve(); $nouvel_eleve->setLogin($this->login); $nouvel_eleve->setNom($user['nom']); $nouvel_eleve->setPrenom($user['prenom']); $nouvel_eleve->setSexe($user['raw']['entpersonsexe'][0]); $naissance = $user['raw']['entpersondatenaissance'][0]; if ($naissance != '') { $annee = mb_substr($naissance, 0, 4); $mois = mb_substr($naissance, 4, 2); $jour = mb_substr($naissance, 6, 2); } else { $annee = '0000'; $mois = '00'; $jour = '00'; } $nouvel_eleve->setNaissance("$annee-$mois-$jour"); $nouvel_eleve->setLieuNaissance(''); $nouvel_eleve->setElenoet($user['raw']['employeenumber'][0] || ''); $nouvel_eleve->setEreno(''); $nouvel_eleve->setEleid($user['raw']['intid'][0] || ''); $nouvel_eleve->setNoGep($user['raw']['ine'][0] || ''); $nouvel_eleve->setEmail($user['email']); if (!$nouvel_eleve->save()) $errors = true; /* * Récupération des CLASSES de l'eleve : * Pour chaque eleve, on parcours ses classes, et on ne prend que celles * qui correspondent à la branche de l'établissement courant, et on les stocke */ $nb_classes = $user['raw']['enteleveclasses']['count']; // Pour chaque classe trouvée.. $eleve_added_to_classe = false; for ($cpt=0; $cpt<$nb_classes; $cpt++) { if ($eleve_added_to_classe) break; $classe_from_ldap = explode("$", $user['raw']['enteleveclasses'][$cpt]); // $classe_from_ldap[0] contient le DN de l'établissement // $classe_from_ldap[1] contient l'id de la classe $code_classe = $classe_from_ldap[1]; // Si le SIREN de la classe trouvée correspond bien au SIREN de l'établissement courant, // on crée une entrée correspondante dans le tableau des classes disponibles // Sinon c'est une classe d'un autre établissement, on ne doit donc pas en tenir compte if (strcmp($classe_from_ldap[0], $ldap_server->get_base_branch()) == 0) { /* * On test si la classe que l'on souhaite ajouter existe déjà * en la cherchant dans la base ( */ $classe_courante = ClasseQuery::create() ->filterByClasse($code_classe) ->findOne(); if ($classe_courante) { foreach($classe_courante->getPeriodeNotes() as $periode) { // On associe l'élève à la classe $sql_classe = "INSERT INTO j_eleves_classes SET login = '******', id_classe = '".$classe_courante->getId()."', periode = '".$periode->getNumPeriode()."'"; $res = mysqli_query($mysqli, $sql); $res->close(); } // Fin boucle périodes $eleve_added_to_classe = true; } // Fin test classe } //Fin du if classe appartient a l'etablissement courant } //Fin du parcours des classes de l'eleve // On a maintenant un élève en base, qui appartient à sa classe // pour toutes les périodes à partir de la période courante // On ne l'associe pas aux enseignements, car c'est un peu trop // risqué et bancal pour être réalisé dynamiquement ici, dans // la mesure où l'on n'a pas une information précise sur la // composition des groupes. } else { // L'élève existe déjà dans la base. On ne créé que l'utilisateur correspondant. // Pour ça, on va devoir s'assurer que l'identifiant est identique ! $sql_login = "******".$user['raw']['ine'][0]."' OR (nom = '".$user['nom']."' AND prenom = '".$user['prenom']."'))"; $resultat = mysqli_query($mysqli, $sql); $res = $resultatè->fetch_object(); $test_login = $res->login; $resultat->close(); if ($test_login != $this->login) { // Le login est différent, on ne peut rien faire... Il faudrait renommer // le login partout dans l'application, mais il n'existe pas de mécanisme // pour le faire de manière fiable. $errors = true; } } } elseif ($user['statut'] == 'responsable') { // Si on a un responsable, il faut l'associer à un élève $resp = new ResponsableEleve(); $resp->setLogin($this->login); $resp->setNom($user['nom']); $resp->setPrenom($user['prenom']); $resp->setCivilite($user['raw']['personaltitle'][0]); $resp->setTelPers($user['raw']['homephone'][0]); $resp->setTelProf($user['raw']['telephonenumber'][0]); $resp->setTelPort($user['raw']['mobile'][0]); $resp->setMel($user['email']); $resp->setAdresseId($user['raw']['intid'][0]); // On créé l'adresse associée $adr = new Adresse(); $adr->setAdresseId($user['raw']['intid'][0]); $adr->setAdr1($user['raw']['entpersonadresse'][0]); $adr->setAdr2(''); $adr->setAdr3(''); $adr->setAdr4(''); $adr->setCommune($user['raw']['entpersonville'][0]); $adr->setCp($user['raw']['entpersoncodepostal'][0]); $adr->setPays($user['raw']['entpersonpays'][0]); $resp->setAdresse($adr); $resp->save(); $nb_eleves_a_charge = $user['raw']['entauxpersreleleveeleve']['count']; //pour chaque dn d'eleve for ($i=0;$i<$nb_eleves_a_charge;$i++) { $eleve_uid = explode(",",$user['raw']['entauxpersreleleveeleve'][$i]); $eleve_associe_login = mb_substr($eleve_uid[0], 4); $eleve_sql = "SELECT ele_id FROM eleves WHERE login = '******'"; $eleve_query = mysqli_query($mysqli, $sql); if ($eleve_query->num_rows == 1) { $eleve_associe_obj = $eleve_query->fetch_object(); $eleve_associe_ele_id = $eleve_associe_obj->ele_id; // Gepi donne un ordre aux responsables, il faut donc verifier combien de responsables sont deja enregistres pour l'eleve // On initialise le numero de responsable $numero_responsable = 1; $req_nb_resp_deja_presents = "SELECT count(*) FROM responsables2 WHERE ele_id = '$eleve_associe_ele_id'"; $res_nb_resp = mysqli_query($mysqli, $req_nb_resp_deja_presents); $nb_resp = $res_nb_resp->fetch_array($res_nb_resp); if ($nb_resp[0] > 0) { // Si deja 1 ou plusieurs responsables legaux pour cet eleve,on ajoute le nouveau responsable en incrementant son numero $numero_responsable += $nb_resp[0]; //-- // TODO: tester si on a des adresses identiques, et n'utiliser qu'un seul objet adresse dans ce cas. //-- } // Ajout de la relation entre Responsable et Eleve dans la table "responsables2" pour chaque eleve $req_ajout_lien_eleve_resp = "INSERT INTO responsables2 VALUES('$eleve_associe_ele_id','".$resp->getResponsableEleveId()."','$numero_responsable','')"; $insert_lien = mysqli_query($mysqli, $req_ajout_lien_eleve_resp); } } } elseif ($user['statut'] == 'professeur') { // Rien de spécial à ce stade. } else { // Ici : que fait-on si l'on n'a pas un statut directement reconnu // et compatible Gepi ? // On applique le statut par défaut, configuré par l'admin. $user['statut'] = getSettingValue("statut_utilisateur_defaut"); } // On créé l'utilisateur, s'il n'y a pas eu d'erreurs. if (!$errors) { $new_compte_utilisateur = new UtilisateurProfessionnel(); $new_compte_utilisateur->setAuthMode('sso'); $new_compte_utilisateur->setCivilite($user['civilite']); $new_compte_utilisateur->setEmail($user['email']); $new_compte_utilisateur->setEtat('actif'); $new_compte_utilisateur->setLogin($this->login); $new_compte_utilisateur->setNom($user['nom']); $new_compte_utilisateur->setPrenom($user['prenom']); $new_compte_utilisateur->setShowEmail('no'); $new_compte_utilisateur->setStatut($user['statut']); //$new_compte_utilisateur->save(); if ($new_compte_utilisateur->save()) { return true; } else { return false; } } } else { return false; } } }