[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
|
||||
|
||||
/* 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 */
|
||||
|
|
|
@ -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 */
|
||||
/**************************/
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 "<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.
10
test.php
10
test.php
|
@ -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' ]
|
||||
// )) );
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue