From 97bc41d54e9abb568b031eb15710b754acdd643d Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sun, 15 Nov 2015 15:12:26 +0100 Subject: [PATCH] Saisie note individuelle OP --- manager/career.php | 25 ++------ manager/database.php | 141 +++++------------------------------------- manager/repo/note.php | 99 ++++++++++++++++++----------- page/_JS/career.js | 2 +- page/career.php | 6 +- 5 files changed, 89 insertions(+), 184 deletions(-) diff --git a/manager/career.php b/manager/career.php index a570978..30c60dd 100755 --- a/manager/career.php +++ b/manager/career.php @@ -128,26 +128,13 @@ require_once __ROOT__.'/manager/database.php'; /****************************************************/ case 'saisieNote': if( permission('teacher') ){ - $areSetParam = isset($request->etudiant) && isset($request->controle); // les arguments existent - $typeOkParam = $areSetParam && is_string($request->enseignant); // si c'est des strings - $nEmptyParam = $typeOkParam && strlen($request->enseignant) > 0 && is_numeric($request->controle); // des bon types - $enseignantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->enseignant); // nom bon format - - // paramètre optionnel - $optionalGroupe = isset($request->groupe) && is_string($request->groupe) && strlen($request->groupe) > 1 && preg_match('/^[a-z0-9 -]{1,10}$/i', $request->groupe); - - // définition (ou pas) du paramètre optionnel - if( $optionalGroupe ) $groupe = $request->groupe; - else $groupe = null; + $areSetParam = isset($request->etudiant) && isset($request->controle) && isset($request->note); // les arguments existent + $typeOkParam = $areSetParam && is_string($request->etudiant); // si c'est des strings + $nEmptyParam = $typeOkParam && strlen($request->etudiant) > 0 && is_numeric($request->controle) && is_numeric($request->note); // des bon types + $etudiantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->etudiant); // nom bon format - if( $enseignantCheck ){ // si tout les paramètres sont bons - $controle = DataBase::getInstance()->getNotesEnseignant($request->enseignant, $_SESSION['semestre_pair'], $_SESSION['annee'], $request->controle, $groupe); - - if( is_array($controle) ){ // si on a bien un tableau - $answer->controle = $controle; // on renvoie dans answer->controle - $answer->request = 'success'; // et on renvoie success - }else // sinon si c'est pas un tableau - $answer->request = $controle; // on retourne l'erreur + if( $etudiantCheck ){ // si tout les paramètres sont bons + $answer->request = DataBase::getInstance()->saisieNote($request->etudiant, $request->controle, $request->note); }else $answer->request = 'param_error'; diff --git a/manager/database.php b/manager/database.php index ecf9082..5e75e7d 100755 --- a/manager/database.php +++ b/manager/database.php @@ -686,136 +686,23 @@ class DataBase{ } + /******************************************/ + /*** saisie note étudiant à un contrôle ***/ + /******************************************/ + public function saisieNote($etudiant, $controle, $note){ + // on vérifie l'existence de l'étudiant et du contrôle, ainsi que la cohérence de la note (pas supérieure à la base) + if( !($etudiantUID=userRepo::UID($etudiant)) ) return 'unknown_user'; + if( !($controleInfo=controleRepo::info($controle)) ) return 'unknown_controle'; + if( $note > $controleInfo['base'] ) return 'unknown_note'; - - - /**************************************/ - /*** retourne les notes d'un module ***/ - /**************************************/ - public function getModuleNotes($etudiant, $module, $semestre, $annee){ - // on vérifie que le module, le semestre existent et que l'étudiant est inscrit à ce semestre - if( !($semestreUID=semestreRepo::UID($semestre, $annee)) ) return 'unknown_semestre'; else $semestreUID = (int) $semestreUID; - if( !($etudiantUID=userRepo::UID($etudiant, $semestreUID)) ) return 'unknown_user'; - if( !($moduleUID=moduleRepo::UID($module)) ) return 'unknown_module'; - - - /*** on cherche un module avec ce nom, en accord avec le semestre et l'étudiant ***/ - $getModuleUID = DataBase::getPDO()->prepare("SELECT m.id_module as id FROM module as m, appartenance as app, ue, mcc_ue, mcc_module as mcc_m ". - "WHERE app.id_etudiant = :etudiantUID ". - - "AND mcc_ue.id_ue = ue.id_ue ". - "AND mcc_ue.id_semestre = app.id_semestre ". - "AND mcc_ue.id_semestre = :semestreUID ". - - "AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ". - - "AND mcc_m.id_module = m.id_module ". - - "AND m.nom = :module "); - $getModuleUID->execute(array( - ':module' => $module, - ':etudiantUID' => $etudiantUID, - ':semestreUID' => $semestreUID - )); - - // si on trouve, on le définit, sinon on retourne "unknown_group" - if( $moduleUID = $getModuleUID->fetch()['id'] ) - $moduleUID = (int) $moduleUID; + // saisie de la note + $rep = noteRepo::creer($etudiantUID, $controleInfo['id'], $controleInfo['id_semestre'], $note); + + if( $rep ) + return 'success'; else - return 'unknown_module'; + return 'error'; - - - $EtudiantInscritAuModule = false; // par défaut on dit que l'étudiant n'est pas inscrit à ce module - foreach(moduleRepo::forStudent($etudiant, $semestreUID) as $module ) // on récupère parmi les modules auquel est inscrit l'utilisateur - if( $module['id'] == $moduleUID ){ // s'il est inscrit au module donné - $EtudiantInscritAuModule = true; - break; - } - - // si l'étudiant n'a pas ce module dans ceux auxquels il est inscrit - if( !$EtudiantInscritAuModule ) return 'unknown_module'; - - - // si on a l'UID utilisateur & l'UID groupe => on récupère les modules - $getNoteList = DataBase::getPDO()->prepare("SELECT m.nom as module, m.libelle as modulelib, ctrl.intitule, note.valeur, ctrl.base, ctrl.coefficient ". - "FROM note, appartenance as app, semestre as s, module as m, mcc_ue, mcc_module as mcc_m, controle as ctrl ". - "WHERE note.id_appartenance = app.id_appartenance ". - "AND ctrl.id_controle = note.id_controle ". - "AND ctrl.id_mcc_module = mcc_m.id_mcc_module ". - - "AND mcc_ue.id_semestre = app.id_semestre ". - "AND mcc_ue.id_semestre = s.id_semestre ". - - "AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ". - - "AND mcc_m.id_module = m.id_module ". - - "AND m.id_module = :moduleUID ". - "AND app.id_etudiant = :etudiantUID ". - "AND s.id_semestre = :semestreUID ". - "ORDER BY ctrl.date_publication ASC"); - $getNoteList->execute(array( - ':moduleUID' => $moduleUID, - ':etudiantUID' => $etudiantUID, - ':semestreUID' => $semestreUID - )); - - // on retourne la liste des notes et supprime les doublons à indices numériques - return DataBase::delNumeric( $getNoteList->fetchAll() ); - } - - - - - - /**********************************/ - /*** retourne les notes d'un UE ***/ - /**********************************/ - public function getUENotes($etudiant, $UE, $semestre, $annee){ - // on vérifie que l'UE, le semestre existent et que l'étudiant est inscrit à ce semestre - if( !($semestreUID=semestreRepo::UID($semestre, $annee)) ) return 'unknown_semestre'; else $semestreUID = (int) $semestreUID; - if( !($etudiantUID=userRepo::UID($etudiant, $semestreUID)) ) return 'unknown_user'; - if( !($UEUID=ueRepo::UID($UE)) ) return 'unknown_ue'; - - - $EtudiantInscritAlUE = false; // par défaut on dit que l'étudiant n'est pas inscrit à cet UE - foreach(ueRepo::forStudent($etudiant, $semestreUID) as $UE ) // on récupère parmi les UEs auquel est inscrit l'utilisateur - if( $UE['id'] == $UEUID ){ // s'il est inscrit à l'UE donnée - $EtudiantInscritAlUE = true; - break; - } - - // si l'étudiant n'a pas ce module dans ceux auxquels il est inscrit - if( !$EtudiantInscritAlUE ) return 'unknown_module'; - - // si on a l'UID utilisateur & l'UID UE => on récupère les notes - $getNoteList = DataBase::getPDO()->prepare("SELECT m.nom as module, m.libelle as modulelib, ctrl.intitule, note.valeur, ctrl.base, ctrl.coefficient ". - "FROM note, appartenance as app, semestre as s, module as m, ue, mcc_ue, mcc_module as mcc_m, controle as ctrl ". - "WHERE note.id_appartenance = app.id_appartenance ". - "AND ctrl.id_mcc_module = mcc_m.id_mcc_module ". - "AND ctrl.id_controle = note.id_controle ". - - "AND mcc_ue.id_ue = ue.id_ue ". - "AND mcc_ue.id_semestre = app.id_semestre ". - "AND mcc_ue.id_semestre = s.id_semestre ". - - "AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ". - - "AND mcc_m.id_module = m.id_module ". - - "AND ue.id_ue = :UEUID ". - "AND app.id_etudiant = :etudiantUID ". - "AND s.id_semestre = :semestreUID ". - "ORDER BY m.nom, ctrl.date_publication ASC"); - $getNoteList->execute(array( - ':UEUID' => $UEUID, - ':etudiantUID' => $etudiantUID, - ':semestreUID' => $semestreUID - )); - - // on retourne la liste de notes et supprime les doublons à indices numériques - return DataBase::delNumeric( $getNoteList->fetchAll() ); } } diff --git a/manager/repo/note.php b/manager/repo/note.php index 363e614..9459916 100755 --- a/manager/repo/note.php +++ b/manager/repo/note.php @@ -15,47 +15,22 @@ class noteRepo extends DBAccess{ * @etudiant l'identifiant de l'étudiant recherché * @controle l'UID du contrôle * - * @return UID si l'utilisateur est dans la BDD, retourne son UID - * @return FALSE FAUX si l'utilisateur n'est pas présent dans la BDD + * @return UID l'UID de la note si elle existe pour ces critères + * @return FALSE FAUX si aucune note répondant à ces critères n'est pas présente dans la BDD * */ - public static function UID($identifiant, $semestre=null, $annee=null){ - if( $semestre == null && $annee == null ){ // on cherche un utilisateur avec cet identifiant - - /* [1] Cas où on cherche juste si l'utilisateur existe - =============================================================*/ - $getUtilisateurUID = DataBase::getPDO()->prepare("SELECT identifiant as id FROM utilisateur WHERE identifiant = :identifiant"); - $getUtilisateurUID->execute(array( ':identifiant' => $identifiant )); - - }elseif( $semestre != null ){ - - /* [2] Cas où on cherche si un étudiant est inscrit à un semestre - ==============================================================*/ - $getUtilisateurUID = DataBase::getPDO()->prepare("SELECT u.identifiant as id ". - "FROM utilisateur as u, appartenance as app ". - "WHERE u.identifiant = app.id_etudiant ". - "AND u.identifiant = :identifiant ". - "AND app.id_semestre = :semestre"); - $getUtilisateurUID->execute(array( ':identifiant' => $identifiant, ':semestre' => $semestre )); + public static function UID($etudiant, $controle){ + $getNoteUID = DataBase::getPDO()->prepare("SELECT note.id_note as id ". + "FROM appartenance as app, note, controle as ctrl ". + "WHERE app.id_appartenance = note.id_appartenance ". + "AND ctrl.id_controle = note.id_controle ". - }else{ - - /* [2] Cas où on cherche si un enseignant enseigne l'année donnée - ==============================================================*/ - $getUtilisateurUID = DataBase::getPDO()->prepare("SELECT DISTINCT u.identifiant as id ". - "FROM utilisateur as u, enseignement as ens, semestre as s, mcc_module as mcc_m, mcc_ue ". - "WHERE u.identifiant = ens.id_enseignant ". - "AND ens.id_mcc_module = mcc_m.id_mcc_module ". - "AND mcc_m.id_mcc_ue = mcc_ue.id_mcc_ue ". - "AND mcc_ue.id_semestre = s.id_semestre ". - "AND s.annee = :annee ". - "AND u.identifiant = :identifiant"); - $getUtilisateurUID->execute(array( ':identifiant' => $identifiant, ':annee' => $annee )); - - } + "AND app.id_etudiant = :etudiant ". + "AND ctrl.id_controle = :controle"); + $getNoteUID->execute(array( ':etudiant' => $etudiant, ':controle' => $controle )); // on retourne le résultat : FAUX si aucun résultat, sinon la valeur de l'UID de l'utilisateur - return $getUtilisateurUID->fetch()['id']; + return $getNoteUID->fetch()['id']; } @@ -178,4 +153,56 @@ class noteRepo extends DBAccess{ } + + + /* CRÉATION/MODIFICATION D'UNE NOTE POUR UN ETUDIANT À UN CONTRÔLE + * + * @etudiant l'UID de l'étudiant en question + * @controle l'UID du contrôle en question + * @semestre l'UID du semestre en question + * @valeur valeur de la note à saisir + * + * + * @return noteUID l'UID de la note si elle a bien été créé + * @return cree FALSE si la note n'a pas été créé + * + */ + public static function creer($etudiant, $controle, $semestre, $valeur){ + /* [1] Premier cas : il faut créer la note de cet étudiant pour ce contrôle + ============================================================================*/ + if( !($noteUID=noteRepo::UID($etudiant, $controle)) ){ + + $creationNote = DataBase::getPDO()->prepare("INSERT INTO note(id_note, id_appartenance, id_controle, valeur) ". + "VALUES(". + "DEFAULT, ". + "(SELECT id_appartenance FROM appartenance WHERE id_etudiant = :etudiant AND id_semestre = :semestre), ". + ":controle, ". + ":valeur". + ")"); + $creationNote->execute(array( ':etudiant' => $etudiant, ':semestre' => $semestre, ':controle' => $controle, ':valeur' => $valeur )); + + + /* [2] Second cas : il faut modifier la note de cet étudiant + ============================================================================*/ + }else{ + + $modificationNote = DataBase::getPDO()->prepare("UPDATE note SET valeur = :valeur WHERE id_note = :noteUID"); + $modificationNote->execute(array( ':valeur' => $valeur, ':noteUID' => $noteUID )); + + } + + /* [3] On vérifie que la note a bien été créé pour cet étudiant et ce contrôle + =================================================================================*/ + if( !($noteUID=noteRepo::UID($etudiant, $controle)) ) return false; + + + /* [4] On vérifie que la note créée a bien la valeur qu'on a attribuée + =================================================================================*/ + $verificationValeur = DataBase::getPDO()->prepare("SELECT note.valeur FROM note WHERE id_note = :noteUID"); + $verificationValeur->execute(array( ':noteUID' => $noteUID )); + + return ( $verificationValeur->fetch()['valeur'] == $valeur ); + } + + } \ No newline at end of file diff --git a/page/_JS/career.js b/page/_JS/career.js index fc4e973..e6b1cc7 100644 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -86,7 +86,7 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != n level_1: 'saisieNote', etudiant: obj.userid, controle: obj.ctrlid, - note: obj.inputEl.value, + note: obj.inputEl.value.replace(',', '.'), // par précaution, on replace les virgules par des points pour le php (is_numeric) }; API.send(request, function(response){ // on gère la réponse de API, si déplacement effectué, on recharge la page diff --git a/page/career.php b/page/career.php index b65c503..5ce2ea0 100755 --- a/page/career.php +++ b/page/career.php @@ -315,7 +315,11 @@ elseif( permission('teacher') ){ // si enseignant et qu'un contrôle est spécif echo "Pas noté"; echo ""; - echo ""; + if( $user['note'] != null ) // s'il a déjà une note, on la met par défaut + echo ""; + else // sinon on laisse le champ vide + echo ""; + echo "
"; echo "";