diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index 80cdd0c8b..b892863e8 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -552,9 +552,40 @@ class lehreinheitmitarbeiter extends basis_db $beginn = new DateTime($beginn); $ende = new DateTime($ende); + // get relevant Studiensemester + $studiensemester_kurzbz_arr = []; + + $qry = ' + SELECT + studiensemester_kurzbz + FROM + public.tbl_studiensemester + WHERE + start BETWEEN + '. $this->db_add_param($beginn->format('Y-m-d')). ' AND + '. $this->db_add_param($ende->format('Y-m-d')); + + if ($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + $studiensemester_kurzbz_arr[] = $row->studiensemester_kurzbz; + } + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + + $lehrgaengeDistr = $this->_getLehrgaengeForDistribution($studiensemester_kurzbz_arr); + + if (!is_array($studiensemester_kurzbz_arr) || empty($studiensemester_kurzbz_arr)) return true; + $qry = ' WITH semester_sws_tbl AS ( - SELECT DISTINCT lehreinheit_id, studiensemester_kurzbz, lema.semesterstunden, stg.studiengang_kz + SELECT DISTINCT lehreinheit_id, studiensemester_kurzbz, lema.semesterstunden, + stg.studiengang_kz, stg.melde_studiengang_kz, stg.lgartcode FROM lehre.tbl_lehreinheitmitarbeiter lema JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) @@ -564,38 +595,103 @@ class lehreinheitmitarbeiter extends basis_db JOIN public.tbl_studiengang stg ON stg.studiengang_kz = sto.studiengang_kz JOIN public.tbl_studiensemester ss USING (studiensemester_kurzbz) WHERE mitarbeiter_uid = '. $this->db_add_param($uid). ' - AND ( - ss.start BETWEEN - '. $this->db_add_param($beginn->format('Y-m-d')). ' AND - '. $this->db_add_param($ende->format('Y-m-d')). ') + AND ss.studiensemester_kurzbz IN ('.$this->implode4SQL($studiensemester_kurzbz_arr).') -- nur lehre, die bisgemeldet wird AND lema.bismelden -- keine lehreinheiten ohne semesterstunden - AND lema.semesterstunden != 0 + AND lema.semesterstunden != 0 ) SELECT studiengang_kz, studiensemester_kurzbz, + melde_studiengang_kz, + lgartcode, sum(semesterstunden) AS summe, round(sum(semesterstunden) / 15, 2) AS sws FROM semester_sws_tbl GROUP BY studiengang_kz, - studiensemester_kurzbz + studiensemester_kurzbz, + melde_studiengang_kz, + lgartcode ORDER BY studiengang_kz; '; if ($this->db_query($qry)) { + $additionalLehrgaenge = []; + while($row = $this->db_fetch_object()) { $obj = new StdClass(); $obj->studiengang_kz = $row->studiengang_kz; $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->melde_studiengang_kz = $row->melde_studiengang_kz; + $obj->lgartcode = $row->lgartcode; $obj->sws = $row->sws; + + if (isset($lehrgaengeDistr[$uid][$row->studiensemester_kurzbz])) + { + $lehrgaenge = $lehrgaengeDistr[$uid][$row->studiensemester_kurzbz]; + + foreach ($lehrgaenge as $lehreinheit_id => $lehrgangKzArr) + { + // wenn lehrgang gefunden, zusammenhängende Lehrgaenge holen und sws aufteilen + if (array_key_exists($row->studiengang_kz, $lehrgangKzArr)) + { + foreach ($lehrgangKzArr as $studiengang_kz => $lehrgang) + { + // check: nur eine Studiengangsverknüpfung pro Mitarbeiter, Semester, und Referenzstudiengang + if ( + $studiengang_kz == $row->studiengang_kz + || isset( + $additionalLehrgaenge[$uid][$row->studiensemester_kurzbz][$row->studiengang_kz][$studiengang_kz] + ) + ) continue; + + // Lehrgang erstellen + $lg = new StdClass(); + $lg->mitarbeiter_uid = $uid; + $lg->melde_studiengang_kz = $lehrgang->melde_studiengang_kz; + $lg->lgartcode = $lehrgang->lgartcode; + $lg->studiengang_kz = $lehrgang->studiengang_kz; + $lg->studiensemester_kurzbz = $lehrgang->studiensemester_kurzbz; + $lg->summe = $row->summe; + $lg->sws = $row->sws; + // Lehrgang, der mit Ursprungsstudiengang aufgrund lehreinheit "verknüpft" ist, hinzufügen + $additionalLehrgaenge[$uid][$row->studiensemester_kurzbz][$row->studiengang_kz][$studiengang_kz] = $lg; + } + } + } + + // ignorieren, wenn für den Studiengang keine verknüpften Lehrgaenge hat + if (isset($additionalLehrgaenge[$uid][$row->studiensemester_kurzbz][$row->studiengang_kz])) + { + $addLehrgaenge = $additionalLehrgaenge[$uid][$row->studiensemester_kurzbz][$row->studiengang_kz]; + + // sws Durchschnitt über alle verknuepften Lehrgaenge berechnet + $summeSws = $row->summe/(count($addLehrgaenge) + 1); + $sws = $row->sws/(count($addLehrgaenge) + 1); + + // neue sws zuweisen + $obj->summe = $summeSws; + $obj->sws = $sws; + + foreach ($addLehrgaenge as $conn_ws_studiengang_kz => $lehrgang) + { + // sws fuer jeden verknuepften Lehrgang zuweisen + $lehrgang->summe = $summeSws; + $lehrgang->sws = $sws; + + // neue lehrgang sws hinzufuegen + $this->result [] = $lehrgang; + } + } + } + $this->result []= $obj; } return true; @@ -655,4 +751,63 @@ class lehreinheitmitarbeiter extends basis_db return false; } + /** + * Get "connected" Lehrgaenge for equal sws distribution. + * @param $studiensemester_kurzbz_arr all semester for which Lehrgaenge should be retrieved + * @return object success or error + */ + private function _getLehrgaengeForDistribution($studiensemester_kurzbz_arr) + { + if (!is_array($studiensemester_kurzbz_arr) || empty($studiensemester_kurzbz_arr)) return []; + + $qry = " + WITH gruppen AS ( + SELECT + mitarbeiter_uid, lehreinheit_id, lehrveranstaltung_id, studiensemester_kurzbz, sem.start, sem.ende, + lehreinheitgruppe_id, studiengang_kz, melde_studiengang_kz, lgartcode + FROM + lehre.tbl_lehreinheitmitarbeiter lema + JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) + JOIN lehre.tbl_lehreinheitgruppe legr USING (lehreinheit_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) + WHERE + bismelden + AND stg.melderelevant + AND stg.typ = 'l' + AND le.studiensemester_kurzbz IN (".$this->implode4SQL($studiensemester_kurzbz_arr).") + ) + SELECT + DISTINCT mitarbeiter_uid, studiensemester_kurzbz, lehreinheit_id, studiengang_kz, melde_studiengang_kz, lgartcode + FROM + gruppen gr + GROUP BY + mitarbeiter_uid, studiensemester_kurzbz, lehreinheit_id, studiengang_kz, melde_studiengang_kz, lgartcode + ORDER BY + mitarbeiter_uid, studiensemester_kurzbz, lehreinheit_id, studiengang_kz, melde_studiengang_kz, lgartcode"; + + $lehrgaengeDistributions = []; + + if($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + // group by properties + $lehrgaengeDistributions + [$row->mitarbeiter_uid] + [$row->studiensemester_kurzbz] + [$row->lehreinheit_id] + [$row->studiengang_kz] + = $row; + } + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + + return $lehrgaengeDistributions; + } + } diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index cd929c24b..1def6774d 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -875,7 +875,6 @@ function _getLehrecontainer($sws_proStg_arr) $sws_proStg_arr = array_filter($sws_proStg_arr, function ($obj) { return !in_array($obj->studiengang_kz, BIS_EXCLUDE_STG) && - $obj->studiengang_kz > 0 && $obj->studiengang_kz < 10000; }); } @@ -886,13 +885,17 @@ function _getLehrecontainer($sws_proStg_arr) { $is_sommersemester = substr($sws_proStg->studiensemester_kurzbz, 0, 2) == 'SS'; $is_wintersemester = substr($sws_proStg->studiensemester_kurzbz, 0, 2) == 'WS'; + $is_lehrgang = isset($sws_proStg->lgartcode); + $kennzeichen_name = $is_lehrgang ? 'LehrgangNr' : 'StgKz'; // Lehreobjekt generieren if (empty($lehre_arr) || !lehre_stg_exists($sws_proStg->studiengang_kz, $lehre_arr)) { $lehre_obj = new StdClass(); - $lehre_obj->StgKz = setLeadingZero(intval($sws_proStg->studiengang_kz), 4); + $lehre_obj->{$kennzeichen_name} = $sws_proStg->melde_studiengang_kz; + //~ $lehre_obj->StgKz = setLeadingZero(intval($sws_proStg->studiengang_kz), 4); + $lehre_obj->SommersemesterSWS = $is_sommersemester ? $sws_proStg->sws : 0.00; $lehre_obj->WintersemesterSWS = $is_wintersemester ? $sws_proStg->sws : 0.00; @@ -1020,9 +1023,14 @@ function _generateXML($person_arr) foreach ($person->lehre_arr as $lehre) { $xml .= ''; - $xml .= 'StgKz. ']]>'; - $xml .= 'SommersemesterSWS. ']]>'; - $xml .= 'WintersemesterSWS. ']]>'; + + if (isset($lehre->LehrgangNr)) + $xml .= 'LehrgangNr. ']]>'; + else + $xml .= 'StgKz. ']]>'; + + $xml .= 'SommersemesterSWS, 2, '.', ''). ']]>'; + $xml .= 'WintersemesterSWS, 2, '.', ''). ']]>'; $xml .= ''; } @@ -1211,7 +1219,7 @@ function _outputHTML($person_arr) { echo ' - '. $lehre->StgKz. ' + '. (isset($lehre->LehrgangNr) ? $lehre->LehrgangNr : $lehre->StgKz). ' '. $lehre->SommersemesterSWS. ' '. $lehre->WintersemesterSWS. ' '; @@ -1359,7 +1367,8 @@ function lehre_stg_exists($studiengang_kz, $lehre_arr) { foreach($lehre_arr as $row) { - if($row->StgKz == $studiengang_kz) + $kennzeichenName = $row->LehrgangNr ?? $row->StgKz; + if(isset($row->{$kennzeichenName}) && $row->{$kennzeichenName} == $melde_studiengang_kz) return true; } return false;