Beispiel #1
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;
}
}
if($date_mysql_debut>$date_mysql_fin)
{
  exit('La date de début est postérieure à la date de fin !');
}

// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des items travaillés durant la période choisie, pour l'élève selectionné, pour la ou les matières indiquées, ou les items indiqués
// Récupération de la liste des rubriques (matières, synthèses par thèmes / domaines, niveaux) travaillées (affinée suivant les items trouvés)
// ////////////////////////////////////////////////////////////////////////////////////////////////////

if( ($objet=='matieres') || ($objet=='matiere_niveau') )
{
  $rubrique_type    =($objet=='matieres') ? 'matiere'         : 'niveau'    ;
  $liste_matiere_id =($objet=='matieres') ? $liste_matiere_id : $matiere_id ;
  list( $tab_item , $tab_rubrique ) = DB_STRUCTURE_BILAN::DB_recuperer_items_travailles( $eleve_id , $liste_matiere_id , $only_socle , $date_mysql_debut , $date_mysql_fin , $rubrique_type );
}

if($objet=='matiere_synthese')
{
  list( $tab_item , $tab_rubrique ) = DB_STRUCTURE_BILAN::DB_recuperer_arborescence_synthese( $eleve_id , $matiere_id , $only_socle , 0 /*only_niveau*/ , $mode_synthese , $fusion_niveaux , $date_mysql_debut , $date_mysql_fin );
}

if($objet=='selection')
{
  list( $tab_item, /*tab_matiere*/ ) = DB_STRUCTURE_BILAN::DB_recuperer_arborescence_selection( $eleve_id , $liste_item_id , $date_mysql_debut , $date_mysql_fin , 0 /*aff_domaine*/ , 0 /*aff_theme*/ );
}

$item_nb = count($tab_item);
if( !$item_nb && (in_array($_SESSION['USER_PROFIL_TYPE'],array('parent','eleve'))) ) // Dans le cas d'un professeur / directeur, où l'on regarde les élèves d'un groupe un à un, ce ne doit pas être bloquant.
{
    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'];
    $date_debut = convert_date_mysql_to_french($date_mysql_debut);
    $date_fin = convert_date_mysql_to_french($date_mysql_fin);
}
if ($date_mysql_debut > $date_mysql_fin) {
    exit('La date de début est postérieure à la date de fin !');
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Récupération de la liste des items travaillés durant la période choisie, pour l'élève selectionné, pour la ou les matières indiquées
// Récupération de la liste des matières travaillées (affinée suivant les items trouvés)
// ////////////////////////////////////////////////////////////////////////////////////////////////////
list($tab_item, $tab_matiere) = DB_STRUCTURE_BILAN::DB_recuperer_items_travailles($eleve_id, $liste_matiere_id, $date_mysql_debut, $date_mysql_fin);
$item_nb = count($tab_item);
if (!$item_nb && in_array($_SESSION['USER_PROFIL_TYPE'], array('parent', 'eleve'))) {
    exit('Aucun item évalué sur la période ' . $date_debut . ' ~ ' . $date_fin . ' selon les paramètres choisis !');
}
$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
// 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') {