From 44555f615677827585357ac7b3d8df610328ee0a Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Fri, 8 Jan 2016 23:34:17 +0100 Subject: [PATCH] =?UTF-8?q?[x]=C2=A0Capitalisation=20(check)=20=09+=20conc?= =?UTF-8?q?eption=20BDD=20(appartenance=20on=20enregistre=20les=20ue=20NON?= =?UTF-8?q?=20CAPITALIS=C3=89ES)=20=09+=20uniquement=20pour=20m=C3=AAme=20?= =?UTF-8?q?(formation=20+=20rang=20+=20ann=C3=A9e=C2=B11=20)=20parcours=20?= =?UTF-8?q?(c=C3=A0d=20redoublement)=20=09+=20affichage:=20moyenne=20UE=20?= =?UTF-8?q?/=20"non=20pris=20en=20compte"=20=09=09->=20semestreRepo::getRe?= =?UTF-8?q?doublements(id=5Fsem)=20retourne=20tableau=20des=20ID=20des=20s?= =?UTF-8?q?emestre=20=C3=A9quivalents=20=09+=20gestion=20de=20l'affichage?= =?UTF-8?q?=20=09=09+=20lien=20pour=20capitaliser=20cet=20UE=20quand=20"no?= =?UTF-8?q?n=20pris=20en=20compte"=20=09+=20gestion=20du=20calcul=20de=20m?= =?UTF-8?q?oyenne=20=09=09->=20pb=20calcul=20moyenne=20semestre=20(croisem?= =?UTF-8?q?ent=20des=20moyennes)=20=09+=20gestion=20des=20valeurs=20par=20?= =?UTF-8?q?d=C3=A9faut=20lors=20de=20la=20cr=C3=A9ation=20(premier=20affic?= =?UTF-8?q?hage)=20=09=09->=20on=20garde=20normal=20si=20aucun=20UE=20inac?= =?UTF-8?q?tif=20=09=09->=20et=20on=20prend=20la=20moyenne=20de=20plusieur?= =?UTF-8?q?s=20si=20au=20moins=20un=20UE=20inactif=20=09=09=09->=20on=20me?= =?UTF-8?q?t=20tous=20les=20autres=20UEs=20(en=20doublons=20ducoup)=20inac?= =?UTF-8?q?tifs=20sauf=20le=20dernier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/career.php | 20 ++++ manager/database.php | 158 +++++++++++++++++++++++++++++- manager/repo/group.php | 2 +- manager/repo/semestre.php | 45 ++++++++- manager/repo/ue.php | 60 +++++++++++- page/_JS/career.js | 30 ++++++ page/career.php | 28 ++++-- src/files/admin2_export_jury.xlsx | Bin 9503 -> 6394 bytes src/files/admin2_import_jury.xlsx | Bin 0 -> 4708 bytes src/files/admin2_import_mcc.xlsx | Bin 0 -> 9131 bytes test.php | 13 +++ 11 files changed, 341 insertions(+), 15 deletions(-) create mode 100755 src/files/admin2_import_jury.xlsx create mode 100755 src/files/admin2_import_mcc.xlsx diff --git a/manager/career.php b/manager/career.php index a636400..36b70f6 100755 --- a/manager/career.php +++ b/manager/career.php @@ -200,6 +200,26 @@ class careerManager{ break; + /********************************************/ + /* modification des capitalisations d'un UE */ + /********************************************/ + case 'capitaliser': if( permission('admin') ){ + + $areSetParam = isset($request->etudiant) && isset($request->ue) && isset($request->semestre); // les arguments existent + $etudiantCheck = $areSetParam && checkParam($request->etudiant, 'utilisateur.identifiant'); // identifiant etudiant bon format + $semestreCheck = $etudiantCheck && checkParam($request->semestre, 'auto_increment_id'); // id semestre bon format + $ueCheck = $semestreCheck && checkParam($request->ue, 'auto_increment_id'); // id ue bon format + + if( $ueCheck ){ // si tout les paramètres sont bons + $answer->request = DataBase::getInstance()->capitaliserUE($request->ue, $request->semestre, $request->etudiant); + }else + $answer->request = 'param_error'; + + }else + $answer->request = 'permission_error'; + + break; + /****************************************************/ diff --git a/manager/database.php b/manager/database.php index 56c21fb..ecc42a2 100755 --- a/manager/database.php +++ b/manager/database.php @@ -309,6 +309,63 @@ class DataBase{ + + /* effectue la capitalisation de l'ue + * @ue pour le semestre @semestre + * pour l'étudiant @etudiant + */ + public function capitaliserUE($ue, $semestre, $etudiant){ + // on vérifie l'existence des paramètres (etudiant, semestre, ue) + if( !semestreRepo::exists($semestre) ) return 'unknown_semestre'; + if( !groupRepo::forStudent($etudiant, $semestre) ) return 'unknown_user'; + if( !($ueInfo=ueRepo::info($ue)) ) return 'unknown_ue'; + + // on vérifie que ce semestre a bien l'ue donnée + $UEs = ueRepo::forStudent($etudiant, $semestre); + $UEUIDList = array(); + + foreach($UEs as $UE) + if( !in_array($UE['id'], $UEUIDList) ) + array_push($UEUIDList, $UE['id']); + + // si l'UE n'est pas dans ce semestre, on retourne une erreur + if( !in_array($ue, $UEUIDList) ) return 'unknown_ue'; + + + /* [1] On récupère les redoublements de ce semestre + ======================================================*/ + $redoublements = semestreRepo::getRedoublements($semestre, $etudiant); + + /* [2] On retire ceux qui n'ont pas l'UE + ======================================================*/ + foreach($redoublements as $iter_s=>$SEM){ + $listeUEs = ueRepo::forStudent($etudiant, $SEM['id_semestre']); + $hasUE = false; + // on vérifie que le semestre a bien l'UE + foreach($listeUEs as $UE) + if( $UE['id'] == $ue ) $hasUE = true; + + // s'il n'a pas l'UE, on le supprime + if( !$hasUE ) unset($redoublements[$iter_s]); + } + + /* [3] On applique les modifications + ======================================================*/ + $checker = true; + // on définit l'UE comme actif + $checker = $checker && ueRepo::capitalisation($semestre, $etudiant, $ue, true); + + // on définit l'UE dans les autres semestres comme inactif + foreach($redoublements as $red) + $checker = $checker && ueRepo::capitalisation($red['id_semestre'], $etudiant, $ue, false); + + + return ($checker) ? 'success' : 'error'; + + } + + + /*************************************************************************************/ /* _ _ _______ _____ _ _____ _____ _______ ______ _ _ _____ */ /* | | | |__ __|_ _| | |_ _|/ ____| /\|__ __| ____| | | | __ \ */ @@ -1004,9 +1061,25 @@ class DataBase{ $parcours = semestreRepo::getParcours($etudiantUID); + + // contiendra les couples [id_formation, rang] pour les semestres capitalisables + $listeSemestresCapitalisables = array(); + /* [1] Chaque semestre ==========================*/ foreach($parcours as $iter_s=>$semestre){ + // on récupère les id des UEs non pris en compte + $inactiveUE = explode(',', $semestre['inactive']); + // on supprime les entrées vides + foreach($inactiveUE as $i=>$UE) + if( strlen($UE) == 0 ) + unset($inactiveUE[$i]); + + // si des UEs non pris en compte, on ajoute le rang+formation à la liste + if( count($inactiveUE) > 0 ) + if( !in_array( array($semestre['id_formation'], $semestre['rang']), $listeSemestresCapitalisables) ) + array_push($listeSemestresCapitalisables, array($semestre['id_formation'], $semestre['rang'])); + $parcours[$iter_s]['UEs'] = ueRepo::forStudent($etudiantUID, $semestre['id']); /* CALCUL DE MOYENNE DU SEMESTRE */ @@ -1060,14 +1133,15 @@ class DataBase{ $parcours[$iter_s]['UEs'][$iter_ue]['moyenne'] = array('moyenne' => 20*$moyenneUE/$totalUE, 'base' => 20 ); - // on complète la moyenne du semestre si l'UE a une moyenne + // on complète la moyenne du semestre + // SI l'UE a une moyenne $tmpUE = $parcours[$iter_s]['UEs'][$iter_ue]; if( !is_bool($tmpUE['moyenne']) ){ $moyenneSemestre += $tmpUE['moyenne']['moyenne']/$tmpUE['moyenne']['base'] * $tmpUE['coefficient']; $totalSemestre += $tmpUE['coefficient']; - // le semestre est non compensable si la moyenne d'au moins un UE < 8 + // le semestre est non compensable si la moyenne d'au moins un UE < 8 if( 20*$tmpUE['moyenne']['moyenne']/$tmpUE['moyenne']['base'] < 8 ) $semestreCompensable = false; @@ -1080,10 +1154,15 @@ class DataBase{ /* ENREGISTREMENT DE LA MOYENNE DU SEMESTRE */ + // on enregistre les valeurs du calcul pour pouvoir calculer avec compensation + $parcours[$iter_s]['calculMoyenne'] = array( 'sum' => $moyenneSemestre, 'count' => $totalSemestre ); + if( $totalSemestre == 0 ) // si la somme vaut 0, on retourne FALSE $parcours[$iter_s]['moyenne'] = false; - else + else{ + // on enregistre la moyenne $parcours[$iter_s]['moyenne'] = array('moyenne' => 20*$moyenneSemestre/$totalSemestre, 'base' => 20 ); + } $parcours[$iter_s]['compensable'] = $semestreCompensable; @@ -1093,6 +1172,79 @@ class DataBase{ else $parcours[$iter_s]['compensation'] = false; + // on met la liste des id d'ue inactifs sous forme de tableau + $parcours[$iter_s]['inactive'] = $inactiveUE; + } + + + + + + + /* LISTE DES UES CAPITALISÉES PAR SEMESTRES REGROUPÉS (FORMATION+RANG) */ + // On ajoute toutes les UE capitalisées + foreach($listeSemestresCapitalisables as $i=>$formationRang){ + + // pour cette formation+rang, on récupère toutes les UEs + $listeUEs = array(); + $UEUIDS = array(); + $listeSemestresIndexes = array(); + + foreach($parcours as $iter_s=>$semestre){ + + // si fait partie de la formation+rang courante + if( $formationRang == array( $semestre['id_formation'], $semestre['rang'] ) ){ + + // on ajoute l'index du semestre à la liste + array_push($listeSemestresIndexes, $iter_s); + + // on ajoute chaque UE de ce semestre s'il est actif + foreach($semestre['UEs'] as $UE) + if( !in_array($UE['id'], $semestre['inactive']) ){ + if( ($lastUEIndex=array_search($UE['id'], $UEUIDS)) === false ){ + array_push( $listeUEs, $UE ); + array_push( $UEUIDS, $UE['id'] ); + }else // si UE existe déjà pour formation+rang, on créé la capitalisation du semestre (on le désactive) + DataBase::getInstance()->capitaliserUE($UEUIDS[$lastUEIndex], $semestre['id'], $etudiantUID); + } + } + + } + + // variables utiles pour la moyenne + $moyenneSemestre = 0; $totalSemestre = 0; + $semestreCompensable = true; $semestreCompensation = true; + + // pour chaque UE capitalisée + foreach($listeUEs as $iter_ue=>$UE){ + // si l'UE a une moyenne + if( !is_bool($UE['moyenne']) ){ + $moyenneSemestre += $UE['moyenne']['moyenne']/$UE['moyenne']['base'] * $UE['coefficient']; + $totalSemestre += $UE['coefficient']; + + // le semestre est non compensable si la moyenne d'au moins un UE < 8 + if( 20*$UE['moyenne']['moyenne']/$UE['moyenne']['base'] < 8 ) + $semestreCompensable = false; + + // semestreCompensé est VRAI si au moins un semestre est entre 8 et 10 + if( 20*$UE['moyenne']['moyenne']/$UE['moyenne']['base'] >= 8 && 20*$UE['moyenne']['moyenne']/$UE['moyenne']['base'] < 10 ) + $semestreCompensation = true; + } + } + + + // attribution des moyennes aux semestres concernés + foreach($listeSemestresIndexes as $index){ + if( $totalSemestre > 0 ) + $parcours[$index]['moyenne'] = array( 'moyenne' => 20*$moyenneSemestre/$totalSemestre, 'base' => 20 ); + else + $parcours[$index]['moyenne'] = array( 'moyenne' => 0, 'base' => 20 ); + + // on met à jour le semestre compensable, et compensation + $parcours[$index]['compensable'] = $semestreCompensable; + $parcours[$index]['compensation'] = $semestreCompensation; + } + } return $parcours; diff --git a/manager/repo/group.php b/manager/repo/group.php index f21375d..e8068e1 100755 --- a/manager/repo/group.php +++ b/manager/repo/group.php @@ -232,7 +232,7 @@ class groupRepo{ ORDER BY g.nom"); $getGroupe->execute(array( ':etudiant' => $etudiant, ':semestre' => $semestre )); - return DataBase::delNumeric( $getGroupe->fetch(), true ); + return $getGroupe->fetch(); } diff --git a/manager/repo/semestre.php b/manager/repo/semestre.php index 0cc18cd..2f26096 100755 --- a/manager/repo/semestre.php +++ b/manager/repo/semestre.php @@ -258,7 +258,7 @@ class semestreRepo{ * */ public static function getParcours($etudiant){ - $getSemestreListe = DataBase::getPDO()->prepare("SELECT DISTINCT s.id_semestre as id, f.id_formation, f.code, f.nom as formation, f.nb_semestres, s.nom as semestre, s.rang, s.annee, app.mention + $getSemestreListe = DataBase::getPDO()->prepare("SELECT DISTINCT s.id_semestre as id, f.id_formation, f.code, f.nom as formation, f.nb_semestres, s.nom as semestre, s.rang, s.annee, app.mention, app.inactive FROM formation as f, semestre as s, appartenance as app WHERE s.id_formation = f.id_formation AND app.id_semestre = s.id_semestre @@ -568,4 +568,47 @@ class semestreRepo{ return $prev; } + /* RETOURNE LES SEMESTRES EQUIVALENTS (REDOUBLÉS) + * + * @semestre UID du semestre de base + * @etudiant UID de l'étudiant en question + * + * + * @return redoublements Retourne un tableau contenant les UIDs des semestre équivalents + * @return error Retourne FAUX si une erreur occure + * + */ + public static function getRedoublements($semestre, $etudiant){ + /* [1] On récupère les informations du semestre + =================================================*/ + $getSemestreInfo = DataBase::getPDO()->prepare("SELECT DISTINCT s.* + FROM semestre as s, appartenance as app + WHERE s.id_semestre = app.id_semestre + AND s.id_semestre = :semestre + AND app.id_etudiant = :etudiant"); + $getSemestreInfo->execute(array( ':semestre' => $semestre, ':etudiant' => $etudiant )); + + // aucun résultat, on retourne une erreur + if( !($semestreInfo=$getSemestreInfo->fetch()) ) return 'unknown_semestre'; + + /* [2] On cherche les semestre redoublés + =================================================*/ + $getRedoublements = DataBase::getPDO()->prepare("SELECT s.id_semestre + FROM semestre as s, appartenance as app + WHERE s.id_semestre = app.id_semestre + AND s.id_formation = :formation + AND s.rang = :rang + AND app.id_etudiant = :etudiant + AND s.id_semestre <> :semestre + ORDER BY s.annee, s.rang ASC"); + $getRedoublements->execute(array( + ':formation' => $semestreInfo['id_formation'], + ':rang' => $semestreInfo['rang'], + ':etudiant' => $etudiant, + ':semestre' => $semestre + )); + + return $getRedoublements->fetchAll(); + } + } \ No newline at end of file diff --git a/manager/repo/ue.php b/manager/repo/ue.php index 7fc8a1d..44d0e8d 100755 --- a/manager/repo/ue.php +++ b/manager/repo/ue.php @@ -56,7 +56,7 @@ class ueRepo extends DBAccess{ * */ public static function forStudent($etudiant, $semestre){ - // on récupère les modules + // on récupère les UEs $getUesForStudent = DataBase::getPDO()->prepare("SELECT DISTINCT ue.id_ue as id, s.id_semestre, s.nom as semestre, s.annee, ue.nom, ue.libelle, mcc_ue.coefficient FROM appartenance as app, semestre as s, mcc_ue, ue WHERE app.id_semestre = s.id_semestre @@ -247,4 +247,62 @@ class ueRepo extends DBAccess{ } + + /* DEFINIT SI UN UE EST PRIS EN COMPTE OU NON (CAPITALISATION) + * + * @semestre UID du semestre en question + * @etudiant UID de l'étudiant en question + * @ue UID de l'UE en question + * @active VRAI si on veut qu'il soit pris en compte, NON sinon + * + * + * @return state VRAI si les changements sont pris en compte, sinon FAUX + * + */ + public static function capitalisation($semestre, $etudiant, $ue, $active){ + /* [1] On récupère l'appartenance + ==========================================================================*/ + $getUEState = DataBase::getPDO()->prepare("SELECT * + FROM appartenance + WHERE id_semestre = :semestre + AND id_etudiant = :etudiant"); + $getUEState->execute(array( ':semestre' => $semestre, ':etudiant' => $etudiant )); + + // si on trouve aucune appartenance, on retourne FAUX + if( !($ueState=$getUEState->fetch()) ) return false; + + $stateArray = explode(',', $ueState['inactive'] ); + // on supprime les entrées vides + foreach($stateArray as $i=>$state) + if( strlen($state) == 0 ) + unset($stateArray[$i]); + + /* [2] On met à jour "inactive" pour enlever ou mettre l'UE + ==========================================================================*/ + if( $active && in_array($ue, $stateArray) ) // si on doit enlever l'ue et qu'il y est + array_splice($stateArray, array_search($ue, $stateArray), 1 ); // => on enleve l'ue + + if( !$active && !in_array($ue, $stateArray) ) // si on doit ajouter l'ue et qu'il n'y est pas encore + array_push($stateArray, $ue); // => on ajoute l'ue + + $stateString = implode(',', $stateArray); + + /* [3] On met à jour dans la base de données + ==========================================================================*/ + $setUEState = DataBase::getPDO()->prepare("UPDATE appartenance + SET inactive = :uestate + WHERE id_appartenance = :appartenance"); + $setUEState->execute(array( ':uestate' => $stateString, ':appartenance' => $ueState['id_appartenance'] )); + + /* [4] On vérifie que la modification a bien été faite + ==========================================================================*/ + $getVerifState = DataBase::getPDO()->prepare("SELECT inactive FROM appartenance WHERE id_appartenance = :appartenance"); + $getVerifState->execute(array( ':appartenance' => $ueState['id_appartenance'] )); + + if( !($verifState=$getVerifState->fetch()) ) return false; + + return $verifState['inactive'] == $stateString; + + } + } \ No newline at end of file diff --git a/page/_JS/career.js b/page/_JS/career.js index 115a218..1c2ba94 100755 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -746,8 +746,38 @@ if( importNotes.length > 0 ){ } +/****************************************/ +/* GESTION DE LA CAPITALISATION D'UN UE */ +/****************************************/ +var capitalisationUE = document.querySelectorAll('.capitalisation_ue[data-stre][data-ue][data-etu]'); +// si il y en a sur la page +if( capitalisationUE.length > 0 ){ + for( var i = 0 ; i < capitalisationUE.length ; i++ ){ + + capitalisationUE[i].addEventListener('click', function(e){ + + // on créé la requête + request = { + level_0: 'career', + level_1: 'capitaliser', + semestre: e.target.dataset.stre, + ue: e.target.dataset.ue, + etudiant: e.target.dataset.etu + }; + + // on envoie la requête + API.send(request, function(answer){ + if( answer.request == 'success' ) reload(); + else makeBounce(e.target); + }); + + }, false); + + } + +} diff --git a/page/career.php b/page/career.php index 6248755..82b44e5 100755 --- a/page/career.php +++ b/page/career.php @@ -1113,7 +1113,7 @@ if( (permission('master') || permission('admin')) && $etudiantOpt != null ){ $request->etudiant = $etudiantOpt; careerManager::switch_level_1($request, $answer); - + if( $answer->request == 'success' ){ // si on a bien récupéré les UE/notes //////////////////////////////////////////////////////////////////////////////// echo "
"; @@ -1182,21 +1182,31 @@ if( (permission('master') || permission('admin')) && $etudiantOpt != null ){ /* MOYENNE MODULE */ if( is_bool($module['moyenne']) ) // si aucune note pour ce controle on affiche 'Pas de note' - echo "Pas de moyenne"; + echo "Pas de moyenne"; else // si une note, alors on l'affiche - echo "Moyenne module: ".number_format($module['moyenne']['moyenne'], 2)." / ".$module['moyenne']['base'].""; + echo "Moyenne module: ".number_format($module['moyenne']['moyenne'], 2)." / ".$module['moyenne']['base'].""; /* MOYENNE UE */ - if( is_bool($UE['moyenne']) ) // si aucune note pour cet UE on affiche 'Pas de moyenne' - echo "Pas de moyenne"; - else // si un moyenne, alors on l'affiche - echo "Moyenne UE: ".number_format($UE['moyenne']['moyenne'], 2)." / ".$UE['moyenne']['base'].""; + // si UE non inactif dans la capitalisation, on affiche + if( !in_array($UE['id'], $semestre['inactive']) ){ + + if( is_bool($UE['moyenne']) ) // si aucune note pour cet UE on affiche 'Pas de moyenne' + echo "Pas de moyenne"; + else // si un moyenne, alors on l'affiche + echo "Moyenne UE: ".number_format($UE['moyenne']['moyenne'], 2)." / ".$UE['moyenne']['base'].""; + + // UE pas utilisé dans la capitalisation, on affiche pas + }else{ // sert de lien pour l'activer dans la capitalisation + echo "Non pris en compte"; + } + + /* MOYENNE SEMESTRE */ if( is_bool($semestre['moyenne']) ) // si aucune note pour ce semestre on affiche 'Pas de moyenne' - echo "Pas de moyenne"; + echo "Pas de moyenne"; else // si un moyenne, alors on l'affiche - echo "Moyenne semestre: ".number_format($semestre['moyenne']['moyenne'], 2)." / ".$semestre['moyenne']['base'].""; + echo "Moyenne semestre: ".number_format($semestre['moyenne']['moyenne'], 2)." / ".$semestre['moyenne']['base'].""; echo ''; diff --git a/src/files/admin2_export_jury.xlsx b/src/files/admin2_export_jury.xlsx index ff9f2002e09b2617453ca01dc15b09ec763c98ef..bbfe941ebed7d163982553ad0c5fb7889add9aac 100644 GIT binary patch delta 1899 zcmZ8i4LH+lAO6p>7_)Wqb$nE27;A<^Ecplri!ff_`Bq|Nn0bexvbA$2OpXYVQNp<- zv>ab8Qa;iUlH)Tu2Sull(e;jVz3*|}=enNjzMkiIKfmX?p8NUTzY>Q{eQ9R`c%Li) z01|*fUY#@pBxaCTe*=Wr#Y(ZmyVwnW0HPb@q3t}bI`$`n0N|S#02~k<3W*MOCP!b2 z#RW%`Lv^X7NUrO+)2tpMdGZ(L7RwdC%)+`{d}^~KWrrah_*IF9&e%ZG9;=l+O;`zD zM3LTzMV~A-IiGnxv(hyAc>EgNYN%h=PCpO@#uN!C4M&=K?k71tU_Q}t!AsGl1XifZ ztsgX!wf$1fI}#=Cs)ar8?sDA}Pqg~1!F4&6b|5B4)+qbBu40;GhTIpcR;Jv5cJQ+y z0IK0U(66_CM}5pw$HaRx{w@uyp*|p!v1=GOt`FI*&DIQB zSaH*^{#?O4ZehFc%Vf&1?>JpoNAik?L!LpZg~B6e+wpLlbqBws1}2r0o-%a1-zSB# zDy%LmSsV`ImMXaA*=jR7ntCUeX2^*)8@Y1NOfY04fB8Q@y|*_J#y@4{)O}b6bBgYd z{rcH#yoS(be6c#sf03Eh(l+fKp53ZVJI82*2TtL+>FCRA`BB%`hx9GgrXQtHA=khr z>9PW;hioaGPp2NJ{?TuMeMBx*y$fHM3i(Rkt7g5{{u%LI+4RZjCUYXWXd>x$w5CSl zVlM=eLqmvhPk!Veri-%g5$=aX3i@4f=f9~ylUE$@? z^vuOenZDBdq2;i5TkGdrzl{#lmO7O~ppp^cVcyVo%?8lfh9uMKXpA<~tg-d1L<4;b z$iXB8U-Qg$FZZVO@?Etrnlg*S!hxf6`Q*>OT}iHnAuHH;K!tXEk8to1Zuk1&E)x`_|JUBiY}1aJmVw7X6C$@mo> zrbe<~d+->`Dbe3NI%kuh#V`UiwRaeFwk)$!s0=kN2U%kzzaF{nmkQ(04oE zTR4y^c?1jqCi1USVgC3=xNA@+?PqIKPanuLSQWXXU-a-0kL%Q}bLCy)m#+jxv?J9a ze@YL&e)~yJXXThvcg+h>T&he(6-rWxAPEhDm4bK$4BqQ^hAcOF&S}dbi`@2CIg(xo zcGX*Js0pf}7%IV}mG zej-z|(yCbL-P_0Y>i7aac*V|`XJqj(-v)-`F1(G?&dTcJ-+vWnqOY}-Rw7HOQr}-t zU6N{9rq)pF*i3(I70F)3TaAX@_;JG6eh}Xa@!^Jw%OuG*D|bZIVX4>*c4iIk;H@ct zm~nglbC6_PvMH%i)7Ik@s__Aq|Ag3W*J;?r6Zele$>g^;&C6U2xL%>f507G^<7If@C) zI~fb<38dNJamNt~CDMmNTKzplQ;Tymj`_YN7#?slwJ8?9XKhUF>gbq~-DRD7?b#f^8p@Xr0$lNcW<_AF(9+`RD< zC2aHPXUo+TeP?%wM#q}jEAxO#Cp%W*r0!PY!bl-6ASjGt_|z=VW&3DB{QG$GX^Ms4 z=nb|)xnYk*S&z_g+Z!B>n+@=Exfl0dJFwiNDt1dk)d&(8$A`@;PsePDaqszj*q|EV z4OqI5FT)LV&;6$IQO7n)!cXJaz2mv+eLAq;Jr|9D;dyY|hSc7&;{2$_6IB(*7HPf% z45aZ6v?FbIKtlbb;PMJFL$PVZKJ?w7| z0OQQ5BX_f-RLtaM{_?lD#K_QHV{;~eMBVDYEe>t>8!W=1NMwYAqFwl&EC67N-~^&n vcW?Wr6YOQ}`%dHwn!BVvf-90Lim^pgeJ=;_mg5wvX>cSp5RilNJCXkY>+~5x delta 4950 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 DbUwye literal 0 HcmV?d00001 diff --git a/src/files/admin2_import_mcc.xlsx b/src/files/admin2_import_mcc.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..7c391af2a18ded33e187b3b4e85dba37f93af75c GIT binary patch literal 9131 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 literal 0 HcmV?d00001 diff --git a/test.php b/test.php index 2455ce3..5044b01 100755 --- a/test.php +++ b/test.php @@ -48,6 +48,19 @@ debug(); // var_dump(DataBase::getInstance()->getSemestreInfoFromTime( strtotime('2017-01-31') )); +// on récupère les année équivalentes (redoublées) pour un semestre +// var_dump( semestreRepo::getRedoublements(252, 'Etud100') ); + +// 35 = UE1, +// on veut que l'ue d'id 35 compte pour le semestre 252 et que les semestres de même rang et formation soient ignorés +$request = new stdClass; $answer = new stdClass; +$request->level_1 = 'capitaliser'; +$request->ue = 35; +$request->semestre = 252; +$request->etudiant = 'Etud100'; + +careerManager::switch_level_1($request, $answer); +var_dump( $answer ); // $ts = time(); // $date1 = date('Y-m-d', $ts);