From d8fbc6eac1230ae4c6fda3019f9b7e3e1482ea3d Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 2 Jan 2016 20:15:06 +0100 Subject: [PATCH] =?UTF-8?q?[x]=20Export=20jury=20=09+=20format=20=09+=20ex?= =?UTF-8?q?celManager=20=09+=20g=C3=A9n=C3=A9ration=20=09+=20t=C3=A9l?= =?UTF-8?q?=C3=A9chargement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/excel.php | 134 ++++++++++--------- page/_JS/career.js | 66 +++++++++ page/career.php | 13 +- page/groups.php | 1 - src/files/admin2_export_jury.xlsx | Bin 0 -> 6640 bytes src/files/admin2_export_liste_etudiants.xlsx | Bin 6522 -> 6652 bytes 6 files changed, 143 insertions(+), 71 deletions(-) create mode 100644 src/files/admin2_export_jury.xlsx diff --git a/manager/excel.php b/manager/excel.php index cddb33a..117fa2b 100755 --- a/manager/excel.php +++ b/manager/excel.php @@ -50,8 +50,7 @@ class excelManager{ $sheet->getColumnDimension('G')->setWidth(10); // [4] Écriture des colonnes du tableau - $sheet->setCellValue('B1', ""); - $sheet->setCellValue('A2', date("d/m/Y G:m")); + $sheet->setCellValue('A1', date("d/m/Y")); $sheet->setCellValue('A4', 'Identifiant'); $sheet->setCellValue('B4', 'Prénom'); $sheet->setCellValue('C4', 'Nom'); @@ -415,6 +414,73 @@ class excelManager{ break; + + + /**********************************************/ + /* Export la liste des étudiants pour le jury */ + /**********************************************/ + case 'export_jury': + + // Vérification de la présence des groupes + + if( isset($request->grouplist) ){ + + // [1] On crée une instance du fichier xls, activation de la feuille + $workbook = new PHPExcel(); + $sheet = $workbook->getActiveSheet(); + $writer = new PHPExcel_Writer_Excel2007($workbook); + + // [2] Définition des paramètres du document + $workbook->getProperties()->setCreator($_SESSION['identifiant']); + $workbook->getProperties()->setLastModifiedBy('ACGA'); + $workbook->getProperties()->setTitle('Liste étudiants jury'); + + // [3] Définition du format des cellules (document Excel) + $sheet->getColumnDimension('A')->setWidth(15); + $sheet->getColumnDimension('B')->setWidth(15); + $sheet->getColumnDimension('C')->setWidth(15); + $sheet->getColumnDimension('D')->setWidth(15); + + // [4] Écriture des colonnes du tableau + $sheet->setCellValue('B1', "" ); + $sheet->setCellValue('A2', date("d/m/Y G:m") ); + $sheet->setCellValue('A4', 'Identifiant' ); + $sheet->setCellValue('B4', 'Formation' ); + $sheet->setCellValue('C4', 'Groupe' ); + $sheet->setCellValue('D4', 'Mention' ); + + // [5] Écriture des valeurs dans le document Excel + $index = 5; + foreach($request->grouplist as $group){ + $index++; + + foreach($group->userlist as $student){ + $sheet->setCellValue('A'.$index, $student->identifiant); + $sheet->setCellValue('B'.$index, $group->formation); + $sheet->setCellValue('C'.$index, $group->nom); + $sheet->setCellValue('D'.$index, 'À compléter'); + $index++; + } + } + + // [6] On enregistre ce nouveau fichier, et on lance son téléchargement + $filePath = __EXCEL_PATH__.$_SESSION['identifiant'].'_export_jury.xlsx'; + $writer->save( $filePath ); + + + // [7] On retourne l'état du traitement 'success' + $answer->request = 'success'; + + // [8] On retourne le chemin relatif du serveur + $answer->pathfile = '/src/files/'.$_SESSION['identifiant'].'_export_jury.xlsx'; + } + + // [7] On retourne l'état du traitement 'param_error' + else + $answer->request = 'param_error'; + break; + + /************************************/ /* Importation des résulats du jury */ /************************************/ @@ -428,12 +494,12 @@ class excelManager{ // Chargement du fichier - $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); + $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); // Placement du curseur sur la première case - $sheet = $objPHPExcel->getSheet(0); - $mccData = $sheet->rangeToArray('A2:'.$sheet->getHighestColumn().''.$sheet->getHighestRow()); + $sheet = $objPHPExcel->getSheet(0); + $mccData = $sheet->rangeToArray('A2:'.$sheet->getHighestColumn().''.$sheet->getHighestRow()); // Varaible stack pour les résultats du jury @@ -441,8 +507,6 @@ class excelManager{ // Boucle sur le format suivant : ligne[0] : [IDETUDIANT] / ligne[1] : [DECISION JURY] - // / ! \ LES RESULTATS NE DOIVENT PAS ETRE NOMINATIFs, UTILISER LES IDENTIFIANTS DES ÉTUDIANTS / ! \ - $i = 0; foreach($mccData as $line) { @@ -464,62 +528,6 @@ class excelManager{ - // /************************************/ - // /* Exportation des résulats du jury */ - // /************************************/ - // case 'export_fiche_resultat_jury': - - // //vérificationd du paramètre en entrée - - // if(isset($request->formation) && isset($request->semestre)){ - - // // Création / Activation de la feuille - - // $workbook = new PHPExcel(); - // $sheet = $workbook->getActiveSheet(); - // $writer = new PHPExcel_Writer_Excel2007($workbook); - - // $workbook->getProperties()->setTitle("ResultatJury"." ".$request->formation." ".$request->semestre.date("d/m/Y G:m")); - - // $sheet->getColumnDimension('A')->setWidth(20); - // $sheet->getColumnDimension('B')->setWidth(20); - // $sheet->getColumnDimension('C')->setWidth(20); - // $sheet->getColumnDimension('D')->setWidth(20); - - // // Écriture de l'en-tête du document - - // $sheet->setCellValue('A1', 'Résultats jury'); - // $sheet->setCellValue('B1',$request->formation); - // $sheet->setCellValue('C1',$request->semestre); - // $sheet->setCellValue('D1', date("d/m/Y G:m")); - // $sheet->setCellValue('A3',"Id Étudiant"); - // $sheet->setCellValue('B3',"Avis jury"); - - - // $i = 6; - - // while(// TANT QUE IL Y A UN ELEVE) { - - // $sheet->setCellValue('A'.$i,// ID ELEVE); - // $sheet->setCellValue('B'.$i,// AVIS JURY); - // $i++; - // } - - // // Sauvegarde du fichier sous le format .xlsx - - // $writer->save("ResultatJury"." ".$request->formation." ".$request->semestre.date("d/m/Y G:m").'xlsx' ); - // $answer->request = 'success'; - // } - - // //Si il y a un problème dans les paramètre(s) - - // else { - - // $answer->request='param_error'; - // } - - // break; - diff --git a/page/_JS/career.js b/page/_JS/career.js index 6aaf264..5a6da22 100755 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -428,6 +428,72 @@ if( document.querySelector('#CONTAINER section[name=allcontroles]') != null ){ / +/*******************************/ +/* GESTION DE L'EXPORT DE JURY */ +/*******************************/ +var exportJury = document.getElementById('export_jury'); +if( exportJury != null ){ + + exportJury.addEventListener('click', function(e){ + var selectedSemestre = document.querySelector("#CONTAINER > section[name] > .p > div.partlist[name] > span[data-stre][data-year].active"); + + // on récupère l'année et le semestre selectionnés + var fSemestre = (selectedSemestre!=null) ? selectedSemestre.dataset.stre : null; + var fAnnee = (selectedSemestre!=null) ? selectedSemestre.dataset.year : null; + + console.log(fSemestre); + console.log(fAnnee); + + /* [1] On récupère la liste des groupes en question (groupManager) + ===================================================================*/ + /* (1) Tous les semestres */ + var request1; + if( fSemestre == '*' ){ + request1 = { + level_0: 'groups', + level_1: 'grouplistForYear', + annee: fAnnee, + }; + }else{ + request1 = { + level_0: 'groups', + level_1: 'grouplist', + semestre: fSemestre, + }; + } + + API.send(request1, function(answer1){ + // si on a bien récupéré les étudiants + if( answer1.request == 'success' ){ + console.log( answer1.grouplist ); + + /* [2] On génère le fichier associé (excelManager) + ===================================================================*/ + var request2 = { + level_0: 'excel', + level_1: 'export_jury', + grouplist: answer1.grouplist // on envoie la liste qu'on vient de récupérer + }; + + API.send(request2, function(answer2){ + if( answer2.request == 'success' ){ // le fichier a bien été généré, on lance le téléchargement + document.location = answer2.pathfile; + reload(); + } + }); + } + }); + + + + }, false); + +} + + + + + /* GESTION DE PUBLICATION DES NOTES D'UN CONTRÔLE */ diff --git a/page/career.php b/page/career.php index fa6d601..567548f 100755 --- a/page/career.php +++ b/page/career.php @@ -858,7 +858,7 @@ if( permission('master') || permission('admin') ){ /**********************/ /* AFFINAGE PAR ANNEE */ /**********************/ - echo "Exportation des MCC d'un semestre
"; + echo "Exportation des feuilles jury d'un semestre
"; echo "(Format compatible Microsoft Office, Open Office et Libre Office)
"; /* AFFINAGE POUR LES 5 ANNEES SUIVANTES */ @@ -929,8 +929,7 @@ if( permission('master') || permission('admin') ){ - echo "
Générer le fichier
"; - echo "
Télécharger le fichier
"; + echo "
Télécharger le fichier
"; echo ""; @@ -952,8 +951,8 @@ if( permission('master') || permission('admin') ){ $anneeOpt = intval($anneeOpt); // on met l'année en (int) echo "
"; - echo "Importation des MCC d'un semestre
"; - echo "(Fichier .xlsx suivant le modèle : modèle de fichier)
"; + echo "Importation des mentions jury d'un semestre
"; + echo "(Fichier .xlsx suivant le modèle : modèle de fichier)
"; /**********************/ @@ -996,9 +995,9 @@ if( permission('master') || permission('admin') ){ foreach($annee['semestres'] as $semestre){ if( in_array($semestre['id'], $semestresListe) ){ if( $semestre['id'] == $semestreOpt ) // si c'est le semestre séléctionné - echo "".$semestre['formation']." - ".$semestre['nom'].''; + echo "".$semestre['formation']." - ".$semestre['nom'].''; else // sinon on affiche normalement - echo "".$semestre['formation']." - ".$semestre['nom'].''; + echo "".$semestre['formation']." - ".$semestre['nom'].''; }} echo "


"; diff --git a/page/groups.php b/page/groups.php index c844084..7c8a478 100755 --- a/page/groups.php +++ b/page/groups.php @@ -635,7 +635,6 @@ if( permission('master') || permission('admin') ){ } - echo "
Générer le fichier
"; echo "
Télécharger le fichier
"; diff --git a/src/files/admin2_export_jury.xlsx b/src/files/admin2_export_jury.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..aa912f5e9fbb7d06ba8fdfca2806acc9236d9258 GIT binary patch literal 6640 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 delta 1951 zcmY*adpy(YAOCJh2+M7Z6ISMu2$H&Z)xIS?$<)2P}wG?9ZGCXof=9~zoul9 z%TF$uh!!`&+GlXp3n1n{&`J6434}VI zoY`8%?sJh=&h*$xY96LkDA>kLKRO>oBZs(J2y>UvNv5n~XZ?;h{#~rM-Fu!r=pJ@r ztfoR9aUDILtF|>d+^O(0Zd;wg?A7r;7|4uZQFT6O(f5!%9SQc(QLnfi;3%3m`1Miy zhF#sX`XXd|xCy+APUayN+az|HFaw?Ia>{~aD?*O#lfB^vmY7YgDWrvDc@p=3bB@?T zp)0{m0!({@@Gt71+E>5MrtT97kuWRy5ue0yAt~#$S>+sgw%^P+bCOM)n z|EYuh5;dl?TLrzFh<}jDpQpQTxPS9N;chBEV?urvH0fr*y`WBXnK4L#en&-}3D-xDOLijENyNP@3IYnM%F86Yk3xeAMQoyd-y2j1E#` zF4ucX67tBvFZ^-!B*!H-iNav=(BkVv#jF#h1Tdbcs*qFY&M`bK2yPiG5i|n$7bBZO z+)+$uxd9prWa^sIvDFmzXFK#EBm7{D!Hxd05g9?TyrhaR7kEHSJyU8upcGMu}^r5($NBc5UxCH+`N>4%Q z6H8p#+9}(Ci*JdrBXOxGDlIB?s-iWfYF--;%dQrOFMsN-XfRE32{sd%pwf3$10A*; zP02{=?Ed2?^x7SA9G<5oyNe3%`YJIy{K*OsM@<|V^l!Oy1LWY~4ZWvBT0wFf`Y!gg zMpMK9fGExIQP3pg1u+6kNXkeVeq8$CLR&TXW%usm(mmCLS}H$iLsGx2-c z$FeSX{yA{4-WRMW>4dcb%O`k6itU;X?foE~+2zcHOT9B#LwXN|g=OR~7*o@vTXGSC zLjgI_WWCbp!w>F5x--73Ya4R!HILzY$9H(8-R|W`NZQbN%z(tBDnlx_aL@X$NVzP; z%6m0l^%j#ReSP(^k`8p0Veq)pH?2q_JcXB+%mF(JJGMQrerH_4Q-lOo$7g25Bp0a|I zQzH;U(&E$F{oQq^huM6BSGa%vYBuJ?N|-AT)e};8c^qP&_*Ffq{#6^C_bE?(p*LTj z)!TW!;M%g3yY+$hy9H(ZP>w|^uIaV?m?6Xkb5mvqk*}SoOq@6{hY^Mym_rDSGKLUB z^7{jG=0Xl%s>>B&DW9&1lgbz(+!8+!L(ewT$hpONv#r(rjky@nvswT`TjhtIGV3t( z%$_=p);dJ3gXO%|>z=u9Eh)TPaeW=RRUe(s#qz31H&dn`Eg2X|9scU~*KA_*k#M$# zWv=IET5XXNn?#lB?>~DXsAE>UeGx%ULG|3!MGV&=waVT1E+0%y%*ZI0JTGTm-SN&} z*zLB>i=95Bh`6t!-i~aQi<