[x] Import de notes pour un contrôle
+ @excelManager + enregistrement + lecture/parsage + intégration
This commit is contained in:
parent
5b6a537a9d
commit
17dd4096ed
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
/**************************/
|
/**************************/
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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':
|
||||||
|
|
||||||
|
|
||||||
|
$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;
|
/****************************/
|
||||||
|
/* TRAITEMENT SUR LES CASES */
|
||||||
// Chargement du fichier
|
/****************************/
|
||||||
|
foreach($notesData as $line){
|
||||||
|
|
||||||
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
|
/* [1] On récupère pour chaque étudiant si le format est bon
|
||||||
|
=========================================================================*/
|
||||||
// Placement du curseur sur la première case
|
// 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);
|
if( checkParam($line[0], 'utilisateur.identifiant') && is_numeric($line[1]) ){ // bon format pour l'identifiant et la note
|
||||||
$noteData = $sheet->rangeToArray('A3:'.$sheet->getHighestColumn().''.$sheet->getHighestRow());
|
|
||||||
|
|
||||||
// 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)
|
$answer->notes = $notes;
|
||||||
|
$answer->request = 'success';
|
||||||
else {
|
|
||||||
|
|
||||||
$answer->request='param_error';
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -24,9 +24,10 @@ class noteRepo{
|
||||||
FROM appartenance as app, note, controle as ctrl
|
FROM appartenance as app, note, controle as ctrl
|
||||||
WHERE app.id_appartenance = note.id_appartenance
|
WHERE app.id_appartenance = note.id_appartenance
|
||||||
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;
|
||||||
|
|
||||||
|
|
||||||
/* [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 = 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
10
test.php
10
test.php
|
@ -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' ]
|
||||||
|
// )) );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue