[x] Import de notes pour un contrôle

+ @excelManager
	+ enregistrement
	+ lecture/parsage
	+ intégration
This commit is contained in:
xdrm-brackets 2016-01-03 22:02:46 +01:00
parent 5b6a537a9d
commit 17dd4096ed
9 changed files with 126 additions and 75 deletions

View File

@ -51,7 +51,7 @@ APIClass.prototype = {
if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée
/* DEBUG : affiche la réponse BRUTE de API.php */ /* 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) ); console.log( JSON.parse(ptrAPI.xhr[i].responseText) );
/* si success de requête */ /* si success de requête */

View File

@ -225,7 +225,7 @@ class careerManager{
case 'saisieNoteMultiple': if( (permission('teacher') || permission('admin')) && $_SESSION['annee'] >= getCurrentYear() ){ case 'saisieNoteMultiple': if( (permission('teacher') || permission('admin')) && $_SESSION['annee'] >= getCurrentYear() ){
$areSetParam = isset($request->notes) && isset($request->controle); // les arguments existent $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 $nEmptyParam = $typeOkParam && count($request->notes) > 0; // des bon types
if( $nEmptyParam ){ // si tout les paramètres sont bons if( $nEmptyParam ){ // si tout les paramètres sont bons
@ -304,10 +304,6 @@ class careerManager{
/**************************/ /**************************/
/* création d'un semestre */ /* création d'un semestre */
/**************************/ /**************************/

View File

@ -1186,17 +1186,18 @@ class DataBase{
public function saisieNoteMultiple($controle, $notes){ public function saisieNoteMultiple($controle, $notes){
if( !($controleInfo=controleRepo::info($controle)) ) return 'unknown_controle'; 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) // 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 // si la note > base du contrôle, on supprime la note
if( $note->valeur > $controleInfo['base'] ) if( $NOTE->valeur > $controleInfo['base'] )
unset( $notes[$iter] ); unset( $notes[$iter] );
} }
// saisie multiple des notes // saisie multiple des notes
$rep = noteRepo::creerMultiple($controleInfo['id'], $controleInfo['id_semestre'], $notes); $rep = noteRepo::creerMultiple($controleInfo['id'], $controleInfo['id_semestre'], $notes);

View File

@ -252,47 +252,53 @@ class excelManager{
break; break;
/***************************************************************************/ /******************************************/
/* Importation de notes pour un contrôle, une formation et un groupe donné */ /* Importation des notes pour un contrôle */
/***************************************************************************/ /******************************************/
case 'import_notes': case 'import_notes':
if( isset($request->docPath) ) { $filePath = __EXCEL_PATH__.$_SESSION['identifiant'].'_import_notes.xlsx';
// Récupération du nom du fichier // si on a pas le droit d'écriture, on quitte //
if( !is_readable($filePath) ){ $answer->request = 'read_permission'; return; }
$inputFileName = $request->docPath; // Charger le fichier en tant que document Excel
$objPHPExcel = PHPExcel_IOFactory::load($filePath);
// Chargement du fichier // Get sur la première case
$sheet = $objPHPExcel->getSheet(0);
$notesData = $sheet->rangeToArray('A1:'.'B'.$sheet->getHighestRow());
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
// Placement du curseur sur la première case $notes = array(); // contiendra le tableau de retour
$sheet = $objPHPExcel->getSheet(0); /****************************/
$noteData = $sheet->rangeToArray('A3:'.$sheet->getHighestColumn().''.$sheet->getHighestRow()); /* TRAITEMENT SUR LES CASES */
/****************************/
foreach($notesData as $line){
// Varaible stack pour la liste des notes /* [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]);
$listeNotes = array(); if( checkParam($line[0], 'utilisateur.identifiant') && is_numeric($line[1]) ){ // bon format pour l'identifiant et la note
// Boucle sur le format suivant : ligne[0] : [ID] / ligne[1] : [NOTE] array_push( // on ajoute l'étudiant et sa note
$notes,
array(
'etudiant' => $line[0],
'valeur' => $line[1]
)
);
foreach($noteData as $line) {
if($line[0] != null && $line[1] != null)
array_push($listeNotes,array($line[0],$line[1]));
} }
} }
// Erreur de paramètre(s) $answer->notes = $notes;
$answer->request = 'success';
else {
$answer->request='param_error';
}
break; break;

View File

@ -15,7 +15,7 @@ class noteRepo{
* @etudiant<String> l'identifiant de l'étudiant recherché * @etudiant<String> l'identifiant de l'étudiant recherché
* @controle<int> l'UID du contrôle * @controle<int> l'UID du contrôle
* *
* @return UID<String> l'UID de la note si elle existe pour ces critères * @return UID<String> l'UID de la note si elle existe pour ces critères (la dernière assignée)
* @return FALSE<Boolean> FAUX si aucune note répondant à ces critères n'est pas présente dans la BDD * @return FALSE<Boolean> FAUX si aucune note répondant à ces critères n'est pas présente dans la BDD
* *
*/ */
@ -26,7 +26,8 @@ class noteRepo{
AND ctrl.id_controle = note.id_controle AND ctrl.id_controle = note.id_controle
AND app.id_etudiant = :etudiant 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 )); $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 // 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){ public static function creerMultiple($controle, $semestre, $notes){
$saisieFinie = true; $saisieFinie = true;
foreach($notes as $iter=>$note){ foreach($notes as $iter=>$note){
@ -327,45 +327,31 @@ class noteRepo{
$cEtudiant = $note->etudiant; $cEtudiant = $note->etudiant;
$cValeur = $note->valeur; $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 */ $creationNote = DataBase::getPDO()->prepare("INSERT INTO note(id_note, id_appartenance, id_controle, valeur)
if( true ){ // !($noteUID=noteRepo::UID($cEtudiant, $controle)) VALUES(
DEFAULT,
$creationNote = DataBase::getPDO()->prepare("INSERT INTO note(id_note, id_appartenance, id_controle, valeur) (SELECT id_appartenance FROM appartenance WHERE id_etudiant = :etudiant AND id_semestre = :semestre),
VALUES( :controle,
DEFAULT, :valeur
(SELECT id_appartenance FROM appartenance WHERE id_etudiant = :etudiant AND id_semestre = :semestre), )");
:controle, $creationNote->execute(array( ':etudiant' => $cEtudiant, ':semestre' => $semestre, ':controle' => $controle, ':valeur' => $cValeur ));
:valeur
)");
$creationNote->execute(array( ':etudiant' => $cEtudiant, ':semestre' => $semestre, ':controle' => $controle, ':valeur' => $cValeur ));
/* [2] Second cas : il faut modifier la note de cet étudiant /* [2] On vérifie que la note a bien été créé pour cet étudiant et ce contrôle
============================================================================*/
}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
=================================================================================*/ =================================================================================*/
if( !($noteUID=noteRepo::UID($cEtudiant, $controle)) ) return false; if( !($noteUID=noteRepo::UID($cEtudiant, $controle)) ) return false;
/* [3] On vérifie que la note créée a bien la valeur qu'on a attribuée
/* [4] 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 = DataBase::getPDO()->prepare("SELECT valeur FROM note WHERE id_note = :noteUID");
$verificationValeur->execute(array( ':noteUID' => $noteUID )); $verificationValeur->execute(array( ':noteUID' => $noteUID ));
$saisieFinie = $saisieFinie && ( $verificationValeur->fetch()['valeur'] == $cValeur ); $saisieFinie = $saisieFinie && ( $verificationValeur->fetch()['valeur'] == $cValeur );
} }
return $saisieFinie; return $saisieFinie;
} }

View File

@ -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);
}

View File

@ -355,8 +355,9 @@ elseif( permission('teacher') ){ // si enseignant et qu'un contrôle est spécif
echo "<table class='basic col4'><thead>"; echo "<table class='basic col4'><thead>";
echo "<th colspan=5 style='font-size:1.5em; text-align:center;'>".$answer->controle['nom'].' - '.$answer->controle['libelle'].'</th>'; echo "<th colspan=5 style='font-size:1.5em; text-align:center;'>".$answer->controle['nom'].' - '.$answer->controle['libelle'].'</th>';
echo '<tr>'; echo '<tr class="noborder transparentbg">';
echo "<th><span class='link ctrl' data-ctrl='".$answer->controle['id']."'>".$answer->controle['libelle']."</span></th>"; echo "<td><div class='confirm active' style='background-color:#fff;' id='import_notes' data-ctrl='".$answer->controle['id']."'>Importer les notes";
echo "<input type='file'></div></td>";
echo "<th>".$answer->controle['module']." - ".$answer->controle['modulelib']."</th>"; echo "<th>".$answer->controle['module']." - ".$answer->controle['modulelib']."</th>";

Binary file not shown.

View File

@ -49,10 +49,12 @@ debug();
/* [1] On récupère le semestre d'un étudiant /* [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' ]
// )) );