From f9f79e1e491f508bb7d3ff6f0a2dd42bf5b3e3dd Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 21 Nov 2015 18:09:03 +0100 Subject: [PATCH] =?UTF-8?q?Import=20du=20MCC=20en=20cours=20(phase=20de=20?= =?UTF-8?q?d=C3=A9ploiement)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API.php | 8 + css/global.css | 17 ++ manager/career.php | 22 +++ manager/database.php | 2 +- manager/import.php | 16 ++ manager/phpExcel.php | 174 +++++++++--------- page/_JS/modules.js | 71 +++++++ page/modules.php | 16 +- .../admin_import_mcc.xlsx} | Bin src/import_mcc.xlsx | Bin 0 -> 9169 bytes src/loader.gif | Bin xdoc/empty.sql | 0 12 files changed, 226 insertions(+), 100 deletions(-) create mode 100755 manager/import.php rename src/{nouveau_modele.xlsx => files/admin_import_mcc.xlsx} (100%) mode change 100755 => 100644 create mode 100755 src/import_mcc.xlsx mode change 100644 => 100755 src/loader.gif mode change 100644 => 100755 xdoc/empty.sql diff --git a/API.php b/API.php index a3bc203..dc8cf2c 100755 --- a/API.php +++ b/API.php @@ -61,6 +61,14 @@ require_once __ROOT__.'/manager/security.php'; case 'modules': if( isset($request->level_1) ){ require_once __ROOT__.'/manager/modules.php'; modules_switch_level_1($request, $answer); } else { $answer->request = 'missing_level_1'; } + break; + + /**********/ + /* MODULE */ + /**********/ + case 'phpExcel': + if( isset($request->level_1) ){ require_once __ROOT__.'/manager/phpExcel.php'; xlsx_switch_lvl1($request, $answer); } + else { $answer->request = 'missing_level_1'; } break; diff --git a/css/global.css b/css/global.css index 7d3b2b4..525298a 100755 --- a/css/global.css +++ b/css/global.css @@ -279,9 +279,26 @@ td select > option{ padding: 0; } /* extra */ cursor: pointer; + + /* scroll */ + overflow: hidden; } +.confirm [type=file]{ + /* position */ + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + + /* extra */ + opacity: 0; + cursor: pointer; +} + /* @all */ diff --git a/manager/career.php b/manager/career.php index fccb380..995bd32 100755 --- a/manager/career.php +++ b/manager/career.php @@ -197,6 +197,28 @@ require_once __ROOT__.'/manager/database.php'; + + + + /**********************/ + /* intégration du MCC */ + /**********************/ + case 'setMCC': if( permission('admin') ){ + + + if( isset($request->mcc) && isset($request->semestre) && is_numeric($request->semestre) ){ // si tout les paramètres sont bons + DataBase::getInstance()->setMCC($request->semestre, $request->mcc); + $answer->request = 'success'; + }else + $answer->request = 'param_error'; + + }else + $answer->request = 'permission_error'; + break; + + + + /***********/ /* DEFAULT */ /***********/ diff --git a/manager/database.php b/manager/database.php index 2bb7b3f..bfa5314 100755 --- a/manager/database.php +++ b/manager/database.php @@ -123,7 +123,7 @@ class DataBase{ * @mcc contient toutes les données du MCC * */ - public static function setMCC($semestre, $mcc){debug(); + public static function setMCC($semestre, $mcc){ foreach($mcc as $ue){ diff --git a/manager/import.php b/manager/import.php new file mode 100755 index 0000000..fa8674f --- /dev/null +++ b/manager/import.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/manager/phpExcel.php b/manager/phpExcel.php index 6fb6236..66b77ad 100755 --- a/manager/phpExcel.php +++ b/manager/phpExcel.php @@ -276,118 +276,114 @@ function xlsx_switch_lvl1($request, $answer){ /**********************/ case 'import_mcc': - if(isset($request->docPath)) { - // $inputFileType = 'Excel2007'; - $inputFileName = $request->docPath; - - // Charger le fichier en tant que document Excel - $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); - - // Get sur la première case - $sheet = $objPHPExcel->getSheet(0); - $mccData = $sheet->rangeToArray('A2:'.$sheet->getHighestColumn().''.$sheet->getHighestRow()); - + $filePath = __ROOT__.'/src/files/'.$_SESSION['identifiant'].'_import_mcc.xlsx'; - /* permet d'éviter les doublons */ - $mcc = array(); // contiendra le tableau de retour - $ueuid = array(); + // file_put_contents($filePath, $file['file']); - /****************************/ - /* TRAITEMENT SUR LES CASES */ - /****************************/ - foreach($mccData as $line){ + // // $inputFileType = 'Excel2007'; + // $inputFileName = $request->docPath; + + // Charger le fichier en tant que document Excel + $objPHPExcel = PHPExcel_IOFactory::load($filePath); + + // Get sur la première case + $sheet = $objPHPExcel->getSheet(0); + $mccData = $sheet->rangeToArray('A2:'.$sheet->getHighestColumn().''.$sheet->getHighestRow()); + - if( $line[0] != null ){ + /* permet d'éviter les doublons */ + $mcc = array(); // contiendra le tableau de retour + $ueuid = array(); + + /****************************/ + /* TRAITEMENT SUR LES CASES */ + /****************************/ + foreach($mccData as $line){ + + if( $line[0] != null ){ - /* [1] On récupère les données de l'UE, si les champs sont définis + /* [1] On récupère les données de l'UE, si les champs sont définis + =========================================================================*/ + if( /*$line[0] != null && */ $line[1] != null && $line[2] != null ){ + + if( $line[0] != null && !in_array($line[0], $ueuid) ){ // on créé l'UE dans la liste s'il n'y est pas déjà + + array_push( // on ajoute l'UE + $mcc, + array( + 'nom' => $line[0], + 'libelle' => $line[1], + 'coefficient' => $line[2], + 'modules' => array(), + 'moduid' => array() + ) + ); + + array_push($ueuid, $line[0]); // on dis qu'on a déjà enregistré l'ue + } + + if( $line[0] != null ) + $ueIndex = array_search($line[0], $ueuid); + + /* [2] On récupère les données du module, si les champs sont définis =========================================================================*/ - if( /*$line[0] != null && */ $line[1] != null && $line[2] != null ){ - - if( $line[0] != null && !in_array($line[0], $ueuid) ){ // on créé l'UE dans la liste s'il n'y est pas déjà - + if( /*$line[3] != null && */ $line[4] != null && $line[5] != null ){ + + if( $line[3] != null && !in_array($line[3], $mcc[$ueIndex]['moduid']) ){ // on créé le module dans la liste de cet UE s'il n'y est pas déjà array_push( // on ajoute l'UE - $mcc, + $mcc[$ueIndex]['modules'], array( - 'nom' => $line[0], - 'libelle' => $line[1], - 'coefficient' => $line[2], - 'modules' => array(), - 'moduid' => array() + 'nom' => $line[3], + 'libelle' => $line[4], + 'coefficient' => $line[5], + 'controles' => array(), + 'ctrluid' => array() ) ); - array_push($ueuid, $line[0]); // on dis qu'on a déjà enregistré l'ue + array_push($mcc[$ueIndex]['moduid'], $line[3]); // on dis qu'on a déjà enregistré le module } - - if( $line[0] != null ) - $ueIndex = array_search($line[0], $ueuid); - - /* [2] On récupère les données du module, si les champs sont définis - =========================================================================*/ - if( /*$line[3] != null && */ $line[4] != null && $line[5] != null ){ - - if( $line[3] != null && !in_array($line[3], $mcc[$ueIndex]['moduid']) ){ // on créé le module dans la liste de cet UE s'il n'y est pas déjà - array_push( // on ajoute l'UE - $mcc[$ueIndex]['modules'], - array( - 'nom' => $line[3], - 'libelle' => $line[4], - 'coefficient' => $line[5], - 'controles' => array(), - 'ctrluid' => array() - ) - ); - - array_push($mcc[$ueIndex]['moduid'], $line[3]); // on dis qu'on a déjà enregistré le module - } - } - - if( $line[3] != null ) - $modIndex = array_search($line[3], $mcc[$ueIndex]['moduid']); - - /* [3] On récupère les contrôles du module, si les champs sont définis - =========================================================================*/ - if( $line[6] != null && $line[7] != null && $line[8] != null ){ - - if( !in_array($line[6], $mcc[$ueIndex]['modules'][$modIndex]['ctrluid']) ){ // on créé le contrôle dans la liste de ce module s'il n'y est pas déjà - array_push( // on ajoute l'UE - $mcc[$ueIndex]['modules'][$modIndex]['controles'], - array( - 'nom' => $line[6], - 'libelle' => $line[7], - 'coefficient' => $line[8] - ) - ); - - array_push($mcc[$ueIndex]['modules'][$modIndex]['ctrluid'], $line[6]); // on dis qu'on a déjà enregistré le module - } - } - } + if( $line[3] != null ) + $modIndex = array_search($line[3], $mcc[$ueIndex]['moduid']); + /* [3] On récupère les contrôles du module, si les champs sont définis + =========================================================================*/ + if( $line[6] != null && $line[7] != null && $line[8] != null ){ + + if( !in_array($line[6], $mcc[$ueIndex]['modules'][$modIndex]['ctrluid']) ){ // on créé le contrôle dans la liste de ce module s'il n'y est pas déjà + array_push( // on ajoute l'UE + $mcc[$ueIndex]['modules'][$modIndex]['controles'], + array( + 'nom' => $line[6], + 'libelle' => $line[7], + 'coefficient' => $line[8] + ) + ); + + array_push($mcc[$ueIndex]['modules'][$modIndex]['ctrluid'], $line[6]); // on dis qu'on a déjà enregistré le module + } + } } } + } - /* [4] Affinage des données, on supprime les données temporaires - =========================================================================*/ - foreach($mcc as $iter_ue=>$ue){ - unset( $mcc[$iter_ue]['moduid'] ); + /* [4] Affinage des données, on supprime les données temporaires + =========================================================================*/ + foreach($mcc as $iter_ue=>$ue){ + unset( $mcc[$iter_ue]['moduid'] ); - foreach($mcc[$iter_ue]['modules'] as $iter_m=>$mod) - unset( $mcc[$iter_ue]['modules'][$iter_m]['ctrluid'] ); - } + foreach($mcc[$iter_ue]['modules'] as $iter_m=>$mod) + unset( $mcc[$iter_ue]['modules'][$iter_m]['ctrluid'] ); + } - $answer->mcc = $mcc; - $answer->request = 'success'; - - - }else - $answer->request = 'param_error'; + $answer->mcc = $mcc; + $answer->request = 'success'; break; diff --git a/page/_JS/modules.js b/page/_JS/modules.js index b30139d..fc2bc71 100755 --- a/page/_JS/modules.js +++ b/page/_JS/modules.js @@ -93,4 +93,75 @@ creerSemestre.addEventListener('click', function(e){ }, false); + + + + + + +/* GESTION DE L'IMPORT DE MCC */ +var importMcc = document.getElementById('import_mcc'); +importMcc.addEventListener('change', function(e){ + + addClass( importMcc, 'loading' ); + + var file = importMcc.files[0]; + + /* IMPORTATION DU FICHIER */ + var fd = new FormData(); + fd.append('filename', 'import_mcc'); + fd.append('file', file, file.name); + + var xhr = new XMLHttpRequest(); + + xhr.open('POST', 'manager/import.php', true); + + xhr.onreadystatechange = function(){ + if( xhr.readyState == 4 ) + if( [0, 200].indexOf(xhr.status) > -1 ) + if( xhr.responseText == 'success' ){ + + + var request = { + level_0: 'phpExcel', + level_1: 'import_mcc' + } + + API.send(request, function(e){ + if( e.request == 'success' ){ // si on a récupéré l'objet MCC, on lance maintenant l'intégration + + requestIntegration = { + level_0: 'career', + level_1: 'setMCC', + semestre: 1, + mcc: e.mcc + } + + API.send( requestIntegration, function(f){ + if( f.request == 'success' ){ + console.log('mcc intégré'); + reload(); + }else + console.log('Mcc non intégré'); + }); + + }else + reload(); + }); + + + + + } + } + + xhr.send(fd); + + + + + + + +}, false); --> \ No newline at end of file diff --git a/page/modules.php b/page/modules.php index 06d93bd..ecdb269 100755 --- a/page/modules.php +++ b/page/modules.php @@ -529,7 +529,6 @@ if( permission('admin') ){ echo "
"; $anneesListe = array(); - $semestresListe = array(); /**********************/ /* AFFINAGE PAR ANNEE */ @@ -554,6 +553,7 @@ if( permission('admin') ){ /*************************/ /* AFFINAGE PAR SEMESTRE */ /*************************/ + $semestresListe = array(); foreach($answer->yearList as $annee){ if( in_array($annee['annee'], $anneesListe) ){ // on récupère la liste des ids foreach($annee['semestres'] as $semestre){ if( !in_array($semestre['id'], $semestresListe) ){ array_push($semestresListe, $semestre['id']); @@ -561,8 +561,7 @@ if( permission('admin') ){ }} // si semestreOpt n'est pas cohérent (pas pour cette année) - if( !in_array($semestreOpt, $semestresListe) ) $semestreOpt = null; - + if( $semestreOpt == null || !in_array($semestreOpt, $semestresListe) ) $semestreOpt = $semestresListe[0]; $count = 0; echo "
"; @@ -571,7 +570,6 @@ if( permission('admin') ){ foreach($annee['semestres'] as $semestre){ if( in_array($semestre['id'], $semestresListe) ){ $count++; - if( $semestreOpt == null ) $semestreOpt = $semestre['id']; if( $semestre['id'] == $semestreOpt ) // si c'est le semestre séléctionné echo "".$semestre['formation']." - ".$semestre['nom'].''; @@ -632,7 +630,7 @@ if( permission('admin') ){ // if( $answer->request == 'success' ){ // si pas d'erreur echo "
"; echo "Importation des MCC d'un semestre
"; - echo "(Fichier .xlsx suivant le modèle : modèle de fichier)
"; + echo "(Fichier .xlsx suivant le modèle : modèle de fichier)
"; /**********************/ @@ -662,8 +660,6 @@ if( permission('admin') ){ echo "
"; foreach($annee['semestres'] as $semestre){ if( in_array($semestre['id'], $semestresListe) ){ - if( $semestreOpt == null ) $semestreOpt = $semestre['id']; - if( $semestre['id'] == $semestreOpt ) // si c'est le semestre séléctionné echo "".$semestre['formation']." - ".$semestre['nom'].''; else // sinon on affiche normalement @@ -680,7 +676,7 @@ if( permission('admin') ){ - echo "
Importer les MCC
"; + echo "
Importer les MCC
"; echo "
"; @@ -742,12 +738,12 @@ if( permission('admin') ){ echo ""; echo "
"; - echo "
"; + echo "
"; echo "
"; echo "
"; echo "
"; - echo "
Créer le semestre
"; + echo "
Créer le semestre
"; diff --git a/src/nouveau_modele.xlsx b/src/files/admin_import_mcc.xlsx old mode 100755 new mode 100644 similarity index 100% rename from src/nouveau_modele.xlsx rename to src/files/admin_import_mcc.xlsx diff --git a/src/import_mcc.xlsx b/src/import_mcc.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..5570669a3389d8b2356847c9c3364567c508125f GIT binary patch literal 9169 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 N{D>hl<;`$6`X7r|Mq>Z~ literal 0 HcmV?d00001 diff --git a/src/loader.gif b/src/loader.gif old mode 100644 new mode 100755 diff --git a/xdoc/empty.sql b/xdoc/empty.sql old mode 100644 new mode 100755