[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
/* 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 */

View File

@ -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 */
/**************************/

View File

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

View File

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

View File

@ -15,7 +15,7 @@ class noteRepo{
* @etudiant<String> l'identifiant de l'étudiant recherché
* @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
*
*/
@ -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;
}

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 "<th colspan=5 style='font-size:1.5em; text-align:center;'>".$answer->controle['nom'].' - '.$answer->controle['libelle'].'</th>';
echo '<tr>';
echo "<th><span class='link ctrl' data-ctrl='".$answer->controle['id']."'>".$answer->controle['libelle']."</span></th>";
echo '<tr class="noborder transparentbg">';
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>";

Binary file not shown.

View File

@ -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' ]
// )) );