From 17dd4096ed435ac6d337f26b71d151512910db28 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sun, 3 Jan 2016 22:02:46 +0100 Subject: [PATCH] =?UTF-8?q?[x]=20Import=20de=20notes=20pour=20un=20contr?= =?UTF-8?q?=C3=B4le=20=09+=20@excelManager=20=09+=20enregistrement=20=09+?= =?UTF-8?q?=20lecture/parsage=20=09+=20int=C3=A9gration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/lib/API.js | 2 +- manager/career.php | 6 +-- manager/database.php | 9 ++-- manager/excel.php | 64 +++++++++++++++------------ manager/repo/note.php | 46 +++++++------------ page/_JS/career.js | 59 ++++++++++++++++++++++++ page/career.php | 5 ++- src/files/lbh1609a_import_notes.xlsx | Bin 0 -> 4509 bytes test.php | 10 +++-- 9 files changed, 126 insertions(+), 75 deletions(-) create mode 100755 src/files/lbh1609a_import_notes.xlsx 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 0000000000000000000000000000000000000000..5991c0a9ddd9fe668d2cece6b3a876ba8baebe07 GIT binary patch literal 4509 zcmaJ^2{=^$*Ozq=QFgL4k$rFMl#tz+kbN1{*q0$&))BIkeJdnO_Q)=KQL>aJWX-;e zY|~))&(!;S^Y;FKo%_tacb?~-?>*;p?)je22dqIrNP`Ce0Pr}AfU0m26(ML=0xC`UjMNdwny2J%;nH$w z`3YRA9-tC;(wwNZ`W`mYHgpZ9fCttf0o*GIshh>7ErXAT{r_*kP+_02aj^!wyST!I ztXy3My`3Dh2Smsb!c;`FEpHU79UQ|USJxoYUX@>Ox!bo*skzf)P+B~nTNW1D-};r9 zVUh%>@_?n?Rou$Nuy@id_TN{W(aJUn*Nx?<6$L;Mc}|pTtgx^)N@xmUbS*>rvU(p( zWm}rAxaad8P4f~>Cwnn6JD4v$mBhw}_x-ET3uZFZ;G`eLxXh}XQ z^l`5zQv8C5hrnyo<83-u?RWSN0Mnhe@7$W3j!L%+XkHCFn@Ny9ZyO9Iz9jpCvHLzK z=+nu)_M`^(S~3!HiJ?30FHq+Fv%=@UfHh$oPvh2*vdz}E!0P>WeqB;!_*`7wT)!EFL0euk!NY=u75!IenXu4$I|}{kD=!y!2dImS0}kF_J(i&5&?$UA z42hvtL3OK!-a_W< zf(AA1@A3Njtt)z9M zr9t$cJSEjXpuojZRq>SGhtp$@n-w(E!P=ysG1$x!45gc555-z6a;&y`6tc-eKs~Ed zb{1|umi#_if%V73M6K>)dgX|mY_Op1N5@C6(T)jRE>G6ci^{$YfTUaJ*?zXU-XdZg4IC+~YTEH3ohw+dH2R9QS#c z=BtVnVUva0$bofE@2{=$t?i28&Z~_3-jHAwxSd1{o6z%))~*K0gYQ-wb8vFX^wyWW z1?Z^6lt|i-{DV(25s0y!`F#}@u95pC7gz|$XI6VR)(-85YESFCh`%HJ63i(SK6_U1 zlc9BFlG%iSH;P^DW7fUX5}goo<3ZEk>6@G1SeKl`HIAqP88s4xeAvZ*=$}+UP2Eu*fLz$iAKrHPuTKYU+muEZ9Eg zOd4H?OY+?ftD1>jP#zHLHe}dCGaE}F4NlNYelItgZXX{o>;%mu3zfXsSr&$L=6Gcm zo*+R{w`oWi>W{D8C4v`MfLH=NJXyfsdYa;YHY^Vx zN86t})n=NR&ZIC+7!t+DKNI)7fF^C2-O?jNoP$s~LwvL2sy1{k?%jjjxiL6Pp&caj z^#gi7NQL7Yset3daf3~j`{eCImqx;Pq}mY(Dj@HrWYKh;ZH(g~nh1{|Oa{%Wp4Tr=SD7OB{36W&A`sS9(OT;%*US8om5ID;o8$wKVJ3W!_BfyU% z_5-=^6&Chf@>C`8jQm)%>or>?VRIk1mC)zx6Kxw0>wKx=Ch!@yG*OMNcF?RkJ0_@5 zm#$iAfw6XOaK>RNFUQzLx*6-WdIhEB3_Zl0Zs9Gnw)zX|g_U0#$u~KZL=*Yce)vnZ zGtPz08yuG8EJC7z+G6CE{W~4W2Fbw)!<}#xD!J&mAF3nTK>34*8gomQ_JXxaaiv) zi0W=HP%D*-JVkL#+otl}s3>juj`%o8CuU$@$#c>9MatytLK@>%f3x+y^;fkLul_k= z(ud{*F_2hdnZzHBni-oFp43%`feKkOtX@xAjTZU|$@LXM0R9SCEsq_{6K^yX;|Hje_`ZK__V z2D2Ecy=etb^bxG&@!7FT!;#UW^g?B{B^n86|mBPj3Tt#r!~!3o}T zr8qCb19Ku5Cmx=?LOcGX=)=2<0j8e`^xV{2Wtj^xV0HPS^>7qNi#)Ry1>5$O9Q?8BaoUhBQqc2 zkrjg%D?b?J(38qIJ=~?oRo2_aG&UQ{JU{-GV_m{l*5sCpvxlv-hlQSxt1aB@Cj&`p z*XR_c=|LXxsh1DG*k!-6`G87xt<5JTt+_1M>Ed+Mt0Sa;app6?SFgBG%r z-3sIfz%|`(`-BbSzqBA& TgNPXS5GnRh!1l1}&sY8j%3^b* literal 0 HcmV?d00001 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']."