diff --git a/manager/database.php b/manager/database.php index 404bfd2..2beed87 100755 --- a/manager/database.php +++ b/manager/database.php @@ -637,6 +637,68 @@ class DataBase{ + /* Applique la mention du jury à un étudiant d'un semestre + * + * @etudiant UID de l'étudiant en question + * @semestre UID du semestre courant de l'étudiant + * + * + * @return state SUCCESS => changement effectué + * OU fin de formation + * * => ERREUR + * + * @history + * 1. ADM/ADJ => passage de semestre + * 2. RDB => Redoublement + * 3. RFS => Arrêt + */ + public function applyJuryTo($etudiant, $semestre, $mention){ + + // on vérifie que le semestre et que l'étudiant existent + if( !($semestreInfo=semestreRepo::info($semestre)) ) return 'unknown_semestre'; + if( !($etudiantUID=userRepo::UID($etudiant, $semestre)) ) return 'unknown_user'; + + // on vérifie que la mention est correcte + if( !in_array($mention, array('ADM', 'ADJ', 'RDB', 'RFS')) ) return 'unknown_mention'; + + /* [1] On définit la mention pour l'utilisateur à ce semestre + ======================================================*/ + groupRepo::setMention($etudiantUID, $semestre, $mention); + + /* [2] Gestion du passage de l'étudiant + ======================================================*/ + // si ADM/ADJ ou RDB (redoublement) et semestre impair, passage + if( in_array($mention, array('ADM', 'ADJ')) || $mention == 'RDB' && $semestreInfo['rang']%2==1 ){ + /* (1) On récupère le semestre suivant s'il existe */ + $nextSemestre = semestreRepo::next($semestre); + + /* (2) Si le semestre n'existe pas, on le créé */ + if( is_array($nextSemestre) ) + $nextSemestre = semestreRepo::creer($semestreInfo['formation'], $semestreInfo['nom_formation'], null, $nextSemestre['rang'], $nextSemestre['annee']); + + /* (3) On créé l'appartenance */ + $appartenanceUID = groupRepo::includeAppartenance($etudiant, $nextSemestre); + + /* [3] Gestion du redoublement (début année), rang-2 + ======================================================*/ + }elseif( $mention == 'RDB' ){ + /* (1) On récupère le semestre 2 fois précédent */ + $rdbSemestre = semestreRepo::prev2($semestre); + + /* (2) Si le semestre n'existe pas, on le créé */ + if( is_array($rdbSemestre) ) + $rdbSemestre = semestreRepo::creer($semestreInfo['formation'], $semestreInfo['nom_formation'], null, $rdbSemestre['rang'], $rdbSemestre['annee']); + + /* (3) On créé l'appartenance */ + $appartenanceUID = groupRepo::includeAppartenance($etudiant, $rdbSemestre); + } + + if( isset($nextSemestre) ) var_dump('nxt: '.$nextSemestre); + if( isset($rdbSemestre) ) var_dump('rdb: '.$rdbSemestre); + if( isset($appartenanceUID) ) var_dump('app: '.$appartenanceUID); + return 'success'; + } + diff --git a/manager/repo/group.php b/manager/repo/group.php index f4344fe..e17cfb8 100755 --- a/manager/repo/group.php +++ b/manager/repo/group.php @@ -160,6 +160,24 @@ class groupRepo{ + + /* DEFINIT LA MENTION DU JURY POUR UNE APPARTENANCE + * + * @etudiant UID de l'étudiant en question + * @semestre UID du semestre en question + * @mention Mention à affecter à l'appartenance + * + */ + public static function setMention($etudiant, $semestre, $mention){ + $setMention = DataBase::getPDO()->prepare("UPDATE appartenance + SET mention = :mention + WHERE id_etudiant = :etudiant + AND id_semestre = :semestre"); + $setMention->execute(array( ':mention' => $mention, ':etudiant' => $etudiant, ':semestre' => $semestre )); + + } + + /* RETOURNE LA LISTE DES UTILISATEURS MEMBRES D'UN GROUPE * * @groupeUID l'UID du groupe en question @@ -480,8 +498,8 @@ class groupRepo{ - $creerAppartenance = DataBase::getPDO()->prepare("INSERT INTO appartenance(id_appartenance, id_etudiant, id_groupe, id_semestre) - VALUES(DEFAULT, :identifiant, :groupeUID, :semestre)"); + $creerAppartenance = DataBase::getPDO()->prepare("INSERT INTO appartenance(id_appartenance, id_etudiant, id_groupe, id_semestre, mention) + VALUES(DEFAULT, :identifiant, :groupeUID, :semestre, DEFAULT)"); $creerAppartenance->execute(array( ':identifiant' => $identifiant, ':groupeUID' => $groupeUID, @@ -496,7 +514,7 @@ class groupRepo{ AND id_semestre = :semestre"); $getAppartenanceUID->execute(array( ':identifiant' => $identifiant, ':semestre' => $semestre )); - return $appartenanceUID = $getAppartenanceUID->fetch()['id']; + return $getAppartenanceUID->fetch()['id']; } diff --git a/manager/repo/semestre.php b/manager/repo/semestre.php index 8d4b6e0..9ce5dfa 100755 --- a/manager/repo/semestre.php +++ b/manager/repo/semestre.php @@ -366,6 +366,9 @@ class semestreRepo{ * */ public static function creer($codeFormation, $nomFormation, $nomSemestre, $rangSemestre, $annee){ + if( $nomSemestre == null ) // si le nom n'est pas défini, on met "S" collé au rang + $nomSemestre = 'S'.$rangSemestre; + $count = 0; $maxLoop = 2; /* [1] On vérifie l'existence de la formation (code uniquement) @@ -444,4 +447,125 @@ class semestreRepo{ return DataBase::delNumeric( $getLastMccYear->fetch(), true ); } + + /* RETOURNE LE SEMESTRE SUIVANT UN SEMESTRE + * + * @semestre UID du semestre source + * + * + * @return next_semestre Retourne l'UID du semestre de destination + * Retourne NULL si c'est le dernier semestre de la formation + * + */ + public static function next($semestreUID){ + /* [1] On récupère les informations du semestre + =====================================================*/ + $getSemestreInfo = DataBase::getPDO()->prepare("SELECT id_semestre, rang, id_formation, annee + FROM semestre + WHERE id_semestre = :semestreUID"); + $getSemestreInfo->execute(array( ':semestreUID' => $semestreUID )); + + // si le semestre n'existe pas, on retourne une erreur + if( !($semestre=$getSemestreInfo->fetch()) ) return 'unknown_semestre'; + + /* [2] On calcule le rang+annee du semestre suivant + =====================================================*/ + $next = array( + 'rang' => $semestre['rang']+1, // on incrémente le rang + 'annee' => ($semestre['rang']%2==0) ? $semestre['annee']+1 : $semestre['annee'] + ); + + + /* [3] On récupère le nombre de semestres max de la formation + =====================================================*/ + $getNbSemestreFormation = DataBase::getPDO()->prepare("SELECT nb_semestres + FROM formation + WHERE id_formation = :last_formation"); + $getNbSemestreFormation->execute(array( ':last_formation' => $semestre['id_formation'] )); + $nbSemestres = $getNbSemestreFormation->fetch()['nb_semestres']; + + // si c'était le dernier semestre, on retourne null + if( $semestre['rang'] == $nbSemestres ) return null; + + /* [3] On cherche le semestre suivant + =====================================================*/ + $req = DataBase::getPDO()->prepare("SELECT id_semestre + FROM semestre + WHERE id_formation = :id_formation + AND rang = :next_rang + AND annee = :next_annee + "); + $req->execute(array( + ':id_formation' => $semestre['id_formation'], + ':next_rang' => $next['rang'], + ':next_annee' => $next['annee'] + )); + + $nextSemestres = DataBase::delNumeric( $req->fetchAll() ); + + /* [4] On retourne l'UID du semestre concerné + =====================================================*/ + if( count($nextSemestres) > 0 ) // si au moins un semestre, on retourne le premier + return $nextSemestres[0]['id_semestre']; + else // si aucun semestre trouvé, il faut le créer, on retourne le rang et l'année de destination + return $next; + } + + + + /* RETOURNE LE SEMESTRE 2 FOIS PRÉCÉDENT UN SEMESTRE + * + * @semestre UID du semestre source + * + * + * @return prev2_semestre Retourne l'UID du semestre de destination + * Retourne NULL si le semestre destination n'existe pas + * + */ + public static function prev2($semestreUID){ + /* [1] On récupère les informations du semestre + =====================================================*/ + $getSemestreInfo = DataBase::getPDO()->prepare("SELECT id_semestre, rang, id_formation, annee + FROM semestre + WHERE id_semestre = :semestreUID"); + $getSemestreInfo->execute(array( ':semestreUID' => $semestreUID )); + + // si le semestre n'existe pas, on retourne une erreur + if( !($semestre=$getSemestreInfo->fetch()) ) return 'unknown_semestre'; + + // si le rang est impair, on retourne une erreur + if( $semestre['rang']%2==1 ) return 'not_even_rang'; + + /* [2] On calcule le rang+annee du semestre suivant + =====================================================*/ + $prev2 = array( + 'rang' => $semestre['rang']-2, // on décrémente 2 fois le rang + 'annee' => $semestre['annee']+1 // on incrémente l'année + ); + + + /* [3] On cherche le semestre suivant + =====================================================*/ + $req = DataBase::getPDO()->prepare("SELECT id_semestre + FROM semestre + WHERE id_formation = :id_formation + AND rang = :prev2_rang + AND annee = :prev2_annee + "); + $req->execute(array( + ':id_formation' => $semestre['id_formation'], + ':prev2_rang' => $prev2['rang'], + ':prev2_annee' => $prev2['annee'] + )); + + $prev2Semestres = DataBase::delNumeric( $req->fetchAll() ); + + /* [4] On retourne l'UID du semestre concerné + =====================================================*/ + if( count($prev2Semestres) > 0 ) // si au moins un semestre, on retourne le premier + return $prev2Semestres[0]['id_semestre']; + else // si aucun semestre trouvé, il faut le créer, on retourne le rang et l'année de destination + return $prev2; + } + } \ No newline at end of file diff --git a/test.php b/test.php index 79cd70e..4bd2e2d 100755 --- a/test.php +++ b/test.php @@ -46,30 +46,11 @@ require_once __ROOT__.'/manager/security.php'; debug(); -/* [1] On récupère le semestre d'un étudiant */ -$semestre = DataBase::studentSemestre('Etud100', false, 2015); -var_dump($semestre); -/* [2] On cherche le semestre suivant */ -$req = DataBase::getPDO()->prepare("SELECT s.* - FROM semestre as s - WHERE s.id_formation = :id_formation - AND s.rang > :last_rang - AND - "); -$req->execute(array( - ':id_formation' => $semestre['id_formation'], - ':last_rang' => $semestre['rang'] -)); - - - - - - -/*************************/ -/* CONCEPTION DE PASSAGE */ -/*************************/ +/* [1] On récupère le semestre d'un étudiant +=====================================================*/ +// var_dump( DataBase::getInstance()->applyJuryTo('Etud100', 37, 'RDB') ); +var_dump( DataBase::getInstance()->applyJuryTo('Etud100', 67, 'RDB') );