diff --git a/js/lib/API.js b/js/lib/API.js index a272c54..4111cce 100755 --- a/js/lib/API.js +++ b/js/lib/API.js @@ -51,7 +51,7 @@ APIClass.prototype = { if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée /* DEBUG : affiche la réponse BRUTE de API.php */ - console.log('API.php => '+ptrAPI.xhr[i].responseText); + // console.log('API.php => '+ptrAPI.xhr[i].responseText); console.log( JSON.parse(ptrAPI.xhr[i].responseText) ); /* si success de requête */ diff --git a/manager/career.php b/manager/career.php index 9ed7f24..be4a580 100755 --- a/manager/career.php +++ b/manager/career.php @@ -225,7 +225,7 @@ class careerManager{ case 'saisieNoteMultiple': if( (permission('teacher') || permission('admin')) && $_SESSION['annee'] >= getCurrentYear() ){ $areSetParam = isset($request->notes) && isset($request->controle); // les arguments existent - $typeOkParam = $areSetParam && is_array($request->notes) && is_numeric($request->controle); // si c'est des strings + $typeOkParam = $areSetParam && is_array($request->notes) && checkParam($request->controle, 'auto_increment_id'); // si c'est des strings $nEmptyParam = $typeOkParam && count($request->notes) > 0; // des bon types if( $nEmptyParam ){ // si tout les paramètres sont bons @@ -304,10 +304,6 @@ class careerManager{ - - - - /**************************/ /* création d'un semestre */ /**************************/ diff --git a/manager/database.php b/manager/database.php index cf39d00..f2c5c6d 100755 --- a/manager/database.php +++ b/manager/database.php @@ -1186,17 +1186,18 @@ class DataBase{ public function saisieNoteMultiple($controle, $notes){ if( !($controleInfo=controleRepo::info($controle)) ) return 'unknown_controle'; - foreach($notes as $iter=>$note){ + foreach($notes as $iter=>$NOTE){ + + $NOTE->valeur = floatval($NOTE->valeur); // 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( !(userRepo::UID($note->etudiant)) ) return 'unknown_user'; + if( !(userRepo::UID($NOTE->etudiant)) ) return 'unknown_user'; // si la note > base du contrôle, on supprime la note - if( $note->valeur > $controleInfo['base'] ) + if( $NOTE->valeur > $controleInfo['base'] ) unset( $notes[$iter] ); } - // saisie multiple des notes $rep = noteRepo::creerMultiple($controleInfo['id'], $controleInfo['id_semestre'], $notes); diff --git a/manager/excel.php b/manager/excel.php index 22519b2..93ec7d3 100755 --- a/manager/excel.php +++ b/manager/excel.php @@ -252,47 +252,53 @@ class excelManager{ break; - /***************************************************************************/ - /* Importation de notes pour un contrôle, une formation et un groupe donné */ - /***************************************************************************/ - case 'import_notes': + /******************************************/ + /* Importation des notes pour un contrôle */ + /******************************************/ + case 'import_notes': + + $filePath = __EXCEL_PATH__.$_SESSION['identifiant'].'_import_notes.xlsx'; - if( isset($request->docPath) ) { + // si on a pas le droit d'écriture, on quitte // + if( !is_readable($filePath) ){ $answer->request = 'read_permission'; return; } + + // Charger le fichier en tant que document Excel + $objPHPExcel = PHPExcel_IOFactory::load($filePath); + + // Get sur la première case + $sheet = $objPHPExcel->getSheet(0); + $notesData = $sheet->rangeToArray('A1:'.'B'.$sheet->getHighestRow()); + - // Récupération du nom du fichier + $notes = array(); // contiendra le tableau de retour - $inputFileName = $request->docPath; - - // Chargement du fichier + /****************************/ + /* TRAITEMENT SUR LES CASES */ + /****************************/ + foreach($notesData as $line){ - $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); - - // Placement du curseur sur la première case + /* [1] On récupère pour chaque étudiant si le format est bon + =========================================================================*/ + // si la case qui doit contenir la note n'est pas vide, on met au bon format numérique + if( $line[1] != null ) $line[1] = str_replace(',', '.', $line[1]); - $sheet = $objPHPExcel->getSheet(0); - $noteData = $sheet->rangeToArray('A3:'.$sheet->getHighestColumn().''.$sheet->getHighestRow()); + if( checkParam($line[0], 'utilisateur.identifiant') && is_numeric($line[1]) ){ // bon format pour l'identifiant et la note - // Varaible stack pour la liste des notes + array_push( // on ajoute l'étudiant et sa note + $notes, + array( + 'etudiant' => $line[0], + 'valeur' => $line[1] + ) + ); - $listeNotes = array(); - - // Boucle sur le format suivant : ligne[0] : [ID] / ligne[1] : [NOTE] - - foreach($noteData as $line) { - - if($line[0] != null && $line[1] != null) - array_push($listeNotes,array($line[0],$line[1])); } } - // Erreur de paramètre(s) - - else { - - $answer->request='param_error'; - } + $answer->notes = $notes; + $answer->request = 'success'; break; diff --git a/manager/repo/note.php b/manager/repo/note.php index 1d1eff2..0e0d165 100755 --- a/manager/repo/note.php +++ b/manager/repo/note.php @@ -15,7 +15,7 @@ class noteRepo{ * @etudiant l'identifiant de l'étudiant recherché * @controle l'UID du contrôle * - * @return UID l'UID de la note si elle existe pour ces critères + * @return UID l'UID de la note si elle existe pour ces critères (la dernière assignée) * @return FALSE FAUX si aucune note répondant à ces critères n'est pas présente dans la BDD * */ @@ -24,9 +24,10 @@ class noteRepo{ FROM appartenance as app, note, controle as ctrl WHERE app.id_appartenance = note.id_appartenance AND ctrl.id_controle = note.id_controle - + AND app.id_etudiant = :etudiant - AND ctrl.id_controle = :controle"); + AND ctrl.id_controle = :controle + AND note.id_note in (SELECT max(id_note) FROM note GROUP BY id_controle, id_appartenance)"); $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 @@ -318,7 +319,6 @@ class noteRepo{ * */ public static function creerMultiple($controle, $semestre, $notes){ - $saisieFinie = true; foreach($notes as $iter=>$note){ @@ -327,45 +327,31 @@ class noteRepo{ $cEtudiant = $note->etudiant; $cValeur = $note->valeur; - /* [1] Premier cas : il faut créer la note de cet étudiant pour ce contrôle + /* [1] Il faut créer la note de cet étudiant pour ce contrôle ============================================================================*/ - /* [MAJ] On créé toujours une note, même si une existe déjà afin de garder toutes les modifications */ - if( true ){ // !($noteUID=noteRepo::UID($cEtudiant, $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' => $cEtudiant, ':semestre' => $semestre, ':controle' => $controle, ':valeur' => $cValeur )); + $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' => $cEtudiant, ':semestre' => $semestre, ':controle' => $controle, ':valeur' => $cValeur )); - /* [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' => $cValeur, ':noteUID' => $noteUID )); - - } - - /* [3] On vérifie que la note a bien été créé pour cet étudiant et ce contrôle + /* [2] On vérifie que la note a bien été créé pour cet étudiant et ce contrôle =================================================================================*/ if( !($noteUID=noteRepo::UID($cEtudiant, $controle)) ) return false; - - /* [4] On vérifie que la note créée a bien la valeur qu'on a attribuée + /* [3] On vérifie que la note créée a bien la valeur qu'on a attribuée =================================================================================*/ $verificationValeur = DataBase::getPDO()->prepare("SELECT valeur FROM note WHERE id_note = :noteUID"); $verificationValeur->execute(array( ':noteUID' => $noteUID )); + $saisieFinie = $saisieFinie && ( $verificationValeur->fetch()['valeur'] == $cValeur ); - } - return $saisieFinie; } diff --git a/page/_JS/career.js b/page/_JS/career.js index e1ab288..3186f56 100755 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -640,8 +640,67 @@ if( studentCase != null ){ +/*******************/ +/* IMPORT DE NOTES */ +/*******************/ +var importNotes = document.querySelector('#import_notes[data-ctrl]'); +if( importNotes != null ){ + var fileInput = importNotes.children[0] + fileInput.addEventListener('change', function(e){ + // on récupère le contrôle en question + var controle = importNotes.dataset.ctrl; + console.log('controle: '+controle); + + // on récupère le fichier + var file = importNotes.children[0].files[0]; + + /* [1] IMPORTATION DU FICHIER + =======================================*/ + var fd = new FormData(); + fd.append('filename', 'import_notes'); + fd.append('file', file, file.name); + + var xhr = new XMLHttpRequest(); + + xhr.open('POST', 'manager/import.php', true); + + xhr.onreadystatechange = function(){ + if( xhr.readyState == 4 && [0, 200].indexOf(xhr.status) > -1 ) + console.log('[1] IMPORT=> '+xhr.responseText); + if( xhr.responseText == 'success' ){ + + /* [2] LECTURE DU FICHIER + =======================================*/ + var request = { level_0: 'excel', level_1: 'import_notes' }; + API.send(request, function(e){ + console.log('[2] PARSE=>'+e.request); + if( e.request == 'success' ){ + + /* [3] INTÉGRATION À LA BDD + =======================================*/ + requestIntegration = { level_0: 'career', level_1: 'saisieNoteMultiple', controle: controle, notes: e.notes }; + API.send( requestIntegration, function(f){ + console.log('[3] INTEGRATION=>'+f.request); + if( f.request == 'success' ){ + console.log('liste intégrée'); + reload(); + }else console.log('integration error'); + }); + + }else console.log('import error'); + }); + + } + + } + + xhr.send(fd); + + }, false); + +} diff --git a/page/career.php b/page/career.php index 8586b2d..b4a024b 100755 --- a/page/career.php +++ b/page/career.php @@ -355,8 +355,9 @@ elseif( permission('teacher') ){ // si enseignant et qu'un contrôle est spécif echo ""; echo "'; - echo ''; - echo ""; + echo ''; + echo ""; echo ""; diff --git a/src/files/lbh1609a_import_notes.xlsx b/src/files/lbh1609a_import_notes.xlsx new file mode 100755 index 0000000..5991c0a Binary files /dev/null and b/src/files/lbh1609a_import_notes.xlsx differ diff --git a/test.php b/test.php index 4429e39..6caca64 100755 --- a/test.php +++ b/test.php @@ -49,10 +49,12 @@ debug(); /* [1] On récupère le semestre d'un étudiant =====================================================*/ -var_dump( DataBase::getInstance()->applyJuryTo('Etud100', 72, 'ADM') ); - - - +// var_dump( DataBase::getInstance()->applyJuryTo('Etud101', 72, 'ADM') ); +// var_dump( DataBase::getInstance()->saisieNoteMultiple(589, array( +// [ 'etudiant' => 'Etud100', 'valeur' => '10' ], +// [ 'etudiant' => 'Etud101', 'valeur' => '10' ], +// [ 'etudiant' => 'Etud134', 'valeur' => '10' ] +// )) );
".$answer->controle['nom'].' - '.$answer->controle['libelle'].'
".$answer->controle['libelle']."
Importer les notes"; + echo "
".$answer->controle['module']." - ".$answer->controle['modulelib']."