<?php
/**
 * @version $Id$
 * @author Thomas Crespin <thomas.crespin@sesamath.net>
 * @copyright Thomas Crespin 2009-2022
 * 
 * ****************************************************************************************************
 * SACoche <https://sacoche.sesamath.net> - Suivi d’Acquisitions de Compétences
 * © Thomas Crespin pour Sésamath <https://www.sesamath.net> - Tous droits réservés.
 * Logiciel placé sous la licence libre Affero GPL 3 <https://www.gnu.org/licenses/agpl-3.0.html>.
 * ****************************************************************************************************
 * 
 * Ce fichier est une partie de SACoche.
 * 
 * SACoche est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant les termes 
 * de la “GNU Affero General Public License” telle que publiée par la Free Software Foundation :
 * soit la version 3 de cette licence, soit (à votre gré) toute version ultérieure.
 * 
 * SACoche est distribué dans l’espoir qu’il vous sera utile, mais SANS AUCUNE GARANTIE :
 * sans même la garantie implicite de COMMERCIALISABILITÉ ni d’ADÉQUATION À UN OBJECTIF PARTICULIER.
 * Consultez la Licence Publique Générale GNU Affero pour plus de détails.
 * 
 * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ;
 * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>.
 * 
 */

if(!defined('SACoche')) {exit('Ce fichier ne peut être appelé directement !');}
// Pas de test d’établissement de démo ici mais dans les sous-fichiers, sauf dans 2 cas précis
if( ($_SESSION['SESAMATH_ID']==ID_DEMO) && !empty($_POST['f_action']) && ($_POST['f_action']=='enregistrer_moyenne') ) {Json::end( FALSE , 'Action désactivée pour la démo.' );}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération des valeurs transmises
// ////////////////////////////////////////////////////////////////////////////////////////////////////

$ACTION            = Clean::post('f_action'           , 'texte');
$classe_id         = Clean::post('f_classe'           , 'entier');
$groupe_id         = Clean::post('f_groupe'           , 'entier');
$eleve_id          = Clean::post('f_eleve'            , 'entier');
$saisie_id         = Clean::post('f_saisie_id'        , 'entier');
$rubrique_type     = Clean::post('f_rubrique_type'    , 'texte');
$rubrique_id       = Clean::post('f_rubrique_id'      , 'entier');
$rubrique_dispense = Clean::post('f_rubrique_dispense', 'entier');
$saisie_objet      = Clean::post('f_saisie_objet'     , 'texte');
$position          = Clean::post('f_position'         , 'decimal');
$moyenne           = Clean::post('f_moyenne'          , 'decimal');
$groupe_nom        = Clean::post('f_groupe_nom'       , 'texte');

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Afficher la liste des élèves
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($ACTION=='lister_eleves') && !is_null($classe_id) && !is_null($groupe_id) && !is_null($groupe_nom) )
{
  $DB_TAB = (!$groupe_id)
          ? DB_STRUCTURE_COMMUN::DB_lister_users_regroupement( 'eleve' /*profil_type*/ , 1 /*statut*/ , 'classe' , $classe_id , 'nom' /*eleves_ordre*/ , 'user_id,user_nom,user_prenom' /*champs*/ )
          : DB_STRUCTURE_COMMUN::DB_lister_eleves_classe_et_groupe( $classe_id , $groupe_id , 1 /*statut*/ ) ;
  if(empty($DB_TAB))
  {
    Json::end( FALSE , 'Aucun élève évalué trouvé dans le regroupement '.$groupe_nom.' !' );
  }
  $tab_options = array();
  foreach($DB_TAB as $DB_ROW)
  {
    $tab_options[] = '<option value="'.$DB_ROW['user_id'].'">'.html($DB_ROW['user_nom'].' '.$DB_ROW['user_prenom']).'</option>';
  }
  Json::end( TRUE , implode('',$tab_options) );
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Imprimer un tableau récapitulatif PDF
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($ACTION=='imprimer_tableau') && !is_null($classe_id) && !is_null($groupe_id) && !is_null($groupe_nom) )
{
  // Liste des élèves
  $DB_TAB = (!$groupe_id)
          ? DB_STRUCTURE_COMMUN::DB_lister_users_regroupement( 'eleve' /*profil_type*/ , 1 /*statut*/ , 'classe' , $classe_id , 'nom' /*eleves_ordre*/ , 'user_id,user_nom,user_prenom' /*champs*/ )
          : DB_STRUCTURE_COMMUN::DB_lister_eleves_classe_et_groupe( $classe_id , $groupe_id , 1 /*statut*/ ) ;
  if(empty($DB_TAB))
  {
    Json::end( FALSE , 'Aucun élève évalué trouvé dans le regroupement '.$groupe_nom.' !' );
  }
  $tab_eleve_id = array();
  foreach($DB_TAB as $DB_ROW)
  {
    $tab_eleve_id[$DB_ROW['user_id']] = array( 'eleve_nom' => $DB_ROW['user_nom'] ,  'eleve_prenom' => $DB_ROW['user_prenom'] );
  }
  $liste_eleve_id = implode(',',array_keys($tab_eleve_id));
  $nb_eleves = count($tab_eleve_id);
  // Récupérer les enseignements suivis
  $DB_TAB = DB_STRUCTURE_LIVRET::DB_lister_matieres_mef_3e($liste_eleve_id);
  if(empty($DB_TAB))
  {
    Json::end( FALSE , 'Élèves ne suivant pas un niveau de formation 3e !' );
  }
  $tab_categorie = array(
    1 => '', // enseignement obligatoire pour le DNB
    0 => 'Option - ', // enseignement optionnel pour le DNB
    2 => 'Autre - ', // enseignement autre hors DNB ; n’est pas utilisé car il ne faut faire remonter que ce qui compte au DNB
  );
  $tab_rubrique = array();
  $tab_matiere = array();
  $tab_rubrique_used = array();
  foreach($DB_TAB as $DB_ROW)
  {
    $tab_rubrique[$DB_ROW['livret_dnb_matiere_code']] = $tab_categorie[$DB_ROW['livret_dnb_matiere_obligatoire']].$DB_ROW['livret_dnb_matiere_nom'];
    $tab_matiere[$DB_ROW['livret_dnb_matiere_code']] = 0;
  }
  // Moyennes enregistrées pour les élèves
  $DB_TAB = DB_STRUCTURE_LIVRET::DB_recuperer_donnees_eleves( 'dnb' /*livret_page_ref*/ , 'annuel'  /*livret_page_periodicite*/ , 0 /*jointure_periode*/ , '"moyenne"' /*liste_rubrique_type*/ , $liste_eleve_id , 0 /*prof_id*/ , FALSE /*with_periodes_avant*/ );
  $tab_saisie   = array();  // [eleve_id][rubrique_id] => moyenne
  foreach($DB_TAB as $DB_ROW)
  {
    $matiere_key = FALSE;
    foreach($tab_matiere as $matiere_masque => $matiere_used)
    {
      if(preg_match('/^'.$matiere_masque.'$/', $DB_ROW['matiere_code']))
      {
        $matiere_key = $matiere_masque;
        break;
      }
    }
    if(!$matiere_key)
    {
      // enseignement pas dans la liste de ceux comptant pour le dnb
      // on ne doit pas passer ici car il ne faut faire remonter que ce qui compte au DNB
      continue;
      // $matiere_key = $DB_ROW['matiere_code'];
      // $tab_rubrique[$matiere_key] = $tab_categorie[2].$DB_ROW['matiere_nom'];
    }
    $tab_rubrique_used[$matiere_key] = TRUE;
    $pourcentage = $DB_ROW['saisie_valeur'] ;
    if(is_null($pourcentage))
    {
      $tab_saisie[$DB_ROW['eleve_id']][$matiere_key] = 'Sans';
    }
    else if($pourcentage==='DI') // sur les vieilles versions de PHP le test ( 0 == 'blablabla' ) renvoie TRUE !
    {
      $tab_saisie[$DB_ROW['eleve_id']][$matiere_key] = 'Disp';
    }
    else
    {
      // 2 décimales au lieu de 9 pour avoir un affichage gérable
      $tab_saisie[$DB_ROW['eleve_id']][$matiere_key] = round(($pourcentage/5),2);
    }
  }
  $nb_rubriques = count($tab_rubrique_used);
  if(!$nb_rubriques)
  {
    Json::end( FALSE , 'Aucun enseignement trouvé avec un positionnement pour un élève !' );
  }
  $tab_rubrique = array_intersect_key($tab_rubrique, $tab_rubrique_used);
  // Fabrication du PDF ; on a besoin de tourner du texte à 90°
  // Fabrication d’un CSV en parallèle
  $pdf = new PDF_archivage_tableau( FALSE /*officiel*/ , 'A4' /*page_size*/ , 'portrait' /*orientation*/ , 10 /*marge_gauche*/ , 10 /*marge_droite*/ , 5 /*marge_haut*/ , 12 /*marge_bas*/ , 'non' /*couleur*/ );
  $pdf->moyennes_initialiser( $nb_eleves , $nb_rubriques );
  $csv = new CSV();
  // 1ère ligne : intitulés, noms rubriques
  $pdf->moyennes_intitule( $groupe_nom , '' /*periode_nom*/ , 'moyennes' /*objet_document*/ );
  $csv->add( array($groupe_nom) )->add( $tab_rubrique , 1 );
  foreach($tab_rubrique as $matiere_code => $matiere_nom)
  {
    $pdf->moyennes_reference_rubrique( $matiere_code , $matiere_nom );
  }
  // ligne suivantes : élèves, moyennes
  // Pour avoir les élèves dans l’ordre alphabétique, il faut utiliser $tab_eleve_id.
  $pdf->SetXY( $pdf->marge_gauche , $pdf->marge_haut+$pdf->etiquette_hauteur );
  foreach($tab_eleve_id as $eleve_id => $tab_eleve)
  {
    extract($tab_eleve);  // $eleve_nom $eleve_prenom
    $pdf->moyennes_reference_eleve( $eleve_id , $eleve_nom.' '.$eleve_prenom );
    $csv->add( $eleve_nom.' '.$eleve_prenom );
    foreach($tab_rubrique as $matiere_code => $matiere_nom)
    {
      $note = isset($tab_saisie[$eleve_id][$matiere_code]) ? $tab_saisie[$eleve_id][$matiere_code] : '-' ;
      $note = str_replace('.',',',$note) ; // Remplacer le point décimal par une virgule.
      $pdf->moyennes_note( $eleve_id , $matiere_code , $note , 'moyennes' /*objet_document*/ );
      $csv->add( $note );
    }
    $pdf->SetXY( $pdf->marge_gauche , $pdf->GetY()+$pdf->cases_hauteur );
    $csv->add( NULL , 1 );
  }
  // Enregistrement et affichage du retour.
  $fin_alea = FileSystem::generer_fin_nom_fichier__date_et_alea();
  $fnom = Clean::fichier('moyennes_annuelles_'.$groupe_nom.'_').$fin_alea;
  FileSystem::ecrire_objet_pdf( CHEMIN_DOSSIER_EXPORT.$fnom.'.pdf' , $pdf );
  Json::add_str('<a target="_blank" rel="noopener noreferrer" href="'.URL_DIR_EXPORT.$fnom.'.pdf"><span class="file file_pdf">Format <em>pdf</em>.</span></a>');
  FileSystem::ecrire_objet_csv( CHEMIN_DOSSIER_EXPORT.$fnom.'.csv' , $csv );
  Json::add_str(' '.'<a target="_blank" rel="noopener noreferrer" href="./force_download.php?fichier='.$fnom.'.csv"><span class="file file_txt">Format <em>csv</em>.</span></a>');
  Json::end( TRUE );
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Afficher les données pour un élève
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($ACTION=='afficher_donnees') && !empty($eleve_id) && !empty($classe_id) )
{
  $test_droit_directeur = ( ($_SESSION['USER_PROFIL_TYPE']=='directeur') && Outil::test_user_droit_specifique($_SESSION['DROIT_OFFICIEL_LIVRET_CONSULTER_MOYENNE_DNB']) ) ? TRUE : FALSE ;
  $test_droit_professeur = ( ($_SESSION['USER_PROFIL_TYPE']=='professeur') && Outil::test_user_droit_specifique( $_SESSION['DROIT_OFFICIEL_LIVRET_CONSULTER_MOYENNE_DNB'] , NULL /*matiere_coord_or_groupe_pp_connu*/ , $classe_id /*matiere_id_or_groupe_id_a_tester*/ ) ) ? TRUE : FALSE ;
  if( ($_SESSION['USER_PROFIL_TYPE']!='administrateur') && !$test_droit_directeur && !$test_droit_professeur )
  {
    Json::end( FALSE , 'Vous n’êtes pas habilité à accéder à cette fonctionnalité !' );
  }
  // Récupérer les enseignements suivis pour sa formation
  $DB_TAB = DB_STRUCTURE_LIVRET::DB_lister_matieres_mef_3e($eleve_id);
  if(empty($DB_TAB))
  {
    Json::end( FALSE , 'Élève ne suivant pas un niveau de formation 3e !' );
  }
  $tab_categorie = array(
    1 => 'enseignements obligatoires',
    0 => 'enseignements optionnels',
    2 => 'enseignements autres (hors&nbsp;DNB)', // n’est pas utilisé car il ne faut  faire remonter que ce qui compte au DNB
  );
  $tab_enseignement = array();
  $tab_matiere = array();
  foreach($DB_TAB as $DB_ROW)
  {
    $mef = $DB_ROW['livret_dnb_mef_intitule']; // (sera mis à jour à chaque passage avec la même valeur)
    $tab_enseignement[$DB_ROW['livret_dnb_matiere_obligatoire']][$DB_ROW['livret_dnb_matiere_code']] = $DB_ROW['livret_dnb_matiere_nom'];
    $tab_matiere[$DB_ROW['livret_dnb_matiere_code']] = $DB_ROW['livret_dnb_matiere_dispense_possible'];
  }
  // Récupérer la périodicité ; seuls les semestres et les trimestres sont acceptés par LSU en 3e à compter de 2026
  $tab_periode_livret = array(
    21 => 'Semestre 1/2',
    22 => 'Semestre 2/2',
    31 => 'Trimestre 1/3',
    32 => 'Trimestre 2/3',
    33 => 'Trimestre 3/3',
    0 => 'Moyenne annuelle',
  );
  $tab_periode = array();
  $DB_COL = DB_STRUCTURE_LIVRET::DB_lister_jointures_eleve_livret_periodes($eleve_id);
  foreach($DB_COL as $jointure_periode)
  {
    $tab_periode[$jointure_periode] = $tab_periode_livret[$jointure_periode];
  }
  $test_droit_directeur = ( ($_SESSION['USER_PROFIL_TYPE']=='directeur') && Outil::test_user_droit_specifique($_SESSION['DROIT_OFFICIEL_LIVRET_MODIFIER_MOYENNE_DNB']) ) ? TRUE : FALSE ;
  $test_droit_professeur = ( ($_SESSION['USER_PROFIL_TYPE']=='professeur') && Outil::test_user_droit_specifique( $_SESSION['DROIT_OFFICIEL_LIVRET_MODIFIER_MOYENNE_DNB'] , NULL /*matiere_coord_or_groupe_pp_connu*/ , $classe_id /*matiere_id_or_groupe_id_a_tester*/ ) ) ? TRUE : FALSE ;
  $droit_edition = ( ($_SESSION['USER_PROFIL_TYPE']=='administrateur') || ( !$test_droit_directeur && !$test_droit_professeur ) ) ? FALSE : TRUE ;
  // Récupérer les positionnements
  $DB_TAB = array_merge
  (
    DB_STRUCTURE_LIVRET::DB_recuperer_donnees_eleves( '3e'  /*livret_page_ref*/ , 'periode' /*livret_page_periodicite*/ , 0 /*jointure_periode*/ , '"eval"'    /*liste_rubrique_type*/ , $eleve_id , 0 /*prof_id*/ , TRUE /*with_periodes_avant*/ ) ,
    DB_STRUCTURE_LIVRET::DB_recuperer_donnees_eleves( 'dnb' /*livret_page_ref*/ , 'annuel'  /*livret_page_periodicite*/ , 0 /*jointure_periode*/ , '"moyenne"' /*liste_rubrique_type*/ , $eleve_id , 0 /*prof_id*/ , TRUE /*with_periodes_avant*/ )
  );
  $tab_donnees_livret = array();  // [matiere_code][jointure_periode] => array(id, rubrique, note, prof)
  foreach($DB_TAB as $DB_ROW)
  {
    if( ($DB_ROW['saisie_objet']=='position') && ( isset($tab_periode[$DB_ROW['jointure_periode']]) || !$DB_ROW['jointure_periode'] ) )
    {
      $periode_key = $DB_ROW['jointure_periode'];
      $matiere_key = FALSE;
      $matiere_dispense = FALSE;
      foreach($tab_matiere as $matiere_masque => $matiere_dispense)
      {
        if(preg_match('/^'.$matiere_masque.'$/', $DB_ROW['matiere_code']))
        {
          $matiere_key = $matiere_masque;
          break;
        }
      }
      if(!$matiere_key)
      {
        // enseignement pas dans la liste de ceux comptant pour le dnb
        // on ne doit pas afficher ceci car il ne faut faire remonter que ce qui compte au DNB
        continue;
        // $matiere_key = $DB_ROW['matiere_code'];
        // $tab_enseignement[2][$matiere_key] = $DB_ROW['matiere_nom'];
      }
      if(is_null($DB_ROW['saisie_valeur']))
      {
        $valeur = ($periode_key) ? 'Non noté' : 'Sans moyenne';
      }
      else if($DB_ROW['saisie_valeur']==='DI') // sur les vieilles versions de PHP le test ( 0 == 'blablabla' ) renvoie TRUE !
      {
        $valeur = 'Dispensé';
      }
      else
      {
        $precision = ($periode_key) ? 1 : 9 ;
        $valeur = round(($DB_ROW['saisie_valeur']/5),$precision);
      }
      $prof = ( ($DB_ROW['saisie_origine']=='saisie') && $DB_ROW['user_id'] ) ? To::texte_genre_identite($DB_ROW['user_nom'],FALSE,$DB_ROW['user_prenom'],TRUE,$DB_ROW['user_genre']) : NULL ;
      $tab_donnees_livret[$matiere_key][$periode_key] = array(
        'id'       => $DB_ROW['livret_saisie_id'],
        'rubrique' => $DB_ROW['rubrique_id'],
        'note'     => $valeur,
        'prof'     => $prof,
        'dispense' => $matiere_dispense,
      );
    }
  }
  if(!isset($tab_enseignement[2]))
  {
    // Normalement on passe toujours ici car il ne faut  faire remonter que ce qui compte au DNB
    unset($tab_categorie[2]);
  }
  // Afficher le résultat
  $retour = '<table class="vm_nug" data-periodes="'.count($tab_periode).'">';
  // ligne d’en-tête
  $retour .= '<thead><tr><th class="hc" colspan="2">'.html($mef).'</th>';
  foreach($tab_periode as $periode_nom)
  {
    $retour .= '<th class="hc">'.html($periode_nom).'</th>';
  }
  $retour .= '<th class="hc">Moyenne annuelle</th><td class="nu"></td></tr></thead>';
  // lignes des enseignements
  $retour .= '<tbody>';
  foreach($tab_categorie as $categorie_id => $categorie_intitule)
  {
    $first = TRUE;
    foreach($tab_enseignement[$categorie_id] as $matiere_code => $matiere_nom)
    {
      $retour .= '<tr>';
      if($first)
      {
        $retour .= '<th class="wpn" rowspan="'.count($tab_enseignement[$categorie_id]).'">'.$categorie_intitule.'</th>';
        $first = FALSE;
      }
      // enseignement
      $is_inutile = ( !$categorie_id && !isset($tab_donnees_livret[$matiere_code]) ) ? TRUE : FALSE ;
      $matiere_affich = $is_inutile ? '<del>'.html($matiere_nom).'</del>' : html($matiere_nom) ;
      $retour .= '<td class="wpn">'.$matiere_affich.'</td>';
      $tab_enseignement_notes = array();
      $is_calcul_possible = TRUE;
      $is_dispense_possible = FALSE;
      // positionnements périodiques
      foreach($tab_periode as $jointure_periode => $periode_nom)
      {
        if(isset($tab_donnees_livret[$matiere_code][$jointure_periode]))
        {
          extract($tab_donnees_livret[$matiere_code][$jointure_periode]); // id rubrique note prof dispense
          $origine = empty($prof) ? 'Calculé automatiquement' : 'Saisi par '.$prof ;
          $retour .= '<td class="hc"'.infobulle($origine,FALSE).'>'.$note.'</td>';
          $is_calcul_possible = $is_calcul_possible && ($note!='Non noté');
          $is_dispense_possible = $dispense;
          if(is_numeric($note))
          {
            $tab_enseignement_notes[] = $note;
          }
        }
        else if($is_inutile)
        {
          $retour .= '<td class="nu"></td>';
          $is_calcul_possible = FALSE;
        }
        else
        {
          $retour .= '<td class="br"></td>';
          $is_calcul_possible = FALSE;
        }
      }
      // moyenne annuelle
      $id = 0;
      $rubrique = 0;
      if(isset($tab_donnees_livret[$matiere_code][0]))
      {
        extract($tab_donnees_livret[$matiere_code][0]); // id rubrique note prof
        $origine = empty($prof) ? infobulle('Calculé automatiquement',TRUE) : infobulle('Saisi par '.$prof,TRUE) ;
        $style = empty($prof) ? 'bv' : 'bj' ;
        $retour .= '<td class="hc '.$style.'">'.$note.'</td>';
      }
      else if($is_inutile)
      {
        $origine = '';
        $retour .= '<td class="nu"></td>';
      }
      else
      {
        $origine = infobulle('Positionnement manuel nécessaire !',TRUE);
        $retour .= '<td class="hc br">Indéterminée</td>';
      }
      // actions / informations
      $moyenne = !empty($tab_enseignement_notes) ? round( array_sum($tab_enseignement_notes) / count($tab_enseignement_notes) , 9 ) : '' ;
      $disabled = ($droit_edition) ? '' : ' disabled="disabled"' ;
      $button = ( $is_inutile || ($_SESSION['USER_PROFIL_TYPE']=='administrateur') ) ? '' : ' <button type="button" class="modifier"'.$disabled.'>Éditer la moyenne</button></td>' ;
      $retour .= '<td class="nu" data-rubrique="'.$rubrique.'" data-id="'.$id.'" data-auto="'.(int)$is_calcul_possible.'" data-dispense="'.(int)$is_dispense_possible.'" data-moyenne="'.$moyenne.'">'.$origine.$button;
      $retour .= '</tr>';
    }
  }
  $retour .= '</tbody></table><div>&nbsp;</div>';
  Json::end( TRUE , $retour );
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Enregistrer une modification de moyenne pour un élève
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($ACTION=='enregistrer_moyenne') && !empty($eleve_id) && !empty($classe_id) && !empty($rubrique_id) && !is_null($saisie_id) && in_array($saisie_objet,array('valeur','dispense','neant','auto')) )
{
  if($saisie_objet=='valeur') 
  {
    if( ( is_null($position) ) || ($position<0) || ($position>20) )
    {
      Json::end( FALSE , 'Moyenne non transmise ou non trouvée !' );
    }
    $moyenne = round($position*5,9); // une moyenne sur 20 est transmise mais en BDD c’est sur 100
    $saisie_origine = 'saisie';
    $prof_id = $_SESSION['USER_ID'];
  }
  else if($saisie_objet=='dispense')
  {
    if(!$rubrique_dispense)
    {
      Json::end( FALSE , 'Dispense pour une discipline non autorisée !' );
    }
    $moyenne = 'DI';
    $saisie_origine = 'saisie';
    $prof_id = $_SESSION['USER_ID'];
  }
  else if($saisie_objet=='neant')
  {
    $moyenne = NULL;
    $saisie_origine = 'saisie';
    $prof_id = $_SESSION['USER_ID'];
  }
  else if($saisie_objet=='auto')
  {
    if( is_null($moyenne) || ($moyenne<0) || ($moyenne>20) || ($_POST['f_moyenne']==='') || ( ($_POST['f_moyenne']==='DI') && !$rubrique_dispense ) )
    {
      Json::end( FALSE , 'Moyenne non positionnable automatiquement !' );
    }
    $moyenne = ($_POST['f_moyenne']!='DI') ? round($position*5,9) : 'DI' ; // une moyenne sur 20 est transmise mais en BDD c’est sur 100
    $saisie_origine = 'calcul';
    $prof_id = 0;
  }
  // Vérif droit d’édition
  $test_droit_directeur = ( ($_SESSION['USER_PROFIL_TYPE']=='directeur') && Outil::test_user_droit_specifique($_SESSION['DROIT_OFFICIEL_LIVRET_MODIFIER_MOYENNE_DNB']) ) ? TRUE : FALSE ;
  $test_droit_professeur = ( ($_SESSION['USER_PROFIL_TYPE']=='professeur') && Outil::test_user_droit_specifique( $_SESSION['DROIT_OFFICIEL_LIVRET_MODIFIER_MOYENNE_DNB'] , NULL /*matiere_coord_or_groupe_pp_connu*/ , $classe_id /*matiere_id_or_groupe_id_a_tester*/ ) ) ? TRUE : FALSE ;
  $droit_edition = ( ($_SESSION['USER_PROFIL_TYPE']=='administrateur') || ( !$test_droit_directeur && !$test_droit_professeur ) ) ? FALSE : TRUE ;
  if(!$droit_edition)
  {
    Json::end( FALSE , 'Droit insuffisant !' );
  }
  // Enregistrement
  if($saisie_id)
  {
    DB_STRUCTURE_LIVRET::DB_modifier_saisie( $saisie_id , 'position' , $moyenne , $saisie_origine , $prof_id );
  }
  else
  {
    $saisie_id = DB_STRUCTURE_LIVRET::DB_ajouter_saisie( 'dnb' , 'annuel' , 0 /*jointure_periode*/ , 'moyenne' , $rubrique_id , 'eleve' , $eleve_id , 'position' , $moyenne , $saisie_origine , $prof_id );
  }
  // retour (à ce stade la moyenne ne peut pas être indéterminée, car le but est justement de positionner les indéterminées)
  $style = (!$prof_id) ? 'bv' : 'bj' ;
  $valeur = ($moyenne == 'DI') ? 'Dispensé' : ( ($moyenne==NULL) ? 'Sans moyenne' : round($position,9) ); // ici par contre on affiche sur 20
  $retour_td = '<td class="hc '.$style.'">'.$valeur.'</td>';
  $retour_img = (!$prof_id) ? infobulle('Calculé automatiquement',TRUE) : infobulle('Saisi par '.To::texte_genre_identite($_SESSION['USER_NOM'],FALSE,$_SESSION['USER_PRENOM'],TRUE,$_SESSION['USER_GENRE']),TRUE) ;
  Json::end( TRUE ,  array( 'td'=>$retour_td , 'img'=>$retour_img , 'id'=>$saisie_id ) );
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// On ne devrait pas en arriver là...
// ////////////////////////////////////////////////////////////////////////////////////////////////////

Json::end( FALSE , 'Erreur avec les données transmises !<br>'.pathinfo(__FILE__,PATHINFO_FILENAME).':'.__LINE__ );

?>
