Exemplo n.º 1
0
/**
 * Pour un bulletin d'une période et d'une classe donnée, calculer et mettre à jour toutes les moyennes qui en ont besoin et qui ne sont pas figées manuellement.
 * Si demandé, calcule et met en session les moyennes de classe.
 * 
 * @param int    $periode_id
 * @param int    $classe_id
 * @param string $liste_eleve_id
 * @param string $liste_matiere_id   renseigné pour un prof effectuant une saisie, vide sinon
 * @param string $retroactif   oui|non|annuel|auto
 * @param bool   $memo_moyennes_classe
 * @param bool   $memo_moyennes_generale
 * @return void
 */
function calculer_et_enregistrer_moyennes_eleves_bulletin($periode_id, $classe_id, $liste_eleve_id, $liste_matiere_id, $retroactif, $memo_moyennes_classe, $memo_moyennes_generale)
{
    if (!$liste_eleve_id) {
        return FALSE;
    }
    // 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 et affiner la liste des matières concernées
    $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($liste_eleve_id, $liste_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
    // Attention, il faut éliminer certains items qui peuvent 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).
    $tab_score_a_garder = array();
    $DB_TAB = DB_STRUCTURE_BILAN::DB_lister_date_last_eleves_items($liste_eleve_id, $liste_item_id);
    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_id, $liste_item_id, -1, $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['matiere_id']][$DB_ROW['item_id']][] = array('note' => $DB_ROW['note']);
            }
        }
    }
    // On calcule les moyennes des élèves dans chaque matière
    $tab_eleve_id = explode(',', $liste_eleve_id);
    // On ne calcule pas les moyennes de classe à partir de ces données car on peut n'avoir ici qu'une partie de la classe
    $tab_moyennes_calculees = array();
    // $tab_moyennes_calculees[$matiere_id][$eleve_id]         Retenir la moyenne des scores d'acquisitions / matière / élève
    // Pour chaque élève...
    foreach ($tab_eleve_id as $eleve_id) {
        // Si cet élève a été évalué...
        if (isset($tab_eval[$eleve_id])) {
            // Pour chaque matiere...
            foreach ($tab_matiere as $matiere_id => $matiere_nom) {
                // Si cet élève a été évalué dans cette matière...
                if (isset($tab_eval[$eleve_id][$matiere_id])) {
                    $tab_score = array();
                    // Pour chaque item...
                    foreach ($tab_eval[$eleve_id][$matiere_id] 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_retroactif
                        // 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
                    $tab_moyennes_calculees[$matiere_id][$eleve_id] = $somme_coefs ? round($somme_scores_ponderes / $somme_coefs, 0) / 5 : FALSE;
                    // Pas NULL car un test isset() sur une valeur NULL renvoie FALSE !!! (voir qq lignes plus bas)
                }
            }
        }
    }
    // Rechercher les moyennes déjà enregistrées, et si elles ont été calculées automatiquement ou imposées
    $tab_moyennes_enregistrees = array();
    $tab_appreciations_enregistrees = array();
    $DB_TAB = DB_STRUCTURE_OFFICIEL::DB_recuperer_bilan_officiel_notes_eleves_periode($periode_id, $liste_eleve_id, FALSE);
    foreach ($DB_TAB as $DB_ROW) {
        $tab_moyennes_enregistrees['eleve'][$DB_ROW['rubrique_id']][$DB_ROW['eleve_id']] = $DB_ROW['saisie_note'] !== NULL ? (double) $DB_ROW['saisie_note'] : FALSE;
        // Pas NULL car un test isset() sur une valeur NULL renvoie FALSE !!! (voir qq lignes plus bas)
        $tab_appreciations_enregistrees[$DB_ROW['rubrique_id']][$DB_ROW['eleve_id']] = $DB_ROW['saisie_appreciation'];
    }
    $DB_TAB = DB_STRUCTURE_OFFICIEL::DB_recuperer_bilan_officiel_notes_classe($periode_id, $classe_id);
    foreach ($DB_TAB as $DB_ROW) {
        $tab_moyennes_enregistrees['groupe'][$DB_ROW['rubrique_id']] = $DB_ROW['saisie_note'] !== NULL ? (double) $DB_ROW['saisie_note'] : FALSE;
        // Pas NULL car un test isset() sur une valeur NULL renvoie FALSE !!! (voir qq lignes plus bas)
    }
    // Mettre à jour les moyennes qui le nécessitent
    foreach ($tab_moyennes_calculees as $matiere_id => $tab) {
        foreach ($tab as $eleve_id => $note) {
            if (!isset($tab_moyennes_enregistrees['eleve'][$matiere_id][$eleve_id]) || $tab_moyennes_enregistrees['eleve'][$matiere_id][$eleve_id] != $note && $tab_appreciations_enregistrees[$matiere_id][$eleve_id] == '') {
                $note = $note !== FALSE ? $note : NULL;
                DB_STRUCTURE_OFFICIEL::DB_modifier_bilan_officiel_saisie('bulletin', $periode_id, $eleve_id, $matiere_id, 0, 'eleve', $note, '');
                $tab_moyennes_enregistrees['eleve'][$matiere_id][$eleve_id] = $note;
            }
        }
    }
    // Il peut aussi falloir supprimer des moyennes calculées ou imposées précédemment mais qui n'ont plus lieu d'être car les notes ont été supprimées, ou les items déplacés, ou le référentiel supprimé depuis...
    $tab_matiere_id = $liste_matiere_id ? explode(',', $liste_matiere_id) : array_keys($tab_moyennes_enregistrees['eleve']);
    foreach ($tab_moyennes_enregistrees['eleve'] as $matiere_id => $tab) {
        if ($matiere_id && in_array($matiere_id, $tab_matiere_id)) {
            foreach ($tab as $eleve_id => $note) {
                if (!isset($tab_moyennes_calculees[$matiere_id][$eleve_id])) {
                    DB_STRUCTURE_OFFICIEL::DB_supprimer_bilan_officiel_saisie('bulletin', $periode_id, $eleve_id, $matiere_id, 0, 'eleve');
                    unset($tab_moyennes_enregistrees['eleve'][$matiere_id][$eleve_id]);
                }
            }
        }
    }
    // Calculer les moyennes de classe, et mettre à jour les moyennes qui le nécessitent
    if ($memo_moyennes_classe) {
        foreach ($tab_moyennes_enregistrees['eleve'] as $matiere_id => $tab) {
            if ($matiere_id != 0) {
                if (count($tab_moyennes_enregistrees['eleve'][$matiere_id])) {
                    $somme = array_sum($tab_moyennes_enregistrees['eleve'][$matiere_id]);
                    $nombre = count(array_filter($tab_moyennes_enregistrees['eleve'][$matiere_id], 'non_vide'));
                    $moyenne = $nombre ? round($somme / $nombre, 1) : NULL;
                    if (!isset($tab_moyennes_enregistrees['groupe'][$matiere_id]) || $tab_moyennes_enregistrees['groupe'][$matiere_id] != $moyenne) {
                        DB_STRUCTURE_OFFICIEL::DB_modifier_bilan_officiel_saisie('bulletin', $periode_id, $classe_id, $matiere_id, 0, 'classe', $moyenne, '');
                    }
                } else {
                    // Possible si toutes les notes viennent d'être supprimées car n'ayant plus lieu d'être (voir qq lignes plus haut)
                    DB_STRUCTURE_OFFICIEL::DB_supprimer_bilan_officiel_saisie('bulletin', $periode_id, $classe_id, $matiere_id, 0, 'classe');
                    unset($tab_moyennes_enregistrees['eleve'][$matiere_id]);
                }
            }
        }
    }
    // Calculer les moyennes générales des élèves, et mettre à jour les moyennes qui le nécessitent
    if ($memo_moyennes_generale) {
        $tab_moyenne_eleve_generale = array();
        $tab_moyennes_enregistrees_par_eleve = array();
        // inverser les clefs du tableau pour pouvoir effectuer les totaux par élève
        foreach ($tab_moyennes_enregistrees['eleve'] as $matiere_id => $tab) {
            if ($matiere_id != 0) {
                foreach ($tab as $eleve_id => $note) {
                    $tab_moyennes_enregistrees_par_eleve[$eleve_id][$matiere_id] = $note;
                }
            }
        }
        foreach ($tab_moyennes_enregistrees_par_eleve as $eleve_id => $tab) {
            $somme = array_sum($tab_moyennes_enregistrees_par_eleve[$eleve_id]);
            $nombre = count(array_filter($tab_moyennes_enregistrees_par_eleve[$eleve_id], 'non_vide'));
            $moyenne = $nombre ? round($somme / $nombre, 1) : NULL;
            if (!isset($tab_moyennes_enregistrees['eleve'][0][$eleve_id]) || $tab_moyennes_enregistrees['eleve'][0][$eleve_id] != $note) {
                DB_STRUCTURE_OFFICIEL::DB_modifier_bilan_officiel_saisie('bulletin', $periode_id, $eleve_id, 0, 0, 'eleve', $moyenne, '');
            }
            $tab_moyenne_eleve_generale[$eleve_id] = $moyenne;
        }
        // Enfin, moyenne de classe des moyennes générales...
        if ($memo_moyennes_classe) {
            $somme = array_sum($tab_moyenne_eleve_generale);
            $nombre = count(array_filter($tab_moyenne_eleve_generale, 'non_vide'));
            $moyenne = $nombre ? round($somme / $nombre, 1) : NULL;
            if (!isset($tab_moyennes_enregistrees['groupe'][0]) || $tab_moyennes_enregistrees['groupe'][0] != $moyenne) {
                DB_STRUCTURE_OFFICIEL::DB_modifier_bilan_officiel_saisie('bulletin', $periode_id, $classe_id, 0, 0, 'classe', $moyenne, '');
            }
        }
    }
}
Exemplo n.º 2
0
        }
        $archivage_tableau_PDF->appreciation_rubrique_eleves_prof($eleve_id, $eleve_nom, $eleve_prenom, $note, $appreciation, $with_moyenne, FALSE);
    }
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Cas 5/6 imprimer_donnees_eleves_moyennes : Tableau des moyennes pour chaque élève
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'imprimer_donnees_eleves_moyennes') {
    if (!$_SESSION['OFFICIEL']['BULLETIN_MOYENNE_SCORES']) {
        exit('Les bulletins sont configurés sans notes !');
    }
    // Rechercher les notes enregistrées pour les élèves
    $tab_saisie = array();
    // [eleve_id][rubrique_id] => array(note,appreciation);
    $tab_rubriques = array();
    $DB_TAB = DB_STRUCTURE_OFFICIEL::DB_recuperer_bilan_officiel_notes_eleves_periode($periode_id, $liste_eleve_id, TRUE);
    foreach ($DB_TAB as $DB_ROW) {
        if ($DB_ROW['rubrique_id'] || $_SESSION['OFFICIEL']['BULLETIN_MOYENNE_GENERALE']) {
            $tab_saisie[$DB_ROW['eleve_id']][$DB_ROW['rubrique_id']] = $DB_ROW['saisie_note'] !== NULL && !in_array($DB_ROW['rubrique_id'], $tab_moyenne_exception_matieres) ? (double) $DB_ROW['saisie_note'] : NULL;
            // Remarque : un test isset() sur une valeur NULL renverra FALSE !!!
            $tab_rubriques[$DB_ROW['rubrique_id']] = $DB_ROW['rubrique_id'] ? $DB_ROW['rubrique_nom'] : 'Synthèse générale';
        }
    }
    // Rechercher les notes enregistrées pour la classe
    $DB_TAB = DB_STRUCTURE_OFFICIEL::DB_recuperer_bilan_officiel_notes_classe($periode_id, $classe_id);
    if ($_SESSION['OFFICIEL']['BULLETIN_MOYENNE_CLASSE']) {
        foreach ($DB_TAB as $DB_ROW) {
            if ($DB_ROW['rubrique_id'] || $_SESSION['OFFICIEL']['BULLETIN_MOYENNE_GENERALE']) {
                $tab_saisie[0][$DB_ROW['rubrique_id']] = $DB_ROW['saisie_note'] !== NULL && !in_array($DB_ROW['rubrique_id'], $tab_moyenne_exception_matieres) ? (double) $DB_ROW['saisie_note'] : NULL;
                // Remarque : un test isset() sur une valeur NULL renverra FALSE !!!
            }