From f780553773bd86f142301124b6221392b5551534 Mon Sep 17 00:00:00 2001 From: adisposkofh Date: Fri, 24 Apr 2026 15:55:03 +0200 Subject: [PATCH 1/2] moved avg grade calcs to backend --- .../controllers/api/frontend/v1/Lehre.php | 47 ++++++++++++++++- public/js/api/factory/lehre.js | 6 +++ public/js/components/Cis/Mylv/Semester.js | 5 +- .../Cis/Mylv/Semester/Studiengang.js | 3 +- .../Mylv/Semester/Studiengang/AverageGrade.js | 52 ++++++++----------- 5 files changed, 79 insertions(+), 34 deletions(-) diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php index 10d945a3e..c2ebeb10b 100644 --- a/application/controllers/api/frontend/v1/Lehre.php +++ b/application/controllers/api/frontend/v1/Lehre.php @@ -38,7 +38,8 @@ class Lehre extends FHCAPI_Controller parent::__construct([ 'lvStudentenMail' => self::PERM_LOGGED, 'LV' => self::PERM_LOGGED, - 'Pruefungen' => self::PERM_LOGGED + 'Pruefungen' => self::PERM_LOGGED, + 'semesterAverageGrade' => self::PERM_LOGGED, ]); } @@ -100,5 +101,49 @@ class Lehre extends FHCAPI_Controller $this->terminateWithSuccess($result); } + + /** + * calculates and returns the grade average and weighted average for a specific semester + * @param string $studiensemester_kurzbz + * @return void + */ + + public function semesterAverageGrade($studiensemester_kurzbz) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $semesterLvs = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage()); + + if (isError($semesterLvs)) + return $this->outputJsonError(getError($semesterLvs)); + + $semesterLvsData = getData($semesterLvs); + + $doGradesExist = false; + $sum = 0; + $count = 0; + $sumWeighted = 0; + $sumEcts = 0; + + foreach ($semesterLvsData as $lv) { + if (!$lv->znote || $lv->znote < 1 || $lv->znote > 5) + continue; + + $doGradesExist = true; + + $sum += $lv->znote; + $count++; + $sumWeighted += $lv->znote * floatval($lv->ects); + $sumEcts += floatval($lv->ects); + } + + $averageGrade = null; + $weightedAverageGrade = null; + if ($doGradesExist) { + $averageGrade = $sum/$count; + $weightedAverageGrade = $sumWeighted/$sumEcts; + } + + $this->terminateWithSuccess(['average_grade' => $averageGrade, 'weighted_average_grade' => $weightedAverageGrade]); + } } diff --git a/public/js/api/factory/lehre.js b/public/js/api/factory/lehre.js index 84c8e8662..4f32a1e55 100644 --- a/public/js/api/factory/lehre.js +++ b/public/js/api/factory/lehre.js @@ -35,5 +35,11 @@ export default { method: 'get', url: `/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}` }; + }, + getSemesterAverageGrade(semester) { + return { + method: 'get', + url: `/api/frontend/v1/Lehre/semesterAverageGrade/${semester}` + } } }; \ No newline at end of file diff --git a/public/js/components/Cis/Mylv/Semester.js b/public/js/components/Cis/Mylv/Semester.js index 994a7c9ff..90dab5a32 100644 --- a/public/js/components/Cis/Mylv/Semester.js +++ b/public/js/components/Cis/Mylv/Semester.js @@ -36,8 +36,9 @@ export default { return this.lvs.filter(lv => lv.studiengang_kz == studiengang.studiengang_kz && lv.semester == studiengang.semester); } }, - template: `
- + template: ` +
+
diff --git a/public/js/components/Cis/Mylv/Semester/Studiengang.js b/public/js/components/Cis/Mylv/Semester/Studiengang.js index 7e09f67b0..80a969673 100644 --- a/public/js/components/Cis/Mylv/Semester/Studiengang.js +++ b/public/js/components/Cis/Mylv/Semester/Studiengang.js @@ -14,6 +14,7 @@ export default { bezeichnung: String, kuerzel: String, semester: [String,Number], + semesterInfo: [String,Number], lvs: Array, sg_bezeichnung_eng: String }, @@ -44,7 +45,7 @@ export default {
- + ` }; \ No newline at end of file diff --git a/public/js/components/Cis/Mylv/Semester/Studiengang/AverageGrade.js b/public/js/components/Cis/Mylv/Semester/Studiengang/AverageGrade.js index 5fcc6262a..65ef72e3d 100644 --- a/public/js/components/Cis/Mylv/Semester/Studiengang/AverageGrade.js +++ b/public/js/components/Cis/Mylv/Semester/Studiengang/AverageGrade.js @@ -1,50 +1,42 @@ import Phrasen from "../../../../../mixins/Phrasen.js"; +import ApiLehre from "../../../../../api/factory/lehre.js"; export default { mixins: [ Phrasen ], props: { - lvs: Array, + semesterInfo: String, }, data: ( ) =>{ return { gradeAverage: null, gradeWeightedAverage: null, - existingGrades: false } }, methods: { - calculateAverages(){ - let sum = 0; - let count = 0; - let sumWeighted = 0; - let sumEcts = 0; + async fetchAverageGrade() { + this.gradeAverage = null; + this.gradeWeightedAverage = null; + if (!this.$props.semesterInfo) return; - this.lvs.forEach((lv) => { - if ((lv.znote >= 1 && lv.znote <= 5) && lv.znote!= null) { - this.existingGrades = true; - sum+= lv.znote; - count++; - sumWeighted += lv.znote * Number(lv.ects); - sumEcts += Number(lv.ects); - } - }); - this.gradeAverage = (sum/count).toFixed(2); - this.gradeWeightedAverage = (sumWeighted/sumEcts).toFixed(2); - } + let gradeAverageResponse = await this.$api.call( + ApiLehre.getSemesterAverageGrade(this.$props.semesterInfo), + ); + const gradeAverageResponseData = gradeAverageResponse.data; + this.gradeAverage = + gradeAverageResponseData.average_grade?.toFixed(2); + this.gradeWeightedAverage = + gradeAverageResponseData.weighted_average_grade?.toFixed(2); + }, }, watch: { - lvs: { - handler() { - this.calculateAverages(); - }, - deep: true, - immediate: true - } + semesterInfo() { + this.fetchAverageGrade(); + }, }, - mounted(){ - this.calculateAverages(); + async created() { + await this.fetchAverageGrade(); }, template: /*html*/`
@@ -53,7 +45,7 @@ export default {
{{$p.t('lehre/notenstatistik')}}
-
+
@@ -79,7 +71,7 @@ export default {

{{$p.t('lehre/info_noGradesYet')}}

-