From ac44b36b59eef91875c44782add7df81875ead0b Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Tue, 7 Apr 2026 16:07:10 +0200 Subject: [PATCH] =?UTF-8?q?cis4=20myLv=20employee=20functionality=20implem?= =?UTF-8?q?ented;=20wrote=20new=20query=20fetching=20studiensemester=20an?= =?UTF-8?q?=20employee=20in=20which=20he=20had=20assigned=20lehrauftr?= =?UTF-8?q?=C3=A4ge;=20afterwards=20fetch=20all=20lva=20by=20employee=20ui?= =?UTF-8?q?d=20and=20sem=5Fkurzbz=20so=20they=20fit=20in=20the=20existing?= =?UTF-8?q?=20component=20structure;=20MyLv/Lvs/SS2026=20etc=20now=20also?= =?UTF-8?q?=20returns=20a=20'student'=20|=20'employee'=20string=20based=20?= =?UTF-8?q?on=20path=20taken=20inside=20the=20controller=20to=20aid=20vue?= =?UTF-8?q?=20components=20in=20rendering=20useful=20information=20and=20a?= =?UTF-8?q?voiding=20senseless=20fetch=20requests=20->=20e.g.=20employees?= =?UTF-8?q?=20cant=20have=20grades=20on=20lva=20they=20are=20teaching;=20a?= =?UTF-8?q?dded=20component=20names=20for=20sanity=20when=20using=20vuedev?= =?UTF-8?q?tools;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/components/Cis/Mylv.php | 45 +++++++++++++++---- .../education/Lehrveranstaltung_model.php | 31 +++++++++++++ .../organisation/Studiensemester_model.php | 24 ++++++++++ public/js/components/Cis/Mylv/LvMenu.js | 1 + public/js/components/Cis/Mylv/LvUebersicht.js | 2 +- public/js/components/Cis/Mylv/Semester.js | 1 + .../Cis/Mylv/Semester/Studiengang.js | 1 + .../Cis/Mylv/Semester/Studiengang/Lv.js | 21 +++++---- public/js/components/Cis/Mylv/Student.js | 10 ++++- 9 files changed, 118 insertions(+), 18 deletions(-) diff --git a/application/controllers/components/Cis/Mylv.php b/application/controllers/components/Cis/Mylv.php index 1fdb7e2a1..3ce6106b0 100644 --- a/application/controllers/components/Cis/Mylv.php +++ b/application/controllers/components/Cis/Mylv.php @@ -44,13 +44,28 @@ class Mylv extends Auth_Controller public function Studiensemester() { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); - $result = $this->StudiensemesterModel->getWhereStudentHasLvs(getAuthUID()); + $isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())) ?? false; + $isStudent = getData($this->StudentModel->isStudent(getAuthUID())) ?? false; + if($isMitarbeiter) { + $result = $this->StudiensemesterModel->getWhereMitarbeiterHasLvs(getAuthUID()); - if (isError($result)) - return $this->outputJsonError(getError($result)); + if (isError($result)) + return $this->outputJsonError(getError($result)); - $this->outputJsonSuccess(getData($result)); + $this->outputJsonSuccess(getData($result)); + } else if($isStudent) { // $isStudent + $result = $this->StudiensemesterModel->getWhereStudentHasLvs(getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(getError($result)); + + $this->outputJsonSuccess(getData($result)); + } else { + $this->outputJsonError('neither student or mitarbeiter'); + } } /** @@ -58,13 +73,27 @@ class Mylv extends Auth_Controller public function Lvs($studiensemester_kurzbz) { $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); - $result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage()); + $isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())) ?? false; + if($isMitarbeiter) { + $result = $this->LehrveranstaltungModel->getLvsByMitarbeiterInSemester(getAuthUID(), $studiensemester_kurzbz); - if (isError($result)) - return $this->outputJsonError(getError($result)); + if (isError($result)) + return $this->outputJsonError(getError($result)); - $this->outputJsonSuccess(getData($result)); + $this->outputJsonSuccess([getData($result), 'employee']); + } else if(getData($this->StudentModel->isStudent(getAuthUID())) ?? false) { // $isStudent + $result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage()); + + if (isError($result)) + return $this->outputJsonError(getError($result)); + + $this->outputJsonSuccess([getData($result), 'student']); + } else { + $this->outputJsonError('neither student or mitarbeiter'); + } } /** diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index ccac33bc7..76c7b85fc 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -1343,4 +1343,35 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($qry, $params); } + + // used for cis4 mylv mitarbeiter + public function getLvsByMitarbeiterInSemester($mitarbeiter_uid, $sem_kurzbz) { + $qry = "SELECT + public.tbl_studiengang.studiengang_kz, + lehre.tbl_lehrveranstaltung.semester, + public.tbl_studiengang.bezeichnung as sg_bezeichnung, + public.tbl_studiengang.english as sg_bezeichnung_eng, + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as studiengang_kuerzel, + lehre.tbl_lehrveranstaltung.lehrveranstaltung_id, + lehre.tbl_lehrveranstaltung.bezeichnung, + lehre.tbl_lehrveranstaltung.bezeichnung_english as bezeichnung_eng, + lehre.tbl_lehrveranstaltung.farbe, + lehre.tbl_lehrveranstaltung.lvinfo, + lehre.tbl_lehrveranstaltung.benotung, + lehre.tbl_lehrveranstaltung.orgform_kurzbz, + lehre.tbl_lehrveranstaltung.sprache, + lehre.tbl_lehrveranstaltung.ects, + lehre.tbl_lehrveranstaltung.incoming + FROM + lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_studiengang USING(studiengang_kz) + JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id) + WHERE + tbl_lehreinheit.studiensemester_kurzbz = ? + AND mitarbeiter_uid = ? + ORDER BY studiengang_kuerzel, lehre.tbl_lehrveranstaltung.semester, lehre.tbl_lehrveranstaltung.bezeichnung"; + + return $this->execReadOnlyQuery($qry, [$sem_kurzbz, $mitarbeiter_uid]); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 5fa6ffb14..bed138b8a 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -242,6 +242,30 @@ class Studiensemester_model extends DB_Model return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]); } + public function getWhereMitarbeiterHasLvs($uid) { + // first order by year with last 2 letter from right, + // then order by WS/SS inside the years + // query it asc so the ordering magic in cis4 turns it around again + $qry = "WITH unique_semesters AS ( + SELECT DISTINCT ON (studiensemester_kurzbz) + studiensemester_kurzbz, + start, + ende, + bezeichnung, + studienjahr_kurzbz + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE mitarbeiter_uid = ? + ) + SELECT * FROM unique_semesters + ORDER BY + RIGHT(studiensemester_kurzbz, 2) ASC, + LEFT(studiensemester_kurzbz, 2) ASC;"; + + return $this->execReadOnlyQuery($qry, [$uid]); + } + public function getAktAndFutureSemester() { $query = 'SELECT studiensemester_kurzbz diff --git a/public/js/components/Cis/Mylv/LvMenu.js b/public/js/components/Cis/Mylv/LvMenu.js index ef820ebb0..101f0be0f 100644 --- a/public/js/components/Cis/Mylv/LvMenu.js +++ b/public/js/components/Cis/Mylv/LvMenu.js @@ -1,5 +1,6 @@ export default { + name: 'LvMenu', props:{ menu:{ type:Array, diff --git a/public/js/components/Cis/Mylv/LvUebersicht.js b/public/js/components/Cis/Mylv/LvUebersicht.js index 1ec93590f..3303f4b52 100644 --- a/public/js/components/Cis/Mylv/LvUebersicht.js +++ b/public/js/components/Cis/Mylv/LvUebersicht.js @@ -4,7 +4,7 @@ import LvMenu from "./LvMenu.js"; import ApiAddons from '../../../api/factory/addons.js'; export default { - + name: 'LvUebersicht', props:{ event:{ type:Object, diff --git a/public/js/components/Cis/Mylv/Semester.js b/public/js/components/Cis/Mylv/Semester.js index 994a7c9ff..5f9e1153d 100644 --- a/public/js/components/Cis/Mylv/Semester.js +++ b/public/js/components/Cis/Mylv/Semester.js @@ -1,6 +1,7 @@ import MylvSemesterStudiengang from "./Semester/Studiengang.js"; export default { + name: 'Semester', components: { MylvSemesterStudiengang }, diff --git a/public/js/components/Cis/Mylv/Semester/Studiengang.js b/public/js/components/Cis/Mylv/Semester/Studiengang.js index 15d210796..ba6b4f0ca 100644 --- a/public/js/components/Cis/Mylv/Semester/Studiengang.js +++ b/public/js/components/Cis/Mylv/Semester/Studiengang.js @@ -2,6 +2,7 @@ import MylvSemesterStudiengangLv from "./Studiengang/Lv.js"; import Phrasen from "../../../../mixins/Phrasen.js"; export default { + name: 'Studiengang', components: { MylvSemesterStudiengangLv }, diff --git a/public/js/components/Cis/Mylv/Semester/Studiengang/Lv.js b/public/js/components/Cis/Mylv/Semester/Studiengang/Lv.js index 3fd5e6900..1cc128f84 100644 --- a/public/js/components/Cis/Mylv/Semester/Studiengang/Lv.js +++ b/public/js/components/Cis/Mylv/Semester/Studiengang/Lv.js @@ -9,13 +9,14 @@ import ApiAddons from '../../../../../api/factory/addons.js'; // TODO(chris): L10n export default { + name: 'Lv', components:{ LvUebersicht, }, mixins: [ Phrasen ], - inject: ['studien_semester'], + inject: ['studien_semester', 'type'], props: { lehrveranstaltung_id: Number, bezeichnung: String, @@ -152,12 +153,16 @@ export default { } }, created() { - this.$api - .call(ApiLehre.getStudentPruefungen(this.lehrveranstaltung_id)) - .then(res => res.data) - .then(pruefungen => { - this.pruefungenData = pruefungen; - }); + // TODO: check if this isnt a race condition in disguise + if(this.type == 'student') { + this.$api + .call(ApiLehre.getStudentPruefungen(this.lehrveranstaltung_id)) + .then(res => res.data) + .then(pruefungen => { + this.pruefungenData = pruefungen; + }); + } + }, mounted() { this.fetchMenu(this.lehrveranstaltung_id, this.studien_semester); @@ -204,7 +209,7 @@ export default { -