public function processValidateMultipleStudentsListing()
 {
     $ppo = new CopixPPO();
     // Récupération des paramètres
     $ppo->nodeId = _request('id_node', null);
     $ppo->nodeType = _request('type_node', null);
     $nodeInfos = Kernel::getNodeInfo($ppo->nodeType, $ppo->nodeId, true);
     if (is_null($ppo->nodeId) || is_null($ppo->nodeType)) {
         return CopixActionGroup::process('generictools|Messages::getError', array('message' => "Une erreur est survenue.", 'back' => CopixUrl::get('gestionautonome||showTree')));
     }
     $classroomDAO = _ioDAO('kernel|kernel_bu_ecole_classe');
     if (!$classroomDAO->get($ppo->nodeId)) {
         return CopixActionGroup::process('generictools|Messages::getError', array('message' => "Une erreur est survenue.", 'back' => CopixUrl::get('gestionautonome||showTree')));
     }
     _currentUser()->assertCredential('module:classroom|' . $ppo->nodeId . '|student|create@gestionautonome');
     // Récupération des informations du formulaire
     $keys = _request('keys', array());
     // Elèves de la liste à créer (checkbox de confirmation)
     $logins = _request('logins', array());
     // Logins des élèves (possibilité de changer le login généré)
     $passwords = _request('passwords', array());
     // Passwords des élèves (possibilité de changer le mot de passe généré)
     $levels = _request('levels', array());
     // Niveau des élèves dans la classe
     // Récupération des élèves déjà créés en session
     if (!($ppo->studentsSuccess = _sessionGet('gestionautonome|addMultipleStudents|success'))) {
         $ppo->studentsSuccess = array();
     }
     // RAZ des créations en erreur
     _sessionSet('gestionautonome|addMultipleStudents|error', array());
     // DAO
     $studentDAO = _ioDAO('kernel_bu_eleve');
     $studentRegistrationDAO = _ioDAO('kernel|kernel_bu_eleve_inscription');
     $studentAdmissionDAO = _ioDAO('kernel|kernel_bu_eleve_admission');
     $studentAssignmentDAO = _ioDAO('kernel_bu_eleve_affectation');
     $dbuserDAO = _ioDAO('kernel|kernel_copixuser');
     $dbLinkDAO = _ioDAO('kernel_link_bu2user');
     $classDAO = _ioDAO('kernel|kernel_bu_ecole_classe');
     $personDAO = _ioDAO('kernel_bu_responsable');
     $personLinkDAO = _ioDAO('kernel_bu_responsables');
     $schoolClassLevelDAO = _ioDAO('kernel|kernel_bu_ecole_classe_niveau');
     $node_infos = Kernel::getNodeInfo($ppo->nodeType, $ppo->nodeId, false);
     // Récupération des élèves en création
     $studentsInSession = _sessionGet('gestionautonome|addMultipleStudents');
     // Récupération des données nécessaires à l'ajout des enregistrements inscription / adhésion / admission
     $class = $classDAO->get($ppo->nodeId);
     $schoolClassLevels = $schoolClassLevelDAO->getByClass($ppo->nodeId);
     $classType = $schoolClassLevels[0]->type;
     $schoolId = $class->ecole;
     // Récupération de l'année scolaire
     if (is_null($grade = _sessionGet('grade'))) {
         $grade = Kernel::getAnneeScolaireCourante()->id_as;
     }
     // Boucle sur les élèves de la liste à créer
     $students = array();
     foreach ($keys as $key) {
         // La création n'est possible que si le login est disponible
         if (!is_null($logins[$key]) && !is_null($passwords[$key]) && Kernel::isLoginAvailable($logins[$key])) {
             $students[$key] = $studentsInSession[$key];
             $students[$key]['login'] = $logins[$key];
             // Récupération des logins pour les élèves en création
             $students[$key]['password'] = $passwords[$key];
             // Récupération des passwords pour les élèves en création
             $students[$key]['level'] = $levels[$key];
             // Récupération des niveaux pour les élèves en création
             $students[$key]['type_nom'] = Kernel::Code2Name('USER_ELE');
             $students[$key]['node_nom'] = Kernel::Code2Name($ppo->nodeType) . " " . $node_infos['nom'];
             // Création de l'élève
             $ppo->student = _record('kernel_bu_eleve');
             $ppo->student->numero = '';
             $ppo->student->nom = $students[$key]['lastname'];
             $ppo->student->prenom1 = $students[$key]['firstname'];
             $ppo->student->id_sexe = $students[$key]['gender'];
             $ppo->student->date_nais = isset($students[$key]['birthdate']) ? CopixDateTime::dateToYYYYMMDD(strip_tags(trim($students[$key]['birthdate']))) : '';
             $ppo->student->flag = 0;
             $ppo->student->ele_last_update = CopixDateTime::timestampToYYYYMMDDHHIISS(time());
             $studentDAO->insert($ppo->student);
             $students[$key]['id'] = $ppo->student->idEleve;
             // Création du compte dbuser
             $dbuser = _record('kernel|kernel_copixuser');
             $dbuser->login_dbuser = $students[$key]['login'];
             $dbuser->password_dbuser = md5($students[$key]['password']);
             $dbuser->email_dbuser = '';
             $dbuser->enabled_dbuser = 1;
             $dbuserDAO->insert($dbuser);
             // Création du link bu2user
             $dbLink = _record('kernel_link_bu2user');
             $dbLink->user_id = $dbuser->id_dbuser;
             $dbLink->bu_type = 'USER_ELE';
             $dbLink->bu_id = $ppo->student->idEleve;
             $dbLinkDAO->insert($dbLink);
             // Inscription de l'élève dans l'école
             $studentRegistration = _record('kernel|kernel_bu_eleve_inscription');
             $studentRegistration->eleve = $ppo->student->idEleve;
             $studentRegistration->annee_scol = $grade;
             $studentRegistration->date_preinscript = CopixDateTime::timestampToYYYYMMDD(time());
             $studentRegistration->date_effet_preinscript = CopixDateTime::timestampToYYYYMMDD(time());
             $studentRegistration->date_inscript = CopixDateTime::timestampToYYYYMMDD(time());
             $studentRegistration->date_effet_inscript = CopixDateTime::timestampToYYYYMMDD(time());
             $studentRegistration->etablissement = $schoolId;
             $studentRegistration->etablissement_refus = 0;
             $studentRegistration->id_niveau = $students[$key]['level'];
             $studentRegistration->id_typ_cla = $classType;
             $studentRegistration->vaccins_aj = 0;
             $studentRegistration->attente = 0;
             $studentRegistration->derogation_dem = 0;
             $studentRegistration->temporaire = 0;
             $studentRegistration->current_inscr = 1;
             $studentRegistrationDAO->insert($studentRegistration);
             // Admission de l'élève dans l'école
             $studentAdmission = _record('kernel|kernel_bu_eleve_admission');
             $studentAdmission->admission_eleve = $ppo->student->idEleve;
             $studentAdmission->admission_etablissement = $schoolId;
             $studentAdmission->admission_annee_scol = $grade;
             $studentAdmission->admission_id_niveau = $students[$key]['level'];
             $studentAdmission->admission_etat_eleve = 1;
             $studentAdmission->admission_date = CopixDateTime::timestampToYYYYMMDD(time());
             $studentAdmission->admission_date_effet = CopixDateTime::timestampToYYYYMMDD(time());
             $studentAdmission->admission_code_radiation = 0;
             $studentAdmission->admission_previsionnel = 0;
             $studentAdmissionDAO->insert($studentAdmission);
             // Affectation de l'élève dans les classes
             $studentAssignment = _record('kernel_bu_eleve_affectation');
             $studentAssignment->eleve = $ppo->student->idEleve;
             $studentAssignment->annee_scol = $grade;
             $studentAssignment->classe = $ppo->nodeId;
             $studentAssignment->niveau = $students[$key]['level'];
             $studentAssignment->dateDebut = CopixDateTime::timestampToYYYYMMDD(time());
             $studentAssignment->current = 1;
             $studentAssignment->previsionnel_cl = 0;
             $studentAssignmentDAO->insert($studentAssignment);
             // Récupération des responsables sélectionnés pour l'élève
             $personsKeys = _request('person-keys' . $key, array());
             $personsLogins = _request('logins' . $key, array());
             // Récupération des logins des responsables de l'élève
             $personsPasswords = _request('passwords' . $key, array());
             // Récupération des passwords des responsables de l'élève
             $students[$key]['person'] = array();
             foreach ($personsKeys as $personKey) {
                 // La création du responsable n'est possible que si le login est disponible
                 if (!is_null($personsLogins[$personKey]) && !is_null($personsPasswords[$personKey]) && Kernel::isLoginAvailable($personsLogins[$personKey])) {
                     $students[$key]['person'][$personKey] = $studentsInSession[$key]['person'][$personKey];
                     $students[$key]['person'][$personKey]['login'] = $personsLogins[$personKey];
                     $students[$key]['person'][$personKey]['password'] = $personsPasswords[$personKey];
                     $students[$key]['person'][$personKey]['type_nom'] = Kernel::Code2Name('USER_RES');
                     $students[$key]['person'][$personKey]['node_nom'] = Kernel::Code2Name($ppo->nodeType) . " " . $node_infos['nom'];
                     // Création du responsable
                     $ppo->person = _record('kernel_bu_responsable');
                     $ppo->person->nom = $students[$key]['person'][$personKey]['lastname'];
                     $ppo->person->prenom1 = $students[$key]['person'][$personKey]['firstname'];
                     $ppo->person->id_sexe = $students[$key]['person'][$personKey]['gender'];
                     $personDAO->insert($ppo->person);
                     $students[$key]['person'][$personKey]['id'] = $ppo->person->numero;
                     // Création du compte dbuser
                     $dbuser = _record('kernel|kernel_copixuser');
                     $dbuser->login_dbuser = $students[$key]['person'][$personKey]['login'];
                     $dbuser->password_dbuser = md5($students[$key]['person'][$personKey]['password']);
                     $dbuser->email_dbuser = '';
                     $dbuser->enabled_dbuser = 1;
                     $dbuserDAO->insert($dbuser);
                     // Création du link bu2user
                     $dbLink = _record('kernel_link_bu2user');
                     $dbLink->user_id = $dbuser->id_dbuser;
                     $dbLink->bu_type = 'USER_RES';
                     $dbLink->bu_id = $ppo->person->numero;
                     $dbLinkDAO->insert($dbLink);
                     // Création de l'association personne->rôle
                     $newPersonLink = _record('kernel_bu_responsables');
                     $newPersonLink->id_beneficiaire = $ppo->student->idEleve;
                     $newPersonLink->type_beneficiaire = 'eleve';
                     $newPersonLink->id_responsable = $ppo->person->numero;
                     $newPersonLink->type = 'responsable';
                     $newPersonLink->auth_parentale = '0';
                     $newPersonLink->id_par = $students[$key]['person'][$personKey]['id_par'];
                     $personLinkDAO->insert($newPersonLink);
                 }
             }
             // Récupération de l'élève (et de ses responsables) dans le tableau des élèves créés avec succès
             $ppo->studentsSuccess[] = $students[$key];
         } else {
             // Ajout de l'élève (et de ses responsables) dans le tableau des créations en erreur
             $ppo->studentsError[] = $students[$key];
         }
     }
     // Si des créations ont bien eu lieu, les mettre en session pour affichage de confirmation
     if (!empty($ppo->studentsSuccess)) {
         _sessionSet('gestionautonome|addMultipleStudents|success', $ppo->studentsSuccess);
     }
     // Si des créations sont en erreur, les mettre en session pour possibilité de recréation après correction des erreurs
     if (!empty($ppo->studentsError)) {
         _sessionSet('gestionautonome|addMultipleStudents|error', $ppo->studentsError);
         $ppo->students = $ppo->studentsError;
         _sessionSet('gestionautonome|addMultipleStudents', $ppo->studentsError);
         // Récupération des niveaux de la classe
         $classSchoolLevelDAO = _ioDAO('kernel|kernel_bu_ecole_classe_niveau');
         $classLevelDAO = _ioDAO('kernel|kernel_bu_classe_niveau');
         $classSchoolLevels = $classSchoolLevelDAO->getByClass($ppo->nodeId);
         $ppo->levelNames = array();
         $ppo->levelIds = array();
         foreach ($classSchoolLevels as $classSchoolLevel) {
             $level = $classLevelDAO->get($classSchoolLevel->niveau);
             $ppo->levelNames[] = $level->niveau_court;
             $ppo->levelIds[] = $level->id_n;
         }
         // Flag pour affichage du message d'erreur
         $ppo->error = 1;
         // Get vocabulary catalog to use
         $nodeVocabularyCatalogDAO = _ioDAO('kernel|kernel_i18n_node_vocabularycatalog');
         $ppo->vocabularyCatalog = $nodeVocabularyCatalogDAO->getCatalogForNode($ppo->nodeType, $ppo->nodeId);
         // Breadcrumbs
         $breadcrumbs = Kernel::generateBreadcrumbs($nodeInfos);
         $breadcrumbs[] = array('txt' => CopixCustomI18N::get('gestionautonome|gestionautonome.message.add%%structure_element_persons%%list', array('catalog' => $ppo->vocabularyCatalog->id_vc)));
         $ppo->breadcrumbs = Kernel::PetitPoucet($breadcrumbs, ' » ');
         $ppo->TITLE_PAGE = CopixConfig::get('gestionautonome|moduleTitle');
         // Get vocabulary catalog to use
         $nodeVocabularyCatalogDAO = _ioDAO('kernel|kernel_i18n_node_vocabularycatalog');
         $ppo->vocabularyCatalog = $nodeVocabularyCatalogDAO->getCatalogForNode($ppo->nodeType, $ppo->nodeId);
         return _arPPO($ppo, 'add_multiple_students_listing.tpl');
     }
     // Mise en session des comptes créés
     $passwordsList = _sessionGet('modules|gestionautonome|passwordsList');
     if (!is_array($passwordsList)) {
         $passwordsList = array();
     }
     foreach ($ppo->studentsSuccess as $student) {
         $studentAr = array('lastname' => $student['lastname'], 'firstname' => $student['firstname'], 'login' => $student['login'], 'password' => $student['password'], 'bu_type' => 'USER_ELE', 'bu_id' => $student['id'], 'type_nom' => Kernel::Code2Name('USER_ELE'), 'node_nom' => Kernel::Code2Name('BU_CLASSE') . ' ' . $nodeInfos['nom'], 'gender' => $student['gender']);
         $passwordsList['USER_ELE'][$student['id']] = $studentAr;
         // Enregistrement des personnes
         if (!empty($student['person'])) {
             foreach ($student['person'] as $person) {
                 $personAr = array('lastname' => $person['lastname'], 'firstname' => $person['firstname'], 'login' => $person['login'], 'password' => $person['password'], 'bu_type' => 'USER_RES', 'bu_id' => $person['id'], 'type_nom' => Kernel::Code2Name('USER_RES'), 'node_nom' => Kernel::Code2Name('BU_CLASSE') . ' ' . $nodeInfos['nom'], 'gender' => $person['gender']);
                 $passwordsList['USER_RES'][$person['id']] = $personAr;
             }
         }
     }
     $passwordsList = _sessionSet('modules|gestionautonome|passwordsList', $passwordsList);
     return _arRedirect(CopixUrl::get('gestionautonome||showMultipleAccountsListing'));
 }