/**
  * AJAX ONLY ! - Suppression d'une affectation
  */
 public function processRemoveAssignment()
 {
     // Récupération des paramètres
     $userType = _request('user_type', null);
     $userId = _request('user_id', null);
     $classroomId = _request('classroom_id', null);
     // Paramètres obligatoires
     if (is_null($userType) || is_null($userId) || is_null($classroomId)) {
         return new CopixActionReturn(CopixActionReturn::HTTPCODE, array('Content-Type: text/plain; charset=utf-8', 'HTTP/1.1 400 Bad Request'), 'Une erreur est survenue');
     }
     // Récupération de la classe
     $classroomDAO = _ioDAO('kernel|kernel_bu_ecole_classe');
     if (!($classroom = $classroomDAO->get($classroomId))) {
         return new CopixActionReturn(CopixActionReturn::HTTPCODE, array('Content-Type: text/plain; charset=utf-8', 'HTTP/1.1 404 Not found'), 'Classe non trouvée');
     }
     // Récupération du user
     $userDAO = _ioDAO('kernel|kernel_copixuser');
     $user = $userDAO->getUserByBuIdAndBuType($userId, $userType);
     if (false === $user) {
         return new CopixActionReturn(CopixActionReturn::HTTPCODE, array('Content-Type: text/plain; charset=utf-8', 'HTTP/1.1 404 Not found'), 'Utilisateur non trouvé');
     }
     // Suppression de l'affectation
     _classInclude('gestionautonome|GestionAutonomeService');
     if ($userType == 'USER_ELE') {
         // Contrôle des droits
         _currentUser()->assertCredential('module:classroom|' . $classroomId . '|student|update@gestionautonome');
         GestionAutonomeService::removeStudentAssignment($userId, $classroomId);
     } else {
         // Contrôle des droits
         _currentUser()->assertCredential('module:classroom|' . $classroomId . '|teacher|update@gestionautonome');
         GestionAutonomeService::removePersonnelAssignment($userId, $classroomId, 'CLASSE');
     }
     return new CopixActionReturn(CopixActionReturn::HTTPCODE, array('Content-Type: text/html; charset=utf-8', 'HTTP/1.1 200 OK'), CopixZone::process('gestionautonome|manageAssignments'));
 }
 public function _createContent(&$toReturn)
 {
     $ppo = new CopixPPO();
     // Récupération des paramètres
     $id = $this->getParam('node_id');
     $ppo->type = $this->getParam('node_type');
     $ppo->tab = $this->getParam('tab') ? $this->getParam('tab') : 0;
     // Récupération de l'utilisateur connecté
     $ppo->user = _currentUser();
     if (!is_null($ppo->type) && !is_null($id)) {
         $ppo->parent = Kernel::getNodeInfo($ppo->type, $id);
         $personnelDAO = _ioDAO('kernel|kernel_bu_personnel');
         switch ($ppo->type) {
             case 'BU_GRVILLE':
                 $ppo->persons = $personnelDAO->findCitiesAgentsByCitiesGroupId($id);
                 break;
             case 'BU_VILLE':
                 $ppo->persons = $personnelDAO->findCityAgentsByCityId($id);
                 break;
             case 'BU_ECOLE':
                 $personEntityDAO = _ioDAO('kernel|kernel_bu_personnel_entite');
                 $classroomDAO = _ioDAO('kernel|kernel_bu_ecole_classe');
                 $classnames = array();
                 $ppo->persons = $personnelDAO->findAdministrationStaffAndPrincipalBySchoolId($id);
                 foreach ($ppo->persons as $person) {
                     // Pour les enseignants, on récupère leurs affectations pour déterminer s'il est possible de les désaffecter de l'école
                     if ($person->role == DAOKernel_bu_personnel_entite::ROLE_TEACHER && $personEntityDAO->hasTeacherRoleInSchool($person->numero, $id, true)) {
                         $person->hasTeacherRoleInSchool = true;
                         // Récupération du nom des classes ou il est affecté
                         $classnames = array();
                         $personEntities = $personEntityDAO->getTeacherRoleInSchool($person->numero, $id, true);
                         foreach ($personEntities as $personEntity) {
                             $class = $classroomDAO->get($personEntity->pers_entite_reference);
                             $classnames[] = $class->nom;
                         }
                         $person->classrooms = implode(', ', $classnames);
                     } else {
                         $person->hasTeacherRoleInSchool = false;
                     }
                 }
                 break;
             case 'BU_CLASSE':
                 // Récupération des enseignants
                 $ppo->persons = $personnelDAO->findTeachersByClassroomId($id);
                 // Récupération des élèves
                 $studentDAO = _ioDAO('kernel|kernel_bu_ele');
                 $ppo->students = $studentDAO->getStudentsByClass($id);
                 // Récupération des parents
                 $responsableDAO = _ioDAO('kernel|kernel_bu_res');
                 $ppo->responsables = $responsableDAO->getParentsInClasse($id);
                 _classInclude('gestionautonome|GestionAutonomeService');
                 $ppo->isTeachersLimitByClassroomReached = false;
                 if (GestionAutonomeService::hasTeachersLimitByClassroom()) {
                     $ppo->isTeachersLimitByClassroomReached = count($ppo->persons) >= CopixConfig::get('gestionautonome|teachersLimitByClassroom');
                 }
                 $ppo->isStudentsLimitByClassroomReached = false;
                 if (GestionAutonomeService::hasStudentsLimitByClassroom()) {
                     $ppo->isStudentsLimitByClassroomReached = count($ppo->students) >= CopixConfig::get('gestionautonome|studentsLimitByClassroom');
                 }
                 break;
         }
     }
     // Récupération du catalogue de vocabulaire à utiliser
     $nodeVocabularyCatalogDAO = _ioDAO('kernel|kernel_i18n_node_vocabularycatalog');
     $ppo->vocabularyCatalog = $nodeVocabularyCatalogDAO->getCatalogForNode($ppo->type, $id);
     // Récupération de l'année scolaire suivante
     $ppo->nextGrade = _ioDAO('kernel|kernel_bu_annee_scolaire')->getNextGrade(_sessionGet('grade'));
     $toReturn = $this->_usePPO($ppo, '_persons_data.tpl');
 }
 public function _createContent(&$toReturn)
 {
     $ppo = new CopixPPO();
     // Récupération du context en session
     $ppo->filters = _sessionGet('gestionautonome|assignments_management_filters');
     $ppo->openedClassrooms = _sessionGet('gestionautonome|assignments_management_classroom_state');
     // Initialisation des tableaux des affectations
     $originAssignments = array();
     $destinationAssignments = array();
     $withoutAssignments = array();
     $classroomDAO = _ioDAO('kernel|kernel_bu_ecole_classe');
     $groups = _currentUser()->getGroups();
     $studentDAO = _ioDAO('kernel|kernel_bu_ele');
     $personnelDAO = _ioDAO('kernel|kernel_bu_personnel');
     // Récupération des éléves ou des enseignants
     if ($ppo->filters['searchMode'] === 'byStructure') {
         if ($ppo->filters['originUserType'] == 'USER_ELE') {
             if ($ppo->filters['mode'] == 'changeClassroom') {
                 $originAssignments = $studentDAO->findStudentsForAssignment($ppo->filters['originGrade'], array('cityGroup' => $ppo->filters['originCityGroup'], 'city' => $ppo->filters['originCity'], 'school' => $ppo->filters['originSchool'], 'classroom' => $ppo->filters['originClassroom'], 'level' => $ppo->filters['originLevel'], 'lastname' => $ppo->filters['originLastname'], 'firstname' => $ppo->filters['originFirstname']));
             } else {
                 $originAssignments = $studentDAO->findForManageAssignments($ppo->filters['originGrade'], $ppo->filters);
             }
         } elseif ($ppo->filters['originUserType'] === 'USER_ENS') {
             $originAssignments = $personnelDAO->findTeachersAssignedToSchoolByStructure($ppo->filters['originGrade'], $ppo->filters['originSchool'], $ppo->filters['originClassroom'], $ppo->filters['originLevel'], $ppo->filters['originFirstname'], $ppo->filters['originLastname']);
         }
     } elseif ($ppo->filters['searchMode'] === 'byName' && ($ppo->filters['originFirstnameSearch'] || $ppo->filters['originLastnameSearch'])) {
         if ($ppo->filters['originUserTypeSearch'] == 'USER_ELE') {
             if ($ppo->filters['mode'] === 'changeClassroom') {
                 $originAssignments = $studentDAO->findStudentsForAssignmentByName($ppo->filters['originGrade'], $ppo->filters['originFirstnameSearch'], $ppo->filters['originLastnameSearch']);
             } else {
                 $originAssignments = $studentDAO->findForManageAssignmentsByName($ppo->filters['originGrade'], $ppo->filters['destinationGrade'], $ppo->filters['originFirstnameSearch'], $ppo->filters['originLastnameSearch']);
             }
         } elseif ($ppo->filters['originUserTypeSearch'] === 'USER_ENS') {
             $originAssignments = $personnelDAO->findTeachersByName($ppo->filters['originGrade'], $ppo->filters['originFirstnameSearch'], $ppo->filters['originLastnameSearch']);
         }
     }
     if ($ppo->filters['originUserTypeSearch'] == 'USER_ELE' || $ppo->filters['originUserTypeSearch'] == 'USER_ELE') {
         $destinationAssignments = $studentDAO->findAssigned(array('grade' => $ppo->filters['destinationGrade'], 'cityGroup' => $ppo->filters['destinationCityGroup'], 'city' => $ppo->filters['destinationCity'], 'school' => $ppo->filters['destinationSchool'], 'classroom' => $ppo->filters['destinationClassroom'], 'level' => $ppo->filters['destinationLevel']), !_currentUser()->testCredential('module:school|' . $ppo->filters['destinationSchool'] . '|teacher|update@gestionautonome') ? $groups['gestionautonome|iconitogrouphandler'] : null);
     }
     if ($ppo->filters['originUserTypeSearch'] == 'USER_ENS' || $ppo->filters['originUserTypeSearch'] == 'USER_ENS') {
         $destinationAssignments = $personnelDAO->findTeachersAssignedToClassroomByStructure($ppo->filters['destinationGrade'], $ppo->filters['destinationSchool'], $ppo->filters['destinationClassroom'], $ppo->filters['destinationLevel']);
     }
     foreach ($originAssignments as $originAssignment) {
         if ($ppo->filters['originUserType'] == 'USER_ELE' && $originAssignment->current || $ppo->filters['originUserType'] == 'USER_ENS' && $originAssignment->nom_classe != '') {
             if ($ppo->filters['originUserType'] == 'USER_ENS') {
                 // Regroupement des enseignants dans la même classe. Pas de distinction des niveaux
                 $ppo->originAssignments[''][$originAssignment->id_classe][$originAssignment->user_id] = $originAssignment;
             } elseif ($ppo->filters['originUserType'] == 'USER_ELE') {
                 $ppo->originAssignments[$originAssignment->id_niveau][$originAssignment->id_classe][] = $originAssignment;
             }
             $ppo->classrooms[$originAssignment->id_classe] = $originAssignment->nom_classe;
             $ppo->classroomLevels[$originAssignment->id_niveau] = $originAssignment->nom_niveau;
         } elseif (is_null($ppo->filters['originClassroom']) || $ppo->filters['mode'] != 'changeClassroom') {
             $ppo->classrooms[0] = 'Sans affectation';
             $withoutAssignments[] = $originAssignment;
         }
     }
     foreach ($withoutAssignments as $withoutAssignment) {
         $ppo->originAssignments[''][0][] = $withoutAssignment;
     }
     // Construction du tableau des affectations de destination pour l'affichage
     if (!isset($ppo->filters['destinationClassroom'])) {
         if ($ppo->filters['originUserType'] == 'USER_ELE') {
             if (isset($ppo->filters['destinationLevel']) && !is_null($ppo->filters['destinationLevel'])) {
                 // On récupère toutes les classes disponibles pour l'école et le niveau de classe sélectionnés
                 if (_currentUser()->testCredential('module:school|' . $ppo->filters['destinationSchool'] . '|classroom|create@gestionautonome')) {
                     $destinationClassrooms = $classroomDAO->getBySchoolAndLevel($ppo->filters['destinationSchool'], $ppo->filters['destinationLevel'], $ppo->filters['destinationGrade']);
                 } else {
                     $destinationClassrooms = $classroomDAO->findBySchoolIdAndUserGroups($ppo->filters['destinationSchool'], $groups['gestionautonome|iconitogrouphandler'], $ppo->filters['destinationGrade'], $ppo->filters['destinationLevel']);
                 }
                 foreach ($destinationClassrooms as $destinationClassroom) {
                     $classroomLevel = _ioDAO('kernel|kernel_bu_classe_niveau')->get($ppo->filters['destinationLevel']);
                     $ppo->destinationAssignments[$ppo->filters['destinationLevel']][$destinationClassroom->id] = array();
                     $ppo->classrooms[$destinationClassroom->id] = $destinationClassroom->nom;
                     $ppo->classroomLevels[$ppo->filters['destinationLevel']] = $classroomLevel->niveau_court;
                 }
             } else {
                 // On récupère toutes les classes disponibles pour l'école
                 if (_currentUser()->testCredential('module:school|' . $ppo->filters['destinationSchool'] . '|classroom|create@gestionautonome')) {
                     $destinationClassrooms = $classroomDAO->getBySchool($ppo->filters['destinationSchool'], $ppo->filters['destinationGrade']);
                 } else {
                     $destinationClassrooms = $classroomDAO->findBySchoolIdAndUserGroups($ppo->filters['destinationSchool'], $groups['gestionautonome|iconitogrouphandler'], $ppo->filters['destinationGrade']);
                 }
                 foreach ($destinationClassrooms as $destinationClassroom) {
                     $levels = $destinationClassroom->getLevels();
                     foreach ($levels as $level) {
                         $ppo->destinationAssignments[$level->id_n][$destinationClassroom->id] = array();
                         $ppo->classrooms[$destinationClassroom->id] = $destinationClassroom->nom;
                         $ppo->classroomLevels[$level->id_n] = $level->niveau_court;
                     }
                 }
             }
         } else {
             if (isset($ppo->filters['destinationLevel']) && !is_null($ppo->filters['destinationLevel'])) {
                 if (_currentUser()->testCredential('module:school|' . $ppo->filters['destinationSchool'] . '|classroom|create@gestionautonome')) {
                     $destinationClassrooms = $classroomDAO->getBySchoolAndLevel($ppo->filters['destinationSchool'], $ppo->filters['destinationLevel'], $ppo->filters['destinationGrade']);
                 } else {
                     $destinationClassrooms = $classroomDAO->findBySchoolIdAndUserGroups($ppo->filters['destinationSchool'], $groups['gestionautonome|iconitogrouphandler'], $ppo->filters['destinationGrade'], $ppo->filters['destinationLevel']);
                 }
             } else {
                 if (_currentUser()->testCredential('module:school|' . $ppo->filters['destinationSchool'] . '|classroom|create@gestionautonome')) {
                     $destinationClassrooms = $classroomDAO->getBySchool($ppo->filters['destinationSchool'], $ppo->filters['destinationGrade']);
                 } else {
                     $destinationClassrooms = $classroomDAO->findBySchoolIdAndUserGroups($ppo->filters['destinationSchool'], $groups['gestionautonome|iconitogrouphandler'], $ppo->filters['destinationGrade']);
                 }
             }
             foreach ($destinationClassrooms as $destinationClassroom) {
                 $ppo->destinationAssignments[''][$destinationClassroom->id] = array();
                 $ppo->classrooms[$destinationClassroom->id] = $destinationClassroom->nom;
             }
         }
     } else {
         // Récupération de la classe sélectionnée par les filtres
         $destinationClassroom = $classroomDAO->get($ppo->filters['destinationClassroom']);
         if ($ppo->filters['originUserType'] == 'USER_ELE') {
             if (isset($ppo->filters['destinationLevel']) && !is_null($ppo->filters['destinationLevel'])) {
                 $classroomLevel = _ioDAO('kernel|kernel_bu_classe_niveau')->get($ppo->filters['destinationLevel']);
                 $ppo->destinationAssignments[$classroomLevel->id_n][$destinationClassroom->id] = array();
                 $ppo->classrooms[$destinationClassroom->id] = $destinationClassroom->nom;
                 $ppo->classroomLevels[$classroomLevel->id_n] = $classroomLevel->niveau_court;
             } else {
                 $levels = $destinationClassroom->getLevels();
                 foreach ($levels as $level) {
                     $ppo->destinationAssignments[$level->id_n][$destinationClassroom->id] = array();
                     $ppo->classrooms[$destinationClassroom->id] = $destinationClassroom->nom;
                     $ppo->classroomLevels[$level->id_n] = $level->niveau_court;
                 }
             }
         } else {
             $ppo->destinationAssignments[''][$destinationClassroom->id] = array();
             $ppo->classrooms[$destinationClassroom->id] = $destinationClassroom->nom;
         }
     }
     // Ajout des affectations au tableau des affectations de destination destiné à l'affichage
     foreach ($destinationAssignments as $destinationAssignment) {
         if ($ppo->filters['originUserType'] == 'USER_ENS') {
             // Regroupement des enseignants dans la même classe. Pas de distinction des niveaux
             $ppo->destinationAssignments[''][$destinationAssignment->id_classe][$destinationAssignment->user_id] = $destinationAssignment;
         } elseif ($ppo->filters['originUserType'] == 'USER_ELE') {
             $ppo->destinationAssignments[$destinationAssignment->id_niveau][$destinationAssignment->id_classe][] = $destinationAssignment;
         }
         $ppo->classrooms[$destinationAssignment->id_classe] = $destinationAssignment->nom_classe;
         $ppo->classroomLevels[$destinationAssignment->id_niveau] = $destinationAssignment->nom_niveau;
     }
     // Gestion des limites
     _classInclude('gestionautonome|GestionAutonomeService');
     $ppo->personsLimitByClassroom = 0;
     if ($ppo->filters['originUserType'] == 'USER_ENS') {
         if (GestionAutonomeService::hasTeachersLimitByClassroom()) {
             $ppo->personsLimitByClassroom = CopixConfig::get('gestionautonome|teachersLimitByClassroom');
         }
     } elseif ($ppo->filters['originUserType'] == 'USER_ELE') {
         if (GestionAutonomeService::hasStudentsLimitByClassroom()) {
             $ppo->personsLimitByClassroom = CopixConfig::get('gestionautonome|studentsLimitByClassroom');
         }
     }
     $ppo->totalPersonsByClassroom = array();
     foreach ($ppo->destinationAssignments as $level) {
         foreach ($level as $classroomId => $persons) {
             if (!array_key_exists($classroomId, $ppo->totalPersonsByClassroom)) {
                 $ppo->totalPersonsByClassroom[$classroomId] = 0;
             }
             $ppo->totalPersonsByClassroom[$classroomId] += count($persons);
         }
     }
     if (CopixConfig::exists('|can_search_by_name') && CopixConfig::get('|can_search_by_name')) {
         $ppo->can_search_by_name = true;
     } else {
         $ppo->can_search_by_name = false;
     }
     $toReturn = $this->_usePPO($ppo, '_manage_assignments.tpl');
 }