예제 #1
0
        ?>
  <?php 
    }
    ?>
</div>
<hr />
<?php 
}
?>

<?php 
if ($SECTION == 'reglages') {
    echo '<p class="astuce">Choisir une rubrique ci-dessus&hellip;</p>' . NL;
    $nb_inconnu = DB_STRUCTURE_BILAN::DB_compter_modes_synthese_inconnu();
    $s = $nb_inconnu > 1 ? 's' : '';
    echo $nb_inconnu ? '<label class="alerte">Il y a ' . $nb_inconnu . ' référentiel' . $s . ' <img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="' . str_replace('§BR§', '<br />', html(html(DB_STRUCTURE_BILAN::DB_recuperer_modes_synthese_inconnu()))) . '" /> dont le format de synthèse est inconnu (donc non pris en compte).</label> <a href="./index.php?page=' . $PAGE . '&amp;section=reglages_format_synthese">&rarr; Configurer les formats de synthèse.</a>' . NL : '<label class="valide">Tous les référentiels ont un format de synthèse prédéfini.</label>' . NL;
} elseif ($SECTION == 'assiduite') {
    $fichier_section = CHEMIN_DOSSIER_PAGES . $PAGE . '_' . $SECTION . '.php';
    $PAGE = $PAGE . '_' . $SECTION;
    require $fichier_section;
} else {
    if (substr($SECTION, 0, 8) == 'accueil_') {
        $BILAN_TYPE = substr($SECTION, 8);
        $SECTION = 'accueil';
    }
    // Afficher la bonne page et appeler le bon js / ajax par la suite
    $fichier_section = CHEMIN_DOSSIER_PAGES . $PAGE . '_' . $SECTION . '.php';
    if (!is_file($fichier_section)) {
        echo '<p class="danger">Page introuvable (paramètre manquant ou incorrect) !</p>' . NL;
        return;
        // Ne pas exécuter la suite de ce fichier inclus.
예제 #2
0
$tab_score_a_garder = array();
if ($item_nb) {
    $DB_TAB = DB_STRUCTURE_BILAN::DB_lister_date_last_eleves_items($liste_eleve, $liste_item);
    foreach ($DB_TAB as $DB_ROW) {
        $tab_score_a_garder[$DB_ROW['eleve_id']][$DB_ROW['item_id']] = $DB_ROW['date_last'] < $date_mysql_debut ? FALSE : TRUE;
    }
    $date_mysql_debut_annee_scolaire = jour_debut_annee_scolaire('mysql');
    if ($retroactif == 'non') {
        $date_mysql_start = $date_mysql_debut;
    } elseif ($retroactif == 'annuel') {
        $date_mysql_start = $date_mysql_debut_annee_scolaire;
    } else {
        $date_mysql_start = FALSE;
    }
    // 'oui' | 'auto' ; en 'auto' il faut faire le tri après
    $DB_TAB = DB_STRUCTURE_BILAN::DB_lister_result_eleves_items($liste_eleve, $liste_item, $matiere_id, $date_mysql_start, $date_mysql_fin, $_SESSION['USER_PROFIL_TYPE'], FALSE);
    foreach ($DB_TAB as $DB_ROW) {
        if ($tab_score_a_garder[$DB_ROW['eleve_id']][$DB_ROW['item_id']]) {
            $retro_item = $tab_item[$DB_ROW['item_id']][0]['calcul_retroactif'];
            if ($retroactif != 'auto' || $retro_item == 'oui' || $retro_item == 'non' && $DB_ROW['date'] >= $date_mysql_debut || $retro_item == 'annuel' && $DB_ROW['date'] >= $date_mysql_debut_annee_scolaire) {
                $tab_eval[$DB_ROW['eleve_id']][$DB_ROW['item_id']][] = array('note' => $DB_ROW['note'], 'date' => $DB_ROW['date'], 'info' => $DB_ROW['info']);
            }
        }
    }
}
if (!count($tab_eval) && !$make_officiel) {
    exit('Aucune évaluation trouvée sur la période ' . $date_debut . ' ~ ' . $date_fin . ' selon les paramètres choisis !');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
/* 
 * Libérer de la place mémoire car les scripts de bilans sont assez gourmands.
예제 #3
0
// Javascript
Layout::add( 'js_inline_before' , 'var date_mysql  = "'.TODAY_MYSQL.'";' );
Layout::add( 'js_inline_before' , 'var is_multiple = '.$is_select_multiple.';' );

// Fabrication du tableau javascript "tab_groupe_periode" pour les jointures groupes/périodes
// Fabrication du tableau javascript "tab_groupe_niveau" pour les jointures groupes/niveaux
HtmlForm::fabriquer_tab_js_jointure_groupe( $tab_groupes , TRUE /*tab_groupe_periode*/ , TRUE /*tab_groupe_niveau*/ );
?>

<div><span class="manuel"><a class="pop_up" href="<?php echo SERVEUR_DOCUMENTAIRE ?>?fichier=releves_bilans__synthese_multimatiere">DOC : Synthèse pluridisciplinaire.</a></span></div>
<div class="astuce">Un administrateur ou un directeur doit indiquer le type de synthèse adapté suivant chaque référentiel (<span class="manuel"><a class="pop_up" href="<?php echo SERVEUR_DOCUMENTAIRE ?>?fichier=releves_bilans__reglages_syntheses_bilans#toggle_type_synthese">DOC</a></span>).</div>
<?php
$nb_inconnu = DB_STRUCTURE_BILAN::DB_compter_modes_synthese_inconnu();
$s = ($nb_inconnu>1) ? 's' : '' ;
echo ($nb_inconnu) ? '<label class="alerte">Il y a '.$nb_inconnu.' référentiel'.$s.' <img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="'.str_replace('§BR§','<br />',html(html(DB_STRUCTURE_BILAN::DB_recuperer_modes_synthese_inconnu()))).'" /> dont le format de synthèse est inconnu (donc non pris en compte).</label>'.NL : '<label class="valide">Tous les référentiels ont un format de synthèse prédéfini.</label>'.NL ;
?>

<hr />

<form action="#" method="post" id="form_select"><fieldset>
  <p class="<?php echo $class_form_eleve ?>">
    <label class="tab" for="f_groupe">Classe / groupe :</label><?php echo $select_groupe ?><input type="hidden" id="f_groupe_type" name="f_groupe_type" value="" /><input type="hidden" id="f_groupe_nom" name="f_groupe_nom" value="" /> <span id="bloc_ordre" class="hide"><?php echo $select_eleves_ordre ?></span><label id="ajax_maj">&nbsp;</label><br />
    <span id="bloc_eleve" class="hide"><label class="tab" for="f_eleve">Élève(s) :</label><?php echo $select_eleves ?></span>
  </p>
  <p id="zone_periodes" class="<?php echo $class_form_periode ?>">
    <label class="tab" for="f_periode"><img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="Les items pris en compte sont ceux qui sont évalués<br />au moins une fois sur cette période." /> Période :</label><?php echo $select_periode ?>
    <span id="dates_perso" class="show">
      du <input id="f_date_debut" name="f_date_debut" size="9" type="text" value="<?php echo jour_debut_annee_scolaire('french') ?>" /><q class="date_calendrier" title="Cliquer sur cette image pour importer une date depuis un calendrier !"></q>
      au <input id="f_date_fin" name="f_date_fin" size="9" type="text" value="<?php echo TODAY_FR ?>" /><q class="date_calendrier" title="Cliquer sur cette image pour importer une date depuis un calendrier !"></q>
    </span><br />
        if ($type == 'pourcentage' && $mode == 'auto') {
            $tab_item_pilier[$socle_id] = $pilier_id;
        }
    }
}
$listing_entree_id = implode(',', $tab_entree_id);
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des élèves
// ////////////////////////////////////////////////////////////////////////////////////////////////////
$eleves_ordre = $groupe_type == 'Classes' ? 'alpha' : $eleves_ordre;
$tab_eleve_infos = DB_STRUCTURE_BILAN::DB_lister_eleves_cibles($liste_eleve, $eleves_ordre, FALSE, TRUE, FALSE);
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des résultats [type "pourcentage" uniquement]
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($type == 'pourcentage') {
    $DB_TAB = DB_STRUCTURE_BILAN::DB_lister_result_eleves_palier_sans_infos_items($liste_eleve, $listing_entree_id, $_SESSION['USER_PROFIL_TYPE']);
    foreach ($DB_TAB as $DB_ROW) {
        $test_comptabilise = $mode == 'auto' ? !in_array($tab_item_pilier[$DB_ROW['socle_id']], $tab_langue_piliers) || in_array($DB_ROW['matiere_id'], $tab_langues[$tab_eleve_infos[$DB_ROW['eleve_id']]['eleve_langue']]['tab_matiere_id']) : in_array($DB_ROW['matiere_id'], $tab_matiere_id);
        if ($test_comptabilise) {
            $tab_eval[$DB_ROW['eleve_id']][$DB_ROW['socle_id']][$DB_ROW['item_id']][]['note'] = $DB_ROW['note'];
            $tab_item[$DB_ROW['item_id']] = TRUE;
        }
    }
    if (count($tab_item)) {
        $listing_item_id = implode(',', array_keys($tab_item));
        $DB_TAB = DB_STRUCTURE_SOCLE::DB_lister_infos_items($listing_item_id, FALSE);
        foreach ($DB_TAB as $DB_ROW) {
            $tab_item[$DB_ROW['item_id']] = array('calcul_methode' => $DB_ROW['calcul_methode'], 'calcul_limite' => $DB_ROW['calcul_limite']);
        }
    }
}
}
$tab_eleve_id = array();
foreach ($DB_TAB as $DB_ROW) {
    if (in_array($DB_ROW['user_id'], $tab_id_eleves_avec_notes)) {
        $tab_eleve_id[] = $DB_ROW['user_id'];
    }
}
if (empty($tab_eleve_id)) {
    exit('Aucun élève concerné dans ce regroupement !');
}
$liste_eleve_id = implode(',', $tab_eleve_id);
$nb_eleves = count($tab_eleve_id);
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de l'identité des élèves
// ////////////////////////////////////////////////////////////////////////////////////////////////////
$tab_eleve_infos = DB_STRUCTURE_BILAN::DB_lister_eleves_cibles($liste_eleve_id, 'alpha', FALSE, FALSE, TRUE);
if (!is_array($tab_eleve_infos)) {
    exit($liste_eleve_id . 'Aucun élève trouvé correspondant aux identifiants transmis !');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des séries de brevet (probablement une seule)
// ////////////////////////////////////////////////////////////////////////////////////////////////////
$tab_brevet_serie = array();
foreach ($tab_eleve_infos as $eleve_id => $tab_eleve) {
    $tab_brevet_serie[$tab_eleve['eleve_brevet_serie']] = $tab_eleve['eleve_brevet_serie'];
    // Sera remplacé par le nom de la série après
}
if (!count($tab_brevet_serie) || isset($tab_brevet_serie['X'])) {
    exit('Élève(s) trouvé(s) sans association avec une série de brevet !');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
예제 #6
0
  if(in_array($DB_ROW['user_id'],$tab_id_eleves_avec_notes))
  {
    $tab_eleve_id[] = $DB_ROW['user_id'];
  }
}
if(empty($tab_eleve_id))
{
  exit('Aucun élève concerné dans ce regroupement !');
}
$liste_eleve_id = implode(',',$tab_eleve_id);

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de l'identité des élèves
// ////////////////////////////////////////////////////////////////////////////////////////////////////

$tab_eleve_infos = DB_STRUCTURE_BILAN::DB_lister_eleves_cibles( $liste_eleve_id , 'alpha' /*eleves_ordre*/ , FALSE /*with_gepi*/ , FALSE /*with_langue*/ , TRUE /*with_brevet_serie*/ );

if(!is_array($tab_eleve_infos))
{
  exit('Aucun élève trouvé correspondant aux identifiants transmis !');
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des séries de brevet (probablement une seule)
// ////////////////////////////////////////////////////////////////////////////////////////////////////

$tab_brevet_serie = array();
foreach($tab_eleve_infos as $eleve_id => $tab_eleve)
{
  $tab_brevet_serie[$tab_eleve['eleve_brevet_serie']] = $tab_eleve['eleve_brevet_serie']; // Sera remplacé par le nom de la série après
}
// Récupération de la liste des résultats des évaluations associées à ces items donnés d'une ou plusieurs matières, pour les élèves selectionnés, sur la période sélectionnée
// Comme un seul élève est concerné à chaque appel, il n'y a pas le problème de certains items à éliminer car pouvent potentiellement apparaitre dans des relevés d'élèves alors qu'ils n'ont pas été interrogés sur la période considérée (mais un camarade oui).
// Il faut aussi retenir, à une date donnée, combien d'évaluations sont concernées.
// ////////////////////////////////////////////////////////////////////////////////////////////////////

function date_mysql_to_date_js($date_mysql)
{
  list($annee,$mois,$jour) = explode('-',$date_mysql);
  return 'Date.UTC('.$annee.','.((int)$mois-1).','.(int)$jour.')';
}

$date_mysql_debut_annee_scolaire = jour_debut_annee_scolaire('mysql');
    if($retroactif=='non')    { $date_mysql_start = $date_mysql_debut; }
elseif($retroactif=='annuel') { $date_mysql_start = $date_mysql_debut_annee_scolaire; }
else                          { $date_mysql_start = FALSE; } // 'oui' | 'auto' ; en 'auto' il faut faire le tri après
$DB_TAB = ($item_nb) ? DB_STRUCTURE_BILAN::DB_lister_result_eleves_items($eleve_id , $liste_item_id , -1 /*matiere_id*/ , $date_mysql_start , $date_mysql_fin , $_SESSION['USER_PROFIL_TYPE'] , FALSE /*onlyprof*/ , FALSE /*onlynote*/ , TRUE /*first_order_by_date*/ ) : array() ;
foreach($DB_TAB as $DB_ROW)
{
  $retro_item = $tab_item[$DB_ROW['item_id']][0]['calcul_retroactif'];
  if( ($retroactif!='auto') || ($retro_item=='oui') || (($retro_item=='non')&&($DB_ROW['date']>=$date_mysql_debut)) || (($retro_item=='annuel')&&($DB_ROW['date']>=$date_mysql_debut_annee_scolaire)) )
  {
    $tab_eval[$DB_ROW['eleve_id']][$DB_ROW['item_id']][] = array('note'=>$DB_ROW['note']);
    if($objet=='matiere_synthese')
    {
      $rubrique_ref = $tab_item[$DB_ROW['item_id']][0]['synthese_ref'];
    }
    elseif($objet=='selection')
    {
      $rubrique_ref = $tab_item[$DB_ROW['item_id']][0]['item_ref'];
      $tab_rubrique[ $tab_item[$DB_ROW['item_id']][0]['item_ref'] ] = $tab_item[$DB_ROW['item_id']][0]['item_nom'];
    }
예제 #8
0
{

  // Période concernée
  $DB_ROW = DB_STRUCTURE_COMMUN::DB_recuperer_dates_periode($groupe_id,$periode_id);
  if(empty($DB_ROW))
  {
    exit('La classe et la période ne sont pas reliées !');
  }
  $date_mysql_debut = $DB_ROW['jointure_date_debut'];
  $date_mysql_fin   = $DB_ROW['jointure_date_fin'];

  // Rubriques concernées
  $tab_rubriques = array() ;
  if($OBJET=='modifier')
  {
    $DB_TAB = (in_array($BILAN_TYPE,array('releve','bulletin'))) ? DB_STRUCTURE_BILAN::DB_recuperer_matieres_travaillees( $classe_id , $liste_matiere_id , $date_mysql_debut , $date_mysql_fin , $_SESSION['USER_ID'] ) : DB_STRUCTURE_SOCLE::DB_recuperer_piliers( (int)substr($BILAN_TYPE,-1) );
    foreach($DB_TAB as $DB_ROW)
    {
      $tab_rubriques[$DB_ROW['rubrique_id']] = $DB_ROW['rubrique_nom'];
    }
  }
  else if($OBJET=='tamponner')
  {
    $tab_rubriques = array( 0 => 'Synthèse générale' ) ;
  }

  // Élèves concernés
  $DB_TAB = (!$is_sous_groupe) ? DB_STRUCTURE_COMMUN::DB_lister_users_regroupement( 'eleve' /*profil_type*/ , 1 /*statut*/ , 'classe' , $classe_id , 'alpha' /*eleves_ordre*/ ) : DB_STRUCTURE_COMMUN::DB_lister_eleves_classe_et_groupe($classe_id,$groupe_id) ;
  if(empty($DB_TAB))
  {
    exit('Aucun élève trouvé dans ce regroupement !');
예제 #9
0
            $courriel_bilan = Sesamail::mail( $tab['mailto'] , 'Notification - Bilan officiel, étape de saisie' , $tab['contenu'] , $tab['mailto'] );
          }
        }
      }
    }
  }
}

// Puce avertissement mode de synthèse non configuré
$li = '';
if($BILAN_TYPE=='bulletin')
{
  $li = '<li><span class="astuce">Un administrateur ou un directeur doit indiquer le type de synthèse adapté suivant chaque référentiel (<span class="manuel"><a class="pop_up" href="'.SERVEUR_DOCUMENTAIRE.'?fichier=releves_bilans__reglages_syntheses_bilans#toggle_type_synthese">DOC</a></span>).</span></li>'.NL;
  $nb_inconnu = DB_STRUCTURE_BILAN::DB_compter_modes_synthese_inconnu();
  $s = ($nb_inconnu>1) ? 's' : '' ;
  $li .= ($nb_inconnu) ? '<li><label class="alerte">Il y a '.$nb_inconnu.' référentiel'.$s.' <img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="'.str_replace('§BR§','<br />',html(html(DB_STRUCTURE_BILAN::DB_recuperer_modes_synthese_inconnu()))).'" /> dont le format de synthèse est inconnu (donc non pris en compte).</label></li>'.NL : '<li><label class="valide">Tous les référentiels ont un format de synthèse prédéfini.</label></li>'.NL ; // Volontairement 2 html() pour le title sinon &lt;* est pris comme une balise html par l'infobulle.
}

// Javascript
Layout::add( 'js_inline_before' , 'var USER_ID               = '.$_SESSION['USER_ID'].';' );
Layout::add( 'js_inline_before' , 'var TODAY_FR              = "'.TODAY_FR.'";' );
Layout::add( 'js_inline_before' , 'var BILAN_TYPE            = "'.$BILAN_TYPE.'";' );
Layout::add( 'js_inline_before' , 'var CONVERSION_SUR_20     = '.$_SESSION['OFFICIEL']['BULLETIN_CONVERSION_SUR_20'].';' );
Layout::add( 'js_inline_before' , 'var BACKGROUND_NA         = "'.$_SESSION['BACKGROUND_NA'].'";' );
Layout::add( 'js_inline_before' , 'var BACKGROUND_VA         = "'.$_SESSION['BACKGROUND_VA'].'";' );
Layout::add( 'js_inline_before' , 'var BACKGROUND_A          = "'.$_SESSION['BACKGROUND_A'].'";' );
Layout::add( 'js_inline_before' , 'var URL_IMPORT            = "'.URL_DIR_IMPORT.'";' );
Layout::add( 'js_inline_before' , 'var APP_RUBRIQUE_LONGUEUR = '.$_SESSION['OFFICIEL'][$tab_types[$BILAN_TYPE]['droit'].'_APPRECIATION_RUBRIQUE_LONGUEUR'].';' );
Layout::add( 'js_inline_before' , 'var APP_GENERALE_LONGUEUR = '.$_SESSION['OFFICIEL'][$tab_types[$BILAN_TYPE]['droit'].'_APPRECIATION_GENERALE_LONGUEUR'].';' );
Layout::add( 'js_inline_before' , 'var APP_RUBRIQUE_REPORT   = '.$_SESSION['OFFICIEL'][$tab_types[$BILAN_TYPE]['droit'].'_APPRECIATION_RUBRIQUE_REPORT'].';' );
Layout::add( 'js_inline_before' , 'var APP_GENERALE_REPORT   = '.$_SESSION['OFFICIEL'][$tab_types[$BILAN_TYPE]['droit'].'_APPRECIATION_GENERALE_REPORT'].';' );
예제 #10
0
 /**
  * Fabrication de tableau javascript de jointures à partir des groupes
  * 
  * @param array     $tab_groupes          tableau des données [i] => [valeur texte optgroup]
  * @param bool      $tab_groupe_periode   charger ou non "tab_groupe_periode" pour les jointures groupes/périodes
  * @param bool      $tab_groupe_niveau    charger ou non "tab_groupe_niveau"  pour les jointures groupes/niveaux
  * @return void     alimente Layout::$tab_js_inline[]
  */
 public static function fabriquer_tab_js_jointure_groupe($tab_groupes, $tab_groupe_periode, $tab_groupe_niveau)
 {
     Layout::add('js_inline_before', 'var tab_groupe_periode = new Array();');
     Layout::add('js_inline_before', 'var tab_groupe_niveau  = new Array();');
     if (is_array($tab_groupes)) {
         // On liste les ids des classes et groupes
         $tab_id_classe_groupe = array();
         foreach ($tab_groupes as $tab_groupe_infos) {
             if (!isset($tab_groupe_infos['optgroup']) || $tab_groupe_infos['optgroup'] != 'besoin') {
                 $tab_id_classe_groupe[] = $tab_groupe_infos['valeur'];
             }
         }
         if (count($tab_id_classe_groupe)) {
             $listing_groupe_id = implode(',', $tab_id_classe_groupe);
             // Charger le tableau js $tab_groupe_periode de jointures groupes/périodes
             if ($tab_groupe_periode) {
                 $tab_memo_groupes = array();
                 $DB_TAB = DB_STRUCTURE_COMMUN::DB_lister_jointure_groupe_periode($listing_groupe_id);
                 foreach ($DB_TAB as $DB_ROW) {
                     if (!isset($tab_memo_groupes[$DB_ROW['groupe_id']])) {
                         $tab_memo_groupes[$DB_ROW['groupe_id']] = TRUE;
                         Layout::add('js_inline_before', 'tab_groupe_periode[' . $DB_ROW['groupe_id'] . '] = new Array();');
                     }
                     Layout::add('js_inline_before', 'tab_groupe_periode[' . $DB_ROW['groupe_id'] . '][' . $DB_ROW['periode_id'] . ']="' . $DB_ROW['jointure_date_debut'] . '_' . $DB_ROW['jointure_date_fin'] . '";');
                 }
             }
             // Charger le tableau js $tab_groupe_niveau de jointures groupes/périodes
             if ($tab_groupe_niveau) {
                 $DB_TAB = DB_STRUCTURE_BILAN::DB_recuperer_niveau_groupes($listing_groupe_id);
                 foreach ($DB_TAB as $DB_ROW) {
                     Layout::add('js_inline_before', 'tab_groupe_niveau[' . $DB_ROW['groupe_id'] . '] = new Array(' . $DB_ROW['niveau_id'] . ',"' . html($DB_ROW['niveau_nom']) . '");');
                 }
             }
         }
     }
 }
예제 #11
0
/**
 * Pour un bulletin d'une période / d'un élève et d'une matière donné, calculer et forcer la mise à jour d'une moyenne (effacée ou figée).
 * 
 * @param int    $periode_id
 * @param int    $classe_id
 * @param int    $eleve_id
 * @param array  $matiere_id
 * @param string $retroactif   oui|non|auto
 * @return float   la moyenne en question (FALSE si pb)
 */
function calculer_et_enregistrer_moyenne_precise_bulletin($periode_id, $classe_id, $eleve_id, $matiere_id, $retroactif)
{
    // Dates période
    $DB_ROW = DB_STRUCTURE_COMMUN::DB_recuperer_dates_periode($classe_id, $periode_id);
    if (empty($DB_ROW)) {
        return FALSE;
    }
    // Récupération de la liste des items travaillés
    $date_mysql_debut = $DB_ROW['jointure_date_debut'];
    $date_mysql_fin = $DB_ROW['jointure_date_fin'];
    list($tab_item, $tab_matiere) = DB_STRUCTURE_BILAN::DB_recuperer_items_travailles($eleve_id, $matiere_id, $date_mysql_debut, $date_mysql_fin);
    $item_nb = count($tab_item);
    if (!$item_nb) {
        return FALSE;
    }
    $tab_liste_item = array_keys($tab_item);
    $liste_item_id = implode(',', $tab_liste_item);
    // Récupération de la liste des résultats des évaluations associées à ces items donnés d'une ou plusieurs matieres, pour les élèves selectionnés, sur la période sélectionnée
    $date_mysql_debut_annee_scolaire = jour_debut_annee_scolaire('mysql');
    if ($retroactif == 'non') {
        $date_mysql_start = $date_mysql_debut;
    } elseif ($retroactif == 'annuel') {
        $date_mysql_start = $date_mysql_debut_annee_scolaire;
    } else {
        $date_mysql_start = FALSE;
    }
    // 'oui' | 'auto' ; en 'auto' il faut faire le tri après
    $DB_TAB = DB_STRUCTURE_BILAN::DB_lister_result_eleves_items($eleve_id, $liste_item_id, -1, $date_mysql_start, $date_mysql_fin, $_SESSION['USER_PROFIL_TYPE'], FALSE);
    if (empty($DB_TAB)) {
        return FALSE;
    }
    foreach ($DB_TAB as $DB_ROW) {
        $retro_item = $tab_item[$DB_ROW['item_id']][0]['calcul_retroactif'];
        if ($retroactif != 'auto' || $retro_item == 'oui' || $retro_item == 'non' && $DB_ROW['date'] >= $date_mysql_debut || $retro_item == 'annuel' && $DB_ROW['date'] >= $date_mysql_debut_annee_scolaire) {
            $tab_eval[$DB_ROW['item_id']][] = array('note' => $DB_ROW['note']);
        }
    }
    if (empty($tab_eval)) {
        return FALSE;
    }
    // On calcule la moyenne voulue
    $tab_score = array();
    // Pour chaque item...
    foreach ($tab_eval as $item_id => $tab_devoirs) {
        extract($tab_item[$item_id][0]);
        // $item_ref $item_nom $item_coef $item_socle $item_lien $calcul_methode $calcul_limite
        // calcul du bilan de l'item
        $tab_score[$item_id] = calculer_score($tab_devoirs, $calcul_methode, $calcul_limite);
    }
    // calcul des bilans des scores
    $tableau_score_filtre = array_filter($tab_score, 'non_vide');
    $nb_scores = count($tableau_score_filtre);
    // la moyenne peut être pondérée par des coefficients
    $somme_scores_ponderes = 0;
    $somme_coefs = 0;
    if ($nb_scores) {
        foreach ($tableau_score_filtre as $item_id => $item_score) {
            $somme_scores_ponderes += $item_score * $tab_item[$item_id][0]['item_coef'];
            $somme_coefs += $tab_item[$item_id][0]['item_coef'];
        }
    }
    // et voilà la moyenne des pourcentages d'acquisition
    if (!$somme_coefs) {
        return FALSE;
    }
    $moyennes_calculee = round($somme_scores_ponderes / $somme_coefs, 0) / 5;
    DB_STRUCTURE_OFFICIEL::DB_modifier_bilan_officiel_saisie('bulletin', $periode_id, $eleve_id, $matiere_id, 0, 'eleve', $moyennes_calculee, '');
    return $moyennes_calculee;
}
$liste_item_id = implode(',', $tab_liste_item);
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des résultats des évaluations associées à ces items donnés d'une ou plusieurs matieres, pour les élèves selectionnés, sur la période sélectionnée
// Comme un seul élève est concerné à chaque appel, il n'y a pas le problème de certains items à  éliminer car pouvent potentiellement apparaitre dans des relevés d'élèves alors qu'ils n'ont pas été interrogés sur la période considérée (mais un camarade oui).
// Il faut aussi retenir, à une date donnée, combien d'évaluations sont concernées.
// ////////////////////////////////////////////////////////////////////////////////////////////////////
$date_mysql_debut_annee_scolaire = jour_debut_annee_scolaire('mysql');
if ($retroactif == 'non') {
    $date_mysql_start = $date_mysql_debut;
} elseif ($retroactif == 'annuel') {
    $date_mysql_start = $date_mysql_debut_annee_scolaire;
} else {
    $date_mysql_start = FALSE;
}
// 'oui' | 'auto' ; en 'auto' il faut faire le tri après
$DB_TAB = $item_nb ? DB_STRUCTURE_BILAN::DB_lister_result_eleves_items($eleve_id, $liste_item_id, -1, $date_mysql_start, $date_mysql_fin, $_SESSION['USER_PROFIL_TYPE'], FALSE, FALSE, TRUE) : array();
foreach ($DB_TAB as $DB_ROW) {
    $retro_item = $tab_item[$DB_ROW['item_id']][0]['calcul_retroactif'];
    if ($retroactif != 'auto' || $retro_item == 'oui' || $retro_item == 'non' && $DB_ROW['date'] >= $date_mysql_debut || $retro_item == 'annuel' && $DB_ROW['date'] >= $date_mysql_debut_annee_scolaire) {
        $tab_eval[$DB_ROW['eleve_id']][$DB_ROW['item_id']][] = array('note' => $DB_ROW['note']);
        $tab_matiere_for_item[$DB_ROW['item_id']] = $DB_ROW['matiere_id'];
        $date = $DB_ROW['date'] >= $date_mysql_debut ? $DB_ROW['date'] : $date_mysql_debut;
        $tab_date[$DB_ROW['eleve_id']][$date][$DB_ROW['item_id']] = count($tab_eval[$DB_ROW['eleve_id']][$DB_ROW['item_id']]);
    }
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
/* 
 * Libérer de la place mémoire car les scripts de bilans sont assez gourmands.
 * Supprimer $DB_TAB ne fonctionne pas si on ne force pas auparavant la fermeture de la connexion.
 * SebR devrait peut-être envisager d'ajouter une méthode qui libère cette mémoire, si c'est possible...
 */
$tab_eleve = isset($_POST['f_eleve']) ? is_array($_POST['f_eleve']) ? $_POST['f_eleve'] : explode(',', $_POST['f_eleve']) : array();
$tab_pilier = array_filter(Clean::map_entier($tab_pilier), 'positif');
$tab_eleve = array_filter(Clean::map_entier($tab_eleve), 'positif');
$listing_eleve_id = implode(',', $tab_eleve);
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Afficher le tableau avec les états de validations ET NE CONSERVER QUE LES VALIDATIONS POSITIVES
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'Afficher_bilan' && $palier_id && count($tab_pilier) && count($tab_eleve) && $groupe_type && $eleves_ordre) {
    Form::save_choix('validation_socle_pilier');
    $affichage = '';
    // Tableau des langues
    $tfoot = '';
    require CHEMIN_DOSSIER_INCLUDE . 'tableau_langues_socle.php';
    // Récupérer les données des élèves
    $eleves_ordre = $groupe_type == 'Classes' ? 'alpha' : $eleves_ordre;
    $tab_eleve_infos = DB_STRUCTURE_BILAN::DB_lister_eleves_cibles($listing_eleve_id, $eleves_ordre, FALSE, TRUE, FALSE);
    if (!is_array($tab_eleve_infos)) {
        exit('Aucun élève trouvé correspondant aux identifiants transmis !');
    }
    // Afficher la première ligne du tableau avec les étiquettes des élèves
    $tab_eleve_id = array();
    // listing des ids des élèves mis à jour au cas où la récupération dans la base soit différente des ids transmis...
    $affichage .= '<thead><tr>';
    foreach ($tab_eleve_infos as $eleve_id => $tab_eleve) {
        extract($tab_eleve);
        // $eleve_nom $eleve_prenom $eleve_id_gepi
        $affichage .= '<th><img id="I' . $eleve_id . '" alt="' . html($eleve_nom . ' ' . $eleve_prenom) . '" src="./_img/php/etiquette.php?dossier=' . $_SESSION['BASE'] . '&amp;nom=' . urlencode($eleve_nom) . '&amp;prenom=' . urlencode($eleve_prenom) . '" /></th>';
        $tfoot .= '<td class="L' . $eleve_langue . '" title="' . $tab_langues[$eleve_langue]['texte'] . '"></td>';
        $tab_eleve_id[] = $eleve_id;
    }
    $affichage .= '<th class="nu">&nbsp;&nbsp;&nbsp;</th>';