From 47f33ed930d01076271957c7a3d81597935aecb9 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 26 Feb 2020 17:11:00 +0100 Subject: [PATCH 01/24] Added function getLehreinheiten_SWS_BISMeldung This function retrieves semesterwochenstunden of a given studiensemester for all employees who should be BIS reported. --- include/lehreinheitmitarbeiter.class.php | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index 48d0de485..d7d469c2f 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -495,6 +495,41 @@ class lehreinheitmitarbeiter extends basis_db return $ret; } + public function getLehreinheiten_SWS_BISMeldung($uid, $studiensemester) + { + $qry = ' + SELECT + round(sum(semesterstunden) / 15) AS sws + FROM ( + SELECT DISTINCT lehreinheit_id, studiensemester_kurzbz, mitarbeiter_uid, semesterstunden + FROM lehre.tbl_lehreinheitmitarbeiter + JOIN public.tbl_mitarbeiter ma USING (mitarbeiter_uid) + JOIN public.tbl_benutzer ON (mitarbeiter_uid = uid) + JOIN public.tbl_person USING (person_id) + JOIN bis.tbl_bisverwendung USING (mitarbeiter_uid) + JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + JOIN public.tbl_studiensemester ss USING (studiensemester_kurzbz) + WHERE mitarbeiter_uid = '. $this->db_add_param($uid).' + AND ma.bismelden + AND studiensemester_kurzbz = '. $this->db_add_param($studiensemester).' + ) tbl_semesterstunden + '; + + if($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + $this->result[] = $row->sws; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } + /** * Laedt die Lektoren einer Lehrveranstaltung in einem Studiensemester * @param lehrveranstaltung_id From cfb56b5adbffa26304675a74e4167e07e0b4e4d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Thu, 5 Mar 2020 11:57:11 +0100 Subject: [PATCH 02/24] =?UTF-8?q?Datenbankanpassungen=20f=C3=BCr=20BIS=20S?= =?UTF-8?q?chnittstelle=20V.=206.8=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Kodextabellen fuer Beschaeftigungsart1 angepasst (Möglichkeit zum Hinzufügen von multiplen Einträgen für die selbe Beschaeftigungsart) - Kodextabellen für Verwendung angepasst an die neue Version - Aktualisierung der Verwendungsplausibilitätsprüfungen - Script zur Generierung für neue Verwendungen an neuen Meldezeitraum angepasst - Funktionen Block im FAS entfernt/ausgeblendet. --- .../mitarbeiterfunktionoverlay.xul.php | 4 +- .../mitarbeiterverwendungdialog.js.php | 4 +- rdf/beschaeftigungsart1.rdf.php | 4 +- system/dbupdate_3.3.php | 98 ++++++++++++++++++- vilesci/bis/checkverwendung.php | 83 ++++++++-------- .../bis/personal_lektorenohnelehrauftrag.php | 2 +- vilesci/bis/personalmeldung_uebersicht.php | 4 - 7 files changed, 147 insertions(+), 52 deletions(-) diff --git a/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php b/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php index dff657cf6..6a50145eb 100644 --- a/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php +++ b/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php @@ -179,7 +179,7 @@ echo ''; - + - \ No newline at end of file + diff --git a/content/mitarbeiter/mitarbeiterverwendungdialog.js.php b/content/mitarbeiter/mitarbeiterverwendungdialog.js.php index 2b3bcfafd..841f167e9 100644 --- a/content/mitarbeiter/mitarbeiterverwendungdialog.js.php +++ b/content/mitarbeiter/mitarbeiterverwendungdialog.js.php @@ -87,12 +87,12 @@ function MitarbeiterVerwendungInit(mitarbeiter_uid, bisverwendung_id) var predicateNS = "http://www.technikum-wien.at/mitarbeiter/rdf"; fixangestellt = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#fixangestellt" )); - + //neuer Datensatz wird angelegt MitarbeiterVerwendungDetailNeu='true'; //Defaultwerte - ba1code=3; //fixer Dienstvertrag + ba1code=103; //fixer Dienstvertrag ba2code=1; //unbefristet beschausmasscode=1; //Vollzeit verwendung_code=1; //Lehr- und Forschungspersonal diff --git a/rdf/beschaeftigungsart1.rdf.php b/rdf/beschaeftigungsart1.rdf.php index a18e4b26f..bacb36890 100644 --- a/rdf/beschaeftigungsart1.rdf.php +++ b/rdf/beschaeftigungsart1.rdf.php @@ -43,7 +43,7 @@ echo ' '; -$qry = "SELECT * FROM bis.tbl_beschaeftigungsart1 ORDER BY ba1code"; +$qry = "SELECT * FROM bis.tbl_beschaeftigungsart1 ORDER BY ba1kurzbz"; $db = new basis_db(); if($db->db_query($qry)) @@ -62,4 +62,4 @@ if($db->db_query($qry)) } ?> - \ No newline at end of file + diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index f100f2115..455ee4cb6 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -3525,6 +3525,102 @@ if($result = $db->db_query("SELECT * FROM pg_proc WHERE proname = 'transform_ges echo '
Function transform_geschlecht hinzugefügt.'; } } + +/** + * Anpassungen fuer BIS Personalmeldung 6.8 + */ +if (!$result = @$db->db_query("SELECT ba1bis_code FROM bis.tbl_beschaeftigungsart1 LIMIT 1")) +{ + /* + Beschaeftigungsausmass Kodextabelle aktualisieren + + BA1Code alt 1 => BA1Code neu 1 + BA1Code alt 2 => BA1Code neu 2 + BA1Code alt 3 => BA1Code neu 3 (Echter DV) + BA1Code alt 4 => BA1Code neu 5 (Freier DV -> Sonstiges) + BA1Code alt 5 => BA1Code neu 4 + BA1Code alt 6 => BA1Code neu 5 (Werkvertrag -> Sonstiges) + + BA1Code ist nicht mehr der Code der gemeldet wird. + BA1code wird um 100 erhöht damit klar ist, dass es sich um einen anderen Code handelt. + */ + $qry = " + ALTER TABLE bis.tbl_beschaeftigungsart1 ADD COLUMN ba1bis_code smallint; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=1, ba1code=101 WHERE ba1code=1; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=2, ba1code=102 WHERE ba1code=2; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=3, ba1code=103 WHERE ba1code=3; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=5, ba1code=105 WHERE ba1code=4; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=4, ba1code=104 WHERE ba1code=5; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=6, ba1code=106 WHERE ba1code=6; + "; + + /* + Für Werkvertraege wird eine eigene Beschaeftigungsart erstellt. + Die alten Eintraege für "Sonstiges (Werkvertrag)" werden auf diese neue Beschaeftigungsart umgehaengt + da diese bei uns alles Werkvertraege sind. + Fuer Studentische Hilfskraefte wird ebenfalls eine eigene Beschaeftigungsart erstellt. + Diese werden als Echter DV gemeldet aber getrennt verwaltet. + Alle Personen mit einer Funktion als Hilfskraft werden auf diese Beschaeftigungsart geaendert. + */ + $qry .= " + INSERT INTO bis.tbl_beschaeftigungsart1(ba1code, ba1bez, ba1kurzbz, ba1bis_code) VALUES(107,'Werkvertrag (Sonstiges)','Werkvertrag (Sonstiges)', 5); + INSERT INTO bis.tbl_beschaeftigungsart1(ba1code, ba1bez, ba1kurzbz, ba1bis_code) VALUES(108,'Studentische Hilfskraft (Echter DV)','Stud. Hilfskraft (Echter DV)', 3); + UPDATE bis.tbl_bisverwendung SET ba1code=107 WHERE ba1code=106; + UPDATE bis.tbl_bisverwendung SET ba1code=108 WHERE ba1code=103 AND EXISTS( + SELECT 1 FROM public.tbl_benutzerfunktion + WHERE uid=tbl_bisverwendung.mitarbeiter_uid AND funktion_kurzbz='hilfskraft' AND + ( + datum_von BETWEEN tbl_bisverwendung.beginn AND tbl_bisverwendung.ende + OR + datum_bis BETWEEN tbl_bisverwendung.beginn AND tbl_bisverwendung.ende + ) + ); + "; + + $qry .= " + UPDATE bis.tbl_beschaeftigungsart1 SET ba1bez='Dienstverhältnis zur postsekundären Bildungseinrichtung oder deren Träger' WHERE ba1code=103; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1kurzbz='Lehr- oder Ausbildungsverhältnis', ba1bez='Lehr- oder Ausbildungsverhältnis' WHERE ba1code=104; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1kurzbz='Freier Dienstvertrag (Sonstiges)', ba1bez='Sonstiges Beschäftigungsverhältnis' WHERE ba1code=105; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1kurzbz='Andere Bildungseinrichtung', ba1bez='Dienstverhältnis zu einer anderen Bildungseinrichtung oder einem anderen Träger' WHERE ba1code=106; + "; + + /* + Verwendungs Kodextabelle aktualisieren + + VerwendungCode alt 1 => VerwendungsCode neu 1 + VerwendungCode alt 2 => VerwendungsCode neu 2 + VerwendungCode alt 3 => VerwendungsCode neu 3 + VerwendungCode alt 4 => VerwendungsCode neu 4 + VerwendungCode alt 5 => VerwendungsCode neu 5 + VerwendungCode alt 6 => VerwendungsCode neu 5 + VerwendungCode alt 7 => VerwendungsCode neu 5 + VerwendungCode alt 8 => VerwendungsCode neu 6 + VerwendungCode alt 9 => VerwendungsCode neu 7 + */ + + $qry .= " + UPDATE bis.tbl_bisverwendung SET verwendung_code=5 WHERE verwendung_code=6; + UPDATE bis.tbl_bisverwendung SET verwendung_code=5 WHERE verwendung_code=7; + UPDATE bis.tbl_bisverwendung SET verwendung_code=6 WHERE verwendung_code=8; + UPDATE bis.tbl_bisverwendung SET verwendung_code=7 WHERE verwendung_code=9; + + UPDATE bis.tbl_verwendung SET verwendungbez='wissenschaftliche Lehre und Forschung' WHERE verwendung_code=1; + UPDATE bis.tbl_verwendung SET verwendungbez='wissenschaftliche Mitarbeit in Lehre und Forschung' WHERE verwendung_code=2; + UPDATE bis.tbl_verwendung SET verwendungbez='professionelle Unterstützung der Studierenden in akademischen Belangen' WHERE verwendung_code=3; + UPDATE bis.tbl_verwendung SET verwendungbez='professionelle Unterstützung der Studierenden in Gesundheits- und Sozialbelangen' WHERE verwendung_code=4; + UPDATE bis.tbl_verwendung SET verwendungbez='Management' WHERE verwendung_code=5; + UPDATE bis.tbl_verwendung SET verwendungbez='Verwaltung' WHERE verwendung_code=6; + UPDATE bis.tbl_verwendung SET verwendungbez='Wartung und Betrieb' WHERE verwendung_code=7; + + DELETE FROM bis.tbl_verwendung WHERE verwendung_code=8; + DELETE FROM bis.tbl_verwendung WHERE verwendung_code=9; + "; + + if(!$db->db_query($qry)) + echo 'bis.tbl_verwendung und bis.tbl_beschaeftigungsart: '.$db->db_last_error().'
'; + else + echo '
Verwendung und Beschaeftigungsart für BIS Version 6.8 aktualisiert.'; +} // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -3535,7 +3631,7 @@ $tabellen=array( "bis.tbl_bisio_aufenthaltfoerderung" => array("bisio_id","aufenthaltfoerderung_code"), "bis.tbl_ausbildung" => array("ausbildungcode","ausbildungbez","ausbildungbeschreibung"), "bis.tbl_berufstaetigkeit" => array("berufstaetigkeit_code","berufstaetigkeit_bez","berufstaetigkeit_kurzbz"), - "bis.tbl_beschaeftigungsart1" => array("ba1code","ba1bez","ba1kurzbz"), + "bis.tbl_beschaeftigungsart1" => array("ba1code","ba1bez","ba1kurzbz","ba1bis_code"), "bis.tbl_beschaeftigungsart2" => array("ba2code","ba2bez"), "bis.tbl_beschaeftigungsausmass" => array("beschausmasscode","beschausmassbez","min","max"), "bis.tbl_besqual" => array("besqualcode","besqualbez"), diff --git a/vilesci/bis/checkverwendung.php b/vilesci/bis/checkverwendung.php index faf0e500e..5c6917110 100644 --- a/vilesci/bis/checkverwendung.php +++ b/vilesci/bis/checkverwendung.php @@ -40,19 +40,19 @@ $rechte->getBerechtigungen($uid); if(!$rechte->isBerechtigt('mitarbeiter/stammdaten', null,'suid')) die('Sie haben keine Berechtigung für diese Seite'); -$error_log=''; -$fehler=0; +$error_log = ''; +$fehler = 0; $text = ''; -$anzahl_quelle=0; -$anzahl_eingefuegt=0; -$anzahl_update=0; -$anzahl_fehler=0; -$ausgabe=''; -$error_log_fas=''; -$update=false; -$bismeldedatum=date("Y-m-d", mktime(0, 0, 0, 9, 1, date("Y"))); -$bismeldedatumvorjahr=date("Y-m-d", mktime(0, 0, 0, 9, 1, date("Y")-1)); +$anzahl_quelle = 0; +$anzahl_eingefuegt = 0; +$anzahl_update = 0; +$anzahl_fehler = 0; +$ausgabe = ''; +$error_log_fas = ''; +$update = false; +$bismeldedatum_start = date("Y-m-d", mktime(0, 0, 0, 1, 1, date("Y")-1)); +$bismeldedatum_ende = date("Y-m-d", mktime(0, 0, 0, 12, 31, date("Y")-1)); $ba1_arr = array(); $qry = "SELECT * FROM bis.tbl_beschaeftigungsart1"; @@ -141,14 +141,14 @@ if($resultall = $db->db_query($qryall)) AND mitarbeiter_uid=".$db->db_add_param($rowall->uid)." ORDER BY beginn"; - if($result = $db->db_query($qry)) + if ($result = $db->db_query($qry)) { - $num_rows=$db->db_num_rows($result); - if($num_rows>1) + $num_rows = $db->db_num_rows($result); + if ($num_rows > 1) { - while($row=$db->db_fetch_object($result)) + while ($row = $db->db_fetch_object($result)) { - if($i==0) + if ($i == 0) { echo "
@@ -165,7 +165,7 @@ if($resultall = $db->db_query($qryall)) $row->beginn." - ".$row->ende."
"; } } - elseif($num_rows==0) + elseif ($num_rows == 0) echo "
Aktive(r) Mitarbeiter(in): ".$rowall->nachname." ".$rowall->vorname." hat ".$num_rows." aktuelle Verwendungen:
"; } @@ -188,14 +188,14 @@ $qryall = ' ) GROUP BY uid, nachname, vorname ORDER by nachname, vorname;'; -if($resultall = $db->db_query($qryall)) +if ($resultall = $db->db_query($qryall)) { - $num_rows_all=$db->db_num_rows($resultall); + $num_rows_all = $db->db_num_rows($resultall); echo "

Bei $num_rows_all aktiven Fixangestellten Mitarbeitern sind keine aktuellen Verwendungen eingetragen

"; - while($rowall=$db->db_fetch_object($resultall)) + while ($rowall = $db->db_fetch_object($resultall)) { - $i=0; - $qry=" + $i = 0; + $qry = " SELECT * FROM @@ -207,12 +207,12 @@ if($resultall = $db->db_query($qryall)) AND mitarbeiter_uid=".$db->db_add_param($rowall->uid)." ORDER by beginn"; - if($result = $db->db_query($qry)) + if ($result = $db->db_query($qry)) { $num_rows=$db->db_num_rows($result); - while($row=$db->db_fetch_object($result)) + while ($row=$db->db_fetch_object($result)) { - if($i==0) + if ($i == 0) { echo "
@@ -233,7 +233,7 @@ if($resultall = $db->db_query($qryall)) } //3 - nicht aktive mitarbeiter mitarbeiter mit aktueller verwendung -$qryall=' +$qryall = ' SELECT uid, nachname, vorname FROM @@ -246,14 +246,14 @@ $qryall=' GROUP BY uid, nachname, vorname ORDER by nachname, vorname;'; -if($resultall = $db->db_query($qryall)) +if ($resultall = $db->db_query($qryall)) { $num_rows_all=$db->db_num_rows($resultall); echo "

Bei $num_rows_all nicht aktiven Mitarbeitern sind die aktuellen Verwendungen nicht plausibel (inaktiv aber aktuelle Verwendung)

"; - while($rowall=$db->db_fetch_object($resultall)) + while ($rowall = $db->db_fetch_object($resultall)) { - $i=0; - $qry=" + $i = 0; + $qry = " SELECT * FROM @@ -263,12 +263,12 @@ if($resultall = $db->db_query($qryall)) AND mitarbeiter_uid=".$db->db_add_param($rowall->uid)." ORDER BY beginn"; - if($result = $db->db_query($qry)) + if ($result = $db->db_query($qry)) { - $num_rows=$db->db_num_rows($result); - while($row=$db->db_fetch_object($result)) + $num_rows = $db->db_num_rows($result); + while ($row = $db->db_fetch_object($result)) { - if($i==0) + if ($i == 0) { echo "
@@ -287,16 +287,17 @@ if($resultall = $db->db_query($qryall)) } } } -//4 - wenn hauptberuf=j dann sollte verwendung=1,5,6 sein - check -$qryall=" +//4 - wenn hauptberufcode gesetzt ist, muss die Verwendung 1 sein +$qryall = " SELECT uid, nachname, vorname FROM campus.vw_mitarbeiter JOIN bis.tbl_bisverwendung ON (uid=mitarbeiter_uid) WHERE - verwendung_code NOT IN ('1','5','6') + verwendung_code NOT IN ('1') AND hauptberuflich=true + AND (tbl_bisverwendung.ende>".$db->db_add_param($bismeldedatum_start)." or tbl_bisverwendung.ende is null) GROUP BY uid, nachname, vorname ORDER by nachname, vorname, uid;"; @@ -304,8 +305,7 @@ if($resultall = $db->db_query($qryall)) { $num_rows_all=$db->db_num_rows($resultall); echo "

Bei $num_rows_all Mitarbeitern sind die Eintragungen 'hauptberuflich' nicht plausibel

"; - echo "hauptberuflich=ja, aber Verwendung nicht ". - $verwendung_arr[1].", ".$verwendung_arr[5]." oder ".$verwendung_arr[6]; + echo "hauptberuflich=ja, aber Verwendung nicht ".$verwendung_arr[1]; while($rowall=$db->db_fetch_object($resultall)) { @@ -316,9 +316,10 @@ if($resultall = $db->db_query($qryall)) FROM bis.tbl_bisverwendung WHERE - verwendung_code NOT IN ('1','5','6') + verwendung_code NOT IN ('1') AND hauptberuflich=true AND mitarbeiter_uid=".$db->db_add_param($rowall->uid)." + AND (tbl_bisverwendung.ende>".$db->db_add_param($bismeldedatum_start)." or tbl_bisverwendung.ende is null) ORDER BY beginn"; if($result = $db->db_query($qry)) @@ -342,6 +343,7 @@ if($resultall = $db->db_query($qryall)) } } //5 - stimmt beschausmasscode mit vertragsstunden überein? +/* Beschaeftigungsausmass nicht mehr relevant $qryall=" SELECT uid, nachname, vorname @@ -403,6 +405,7 @@ if($resultall = $db->db_query($qryall)) } } } +*/ //6 - aktive, freie lektoren auf verwendung 1 oder 2 prüfen $qryall=" SELECT diff --git a/vilesci/bis/personal_lektorenohnelehrauftrag.php b/vilesci/bis/personal_lektorenohnelehrauftrag.php index ab75e6a90..1cc1fbe0f 100644 --- a/vilesci/bis/personal_lektorenohnelehrauftrag.php +++ b/vilesci/bis/personal_lektorenohnelehrauftrag.php @@ -219,7 +219,7 @@ if ($result = $db->db_query($qry)) echo '

Anzahl:'.$db->db_num_rows($result); echo '
Beendingungsdatum der Verwendung: - +


diff --git a/vilesci/bis/personalmeldung_uebersicht.php b/vilesci/bis/personalmeldung_uebersicht.php index c640d09d3..7f14dd4ef 100644 --- a/vilesci/bis/personalmeldung_uebersicht.php +++ b/vilesci/bis/personalmeldung_uebersicht.php @@ -42,10 +42,6 @@ echo 'Plausibilitätsprüfungen Verwendungen
Diverse Prüfungen auf inkonsistente Daten

-
  • - Funktionen generieren
    - Funktionen zu den Verwendungen generieren (SWS pro Studiengang)

    -
  • Meldung generieren
    Abschließende Plausibilitätsprüfungen durchführen und Meldung generieren

    From 59cc8b78f90a0d0afd54713a22c5986c9d7a39fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Thu, 5 Mar 2020 12:05:47 +0100 Subject: [PATCH 03/24] Spaltenbezeichnung fuer BIS Code korrigiert --- system/dbupdate_3.3.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 455ee4cb6..2700bf43d 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -3529,7 +3529,7 @@ if($result = $db->db_query("SELECT * FROM pg_proc WHERE proname = 'transform_ges /** * Anpassungen fuer BIS Personalmeldung 6.8 */ -if (!$result = @$db->db_query("SELECT ba1bis_code FROM bis.tbl_beschaeftigungsart1 LIMIT 1")) +if (!$result = @$db->db_query("SELECT ba1code_bis FROM bis.tbl_beschaeftigungsart1 LIMIT 1")) { /* Beschaeftigungsausmass Kodextabelle aktualisieren @@ -3545,13 +3545,13 @@ if (!$result = @$db->db_query("SELECT ba1bis_code FROM bis.tbl_beschaeftigungsar BA1code wird um 100 erhöht damit klar ist, dass es sich um einen anderen Code handelt. */ $qry = " - ALTER TABLE bis.tbl_beschaeftigungsart1 ADD COLUMN ba1bis_code smallint; - UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=1, ba1code=101 WHERE ba1code=1; - UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=2, ba1code=102 WHERE ba1code=2; - UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=3, ba1code=103 WHERE ba1code=3; - UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=5, ba1code=105 WHERE ba1code=4; - UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=4, ba1code=104 WHERE ba1code=5; - UPDATE bis.tbl_beschaeftigungsart1 SET ba1bis_code=6, ba1code=106 WHERE ba1code=6; + ALTER TABLE bis.tbl_beschaeftigungsart1 ADD COLUMN ba1code_bis smallint; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1code_bis=1, ba1code=101 WHERE ba1code=1; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1code_bis=2, ba1code=102 WHERE ba1code=2; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1code_bis=3, ba1code=103 WHERE ba1code=3; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1code_bis=5, ba1code=105 WHERE ba1code=4; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1code_bis=4, ba1code=104 WHERE ba1code=5; + UPDATE bis.tbl_beschaeftigungsart1 SET ba1code_bis=6, ba1code=106 WHERE ba1code=6; "; /* @@ -3563,8 +3563,8 @@ if (!$result = @$db->db_query("SELECT ba1bis_code FROM bis.tbl_beschaeftigungsar Alle Personen mit einer Funktion als Hilfskraft werden auf diese Beschaeftigungsart geaendert. */ $qry .= " - INSERT INTO bis.tbl_beschaeftigungsart1(ba1code, ba1bez, ba1kurzbz, ba1bis_code) VALUES(107,'Werkvertrag (Sonstiges)','Werkvertrag (Sonstiges)', 5); - INSERT INTO bis.tbl_beschaeftigungsart1(ba1code, ba1bez, ba1kurzbz, ba1bis_code) VALUES(108,'Studentische Hilfskraft (Echter DV)','Stud. Hilfskraft (Echter DV)', 3); + INSERT INTO bis.tbl_beschaeftigungsart1(ba1code, ba1bez, ba1kurzbz, ba1code_bis) VALUES(107,'Werkvertrag (Sonstiges)','Werkvertrag (Sonstiges)', 5); + INSERT INTO bis.tbl_beschaeftigungsart1(ba1code, ba1bez, ba1kurzbz, ba1code_bis) VALUES(108,'Studentische Hilfskraft (Echter DV)','Stud. Hilfskraft (Echter DV)', 3); UPDATE bis.tbl_bisverwendung SET ba1code=107 WHERE ba1code=106; UPDATE bis.tbl_bisverwendung SET ba1code=108 WHERE ba1code=103 AND EXISTS( SELECT 1 FROM public.tbl_benutzerfunktion @@ -3631,7 +3631,7 @@ $tabellen=array( "bis.tbl_bisio_aufenthaltfoerderung" => array("bisio_id","aufenthaltfoerderung_code"), "bis.tbl_ausbildung" => array("ausbildungcode","ausbildungbez","ausbildungbeschreibung"), "bis.tbl_berufstaetigkeit" => array("berufstaetigkeit_code","berufstaetigkeit_bez","berufstaetigkeit_kurzbz"), - "bis.tbl_beschaeftigungsart1" => array("ba1code","ba1bez","ba1kurzbz","ba1bis_code"), + "bis.tbl_beschaeftigungsart1" => array("ba1code","ba1bez","ba1kurzbz","ba1code_bis"), "bis.tbl_beschaeftigungsart2" => array("ba2code","ba2bez"), "bis.tbl_beschaeftigungsausmass" => array("beschausmasscode","beschausmassbez","min","max"), "bis.tbl_besqual" => array("besqualcode","besqualbez"), From 040dfccf7d4d38db1f17b08dc538455fc8c3ba3c Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 5 Mar 2020 14:23:09 +0100 Subject: [PATCH 04/24] BIS Personalmeldung NEU: Container Person und Container Verwendung * Einholen von BIS relevanten Personen- und deren Verwendungsdaten * Konstruktion von Container Person * Konstruktion von Verwendung Container - Berechnung von JVZAE - Berechnung von VZAE - Beruecksichtigung von . Karenzen / TZ-Bildungskarenzen . Echten Dienstvertraegen (mit und ohne inkludierte Lehrtaetigkeit) . Freie Lektoren auf SWS Stundenbasis --- vilesci/bis/personalmeldung.php | 843 ++++++++++++++------------------ 1 file changed, 369 insertions(+), 474 deletions(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 534b54ed9..2f5745dd7 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -1,32 +1,14 @@ - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > - */ require_once('../../config/vilesci.config.inc.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/datum.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/functions.inc.php'); +require_once('../../include/bisverwendung.class.php'); +require_once('../../include/mitarbeiter.class.php'); require_once('../../include/studiengang.class.php'); +require_once('../../include/lehreinheitmitarbeiter.class.php'); $uid = get_uid(); @@ -39,510 +21,423 @@ if(!$rechte->isBerechtigt('mitarbeiter/stammdaten',null,'suid')) if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); -$error_log=''; -$error_log1=''; -$error_log_all=""; -$mitarbeiter_data=array(); -$mitarbeiter_gesamt=array(); -$stgart=''; -$fehler=''; -$v=''; -$erhalter=''; -$zaehl=0; -$eteam=array(); -$studiensemester=new studiensemester(); -if(isset($_GET['stsem'])) - $stsem = $_GET['stsem']; -else - $stsem=$studiensemester->getaktorNext(1); //aktuelles Semester +if (!defined('BIS_VOLLZEIT_ARBEITSSTUNDEN') || empty('BIS_VOLLZEIT_ARBEITSSTUNDEN')) +{ + die('config var BIS_VOLLZEIT_ARBEITSSTUNDEN fehlt'); +} -$datei=''; -$mitarbeiterzahl=0; -$echt=0; -$frei=0; +if (!defined('BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS') || empty('BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS')) +{ + die('config var BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS fehlt'); +} -$nichtmelden = array(11,91,92,94,999,203,145,204,308,182,222); +if (!defined('BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE') || empty('BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE')) +{ + die('config var BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE fehlt'); +} -$datumobj=new datum(); +if (!defined('BIS_EXCLUDE_STG') || empty('BIS_EXCLUDE_STG')) +{ + die('config var BIS_EXCLUDE_STG fehlt'); +} -if(mb_strstr($stsem,"WS")) +if (!defined('BIS_HALBJAHRES_GEWICHTUNG_SWS') || empty('BIS_HALBJAHRES_GEWICHTUNG_SWS')) +{ + die('config var BIS_HALBJAHRES_GEWICHTUNG_SWS fehlt'); +} + + +// Prüfe Zeitraum zur Erstellung einer BIS-Meldung +$studiensemester = new studiensemester(); +$stsem = (isset($_GET['stsem'])) ? $_GET['stsem'] : $studiensemester->getaktorNext(1); // aktuelles Studiensemester + +$datum_obj = new datum(); +if(mb_strstr($stsem,'SS')) { $studiensemester->load($stsem); - $jahr = $datumobj->formatDatum($studiensemester->start, 'Y'); - $bisdatum=date("Y-m-d", mktime(0, 0, 0, 9, 1, $jahr)); - $bisprevious=date("Y-m-d", mktime(0, 0, 0, 9, 1, $jahr-1)); + $jahr = $datum_obj->formatDatum($studiensemester->start, 'Y'); + $stichtag = date("Y-m-d", mktime(0, 0, 0, 12, 31, $jahr - 1)); // 31.12. des vorangehenden Kalenderjahres zur BIS Meldung TODO: oder Abfragetag mitgeben? } else { - echo "Fehler: Studiensemester muss ein Wintersemester sein"; + echo "Fehler: Studiensemester muss ein Sommersemester sein"; exit; } -$qry="SELECT * FROM public.tbl_erhalter"; -if($result = $db->db_query($qry)) +$beginn_imJahr = new DateTime(($jahr - 1). '-01-01'); +$ende_imJahr = new DateTime(($jahr - 1). '-12-31'); + +$tage_imJahr = $ende_imJahr->diff($beginn_imJahr)->days + 1; + +// Sommer- und Wintersemester im BIS Meldungsjahr +$ss_kurzbz = $studiensemester->getBeforePrevious(); +$ws_kurzbz = $studiensemester->getStudienjahrStudiensemester($stsem); +$ss = new studiensemester($ss_kurzbz); +$ws = new studiensemester($ws_kurzbz); + +// Alle gemeldeten Mitarbeiter holen +$mitarbeiter = new mitarbeiter(); +$mitarbeiter->getMitarbeiterBISMeldung($beginn_imJahr->format('Y-m-d')); +$mitarbeiter_arr = $mitarbeiter->result; + +// ********************************************************************************************************************* +// Container Person generieren +// ********************************************************************************************************************* +$person_arr = array(); + +foreach ($mitarbeiter_arr as $mitarbeiter) { - if($row = $db->db_fetch_object($result)) + $person_obj = new StdClass(); + + $person_obj->personalnummer = $mitarbeiter->personalnummer; + $person_obj->uid = $mitarbeiter->uid; + $person_obj->geschlecht = $mitarbeiter->geschlecht; + $person_obj->geschlechtX = $mitarbeiter->geschlechtX; + $person_obj->geburtsjahr = $datum_obj->formatDatum($mitarbeiter->gebdatum, 'Y'); + $person_obj->staatsangehoerigkeit = $mitarbeiter->staatsbuergerschaft; + $person_obj->hoechste_abgeschlossene_ausbildung = $mitarbeiter->ausbildungcode; + + // Habilitation + $bisverwendung = new bisverwendung(); + $person_obj->habilitation = $bisverwendung->isHabilitiert($mitarbeiter->uid) ? 'j' : 'n'; + + // Alle im FAS gemeldeten BIS-Verwendungen holen + $bisverwendung = new bisverwendung(); + $bisverwendung->getVerwendungenBISMeldung($mitarbeiter->uid, $stichtag); + $bisverwendung_arr = $bisverwendung->result; // alle im FAS gemeldeten BIS Verwendungen + + // BIS Verwendungsdauer und -gewichtung ergaenzen + $bisverwendung_arr = _addDauerGewichtung_imBISMeldungsjahr($bisverwendung_arr); + + // Hauptberufcode: wenn Hauptberuf / Nebenberuf im gleichen Jahr - laengere Dauer entscheidet + // ----------------------------------------------------------------------------------------------------------------- + $is_hauptberuflich = $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberuflich; // default: hauptberuflich der letzten BIS-Verwendung + + // Wenn im selben Jahr hauptberuflich UND nebenberuflich -> laengere Dauer wird gemeldet (Ueberwiegenheitprinzip) + if (in_array(true, array_column($bisverwendung_arr, 'hauptberuflich')) && // hauptberuflich UND + in_array(false, array_column($bisverwendung_arr, 'hauptberuflich'))) // nebenberuflich { - $erhalter = sprintf("%03s",trim($row->erhalter_kz)); + $is_hauptberuflich = _getUeberwiegendeTaetigkeit_HauptNebenberuf($bisverwendung_arr); } -} -$ba1_arr = array(); -$qry = "SELECT * FROM bis.tbl_beschaeftigungsart1"; -if($result = $db->db_query($qry)) - while($row = $db->db_fetch_object($result)) - $ba1_arr[$row->ba1code]=$row->ba1kurzbz; + /** + * Hauptberufcode + * - hauptberuflich Lehrender: NULL, + * - nebenberuflich Lehrender: Hauptberufscode der letzten BIS-Verwendung + */ + $person_obj->hauptberufcode = ($is_hauptberuflich == true) ? NULL : $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberufcode; -$ba2_arr = array(); -$qry = "SELECT * FROM bis.tbl_beschaeftigungsart2"; -if($result = $db->db_query($qry)) - while($row = $db->db_fetch_object($result)) - $ba2_arr[$row->ba2code]=$row->ba2bez; + // ----------------------------------------------------------------------------------------------------------------- + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + // ----------------------------------------------------------------------------------------------------------------- -$verwendung_arr = array(); -$qry = "SELECT * FROM bis.tbl_verwendung"; -if($result = $db->db_query($qry)) - while($row = $db->db_fetch_object($result)) - $verwendung_arr[$row->verwendung_code]=$row->verwendungbez; + // Lehrtaetigkeit ermitteln + $lema = new lehreinheitmitarbeiter(); + $lema->getLehreinheiten_SWS_BISMeldung($person_obj->uid, $ss_kurzbz); + $lehre_ss_sws = $lema->result[0]; // Anzahl SS - Semesterwochenstunden -$ausmass_arr = array(); -$qry = "SELECT * FROM bis.tbl_beschaeftigungsausmass"; -if($result = $db->db_query($qry)) - while($row = $db->db_fetch_object($result)) - $ausmass_arr[$row->beschausmasscode]=$row->beschausmassbez; + $lema = new lehreinheitmitarbeiter(); + $lema->getLehreinheiten_SWS_BISMeldung($person_obj->uid, $ws_kurzbz); + $lehre_ws_sws = $lema->result[0]; // Anzahl WS - Semesterwochenstunden -$stg_obj = new studiengang(); -$stg_obj->getAll(null,false); + $has_lehrtaetigkeit = !is_null($lehre_ss_sws) || !is_null($lehre_ws_sws); -$qry=" - SELECT DISTINCT ON (UID) *, transform_geschlecht(tbl_person.geschlecht, tbl_person.gebdatum) as geschlecht_imputiert - FROM - public.tbl_mitarbeiter - JOIN public.tbl_benutzer ON(mitarbeiter_uid=uid) - JOIN public.tbl_person USING(person_id) - JOIN bis.tbl_bisverwendung USING(mitarbeiter_uid) - WHERE - bismelden - AND personalnummer>0 - AND (tbl_bisverwendung.ende is NULL OR tbl_bisverwendung.ende>".$db->db_add_param($bisprevious).") - ORDER BY uid, nachname,vorname - "; - -if($result = $db->db_query($qry)) -{ - - $datei.=" - - ".$erhalter." - ".date("dmY", mktime(0, 0, 0, 11, 15, $jahr))." - "; - while($row = $db->db_fetch_object($result)) + foreach ($bisverwendung_arr as $index => $bisverwendung) { - $mitarbeiter_data=array(); + $has_vertragsstunden = !is_null($bisverwendung->vertragsstunden) && !empty($bisverwendung->vertragsstunden); + $is_lektor = $bisverwendung->verwendung_code == 1 || $bisverwendung->verwendung_code == 2; - $error_person = false; - $person_content=''; - $qryet="SELECT * FROM bis.tbl_entwicklungsteam WHERE mitarbeiter_uid=".$db->db_add_param($row->mitarbeiter_uid).";"; - if($resultet=$db->db_query($qryet)) + /** + * NOTE: is_karenziert ist ein boolean fuer Vollzeit-Karenz, nicht fuer Teilzeit-(Bildungs-)Karenz! + * Die Unterscheidung ist wichtig fuer die weitere Ermittlung der JVZAE. + * Vollzeitkarenz: Anteiliger Beschaeftigungsausmass und JVZAE wird auf 0 gesetzt. + * Bildungs-Teilzeitkarenz: entspricht im System + */ + $is_karenziert_VZ = $bisverwendung->beschausmasscode == 5 && !$has_vertragsstunden; // VZ-Kinder- und Bildungskarenz + $is_karenziert_TZ = $bisverwendung->beschausmasscode == 5 && $has_vertragsstunden; // TZ-Bildungskarenz + + // Karenzzeit + // ------------------------------------------------------------------------------------------------------------- + if ($is_karenziert_VZ) { - while($rowet=$db->db_fetch_object($resultet)) + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = number_format(0.00, 2); + $bisverwendung->jvzae_anteilig = 0; + continue; + } + + // Echter Dienstvertrag - d.h. Vertragsstunden sind vorhanden + // Bsp. angestellte Lektoren, angestellte MA in Verwaltung/Management/Wartung + // ------------------------------------------------------------------------------------------------------------- + else if ($has_vertragsstunden) + { + // Vertragsstunden koennen max. VZ Aequivalenz-Basiswert haben + if ($bisverwendung->vertragsstunden > BIS_VOLLZEIT_ARBEITSSTUNDEN) { - $eteam[$rowet->studiengang_kz]=$rowet->besqualcode; + $bisverwendung->vertragsstunden = BIS_VOLLZEIT_ARBEITSSTUNDEN; } - } - $error_log=''; - if($row->gebdatum=='' || $row->gebdatum==NULL) - { - $error_log.=($error_log!=''?', ':'')."Geburtsdatum ('".$row->gebdatum."')"; - } - if($row->geschlecht=='' || $row->geschlecht==NULL) - { - $error_log.=($error_log!=''?', ':'')."Geschlecht ('".$row->geschlecht."')"; - } - if($row->ausbildungcode=='' || $row->ausbildungcode==NULL) - { - $error_log.=($error_log!=''?', ':'')."HoechsteAbgeschlosseneAusbildung ('".$row->ausbildungcode."')"; - } - $mitarbeiter_data['uid']=$row->uid; - $mitarbeiter_data['personalnummer']=sprintf("%015s",$row->personalnummer); - $mitarbeiter_data['vorname']=$row->vorname; - $mitarbeiter_data['nachname']=$row->nachname; - $mitarbeiter_data['fixangestellt']=($row->fixangestellt=='t'?true:false); - $mitarbeiter_data['lektor']=($row->lektor=='t'?true:false); + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = round($bisverwendung->vertragsstunden / BIS_VOLLZEIT_ARBEITSSTUNDEN, 2); + $bisverwendung->jvzae_anteilig = round($bisverwendung->beschaeftigungsausmass_relativ * $bisverwendung->gewichtung, 2); + + // Echter Dienstvertrag - mit Lehrtaetigkeit, jedoch kein Lektor. + // Bsp. STG-Leiter mit Lehrtaetigkeit + // --------------------------------------------------------------------------------------------------------- + if (!$is_lektor && $has_lehrtaetigkeit) + { + /** + * Verwendungen ergänzen, wenn Mitarbeiter in Verwaltung/Managment/Wartung (jedenfalls nicht in Lehre) + * zugeteilt ist und dennoch lehrt. + * Die SWS werden sowohl fuer Sommer- als auch Wintersemster ermittelt und jeweils in einer eigenen + * Verwendung mit dem Verwendungscode 1 ergaenzt. + */ + $bisverwendung_beginn_BIS = new DateTime($bisverwendung->beginn_imBISMeldungsJahr); + $bisverwendung_ende_BIS = new DateTime($bisverwendung->ende_imBISMeldungsJahr); - $person_content.=" - - ".sprintf("%015s",$row->personalnummer)." - ".date("dmY", $datumobj->mktime_fromdate($row->gebdatum))." - ".strtoupper($row->geschlecht).""; - if ($row->geschlecht == 'x') - $person_content.=" - ".strtoupper($row->geschlecht_imputiert).""; - - $person_content.=" - ".$row->ausbildungcode.""; - $qryvw="SELECT * FROM bis.tbl_bisverwendung WHERE mitarbeiter_uid=".$db->db_add_param($row->mitarbeiter_uid)." AND habilitation=true;"; - if($resultvw=$db->db_query($qryvw)) - { - if($db->db_num_rows($resultvw)>0) - { - $person_content.=" - J"; - } - else - { - $person_content.=" - N"; - } - } - $qryvw="SELECT * FROM bis.tbl_bisverwendung WHERE mitarbeiter_uid=".$db->db_add_param($row->mitarbeiter_uid)." AND (ende is null OR ende>".$db->db_add_param($bisprevious).") AND (beginn<".$db->db_add_param($bisdatum)." OR beginn is null);"; - if($resultvw=$db->db_query($qryvw)) - { - if($db->db_num_rows($resultvw)>0) - { - $verwendung_data=array(); - while($rowvw=$db->db_fetch_object($resultvw)) + foreach (array($ss_kurzbz => $lehre_ss_sws, $ws_kurzbz => $lehre_ws_sws) as $studsem_kurzbz => $lehre_sws) { - if($rowvw->ba1code=='' || $rowvw->ba1code==NULL) - { - $error_log.=($error_log!=''?', ':'')."Beschaeftigungsart1 ('".$rowvw->ba1code."')"; - } - if($rowvw->ba2code=='' || $rowvw->ba2code==NULL) - { - $error_log.=($error_log!=''?', ':'')."Beschaeftigungsart2 ('".$rowvw->ba2code."')"; - } - if($rowvw->beschausmasscode=='' || $rowvw->beschausmasscode==NULL) - { - $error_log.=($error_log!=''?', ':'')."BeschaeftigungsAusmass ('".$rowvw->beschausmasscode."')"; - } - if($rowvw->verwendung_code=='' || $rowvw->verwendung_code==NULL) - { - $error_log.=($error_log!=''?', ':'')."VerwendungsCode ('".$rowvw->verwendung_code."')"; - } - if(!$rowvw->hauptberuflich && ($rowvw->hauptberufcode=='' || $rowvw->hauptberufcode==NULL)) - { - $error_log.=($error_log!=''?', ':'')."Hauptberuf ('".$rowvw->hauptberufcode."')"; - } - if($rowvw->ba1code==3) - { - $echt++; - } - if($rowvw->ba1code==4) - { - $frei++; - } - $key = $rowvw->ba1code.'/'.$rowvw->ba2code.'/'.$rowvw->beschausmasscode.'/'.$rowvw->verwendung_code; - $verwendung_data[$key]['ba1code']=$rowvw->ba1code; - $verwendung_data[$key]['ba2code']=$rowvw->ba2code; - $verwendung_data[$key]['beschausmasscode']=$rowvw->beschausmasscode; - $verwendung_data[$key]['verwendung_code']=$rowvw->verwendung_code; + $studsem = new studiensemester($studsem_kurzbz); + $studsem_start = new DateTime($studsem->start); + $studsem_ende = new DateTime($studsem->ende); - - - //Studiengangsleiter - $qryslt="SELECT - tbl_benutzerfunktion.*, tbl_studiengang.studiengang_kz - FROM public.tbl_benutzerfunktion JOIN public.tbl_studiengang USING(oe_kurzbz) - WHERE - uid=".$db->db_add_param($row->mitarbeiter_uid)." - AND funktion_kurzbz='Leitung' - AND (datum_von<".$db->db_add_param($bisdatum)." OR datum_von is null) - AND (datum_bis>".$db->db_add_param($bisprevious)." OR datum_bis is NULL) - AND studiengang_kz>0 - AND studiengang_kz<10000;"; - if($resultslt=$db->db_query($qryslt)) + // Wenn Lehrzeit in die BIS Verwendungszeit hineinfaellt, Verwendung erstellen + if (!is_null($lehre_sws) && + (!($studsem_start > $bisverwendung_ende_BIS) && + !($studsem_ende < $bisverwendung_beginn_BIS))) { - while($rowslt=$db->db_fetch_object($resultslt)) - { - if($rowslt->studiengang_kz=='' || $rowslt->studiengang_kz==NULL) - { - $error_log=($error_log!=''?', ':'')."StgKz(Leitung) ('".$rowslt->studiengang_kz."')"; - } - if(!in_array($rowslt->studiengang_kz, $nichtmelden)) - { - $verwendung_data[$key]['stgltg'][]=$rowslt->studiengang_kz; - } - } - } - //Funktionen - $qryfkt="SELECT * FROM bis.tbl_bisfunktion WHERE bisverwendung_id=".$db->db_add_param($rowvw->bisverwendung_id)." AND studiengang_kz>0 AND studiengang_kz<10000;"; - if($resultfkt=$db->db_query($qryfkt)) - { - while($rowfkt=$db->db_fetch_object($resultfkt)) - { - if($rowfkt->studiengang_kz=='' || $rowfkt->studiengang_kz==NULL) - { - $error_log.=($error_log!=''?', ':'')."StgKz(Funktion) ('".$rowfkt->studiengang_kz."')"; - } - if($rowfkt->sws=='' || $rowfkt->sws==NULL) - { - $error_log.=($error_log!=''?', ':'')."SWS ('".$rowfkt->sws."')"; - } - if($rowvw->hauptberuflich=='' || $rowvw->hauptberuflich==NULL) - { - $error_log.=($error_log!=''?', ':'')."Hauptberuflich ('".$rowvw->hauptberuflich."')"; - } - if(($rowvw->hauptberufcode=='' || $rowvw->hauptberufcode==NULL) && $rowvw->hauptberuflich=='f') - { - $error_log.=($error_log!=''?', ':'')."HauptberufCode ('".$rowvw->hauptberufcode."')"; - } - if (isset($eteam[$rowfkt->studiengang_kz])) - { - if(($eteam[$rowfkt->studiengang_kz]=='' || $eteam[$rowfkt->studiengang_kz]==NULL)) - { - $error_log.=($error_log!=''?', ':'')."BesondereQualifikationCode ('".$eteam[$rowfkt->studiengang_kz]."')"; - } - } + // Verwendung erstellen + list($tage_lehre_imSemester, $verwendung_lehre_obj) = _addVerwendung_fuerLehre_inkludiert($studsem, $bisverwendung); - $verwfkt_found=false; + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE, 2); // VZ-Basis fuer inkludierte Lehre + $verwendung_lehre_obj->gewichtung = ($tage_lehre_imSemester == 182) ? BIS_HALBJAHRES_GEWICHTUNG_SWS : round(BIS_HALBJAHRES_GEWICHTUNG_SWS / ($tage_imJahr / 2) * $tage_lehre_imSemester, 2); + $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 3); - // Wenn mehrere Verwendungen vorhanden sind fuer und funktionen fuer die gleichen Studiengaenge - // dann muessen diese zusammengezaehlt werden - if(isset($verwendung_data[$key]['fkt']) && is_array($verwendung_data[$key]['fkt'])) - { - foreach($verwendung_data[$key]['fkt'] as $key_verwfkt=>$row_verwfkt) - { - if($row_verwfkt['stgkz']==$rowfkt->studiengang_kz) - { - $verwendung_data[$key]['fkt'][$key_verwfkt]['sws']+=$rowfkt->sws; - $verwfkt_found=true; - break; - } - } - } - if(!$verwfkt_found) - { - $verwendung_data[$key]['fkt'][] = array( - 'stgkz'=>$rowfkt->studiengang_kz, - 'sws'=>$rowfkt->sws, - 'hauptberuflich'=>$rowvw->hauptberuflich, - 'hauptberufcode'=>$rowvw->hauptberufcode); - } - } + /** + * Relativen Beschaeftigungsausmass der BIS-Verwendung berichtigen + * (durch Abzug des eben erstellten relativen Beschaeftigungsausmass fuer Lehrtaetigkeiten) + * */ + $bisverwendung->beschaeftigungsausmass_relativ -= $verwendung_lehre_obj->beschaeftigungsausmass_relativ; + + /** + * Anteilige JVZAE der BIS-Verwendung berichtigen + * (durch Abzug der eben erstellten anteiligen JVZAE fuer Lehrtaetigkeiten) + */ + $bisverwendung->jvzae_anteilig -= $verwendung_lehre_obj->jvzae_anteilig; + $bisverwendung_arr [] = $verwendung_lehre_obj; } } - $mitarbeiter_data['verwendung']=$verwendung_data; - //Verwendungen ausgeben - foreach($verwendung_data as $row_verwendung) - { - $person_content.=" - - ".$row_verwendung['ba1code']." - ".$row_verwendung['ba2code']." - ".$row_verwendung['beschausmasscode']." - ".$row_verwendung['verwendung_code'].""; - - if(isset($row_verwendung['stgltg']) && isset($row_verwendung['verwendung_code']) && $row_verwendung['verwendung_code']==5) - { - foreach($row_verwendung['stgltg'] as $row_stgl) - { - $person_content.=" - - ".sprintf("%04s",$row_stgl)." - "; - } - } - if(isset($row_verwendung['fkt'])) - { - foreach($row_verwendung['fkt'] as $row_fkt) - { - $person_content.=" - - ".sprintf("%04s",$row_fkt['stgkz'])." - ".number_format($row_fkt['sws'],2).""; - if($row_fkt['hauptberuflich']=='t') - { - $person_content.=" - J"; - } - else - { - $person_content.=" - N - ".$row_fkt['hauptberufcode'].""; - } - if(isset($eteam[$row_fkt['stgkz']])) - { - $person_content.=" - J - ".$eteam[$row_fkt['stgkz']].""; - } - else - { - $person_content.=" - N"; - } - $person_content.=" - "; - } - } - $person_content.=" - "; - } - } - else + // TODO: Interner Check: if ($bisverwendung->jvzae_anteilig < 0) -> Anteil für 'Nicht-Lehre'-Teil muss gegeben sein. + } + + // Sonstige Beschaeftigungsverhaeltnisse ohne Vertragsstunden + // Freie Dienstvertraege auf Stundenbasis + // ------------------------------------------------------------------------------------------------------------- + else if (!$has_vertragsstunden && $has_lehrtaetigkeit) + { + foreach (array($ss_kurzbz => $lehre_ss_sws, $ws_kurzbz => $lehre_ws_sws) as $studsem => $lehre_sws) { - $qry_count="SELECT 1 FROM bis.tbl_bisverwendung WHERE mitarbeiter_uid=".$db->db_add_param($row->mitarbeiter_uid); - if($result_count=$db->db_query($qry_count)) + if (!is_null($lehre_sws)) { - if($db->db_num_rows($result_count)==0) + // Verwendungen erstellen + $verwendung_lehre_obj = _addVerwendung_fuerLehre_Stundenbasis($bisverwendung); + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS, 2); // VZ-Basis nach BIS-Vorgabe fuer Stundenbasis + $verwendung_lehre_obj->gewichtung = BIS_HALBJAHRES_GEWICHTUNG_SWS; + $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 2); + $bisverwendung_arr []= $verwendung_lehre_obj; + } + } + } + } + + // ***************************************************************************************************************** + // JVZAE und VZAE ermitteln (Jahresvollzeitaequivalenz, Vollzeitaequivalenz) + // ***************************************************************************************************************** + + // Container Verwendung aus dem bisverwendung_arr generieren, formatieren und dem Container Person anhängen + $verwendung_arr = array(); + foreach ($bisverwendung_arr as $bisverwendung) + { + if (empty($verwendung_arr) || // wenn erster Durchlauf ODER + (!(in_array($bisverwendung->ba1code, array_column($verwendung_arr, 'ba1code')) && // im verwendung_arr Beschaeftigungsart1 UND + in_array($bisverwendung->ba2code, array_column($verwendung_arr, 'ba2code')) && // Beschaeftigungsart2 UND + in_array($bisverwendung->verwendung_code, array_column($verwendung_arr, 'verwendung_code'))))) // Verwendung_code noch NICHT vorhanden + { + + // Temporaeren array mit Verwendungen mit gleichem Beschaeftigungsverhaeltnis und gleichem Verwendungscode erstellen + $verwendung_tmp_arr = array_filter($bisverwendung_arr, function ($obj) use ($bisverwendung) { + return + $obj->ba1code == $bisverwendung->ba1code && + $obj->ba2code == $bisverwendung->ba2code && + $obj->verwendung_code == $bisverwendung->verwendung_code; + }); + + // Neue Verwendung fuer Container Verwendung erstellen + $verwendung_obj = new StdClass(); + $verwendung_obj->ba1code = $bisverwendung->ba1code; + $verwendung_obj->ba2code = $bisverwendung->ba2code; + $verwendung_obj->verwendung_code = $bisverwendung->verwendung_code; + $verwendung_obj->jvzae = 0; + $verwendung_obj->vzae = -1; // default + + // Loop innerhalb Verwendungen mit selben Beschaeftigungsverhaeltnissen und Verwendung_codes + foreach ($verwendung_tmp_arr as $verwendung_tmp) + { + + // Jahresvollzeitaequivalenz JVZAE ermitteln + // --------------------------------------------------------------------------------------------------------- + /** + * Berechnung: + * JVZAE wird aus der Summe aller anteiligen JVZE gebildet. + */ + $verwendung_obj->jvzae += (isset($verwendung_tmp->jvzae_anteilig)) ? $verwendung_tmp->jvzae_anteilig * 100 : NULL; // TODO: not null... + + + // Vollzeitaequivalenz VZAE ermitteln (Beschaeftigungsausmass zum Stichtag 31.12) + // --------------------------------------------------------------------------------------------------------- + /** + * Berechnung: + * - Wenn Karenz zum Stichtag 31.12. vorhanden: VZAE = 0.00 + * - Wenn Beschaeftigung zum Stichtag 31.12. vorhanden: VZAE = Beschaeftigungsausmass relativ zu VZ + * - Wenn keine Beschaeftigung zum Stichtag 31.12 vorhanden: VZAE = -1; + */ + $ende_imBISMeldungsJahr = new DateTime($verwendung_tmp->ende_imBISMeldungsJahr); + $is_karenziert_VZ = $verwendung_tmp->beschausmasscode == 5 && $verwendung_tmp->jvzae_anteilig == 0; + if ($ende_imBISMeldungsJahr == $ende_imJahr) + { + if ($is_karenziert_VZ) { - //Keine Verwendung - $v.="$row->mitarbeiter_uid hat keine Verwendung und wird ausgelassen
    "; - $error_person = true; + $verwendung_obj->vzae = number_format(0.00, 2); + break; } else { - //Keine Verwendung im Meldezeitraum - //$v.="$row->mitarbeiter_uid hat keine Verwendung und wird ausgelassen
    "; - $error_person = true; + $verwendung_obj->vzae = (isset($verwendung_tmp->beschaeftigungsausmass_relativ)) ? $verwendung_tmp->beschaeftigungsausmass_relativ * 100 : NULL; // TODO: not null... } } - } } - $mitarbeiterzahl++; - $person_content.=" -
    "; - if($error_log!='' || $error_log1!='') - { - if($error_person) - $v.=''; - $v.="Bei Mitarbeiter (PersNr, UID, Vorname, Nachname) '".$row->personalnummer."','".$row->mitarbeiter_uid."', '".$row->nachname."', '".$row->vorname."': \n"; - if($error_log!='') - { - $v.="     Es fehlt: ".$error_log."\n"; - } - $zaehl++; - $v.="\n"; - $error_log=''; - if($error_person) - $v.=''; - } - else - { - if(!$error_person) - { - $datei.=$person_content; - $mitarbeiter_gesamt[]=$mitarbeiter_data; } + + // Neue Verwendung im finalen Verwendungcontainer speichern + $verwendung_arr [] = $verwendung_obj; } } - $datei.=" -
    -
    "; + + // Container Verwendung dem Container Person anhaengen + // ----------------------------------------------------------------------------------------------------------------- + $person_obj->verwendung_arr = $verwendung_arr; + $person_arr []= $person_obj; } -echo ' BIS - Meldung Mitarbeiter - - '; - include('../../include/meta/jquery.php'); - include('../../include/meta/jquery-tablesorter.php'); -echo ' - '; -echo "

    BIS - Mitarbeiterdaten werden überprüft (für Meldung ".$stsem." / $bisprevious - $bisdatum)


    "; -echo "Anzahl Mitarbeiter: Gesamt: ".$mitarbeiterzahl." / echter Dienstvertrag: ".$echt." / freier Dienstvertrag: ".$frei."

    "; -echo "

    Nicht plausible BIS-Daten


    "; -echo nl2br($v."

    "); - -//Tabelle mit Ergebnissen ausgeben - -$ddd='bisdaten/bismeldung_mitarbeiter.xml'; -$dateiausgabe=fopen($ddd,'w'); -fwrite($dateiausgabe,$datei); -fclose($dateiausgabe); - -echo '

    Folgende Personen werden gemeldet

    -Anzahl:'.count($mitarbeiter_gesamt).' - -
  • - - - - - - - - - - - - - - - -'; - -foreach($mitarbeiter_gesamt as $row) +// --------------------------------------------------------------------------------------------------------------------- +// Private Functions +// --------------------------------------------------------------------------------------------------------------------- +/** + * Funktion ermittelt fuer jede BIS-Verwendung die Dauer (in Tagen) und Gewichtung (Dauer / Tage im Jahr) + * @param array $bisverwendung_arr Array mit BIS-Verwendungsobjekten + * @return array + */ +function _addDauerGewichtung_imBISMeldungsjahr($bisverwendung_arr) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - foreach($row['verwendung'] as $row_verwendung) + global $tage_imJahr; + + foreach ($bisverwendung_arr as &$bisverwendung) { - // Ba1Code - if(isset($ba1_arr[$row_verwendung['ba1code']])) - echo ''; - else - echo ''; + $bisverwendung_beginn_imBISMeldungsJahr = new DateTime($bisverwendung->beginn_imBISMeldungsJahr); + $bisverwendung_ende_imBISMeldungsJahr = new DateTime($bisverwendung->ende_imBISMeldungsJahr); - // Ba2Code - if(isset($ba2_arr[$row_verwendung['ba2code']])) - echo ''; - else - echo ''; - - // Ausmass - if(isset($ausmass_arr[$row_verwendung['beschausmasscode']])) - echo ''; - else - echo ''; - - // Verwendung - if(isset($verwendung_arr[$row_verwendung['verwendung_code']])) - echo ''; - else - echo ''; - - echo ''; + $bisverwendung->dauer_imBISMeldungsJahr = $bisverwendung_ende_imBISMeldungsJahr->diff($bisverwendung_beginn_imBISMeldungsJahr)->days + 1; + $bisverwendung->gewichtung = round($bisverwendung->dauer_imBISMeldungsJahr / $tage_imJahr, 2); } - echo ''; + + return $bisverwendung_arr; } -echo '
    UIDVornameNachnamePersonalnummerFixangestelltLektorBeschaeftigungsArt1BeschaeftigungsArt2AusmassVerwendungDetails (Funktion/Lehre)
    '.$row['uid'].''.$row['vorname'].''.$row['nachname'].''.$row['personalnummer'].''.($row['fixangestellt']?'Ja':'Nein').''.($row['lektor']?'Ja':'Nein').''.$ba1_arr[$row_verwendung['ba1code']].''.$row_verwendung['ba1code'].''.$ba2_arr[$row_verwendung['ba2code']].''.$row_verwendung['ba2code'].''.$ausmass_arr[$row_verwendung['beschausmasscode']].''.$row_verwendung['beschausmasscode'].''.$verwendung_arr[$row_verwendung['verwendung_code']].''.$row_verwendung['verwendung_code'].''; - // Details - if(isset($row_verwendung['stgltg'])) - { - - foreach($row_verwendung['stgltg'] as $row_stgl) - { - echo 'Leitung:'.$stg_obj->kuerzel_arr[$row_stgl]; - echo '
    '; - } - } - - if(isset($row_verwendung['fkt'])) - { - foreach($row_verwendung['fkt'] as $row_fkt) - { - echo $stg_obj->kuerzel_arr[$row_fkt['stgkz']].': '.$row_fkt['sws'].' SWS'; - echo '
    '; - } - } - - echo '

    '; -echo 'Mitarbeiter-BIS-Meldung archivieren
    '; -echo "XML-Datei für Mitarbeiter-BIS-Meldung

    "; -?> + +/** + * Funktion ermittelt, ob Person im BIS Meldungsjahr vorwiegend haupt- oder nebenberuflich taetig war. + * @param $bisverwendung_arr Array mit BIS-Verwendungsobjekten + * @return boolean True wenn vorwiegend hauptberuflich + */ +function _getUeberwiegendeTaetigkeit_HauptNebenberuf($bisverwendung_arr) +{ + // Zeiten vergleichen + $sum_dauer_hauptberuflich = 0; + $sum_dauer_nebenberuflich = 0; + + foreach ($bisverwendung_arr as $bisverwendung) + { + if ($bisverwendung->hauptberuflich == true) + { + $sum_dauer_hauptberuflich += $bisverwendung->dauer_imBISMeldungsJahr; + } + else + { + $sum_dauer_nebenberuflich += $bisverwendung->dauer_imBISMeldungsJahr; + } + } + + // Laengere Dauer bestimmt Haupt- oder Nebenberuf + $is_hauptberuflich = $sum_dauer_hauptberuflich > $sum_dauer_nebenberuflich; + + return array($is_hauptberuflich); +} + +/** + * Funktion erstellt Verwendung fuer Lehrtaetigkeiten fuer Personen mit echtem Dienstvertrag. + * (zB STG Leiter mit Lehrtaetigkeit) + * @param object $studiensemester Sommer- / Winterstudiensemester + * @param object $bisverwendung + * @return array + */ +function _addVerwendung_fuerLehre_inkludiert($studiensemester, $bisverwendung) +{ + $verwendung_lehre_obj = new StdClass(); + + $verwendung_lehre_obj->ba1code = $bisverwendung->ba1code; + $verwendung_lehre_obj->ba2code = $bisverwendung->ba2code; + $verwendung_lehre_obj->beschausmasscode = $bisverwendung->beschausmasscode; + $verwendung_lehre_obj->verwendung_code = 1; + $verwendung_lehre_obj->beginn_imBISMeldungsJahr = $bisverwendung->beginn_imBISMeldungsJahr; + $verwendung_lehre_obj->ende_imBISMeldungsJahr = $bisverwendung->ende_imBISMeldungsJahr; + + /** + * Anteilige Lehrtage im Studiensemester ermitteln + * NOTE: Da die gesamte Lehrtaetigkeit fuer SS und WS im BIS Meldungsjahr gemeldet wird, muss die WS Lehrtaetigkeit + * jahresuebergreifend erfasst werden. Daher Datumsvergleiche mit dem tatsaechlichen BIS-Verwendungsende. + * */ + $tage_lehre_imSemester = 182; // default Tage im Halbjahr entsprechend der default Gewichtung von 0.5 + $studsem_start = new DateTime($studiensemester->start); + $studsem_ende = new DateTime($studiensemester->ende); + $bisverwendung_beginn_BIS = new DateTime($bisverwendung->beginn_imBISMeldungsJahr); + $bisverwendung_ende = new DateTime($bisverwendung->ende); + + $beginn_im_semester = ($bisverwendung_beginn_BIS < $studsem_start) ? $studsem_start : $bisverwendung_beginn_BIS; + $ende_im_semester = (!is_null($bisverwendung_ende) && $bisverwendung_ende > $studsem_ende) ? $studsem_ende : $bisverwendung_ende; + $tage_lehre_imSemester = $beginn_im_semester->diff($ende_im_semester)->days + 1; + + return array($tage_lehre_imSemester, $verwendung_lehre_obj); +} + +/** + * Funktion erstellt Verwendung fuer Lehrtaetigkeiten fuer freie Lektoren. + * @param object $bisverwendung + * @return object Verwendung fuer Lehrtaetigkeit + */ +function _addVerwendung_fuerLehre_Stundenbasis($bisverwendung) +{ + $verwendung_lehre_obj = new StdClass(); + + $verwendung_lehre_obj->ba1code = $bisverwendung->ba1code; + $verwendung_lehre_obj->ba2code = $bisverwendung->ba2code; + $verwendung_lehre_obj->beschausmasscode = $bisverwendung->beschausmasscode; + $verwendung_lehre_obj->verwendung_code = 1; + $verwendung_lehre_obj->beginn_imBISMeldungsJahr =$bisverwendung->beginn_imBISMeldungsJahr; + $verwendung_lehre_obj->ende_imBISMeldungsJahr = $bisverwendung->ende_imBISMeldungsJahr; + + return $verwendung_lehre_obj; +} + + From 3d663cdbd715534210d6775a822cc32f6a4e2c14 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 5 Mar 2020 14:29:56 +0100 Subject: [PATCH 05/24] Added getVerwendungenBISMeldung() + isHabilitiert() . getVerwendungenBISMeldung: Holt alle Verwendungen eines Mitarbeiters innerhalb des BIS Meldungszeitraums . isHabilitiert: Prueft, ob Mitarbeiter habilitiert ist --- include/bisverwendung.class.php | 91 +++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/include/bisverwendung.class.php b/include/bisverwendung.class.php index 0e4e4fc06..ab8b5a4e4 100644 --- a/include/bisverwendung.class.php +++ b/include/bisverwendung.class.php @@ -587,5 +587,96 @@ class bisverwendung extends basis_db return false; } } + + /** + * Prueft, ob Mitarbeiter habilitiert ist + * @param $uid UID des Mitarbeiters + * @return bool + */ + public function isHabilitiert($uid) + { + $qry = ' + SELECT + * + FROM + bis.tbl_bisverwendung + WHERE + mitarbeiter_uid = '. $this->db_add_param($uid). ' + AND + habilitation = true; + '; + + if ($this->db_query($qry)) + { + return $this->db_num_rows() > 0; + } + } + + /** + * Holt alle Verwendungen eines Mitarbeiters innerhalb des BIS Meldungszeitraums + * @param $uid UID des Mitarbeiters + * @param $stichtag + * @return bool + */ + public function getVerwendungenBISMeldung($uid, $stichtag) + { + $datetime = new DateTime($stichtag); + $stichtag = $datetime->format('Y-m-d'); + $bismeldung_jahr = $datetime->format('Y'); + + $qry = ' + SELECT + *, + CASE + WHEN (beginn is null OR beginn < make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 1, 1)) + THEN make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 1, 1) + ELSE beginn + END as beginn_imBISMeldungsJahr, + CASE + WHEN (ende is null OR ende > make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 12, 31)) + THEN make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 12, 31) + ELSE ende + END as ende_imBISMeldungsJahr + FROM + bis.tbl_bisverwendung + WHERE + mitarbeiter_uid = '. $this->db_add_param($uid).' + AND (beginn <= '. $this->db_add_param($stichtag).' OR beginn is null) + AND (ende >= make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 1, 1) OR ende is null) + ORDER BY ende + '; + + if($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + $obj = new StdClass(); + + $obj->bisverwendung_id = $row->bisverwendung_id; + $obj->mitarbeiter_uid = $row->mitarbeiter_uid; + $obj->vertragsstunden = $row->vertragsstunden; + $obj->ba1code = $row->ba1code; + $obj->ba2code = $row->ba2code; + $obj->verwendung_code = $row->verwendung_code; + $obj->beschausmasscode = $row->beschausmasscode; + $obj->hauptberufcode = $row->hauptberufcode; + $obj->hauptberuflich = $this->db_parse_bool($row->hauptberuflich); + $obj->beginn = $row->beginn; + $obj->ende = $row->ende; + $obj->beginn_imBISMeldungsJahr = $row->beginn_imbismeldungsjahr; + $obj->ende_imBISMeldungsJahr = $row->ende_imbismeldungsjahr; + + + + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } } ?> From afb5cc3205c56f6684e59cb8925b07ccdc9b1091 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 5 Mar 2020 14:31:20 +0100 Subject: [PATCH 06/24] Added getMitarbeiterBISMeldung() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getMitarbeiterBISMeldung: Gibt alle Mitarbeiter zurück, die im BIS Meldungszeitraum bisgemeldet sind --- include/mitarbeiter.class.php | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/include/mitarbeiter.class.php b/include/mitarbeiter.class.php index 467bff8f8..78bc1a439 100644 --- a/include/mitarbeiter.class.php +++ b/include/mitarbeiter.class.php @@ -1539,5 +1539,56 @@ class mitarbeiter extends benutzer } } + /** + * Gibt alle Mitarbeiter zurück, die im BIS Meldungszeitraum bisgemeldet sind + * @param String $stichtag BIS Meldung Stichtag + * @return boolean + */ + public function getMitarbeiterBISMeldung($stichtag) + { + $datetime = new DateTime($stichtag); + $bismeldung_jahr = $datetime->format('Y'); + + $qry = ' + SELECT DISTINCT ON (UID) *, + transform_geschlecht(tbl_person.geschlecht, tbl_person.gebdatum) as geschlecht_imputiert + FROM + public.tbl_mitarbeiter + JOIN public.tbl_benutzer ON(mitarbeiter_uid=uid) + JOIN public.tbl_person USING(person_id) + JOIN bis.tbl_bisverwendung USING(mitarbeiter_uid) + JOIN bis.tbl_beschaeftigungsausmass USING(beschausmasscode) + WHERE + bismelden + AND personalnummer > 0 + AND (beginn <= make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 12, 31) OR beginn is null) + AND (tbl_bisverwendung.ende is NULL OR tbl_bisverwendung.ende >= make_date('. $this->db_add_param($bismeldung_jahr). '::INTEGER, 1, 1)) + ORDER BY uid, nachname, vorname + '; + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new StdClass(); + + $obj->uid = $row->uid; + $obj->vorname = $row->vorname; + $obj->vornamen = $row->vornamen; + $obj->nachname = $row->nachname; + $obj->gebdatum = $row->gebdatum; + $obj->geschlecht = $row->geschlecht; + $obj->geschlechtX = $row->geschlecht_imputiert; + $obj->staatsbuergerschaft = $row->staatsbuergerschaft; + $obj->personalnummer = $row->personalnummer; + $obj->ausbildungcode = $row->ausbildungcode; + + $this->result []= $obj; + } + return true; + } + return false; + } + } ?> From da201df53430b1250f3461c75400297fe45ed5c3 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 9 Mar 2020 12:23:47 +0100 Subject: [PATCH 07/24] Added Berechnung fuer Studentische Hilfskraefte Die Jahres-/Vollzeitaequivalenz fuer Studentische Hilfskraefte werden ueber eine kalkulatorische Stundenpauschale berechnet. --- vilesci/bis/personalmeldung.php | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 2f5745dd7..c41c3fdd8 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -9,6 +9,7 @@ require_once('../../include/bisverwendung.class.php'); require_once('../../include/mitarbeiter.class.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/lehreinheitmitarbeiter.class.php'); +require_once('../../include/benutzerfunktion.class.php'); $uid = get_uid(); @@ -46,6 +47,11 @@ if (!defined('BIS_HALBJAHRES_GEWICHTUNG_SWS') || empty('BIS_HALBJAHRES_GEWICHTUN die('config var BIS_HALBJAHRES_GEWICHTUNG_SWS fehlt'); } +if (!defined('BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT') || empty('BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT')) +{ + die('config var BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT fehlt'); +} + // Prüfe Zeitraum zur Erstellung einer BIS-Meldung $studiensemester = new studiensemester(); @@ -68,6 +74,7 @@ $beginn_imJahr = new DateTime(($jahr - 1). '-01-01'); $ende_imJahr = new DateTime(($jahr - 1). '-12-31'); $tage_imJahr = $ende_imJahr->diff($beginn_imJahr)->days + 1; +$wochen_imJahr = $tage_imJahr / 7; // Sommer- und Wintersemester im BIS Meldungsjahr $ss_kurzbz = $studiensemester->getBeforePrevious(); @@ -252,6 +259,36 @@ foreach ($mitarbeiter_arr as $mitarbeiter) } } } + else + { + // Studentische Hilfskraft + // --------------------------------------------------------------------------------------------------------- + $benutzerfunktion = new Benutzerfunktion(); + $is_studentische_hilfskraft = $benutzerfunktion->getBenutzerFunktionByUid( + $person_obj->uid, + 'hilfskraft', + $beginn_imJahr->format('Y-m-d'), + $ende_imJahr->format('Y-m-d') + ); + + if ($is_studentische_hilfskraft) + { + // Kalkulatorische Umrechnung der Jahrespauschale + $pauschale_hilfskraft_inStunden = BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT; // Pauschale pro Jahr und Person (in Stunden) + $pauschale_hilfskraft_relativImJahr = $pauschale_hilfskraft_inStunden / 1; // Stundenpauschale in Verhaeltnis zu 1 Jahr + $vollzeit_arbeitsstunden_imJahr = BIS_VOLLZEIT_ARBEITSSTUNDEN * $wochen_imJahr; + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + $bisverwendung->jvzae_anteilig =round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + } + // Mitarbeiter ohne Vertragsstunden und keine SWS + // --------------------------------------------------------------------------------------------------------- + else + { + // TODO: Plausicheck + } + } } // ***************************************************************************************************************** From 40915ba3e160c3c6cdd31fb1442a64e2fa912bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Tue, 10 Mar 2020 16:36:21 +0100 Subject: [PATCH 08/24] =?UTF-8?q?Neue=20Funktionen=20f=C3=BCr=20BIS-Meldun?= =?UTF-8?q?g=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- system/dbupdate_3.3.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 2700bf43d..00d075dfd 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -3616,6 +3616,12 @@ if (!$result = @$db->db_query("SELECT ba1code_bis FROM bis.tbl_beschaeftigungsar DELETE FROM bis.tbl_verwendung WHERE verwendung_code=9; "; + $qry.=" + INSERT INTO public.tbl_funktion(funktion_kurzbz, beschreibung, aktiv, fachbereich, semester) VALUES('vertrBefugter','Vertretungsbefugte/r des Erhalters',true,false,false); + INSERT INTO public.tbl_funktion(funktion_kurzbz, beschreibung, aktiv, fachbereich, semester) VALUES('kollegium_Ltg','Leiter/in des Kollegiums',true,false,false); + INSERT INTO public.tbl_funktion(funktion_kurzbz, beschreibung, aktiv, fachbereich, semester) VALUES('kollegium_stvLtg','Stellv. Leiter/in des Kollegiums',true,false,false); + "; + if(!$db->db_query($qry)) echo 'bis.tbl_verwendung und bis.tbl_beschaeftigungsart: '.$db->db_last_error().'
    '; else From 72c2ce6410a1e0ed43154a6cdb7587f43229359f Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Mar 2020 14:42:07 +0100 Subject: [PATCH 09/24] Added Container Funktion . FunktionsCode . BesondereQualifikationsCode . Studiengang - StgKz --- vilesci/bis/personalmeldung.php | 191 ++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index c41c3fdd8..5bd0a0e89 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -10,6 +10,8 @@ require_once('../../include/mitarbeiter.class.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/lehreinheitmitarbeiter.class.php'); require_once('../../include/benutzerfunktion.class.php'); +require_once('../../include/organisationseinheit.class.php'); +require_once('../../include/entwicklungsteam.class.php'); $uid = get_uid(); @@ -52,6 +54,21 @@ if (!defined('BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT') || empty('BIS_PAUSCHALE_ST die('config var BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT fehlt'); } +if (!defined('BIS_FUNKTIONSCODE_1234_ARR') || empty('BIS_FUNKTIONSCODE_1234_ARR')) +{ + die('config var BIS_FUNKTIONSCODE_1234_ARR fehlt'); +} + +if (!defined('BIS_FUNKTIONSCODE_5_ARR') || empty('BIS_FUNKTIONSCODE_5_ARR')) +{ + die('config var BIS_FUNKTIONSCODE_5_ARR fehlt'); +} + +if (!defined('BIS_FUNKTIONSCODE_6_ARR') || empty('BIS_FUNKTIONSCODE_6_ARR')) +{ + die('config var BIS_FUNKTIONSCODE_6_ARR fehlt'); +} + // Prüfe Zeitraum zur Erstellung einer BIS-Meldung $studiensemester = new studiensemester(); @@ -366,6 +383,43 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // Container Verwendung dem Container Person anhaengen // ----------------------------------------------------------------------------------------------------------------- $person_obj->verwendung_arr = $verwendung_arr; + + + // ********************************************************************************************************************* + // Container Funktion und Lehre werden nur für STG generiert (nicht für Lehrgaenge) + // ********************************************************************************************************************* + // ----------------------------------------------------------------------------------------------------------------- + // Container Funktion generieren + // ----------------------------------------------------------------------------------------------------------------- + $funktion_arr = array(); + + // Alle Benutzerfunktionen im BIS Meldungsjahr holen + $benutzerfunktion = new Benutzerfunktion(); + $benutzerfunktion->getBenutzerFunktionByUid( + $person_obj->uid, null, + $beginn_imJahr->format('Y-m-d'), + $ende_imJahr->format('Y-m-d') + ); + $bisfunktion_arr = $benutzerfunktion->result; + + /** + * Funktionscode 1 - 6 anhand Benutzerfunktionen ermitteln + * Exkludiert Funktionen, die einem Lehrgang bzw. STG, die nicht BIS-gemeldet werden, zugeordnet sind. + */ + // ------------------------------------------------------------------------------------------------------------- + $funktion_arr = _getFunktionscontainer_Funktionscode123456($bisfunktion_arr); + + /** + * Funktionscode 7 aus Entwicklungsteam-Tabelle ermitteln + * Exkludiert Funktionen, die einem Lehrgang bzw. STG, die nicht BIS-gemeldet werden, zugeordnet sind. + */ + // ------------------------------------------------------------------------------------------------------------- + $funktion_arr = _addFunktionscontainer_Funktionscode7($person_obj->uid, $funktion_arr); + + // Container Funktion dem Container Person anhaengen + // ----------------------------------------------------------------------------------------------------------------- + $person_obj->funktion_arr = $funktion_arr; + $person_arr []= $person_obj; } @@ -477,4 +531,141 @@ function _addVerwendung_fuerLehre_Stundenbasis($bisverwendung) return $verwendung_lehre_obj; } +/** + * Funktionscode 1 - 6 anhand Benutzerfunktionen ermitteln + * @param array $bisfunktion_arr + * @return array + */ +function _getFunktionscontainer_Funktionscode123456($bisfunktion_arr) +{ + $funktion_arr = array(); + + foreach ($bisfunktion_arr as $bisfunktion) + { + $funktion_code = NULL; + $has_oe_lehrgang = false; // default + + $studiengang = new Studiengang(); + $studiengang->getStudiengangFromOe($bisfunktion->oe_kurzbz); + + // Wenn OE der Funktion eine STG-Kennzahl ist + if (!is_null($studiengang->studiengang_kz)) + { + // Pruefen ob STG-Kennzahl STG oder Lehrgang + $has_oe_lehrgang = !($studiengang->studiengang_kz > 0 && $studiengang->studiengang_kz < 10000); + + // STG, die nicht BIS-bemeldet werden, ueberspringen + if (in_array($studiengang->studiengang_kz, BIS_EXCLUDE_STG)) + { + continue; + } + } + + // Funktionscode 1 - 6 anhand Benutzerfunktionen ermitteln + // ------------------------------------------------------------------------------------------------------------- + // Wenn OE der Funktion nicht einem Lehrgang zugeordnet ist + if (!$has_oe_lehrgang) + { + // FunktionsCode 1-4 + if (array_key_exists($bisfunktion->funktion_kurzbz, BIS_FUNKTIONSCODE_1234_ARR)) + { + $funktion_code = BIS_FUNKTIONSCODE_1234_ARR[$bisfunktion->funktion_kurzbz]; + } + + if (in_array($bisfunktion->funktion_kurzbz, BIS_FUNKTIONSCODE_5_ARR)) // Leitung + { + // FunktionsCode 5 : STG-Leitung + if (!is_null($studiengang->studiengang_kz)) + { + $funktion_code = 5; + } + + // FunktionsCode 6 : Leitung Organisationseinheit der postsekundaeren Bildungseinrichtung + $organisationseinheit = new Organisationseinheit($bisfunktion->oe_kurzbz); + if (is_null($studiengang->studiengang_kz) && + !in_array($organisationseinheit->oetyp_bezeichnung, BIS_FUNKTIONSCODE_6_ARR)) // nicht Teamleitung + { + $funktion_code = 6; + } + } + } + + // Funktionsobjekt generieren + if (!is_null($funktion_code) && // Funktionscode vorhanden UND + (empty($funktion_arr) || // (Erster Durchlauf ODER + !in_array($funktion_code, array_column($funktion_arr, 'funktionscode')))) // Funktionsobjekt mit diesem Funktionscode nicht vorhanden) + { + $funktion_obj = new StdClass(); + $funktion_obj->funktionscode = $funktion_code; + $funktion_obj->besondereQualifikationCode = NULL; + $funktion_obj->studiengang = ($funktion_code == 5) + ? array(setLeadingZero(intval($studiengang->studiengang_kz), 4)) // STG bei Funktionscode 5 melden + : NULL; + + // Funktionsobjekt dem Funktionscontainer anhaengen + $funktion_arr []= $funktion_obj; + } + else if ($funktion_code == 5) // Funktionscontainer vorhanden und Funktionscode 5 + { + $funktion_obj_arr = array_filter($funktion_arr, function (&$obj) { + return $obj->funktionscode == 5; + }); + + $funktion_obj_arr[0]->studiengang[]= setLeadingZero(intval($studiengang->studiengang_kz), 4); // STG ergaenzen + } + } + + return $funktion_arr; +} + +/** + * Funktionscode 7 aus Entwicklungsteam-Tabelle ermitteln + * @param String $uid + * @param array $funktion_arr Object-Array + * @return array + * + */ +function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr) +{ + $entwicklungsteam = new Entwicklungsteam(); + $entwicklungsteam->getEntwicklungsteam($uid); + $entwicklungsteam_arr = $entwicklungsteam->result; + + if (!empty($entwicklungsteam_arr)) + { + // Lehrgaenge und STG, die nicht BIS gemeldet werden, extrahieren + $entwicklungsteam_arr = array_filter($entwicklungsteam_arr, function ($obj) + { + return + !in_array($obj->studiengang_kz, BIS_EXCLUDE_STG) && + $obj->studiengang_kz > 0 && + $obj->studiengang_kz < 10000; + }); + } + + if (!empty($entwicklungsteam_arr)) + { + // Hoechste besondere Qualifikation + $besondere_qualifikation_code_arr = array_values(array_column($entwicklungsteam_arr, 'besqualcode')); + $besondere_qualifikation_code = max($besondere_qualifikation_code_arr); + + // Studiengaenge, wo Person Teil des Entwicklungsteams gewesen ist + $studiengang_kz_arr = array_values(array_column($entwicklungsteam_arr, 'studiengang_kz')); + sort($studiengang_kz_arr); // sortieren + foreach($studiengang_kz_arr as &$studiengang_kz) // fuehrende Nullen fuer STG + { + $studiengang_kz = setLeadingZero(intval($studiengang_kz), 4); + } + + // Funktionsobjekt generieren und dem Funktionscontainer anhaengen + $funktion_obj = new StdClass(); + $funktion_obj->funktionscode = 7; + $funktion_obj->besondereQualifikationCode = $besondere_qualifikation_code; + $funktion_obj->studiengang = $studiengang_kz_arr; + $funktion_arr []= $funktion_obj; + } + + return $funktion_arr; +} + From a5884127f7f933ccf01efa782db463c897137c86 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Mar 2020 14:54:09 +0100 Subject: [PATCH 10/24] Corrected Realtives Beschaeftigungsausmass Fuer Verwendungen von angestellten Personen in der Admin/Verwaltung, jedoch mit Lehrtaetigkeit, werden fuer die Lehre eigene Verwendungen mit Verwendungscode 1 erstellt. Das relative Beschaeftigungsausmass muss dann entsprechend angepasst werden. Zuvor wurden dem rel BA der Hauptverwendung die rel BA von Sommer- und Wintersemester abgezogen. Fuer die richtige Berechnung der VZAE darf jedoch nur das rel BA Wintersemester abgezogen werden. (Faellt in den Stichtag 31.12) --- vilesci/bis/personalmeldung.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 5bd0a0e89..a6fde06ea 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -241,8 +241,13 @@ foreach ($mitarbeiter_arr as $mitarbeiter) /** * Relativen Beschaeftigungsausmass der BIS-Verwendung berichtigen * (durch Abzug des eben erstellten relativen Beschaeftigungsausmass fuer Lehrtaetigkeiten) + * NOTE: Abzug nur fuer Lehrtaetigkeiten im WS, da nur diese das Beschaeftigungsausmass der + * BIS-Verwendung (und in Folge die VZAE ) zum Stichtag 31.12. bestimmen. * */ - $bisverwendung->beschaeftigungsausmass_relativ -= $verwendung_lehre_obj->beschaeftigungsausmass_relativ; + if(substr($studsem_kurzbz, 0, 2) == 'WS') + { + $bisverwendung->beschaeftigungsausmass_relativ -= $verwendung_lehre_obj->beschaeftigungsausmass_relativ; + } /** * Anteilige JVZAE der BIS-Verwendung berichtigen From 9c8312f880b978c84f7cfc9256dd899a5c590370 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 13:20:30 +0100 Subject: [PATCH 11/24] Added Lehre-Container Lehrecontainer mit . StgKz . SommersemesterSWS . WintersemesterSWS Lehrtaetigkeit an Lehrgaengen bzw. Lehrtaetigkeit an STG, die nicht BIS-gemeldet werden, werden exkludiert. --- vilesci/bis/personalmeldung.php | 92 +++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index a6fde06ea..6437f24a5 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -425,6 +425,34 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // ----------------------------------------------------------------------------------------------------------------- $person_obj->funktion_arr = $funktion_arr; + + // ----------------------------------------------------------------------------------------------------------------- + // Container Lehre generieren + // ----------------------------------------------------------------------------------------------------------------- + $lehre_arr = array(); + + // Alle Semesterwochenstunden, summiert nach STG und Studiensemester + $lehreinheitmitarbeiter = new Lehreinheitmitarbeiter(); + $lehreinheitmitarbeiter->get_SWS_groupByStg( + $person_obj->uid, + $beginn_imJahr->format('Y-m-d'), + $ende_imJahr->format('Y-m-d') + ); + $sws_proStg_arr = $lehreinheitmitarbeiter->result; + + /** + * Lehrtaetigkeit (Semesterwochenstunden) pro STG ermitteln. + * Exkludiert Lehrtaetigkeit an Lehrgaengen bzw. Lehrtaetigkeit an STG, die nicht BIS-gemeldet werden. + */ + $lehre_arr = _getLehrecontainer($sws_proStg_arr); + + // Container Lehre dem Container Person anhaengen + // ----------------------------------------------------------------------------------------------------------------- + $person_obj->lehre_arr = $lehre_arr; + + + // Container Person dem Gesamt-Container anhaengen + // ----------------------------------------------------------------------------------------------------------------- $person_arr []= $person_obj; } @@ -673,4 +701,68 @@ function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr) return $funktion_arr; } +/** + * Lehrecontainer fuer Lehrtaetigkeit (Semesterwochenstunden) pro STG erstellen. + * @param array $sws_proStg_arr Object-Array + * @return array + */ +function _getLehrecontainer($sws_proStg_arr) +{ + $lehre_arr = array(); + + if (!empty($sws_proStg_arr)) + { + // Lehrgaenge und STG, die nicht BIS gemeldet werden, extrahieren + $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; + }); + } + + if (!empty($sws_proStg_arr)) + { + foreach ($sws_proStg_arr as $sws_proStg) + { + $is_sommersemester = substr($sws_proStg->studiensemester_kurzbz, 0, 2) == 'SS'; + $is_wintersemester = substr($sws_proStg->studiensemester_kurzbz, 0, 2) == 'WS'; + + // Lehreobjekt generieren + if (empty($lehre_arr) || // Erster Durchlauf ODER + !in_array($sws_proStg->studiengang_kz, array_column($lehre_arr, 'StgKz'))) // Neu + { + $lehre_obj = new StdClass(); + + $lehre_obj->StgKz = $sws_proStg->studiengang_kz; + $lehre_obj->SommersemesterSWS = $is_sommersemester ? $sws_proStg->sws : NULL; + $lehre_obj->WintersemesterSWS = $is_wintersemester ? $sws_proStg->sws : NULL; + + // Lehreobjekt dem Lehrecontainer anhaengen + $lehre_arr []= $lehre_obj; + } + else // Lehrecontainer mit STG schon vorhanden + { + $lehre_obj_arr = array_filter($lehre_arr, function (&$obj) use ($sws_proStg) { + return $obj->StgKz == $sws_proStg->studiengang_kz; + }); + + // SWS ergaenzen + if ($is_sommersemester) + { + current($lehre_obj_arr)->SommersemesterSWS = $sws_proStg->sws; + } + else if ($is_wintersemester) + { + current($lehre_obj_arr)->WintersemesterSWS = $sws_proStg->sws; + } + } + } + } + + + return $lehre_arr; +} + From 588f2996b3f71207f1bbe42d1cce137448654592 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 13:22:57 +0100 Subject: [PATCH 12/24] Added get_SWS_groupByStg() Ladet Semesterwochenstunden-Summe gruppiert nach Studiengang und Studiensemester. Es werden die Studiensemester herangezogen, die im Zeitraum zwischen beginn und ende beginnen. --- include/lehreinheitmitarbeiter.class.php | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index d7d469c2f..64140a174 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -530,6 +530,74 @@ class lehreinheitmitarbeiter extends basis_db } } + /** + * Ladet Semesterwochenstunden-Summe gruppiert nach Studiengang und Studiensemester. + * Es werden die Studiensemester herangezogen, die im Zeitraum zwischen beginn und ende beginnen. + * @param String $uid + * @param String $beginn + * @param String $ende + * @return bool + */ + public function get_SWS_groupByStg($uid, $beginn, $ende) + { + $beginn = new DateTime($beginn); + $ende = new DateTime($ende); + + $qry = ' + WITH semester_sws_tbl AS ( + SELECT DISTINCT lehreinheit_id, studiensemester_kurzbz, lema.semesterstunden, stg.studiengang_kz + FROM lehre.tbl_lehreinheitmitarbeiter lema + JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + JOIN lehre.tbl_studienplan_lehrveranstaltung USING (lehrveranstaltung_id) + JOIN lehre.tbl_studienplan USING (studienplan_id) + JOIN lehre.tbl_studienordnung sto USING (studienordnung_id) + 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')). ') + -- nur lehre, die bisgemeldet wird + AND lema.bismelden + -- keine lehreinheiten ohne semesterstunden + AND lema.semesterstunden != 0 + ) + + SELECT + studiengang_kz, + studiensemester_kurzbz, + sum(semesterstunden) AS summe, + round(sum(semesterstunden) / 15, 2) AS sws + FROM + semester_sws_tbl + GROUP BY + studiengang_kz, + studiensemester_kurzbz + ORDER BY + studiengang_kz; + '; + + if ($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + $obj = new StdClass(); + $obj->studiengang_kz = $row->studiengang_kz; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->sws = $row->sws; + $this->result []= $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } + /** * Laedt die Lektoren einer Lehrveranstaltung in einem Studiensemester * @param lehrveranstaltung_id From a03e3f3355793ca1e4095ad3bb8cd41f4686adc2 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 13:24:17 +0100 Subject: [PATCH 13/24] Added result array to properties of Lehreinheitmitarbeiter class --- include/lehreinheitmitarbeiter.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index 64140a174..9941a7e12 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -44,6 +44,8 @@ class lehreinheitmitarbeiter extends basis_db public $ext_id; // bigint public $vertrag_id; + public $result = array(); + /** * Konstruktor - Laedt optional einee LEMitarbeiterzuordnung * @param $lehreinheit_id From 67a100ea50d2a9e1854d83df1e22d3f3abd2ad86 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 13:29:48 +0100 Subject: [PATCH 14/24] Corrected BIS-meldungsrelevante SWS in getLehreinheiten_SWS_BISMeldung Zuvor wurde boolean bismelden der Mitarbeiter-Tabelle geprueft. Nun wird der korrekte boolean bismelden der Lehreinheitmitarbeiter-Tabelle geprueft, da nur die bisrelevanten Lehreinheiten herangezogen werden sollen. --- include/lehreinheitmitarbeiter.class.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index 9941a7e12..6be66bb77 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -497,6 +497,13 @@ class lehreinheitmitarbeiter extends basis_db return $ret; } + /** + * Ladet Semesterwochenstunden-Summe eines Mitarbeiters eines Semesters. + * Nur bisrelevante SWS. + * @param String $uid + * @param String $studiensemester + * @return bool + */ public function getLehreinheiten_SWS_BISMeldung($uid, $studiensemester) { $qry = ' @@ -504,7 +511,7 @@ class lehreinheitmitarbeiter extends basis_db round(sum(semesterstunden) / 15) AS sws FROM ( SELECT DISTINCT lehreinheit_id, studiensemester_kurzbz, mitarbeiter_uid, semesterstunden - FROM lehre.tbl_lehreinheitmitarbeiter + FROM lehre.tbl_lehreinheitmitarbeiter lema JOIN public.tbl_mitarbeiter ma USING (mitarbeiter_uid) JOIN public.tbl_benutzer ON (mitarbeiter_uid = uid) JOIN public.tbl_person USING (person_id) @@ -512,7 +519,7 @@ class lehreinheitmitarbeiter extends basis_db JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN public.tbl_studiensemester ss USING (studiensemester_kurzbz) WHERE mitarbeiter_uid = '. $this->db_add_param($uid).' - AND ma.bismelden + AND lema.bismelden AND studiensemester_kurzbz = '. $this->db_add_param($studiensemester).' ) tbl_semesterstunden '; From a65c5076be7243761844f994df2a4829ee5374f4 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 15:45:07 +0100 Subject: [PATCH 15/24] Started XML generieren - NOT COMPLETED - --- vilesci/bis/personalmeldung.php | 80 +++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 6437f24a5..324a181e8 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -456,6 +456,16 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $person_arr []= $person_obj; } +// ********************************************************************************************************************* +// XML generieren +// ********************************************************************************************************************* +$xml = ''; +$xml = _generateXML($person_arr); + +echo '
    ', print_r($xml, 1), '
    '; + + + // --------------------------------------------------------------------------------------------------------------------- // Private Functions // --------------------------------------------------------------------------------------------------------------------- @@ -765,4 +775,74 @@ function _getLehrecontainer($sws_proStg_arr) return $lehre_arr; } +function _generateXML($person_arr) +{ + $xml = ''; + $xml .= ''; + + $xml .= ''; + + foreach ($person_arr as $person) + { + $xml .= ''; + + $xml .= 'personalnummer. ']]>'; + $xml .= 'geschlecht. ']]>'; + $xml .= 'geschlechtX. ']]>'; + $xml .= 'geburtsjahr. ']]>'; + $xml .= 'staatsangehoerigkeit. ']]>'; + $xml .= 'hoechste_abgeschlossene_ausbildung. ']]>'; + $xml .= 'habilitation. ']]>'; + $xml .= 'hauptberufcode. ']]>'; + + foreach ($person->verwendung_arr as $verwendung) + { + $xml .= ''; + $xml .= 'verwendung_code. ']]>'; + $xml .= 'ba1code. ']]>'; + $xml .= 'ba2code. ']]>'; + $xml .= 'vzae. ']]>'; + $xml .= 'jvzae. ']]>'; + $xml .= ''; + } + + foreach ($person->funktion_arr as $funktion) + { + $xml .= ''; + $xml .= 'funktionscode. ']]>'; + $xml .= 'besondereQualifikationCode. ']]>'; + $xml .= ''; + if (is_array($funktion->studiengang)) + { + foreach ($funktion->studiengang as $studiengang) + { + $xml .= ''; + } + } + else if (!is_null($funktion->studiengang)) + { + $xml .= 'studiengang. ']]>'; + + } + $xml .= ''; + $xml .= ''; + } + + foreach ($person->lehre_arr as $lehre) + { + $xml .= ''; + $xml .= 'StgKz. ']]>'; + $xml .= 'SommersemesterSWS. ']]>'; + $xml .= 'WintersemesterSWS. ']]>'; + $xml .= ''; + } + + $xml .= ''; + } + + $xml .= ''; + + return $xml; +} + From 2767dcde9fc688fd1a26dc5490301d662c1937ca Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 15:48:41 +0100 Subject: [PATCH 16/24] Added BIS configs --- config/vilesci.config-default.inc.php | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index 1d68cfdb3..e737fc58a 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -208,4 +208,43 @@ define('DVB_PASSWORD','passwort'); define('CI_ENVIRONMENT', 'development'); // Code igniter environment variable +// BIS Personalmeldung + +// Studiengaenge, die nicht gemeldet werden +define('BIS_EXCLUDE_STG', array()); + +// Basis Vollzeit Arbeitsstunden für Berechnung von Jahresvollzeitaequivalenz JVZAE (echte Dienstverträge) +define('BIS_VOLLZEIT_ARBEITSSTUNDEN', '0'); + +// Basis Vollzeit Semesterwochenstunden für Berechnung von Jahresvollzeitaequivalenz JVZAE auf Stundenbasis (freie Dienstverträge) +define('BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS', '0'); + +// Basis Vollzeit Semesterwochenstunden für Berechnung von Jahresvollzeitaequivalenz JVZAE für inkludierte Lehre bei echten Dienstverträgen +define('BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE', '0'); + +// Semester Gewichtung für Berechnung von Jahresvollzeitaequivalenz JVZAE +define('BIS_HALBJAHRES_GEWICHTUNG_SWS', 0.5); + +// Jahrespauschale fuer studentische Hilfskraefte (in Stunden) +define('BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT', 0); + +// Jahrespauschale fuer sonstige Dienstverhaeltnisse, zb Werkvertrag (in Stunden) +define('BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS', 0); + +define('BIS_FUNKTIONSCODE_1234_ARR', array( + 'vertrBefugter' => 1, // Vertretungsbefugte/r des Erhalters (GF, Prokura) + 'kollegium_Ltg' => 2, // Leiter/in des Kollegiums + 'kollegium_Ltg' => 2, // Leiter/in des Kollegiums + 'kollegium_stvLtg' => 3, // stellv. Leiter/In des Kollegiums + 'kollegium' => 4 // Mitglied des Kollegiums +)); + +define('BIS_FUNKTIONSCODE_5_ARR', array( + 'Leitung' +)); + +define('BIS_FUNKTIONSCODE_6_ARR', array( + 'Team' +)); + ?> From c171ba3de67c340853e76068ba46e93ba5c4faa1 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 15:59:09 +0100 Subject: [PATCH 17/24] Added Berechnung Sonstiges Dienstverhaeltnis (zB. Werkvertraege) --- vilesci/bis/personalmeldung.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 324a181e8..06e7fcd52 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -54,6 +54,11 @@ if (!defined('BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT') || empty('BIS_PAUSCHALE_ST die('config var BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT fehlt'); } +if (!defined('BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS') || empty('BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS')) +{ + die('config var BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS fehlt'); +} + if (!defined('BIS_FUNKTIONSCODE_1234_ARR') || empty('BIS_FUNKTIONSCODE_1234_ARR')) { die('config var BIS_FUNKTIONSCODE_1234_ARR fehlt'); @@ -258,7 +263,6 @@ foreach ($mitarbeiter_arr as $mitarbeiter) } } } - // TODO: Interner Check: if ($bisverwendung->jvzae_anteilig < 0) -> Anteil für 'Nicht-Lehre'-Teil muss gegeben sein. } // Sonstige Beschaeftigungsverhaeltnisse ohne Vertragsstunden @@ -304,11 +308,17 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); $bisverwendung->jvzae_anteilig =round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); } - // Mitarbeiter ohne Vertragsstunden und keine SWS + // Mitarbeiter mit sonstigem Dienstverhaeltnis (zB. Werkvertrag) // --------------------------------------------------------------------------------------------------------- else { - // TODO: Plausicheck + $pauschale_sonstigeDV_inStunden = BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS; // Pauschale pro Jahr und Person (in Stunden) + $pauschale_sonstigeDV_relativImJahr = $pauschale_sonstigeDV_inStunden / 1; // Stundenpauschale in Verhaeltnis zu 1 Jahr + $vollzeit_arbeitsstunden_imJahr = BIS_VOLLZEIT_ARBEITSSTUNDEN * $wochen_imJahr; + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_sonstigeDV_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + $bisverwendung->jvzae_anteilig =round($pauschale_sonstigeDV_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); } } } From e99112dc64b54dc9025658f555b7d7981bb0e09f Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 16:35:24 +0100 Subject: [PATCH 18/24] Enhanced code readability (structure) --- vilesci/bis/personalmeldung.php | 388 +++++++++++++++++--------------- 1 file changed, 205 insertions(+), 183 deletions(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 06e7fcd52..5c214e730 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -138,11 +138,11 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // BIS Verwendungsdauer und -gewichtung ergaenzen $bisverwendung_arr = _addDauerGewichtung_imBISMeldungsjahr($bisverwendung_arr); - // Hauptberufcode: wenn Hauptberuf / Nebenberuf im gleichen Jahr - laengere Dauer entscheidet + // Hauptberufcode // ----------------------------------------------------------------------------------------------------------------- - $is_hauptberuflich = $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberuflich; // default: hauptberuflich der letzten BIS-Verwendung + $is_hauptberuflich = $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberuflich; - // Wenn im selben Jahr hauptberuflich UND nebenberuflich -> laengere Dauer wird gemeldet (Ueberwiegenheitprinzip) + // wenn Hauptberuf / Nebenberuf im gleichen Jahr - laengere Dauer melden (Ueberwiegenheitprinzip) if (in_array(true, array_column($bisverwendung_arr, 'hauptberuflich')) && // hauptberuflich UND in_array(false, array_column($bisverwendung_arr, 'hauptberuflich'))) // nebenberuflich { @@ -154,181 +154,22 @@ foreach ($mitarbeiter_arr as $mitarbeiter) * - hauptberuflich Lehrender: NULL, * - nebenberuflich Lehrender: Hauptberufscode der letzten BIS-Verwendung */ - $person_obj->hauptberufcode = ($is_hauptberuflich == true) ? NULL : $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberufcode; + $person_obj->hauptberufcode = ($is_hauptberuflich == true) + ? NULL + : $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberufcode; + + + // ***************************************************************************************************************** + // Container Verwendung generieren (mit JVZAE und VZAE) + // ***************************************************************************************************************** + $verwendung_arr = array(); - // ----------------------------------------------------------------------------------------------------------------- // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln // ----------------------------------------------------------------------------------------------------------------- + $bisverwendung_arr = _add_relativesBA_und_anteiligeJVZAE($person_obj->uid, $bisverwendung_arr); - // Lehrtaetigkeit ermitteln - $lema = new lehreinheitmitarbeiter(); - $lema->getLehreinheiten_SWS_BISMeldung($person_obj->uid, $ss_kurzbz); - $lehre_ss_sws = $lema->result[0]; // Anzahl SS - Semesterwochenstunden - - $lema = new lehreinheitmitarbeiter(); - $lema->getLehreinheiten_SWS_BISMeldung($person_obj->uid, $ws_kurzbz); - $lehre_ws_sws = $lema->result[0]; // Anzahl WS - Semesterwochenstunden - - $has_lehrtaetigkeit = !is_null($lehre_ss_sws) || !is_null($lehre_ws_sws); - - foreach ($bisverwendung_arr as $index => $bisverwendung) - { - $has_vertragsstunden = !is_null($bisverwendung->vertragsstunden) && !empty($bisverwendung->vertragsstunden); - $is_lektor = $bisverwendung->verwendung_code == 1 || $bisverwendung->verwendung_code == 2; - - /** - * NOTE: is_karenziert ist ein boolean fuer Vollzeit-Karenz, nicht fuer Teilzeit-(Bildungs-)Karenz! - * Die Unterscheidung ist wichtig fuer die weitere Ermittlung der JVZAE. - * Vollzeitkarenz: Anteiliger Beschaeftigungsausmass und JVZAE wird auf 0 gesetzt. - * Bildungs-Teilzeitkarenz: entspricht im System - */ - $is_karenziert_VZ = $bisverwendung->beschausmasscode == 5 && !$has_vertragsstunden; // VZ-Kinder- und Bildungskarenz - $is_karenziert_TZ = $bisverwendung->beschausmasscode == 5 && $has_vertragsstunden; // TZ-Bildungskarenz - - // Karenzzeit - // ------------------------------------------------------------------------------------------------------------- - if ($is_karenziert_VZ) - { - // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln - $bisverwendung->beschaeftigungsausmass_relativ = number_format(0.00, 2); - $bisverwendung->jvzae_anteilig = 0; - continue; - } - - // Echter Dienstvertrag - d.h. Vertragsstunden sind vorhanden - // Bsp. angestellte Lektoren, angestellte MA in Verwaltung/Management/Wartung - // ------------------------------------------------------------------------------------------------------------- - else if ($has_vertragsstunden) - { - // Vertragsstunden koennen max. VZ Aequivalenz-Basiswert haben - if ($bisverwendung->vertragsstunden > BIS_VOLLZEIT_ARBEITSSTUNDEN) - { - $bisverwendung->vertragsstunden = BIS_VOLLZEIT_ARBEITSSTUNDEN; - } - - // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln - $bisverwendung->beschaeftigungsausmass_relativ = round($bisverwendung->vertragsstunden / BIS_VOLLZEIT_ARBEITSSTUNDEN, 2); - $bisverwendung->jvzae_anteilig = round($bisverwendung->beschaeftigungsausmass_relativ * $bisverwendung->gewichtung, 2); - - // Echter Dienstvertrag - mit Lehrtaetigkeit, jedoch kein Lektor. - // Bsp. STG-Leiter mit Lehrtaetigkeit - // --------------------------------------------------------------------------------------------------------- - if (!$is_lektor && $has_lehrtaetigkeit) - { - /** - * Verwendungen ergänzen, wenn Mitarbeiter in Verwaltung/Managment/Wartung (jedenfalls nicht in Lehre) - * zugeteilt ist und dennoch lehrt. - * Die SWS werden sowohl fuer Sommer- als auch Wintersemster ermittelt und jeweils in einer eigenen - * Verwendung mit dem Verwendungscode 1 ergaenzt. - */ - $bisverwendung_beginn_BIS = new DateTime($bisverwendung->beginn_imBISMeldungsJahr); - $bisverwendung_ende_BIS = new DateTime($bisverwendung->ende_imBISMeldungsJahr); - - foreach (array($ss_kurzbz => $lehre_ss_sws, $ws_kurzbz => $lehre_ws_sws) as $studsem_kurzbz => $lehre_sws) - { - $studsem = new studiensemester($studsem_kurzbz); - $studsem_start = new DateTime($studsem->start); - $studsem_ende = new DateTime($studsem->ende); - - // Wenn Lehrzeit in die BIS Verwendungszeit hineinfaellt, Verwendung erstellen - if (!is_null($lehre_sws) && - (!($studsem_start > $bisverwendung_ende_BIS) && - !($studsem_ende < $bisverwendung_beginn_BIS))) - { - // Verwendung erstellen - list($tage_lehre_imSemester, $verwendung_lehre_obj) = _addVerwendung_fuerLehre_inkludiert($studsem, $bisverwendung); - - // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln - $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE, 2); // VZ-Basis fuer inkludierte Lehre - $verwendung_lehre_obj->gewichtung = ($tage_lehre_imSemester == 182) ? BIS_HALBJAHRES_GEWICHTUNG_SWS : round(BIS_HALBJAHRES_GEWICHTUNG_SWS / ($tage_imJahr / 2) * $tage_lehre_imSemester, 2); - $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 3); - - /** - * Relativen Beschaeftigungsausmass der BIS-Verwendung berichtigen - * (durch Abzug des eben erstellten relativen Beschaeftigungsausmass fuer Lehrtaetigkeiten) - * NOTE: Abzug nur fuer Lehrtaetigkeiten im WS, da nur diese das Beschaeftigungsausmass der - * BIS-Verwendung (und in Folge die VZAE ) zum Stichtag 31.12. bestimmen. - * */ - if(substr($studsem_kurzbz, 0, 2) == 'WS') - { - $bisverwendung->beschaeftigungsausmass_relativ -= $verwendung_lehre_obj->beschaeftigungsausmass_relativ; - } - - /** - * Anteilige JVZAE der BIS-Verwendung berichtigen - * (durch Abzug der eben erstellten anteiligen JVZAE fuer Lehrtaetigkeiten) - */ - $bisverwendung->jvzae_anteilig -= $verwendung_lehre_obj->jvzae_anteilig; - $bisverwendung_arr [] = $verwendung_lehre_obj; - } - } - } - } - - // Sonstige Beschaeftigungsverhaeltnisse ohne Vertragsstunden - // Freie Dienstvertraege auf Stundenbasis - // ------------------------------------------------------------------------------------------------------------- - else if (!$has_vertragsstunden && $has_lehrtaetigkeit) - { - foreach (array($ss_kurzbz => $lehre_ss_sws, $ws_kurzbz => $lehre_ws_sws) as $studsem => $lehre_sws) - { - if (!is_null($lehre_sws)) - { - // Verwendungen erstellen - $verwendung_lehre_obj = _addVerwendung_fuerLehre_Stundenbasis($bisverwendung); - - // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln - $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS, 2); // VZ-Basis nach BIS-Vorgabe fuer Stundenbasis - $verwendung_lehre_obj->gewichtung = BIS_HALBJAHRES_GEWICHTUNG_SWS; - $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 2); - $bisverwendung_arr []= $verwendung_lehre_obj; - } - } - } - else - { - // Studentische Hilfskraft - // --------------------------------------------------------------------------------------------------------- - $benutzerfunktion = new Benutzerfunktion(); - $is_studentische_hilfskraft = $benutzerfunktion->getBenutzerFunktionByUid( - $person_obj->uid, - 'hilfskraft', - $beginn_imJahr->format('Y-m-d'), - $ende_imJahr->format('Y-m-d') - ); - - if ($is_studentische_hilfskraft) - { - // Kalkulatorische Umrechnung der Jahrespauschale - $pauschale_hilfskraft_inStunden = BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT; // Pauschale pro Jahr und Person (in Stunden) - $pauschale_hilfskraft_relativImJahr = $pauschale_hilfskraft_inStunden / 1; // Stundenpauschale in Verhaeltnis zu 1 Jahr - $vollzeit_arbeitsstunden_imJahr = BIS_VOLLZEIT_ARBEITSSTUNDEN * $wochen_imJahr; - - // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln - $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); - $bisverwendung->jvzae_anteilig =round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); - } - // Mitarbeiter mit sonstigem Dienstverhaeltnis (zB. Werkvertrag) - // --------------------------------------------------------------------------------------------------------- - else - { - $pauschale_sonstigeDV_inStunden = BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS; // Pauschale pro Jahr und Person (in Stunden) - $pauschale_sonstigeDV_relativImJahr = $pauschale_sonstigeDV_inStunden / 1; // Stundenpauschale in Verhaeltnis zu 1 Jahr - $vollzeit_arbeitsstunden_imJahr = BIS_VOLLZEIT_ARBEITSSTUNDEN * $wochen_imJahr; - - // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln - $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_sonstigeDV_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); - $bisverwendung->jvzae_anteilig =round($pauschale_sonstigeDV_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); - } - } - } - - // ***************************************************************************************************************** - // JVZAE und VZAE ermitteln (Jahresvollzeitaequivalenz, Vollzeitaequivalenz) - // ***************************************************************************************************************** - - // Container Verwendung aus dem bisverwendung_arr generieren, formatieren und dem Container Person anhängen - $verwendung_arr = array(); + // JVZAE und VZAE ermitteln und Container Verwendung generieren + // ----------------------------------------------------------------------------------------------------------------- foreach ($bisverwendung_arr as $bisverwendung) { if (empty($verwendung_arr) || // wenn erster Durchlauf ODER @@ -400,12 +241,9 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $person_obj->verwendung_arr = $verwendung_arr; - // ********************************************************************************************************************* - // Container Funktion und Lehre werden nur für STG generiert (nicht für Lehrgaenge) - // ********************************************************************************************************************* - // ----------------------------------------------------------------------------------------------------------------- - // Container Funktion generieren - // ----------------------------------------------------------------------------------------------------------------- + // ***************************************************************************************************************** + // Container Funktion generieren (nicht für Lehrgaenge) + // ***************************************************************************************************************** $funktion_arr = array(); // Alle Benutzerfunktionen im BIS Meldungsjahr holen @@ -436,9 +274,9 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $person_obj->funktion_arr = $funktion_arr; - // ----------------------------------------------------------------------------------------------------------------- - // Container Lehre generieren - // ----------------------------------------------------------------------------------------------------------------- + // ***************************************************************************************************************** + // Container Lehre generieren (nicht für Lehrgaenge) + // ***************************************************************************************************************** $lehre_arr = array(); // Alle Semesterwochenstunden, summiert nach STG und Studiensemester @@ -479,6 +317,190 @@ echo '
    ', print_r($xml, 1), '
    '; // --------------------------------------------------------------------------------------------------------------------- // Private Functions // --------------------------------------------------------------------------------------------------------------------- + +/** + * Funktion ermittelt relatives Beschaeftigungsausmass und anteilige Jahresvollzeitaequivalenz + * @param String $uid + * @param array $bisverwendung_arr Object-Array + * @return array + */ +function _add_relativesBA_und_anteiligeJVZAE($uid, $bisverwendung_arr) +{ + global $beginn_imJahr; + global $ende_imJahr; + global $wochen_imJahr; + global $tage_imJahr; + global $ss_kurzbz; + global $ws_kurzbz; + + // Lehrtaetigkeit ermitteln + $lema = new lehreinheitmitarbeiter(); + $lema->getLehreinheiten_SWS_BISMeldung($uid, $ss_kurzbz); + $lehre_ss_sws = $lema->result[0]; // Anzahl SS - Semesterwochenstunden + + $lema = new lehreinheitmitarbeiter(); + $lema->getLehreinheiten_SWS_BISMeldung($uid, $ws_kurzbz); + $lehre_ws_sws = $lema->result[0]; // Anzahl WS - Semesterwochenstunden + + $has_lehrtaetigkeit = !is_null($lehre_ss_sws) || !is_null($lehre_ws_sws); + + foreach ($bisverwendung_arr as $index => $bisverwendung) + { + $has_vertragsstunden = !is_null($bisverwendung->vertragsstunden) && !empty($bisverwendung->vertragsstunden); + $is_lektor = $bisverwendung->verwendung_code == 1 || $bisverwendung->verwendung_code == 2; + + /** + * NOTE: is_karenziert ist ein boolean fuer Vollzeit-Karenz, nicht fuer Teilzeit-(Bildungs-)Karenz! + * Die Unterscheidung ist wichtig fuer die weitere Ermittlung der JVZAE. + * Vollzeitkarenz: Anteiliger Beschaeftigungsausmass und JVZAE wird auf 0 gesetzt. + * Bildungs-Teilzeitkarenz: entspricht im System + */ + $is_karenziert_VZ = $bisverwendung->beschausmasscode == 5 && !$has_vertragsstunden; // VZ-Kinder- und Bildungskarenz + $is_karenziert_TZ = $bisverwendung->beschausmasscode == 5 && $has_vertragsstunden; // TZ-Bildungskarenz + + // Karenzzeit + // ------------------------------------------------------------------------------------------------------------- + if ($is_karenziert_VZ) + { + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = number_format(0.00, 2); + $bisverwendung->jvzae_anteilig = 0; + continue; + } + + // Echter Dienstvertrag - d.h. Vertragsstunden sind vorhanden + // Bsp. angestellte Lektoren, angestellte MA in Verwaltung/Management/Wartung + // ------------------------------------------------------------------------------------------------------------- + else if ($has_vertragsstunden) + { + // Vertragsstunden koennen max. VZ Aequivalenz-Basiswert haben + if ($bisverwendung->vertragsstunden > BIS_VOLLZEIT_ARBEITSSTUNDEN) + { + $bisverwendung->vertragsstunden = BIS_VOLLZEIT_ARBEITSSTUNDEN; + } + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = round($bisverwendung->vertragsstunden / BIS_VOLLZEIT_ARBEITSSTUNDEN, 2); + $bisverwendung->jvzae_anteilig = round($bisverwendung->beschaeftigungsausmass_relativ * $bisverwendung->gewichtung, 2); + + // Echter Dienstvertrag - mit Lehrtaetigkeit, jedoch kein Lektor. + // Bsp. STG-Leiter mit Lehrtaetigkeit + // --------------------------------------------------------------------------------------------------------- + if (!$is_lektor && $has_lehrtaetigkeit) + { + /** + * Verwendungen ergänzen, wenn Mitarbeiter in Verwaltung/Managment/Wartung (jedenfalls nicht in Lehre) + * zugeteilt ist und dennoch lehrt. + * Die SWS werden sowohl fuer Sommer- als auch Wintersemster ermittelt und jeweils in einer eigenen + * Verwendung mit dem Verwendungscode 1 ergaenzt. + */ + $bisverwendung_beginn_BIS = new DateTime($bisverwendung->beginn_imBISMeldungsJahr); + $bisverwendung_ende_BIS = new DateTime($bisverwendung->ende_imBISMeldungsJahr); + + foreach (array($ss_kurzbz => $lehre_ss_sws, $ws_kurzbz => $lehre_ws_sws) as $studsem_kurzbz => $lehre_sws) + { + $studsem = new studiensemester($studsem_kurzbz); + $studsem_start = new DateTime($studsem->start); + $studsem_ende = new DateTime($studsem->ende); + + // Wenn Lehrzeit in die BIS Verwendungszeit hineinfaellt, Verwendung erstellen + if (!is_null($lehre_sws) && + (!($studsem_start > $bisverwendung_ende_BIS) && + !($studsem_ende < $bisverwendung_beginn_BIS))) + { + // Verwendung erstellen + list($tage_lehre_imSemester, $verwendung_lehre_obj) = _addVerwendung_fuerLehre_inkludiert($studsem, $bisverwendung); + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE, 2); // VZ-Basis fuer inkludierte Lehre + $verwendung_lehre_obj->gewichtung = ($tage_lehre_imSemester == 182) + ? BIS_HALBJAHRES_GEWICHTUNG_SWS + : round(BIS_HALBJAHRES_GEWICHTUNG_SWS / ($tage_imJahr / 2) * $tage_lehre_imSemester, 2); + $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 3); + + /** + * Relativen Beschaeftigungsausmass der BIS-Verwendung berichtigen + * (durch Abzug des eben erstellten relativen Beschaeftigungsausmass fuer Lehrtaetigkeiten) + * NOTE: Abzug nur fuer Lehrtaetigkeiten im WS, da nur diese das Beschaeftigungsausmass der + * BIS-Verwendung (und in Folge die VZAE ) zum Stichtag 31.12. bestimmen. + * */ + if(substr($studsem_kurzbz, 0, 2) == 'WS') + { + $bisverwendung->beschaeftigungsausmass_relativ -= $verwendung_lehre_obj->beschaeftigungsausmass_relativ; + } + + /** + * Anteilige JVZAE der BIS-Verwendung berichtigen + * (durch Abzug der eben erstellten anteiligen JVZAE fuer Lehrtaetigkeiten) + */ + $bisverwendung->jvzae_anteilig -= $verwendung_lehre_obj->jvzae_anteilig; + $bisverwendung_arr [] = $verwendung_lehre_obj; + } + } + } + } + + // Sonstige Beschaeftigungsverhaeltnisse ohne Vertragsstunden + // Freie Dienstvertraege auf Stundenbasis + // ------------------------------------------------------------------------------------------------------------- + else if (!$has_vertragsstunden && $has_lehrtaetigkeit) + { + foreach (array($ss_kurzbz => $lehre_ss_sws, $ws_kurzbz => $lehre_ws_sws) as $studsem => $lehre_sws) + { + if (!is_null($lehre_sws)) + { + // Verwendungen erstellen + $verwendung_lehre_obj = _addVerwendung_fuerLehre_Stundenbasis($bisverwendung); + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS, 2); // VZ-Basis nach BIS-Vorgabe fuer Stundenbasis + $verwendung_lehre_obj->gewichtung = BIS_HALBJAHRES_GEWICHTUNG_SWS; + $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 2); + $bisverwendung_arr []= $verwendung_lehre_obj; + } + } + } + else + { + // Studentische Hilfskraft + // --------------------------------------------------------------------------------------------------------- + $benutzerfunktion = new Benutzerfunktion(); + $is_studentische_hilfskraft = $benutzerfunktion->getBenutzerFunktionByUid( + $uid, + 'hilfskraft', + $beginn_imJahr->format('Y-m-d'), + $ende_imJahr->format('Y-m-d') + ); + + if ($is_studentische_hilfskraft) + { + // Kalkulatorische Umrechnung der Jahrespauschale + $pauschale_hilfskraft_inStunden = BIS_PAUSCHALE_STUDENTISCHE_HILFSKRAFT; // Pauschale pro Jahr und Person (in Stunden) + $pauschale_hilfskraft_relativImJahr = $pauschale_hilfskraft_inStunden / 1; // Stundenpauschale in Verhaeltnis zu 1 Jahr + $vollzeit_arbeitsstunden_imJahr = BIS_VOLLZEIT_ARBEITSSTUNDEN * $wochen_imJahr; + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + $bisverwendung->jvzae_anteilig =round($pauschale_hilfskraft_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + } + // Mitarbeiter mit sonstigem Dienstverhaeltnis (zB. Werkvertrag) + // --------------------------------------------------------------------------------------------------------- + else + { + $pauschale_sonstigeDV_inStunden = BIS_PAUSCHALE_SONSTIGES_DIENSTVERHAELTNIS; // Pauschale pro Jahr und Person (in Stunden) + $pauschale_sonstigeDV_relativImJahr = $pauschale_sonstigeDV_inStunden / 1; // Stundenpauschale in Verhaeltnis zu 1 Jahr + $vollzeit_arbeitsstunden_imJahr = BIS_VOLLZEIT_ARBEITSSTUNDEN * $wochen_imJahr; + + // Relatives Beschaeftigungsausmass / Anteilige JVZAE ermitteln + $bisverwendung->beschaeftigungsausmass_relativ = round($pauschale_sonstigeDV_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + $bisverwendung->jvzae_anteilig =round($pauschale_sonstigeDV_relativImJahr / $vollzeit_arbeitsstunden_imJahr, 4); + } + } + } + + return $bisverwendung_arr; +} + /** * Funktion ermittelt fuer jede BIS-Verwendung die Dauer (in Tagen) und Gewichtung (Dauer / Tage im Jahr) * @param array $bisverwendung_arr Array mit BIS-Verwendungsobjekten From a25851613b3cd1881a41599a2ea04a195fdf026f Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 18:50:03 +0100 Subject: [PATCH 19/24] Changed ba1code to ba1code_bis in getVerwendungenBISMeldung() --- include/bisverwendung.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/bisverwendung.class.php b/include/bisverwendung.class.php index ab8b5a4e4..44c70eb21 100644 --- a/include/bisverwendung.class.php +++ b/include/bisverwendung.class.php @@ -639,6 +639,7 @@ class bisverwendung extends basis_db END as ende_imBISMeldungsJahr FROM bis.tbl_bisverwendung + JOIN bis.tbl_beschaeftigungsart1 USING (ba1code) WHERE mitarbeiter_uid = '. $this->db_add_param($uid).' AND (beginn <= '. $this->db_add_param($stichtag).' OR beginn is null) @@ -655,7 +656,7 @@ class bisverwendung extends basis_db $obj->bisverwendung_id = $row->bisverwendung_id; $obj->mitarbeiter_uid = $row->mitarbeiter_uid; $obj->vertragsstunden = $row->vertragsstunden; - $obj->ba1code = $row->ba1code; + $obj->ba1code = $row->ba1code_bis; $obj->ba2code = $row->ba2code; $obj->verwendung_code = $row->verwendung_code; $obj->beschausmasscode = $row->beschausmasscode; From 54dd6734ba365b5d3b7ed13de40b664810e32d4c Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 18:53:21 +0100 Subject: [PATCH 20/24] Added XML Output --- vilesci/bis/personalmeldung.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 5c214e730..61f59b603 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -310,7 +310,15 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $xml = ''; $xml = _generateXML($person_arr); -echo '
    ', print_r($xml, 1), '
    '; +$xml_datei = 'bisdaten/bismeldung_mitarbeiter.xml'; +$dateiausgabe = fopen($xml_datei,'w'); +fwrite($dateiausgabe, $xml); +fclose($dateiausgabe); + +echo 'Herunterladen'; + +//header("Content-Type: text/xml"); +//echo $xml; From d1e47ad73e4e5a52183f1a246316cea0982b67cf Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Mar 2020 18:55:28 +0100 Subject: [PATCH 21/24] Corrected: erste Korrekturen nach BIS Uplaod und Validierung, -- ACHTUNG: TODO ! - . kleine Korrekturen (Typen-, Semantikecheck) . TODO!!!: Meldedatum und ErhKz ersetzen! --- vilesci/bis/personalmeldung.php | 62 +++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 61f59b603..9d0f92894 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -12,6 +12,7 @@ require_once('../../include/lehreinheitmitarbeiter.class.php'); require_once('../../include/benutzerfunktion.class.php'); require_once('../../include/organisationseinheit.class.php'); require_once('../../include/entwicklungsteam.class.php'); +require_once('../../include/erhalter.class.php'); $uid = get_uid(); @@ -118,7 +119,7 @@ foreach ($mitarbeiter_arr as $mitarbeiter) { $person_obj = new StdClass(); - $person_obj->personalnummer = $mitarbeiter->personalnummer; + $person_obj->personalnummer = setLeadingZero(intval($mitarbeiter->personalnummer), 15); $person_obj->uid = $mitarbeiter->uid; $person_obj->geschlecht = $mitarbeiter->geschlecht; $person_obj->geschlechtX = $mitarbeiter->geschlechtX; @@ -191,7 +192,7 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $verwendung_obj->ba1code = $bisverwendung->ba1code; $verwendung_obj->ba2code = $bisverwendung->ba2code; $verwendung_obj->verwendung_code = $bisverwendung->verwendung_code; - $verwendung_obj->jvzae = 0; + $verwendung_obj->jvzae = 0.00; $verwendung_obj->vzae = -1; // default // Loop innerhalb Verwendungen mit selben Beschaeftigungsverhaeltnissen und Verwendung_codes @@ -204,7 +205,9 @@ foreach ($mitarbeiter_arr as $mitarbeiter) * Berechnung: * JVZAE wird aus der Summe aller anteiligen JVZE gebildet. */ - $verwendung_obj->jvzae += (isset($verwendung_tmp->jvzae_anteilig)) ? $verwendung_tmp->jvzae_anteilig * 100 : NULL; // TODO: not null... + $verwendung_obj->jvzae += (isset($verwendung_tmp->jvzae_anteilig)) + ? number_format($verwendung_tmp->jvzae_anteilig * 100, 2) + : NULL; // TODO: not null... // Vollzeitaequivalenz VZAE ermitteln (Beschaeftigungsausmass zum Stichtag 31.12) @@ -785,9 +788,9 @@ function _getLehrecontainer($sws_proStg_arr) { $lehre_obj = new StdClass(); - $lehre_obj->StgKz = $sws_proStg->studiengang_kz; - $lehre_obj->SommersemesterSWS = $is_sommersemester ? $sws_proStg->sws : NULL; - $lehre_obj->WintersemesterSWS = $is_wintersemester ? $sws_proStg->sws : NULL; + $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; // Lehreobjekt dem Lehrecontainer anhaengen $lehre_arr []= $lehre_obj; @@ -820,6 +823,10 @@ function _generateXML($person_arr) $xml = ''; $xml .= ''; +// TODO: ErhKz und Meldedatum aendern + $xml .= ''; + $xml .= '005'; + $xml .= '15042020'; $xml .= ''; foreach ($person_arr as $person) @@ -830,15 +837,17 @@ function _generateXML($person_arr) $xml .= 'geschlecht. ']]>'; $xml .= 'geschlechtX. ']]>'; $xml .= 'geburtsjahr. ']]>'; - $xml .= 'staatsangehoerigkeit. ']]>'; + $xml .= 'staatsangehoerigkeit. ']]>'; $xml .= 'hoechste_abgeschlossene_ausbildung. ']]>'; $xml .= 'habilitation. ']]>'; - $xml .= 'hauptberufcode. ']]>'; + $xml .= (!is_null($person->hauptberufcode)) + ? 'hauptberufcode. ']]>' + : ''; foreach ($person->verwendung_arr as $verwendung) { $xml .= ''; - $xml .= 'verwendung_code. ']]>'; + $xml .= 'verwendung_code. ']]>'; $xml .= 'ba1code. ']]>'; $xml .= 'ba2code. ']]>'; $xml .= 'vzae. ']]>'; @@ -850,21 +859,29 @@ function _generateXML($person_arr) { $xml .= ''; $xml .= 'funktionscode. ']]>'; - $xml .= 'besondereQualifikationCode. ']]>'; - $xml .= ''; - if (is_array($funktion->studiengang)) - { - foreach ($funktion->studiengang as $studiengang) - { - $xml .= ''; - } - } - else if (!is_null($funktion->studiengang)) - { - $xml .= 'studiengang. ']]>'; + $xml .= (!is_null($funktion->besondereQualifikationCode)) + ? 'besondereQualifikationCode. ']]>' + : ''; + if ($funktion->funktionscode == 5 || $funktion->funktionscode == 7) + { + $xml .= ''; + + if (is_array($funktion->studiengang)) + { + foreach ($funktion->studiengang as $studiengang) + { + $xml .= ''; + } + } + else if (!is_null($funktion->studiengang)) + { + $xml .= 'studiengang. ']]>'; + + } + $xml .= ''; } - $xml .= ''; + $xml .= ''; } @@ -881,6 +898,7 @@ function _generateXML($person_arr) } $xml .= ''; + $xml .= ''; return $xml; } From dd2c384de04dc089c1d5fc0ae8d9fc14b826cfc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Mon, 16 Mar 2020 11:04:40 +0100 Subject: [PATCH 22/24] =?UTF-8?q?Personalmeldung=20angepasst:=20=20=20=20?= =?UTF-8?q?=C3=9Cbersichtstabelle=20hinzugef=C3=BCgt=20=20=20=20Erhalterke?= =?UTF-8?q?nnzahl=20und=20Meldedatum=20wird=20dynamisch=20ermittelt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vilesci/bis/personalmeldung.php | 233 ++++++++++++++++++++++++++++++-- 1 file changed, 221 insertions(+), 12 deletions(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 9d0f92894..2e2910247 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -1,5 +1,22 @@ + */ require_once('../../config/vilesci.config.inc.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/datum.class.php'); @@ -78,7 +95,7 @@ if (!defined('BIS_FUNKTIONSCODE_6_ARR') || empty('BIS_FUNKTIONSCODE_6_ARR')) // Prüfe Zeitraum zur Erstellung einer BIS-Meldung $studiensemester = new studiensemester(); -$stsem = (isset($_GET['stsem'])) ? $_GET['stsem'] : $studiensemester->getaktorNext(1); // aktuelles Studiensemester +$stsem = (isset($_GET['stsem'])) ? $_GET['stsem'] : $studiensemester->getaktorNext(); // aktuelles Studiensemester $datum_obj = new datum(); if(mb_strstr($stsem,'SS')) @@ -121,6 +138,8 @@ foreach ($mitarbeiter_arr as $mitarbeiter) $person_obj->personalnummer = setLeadingZero(intval($mitarbeiter->personalnummer), 15); $person_obj->uid = $mitarbeiter->uid; + $person_obj->vorname = $mitarbeiter->vorname; + $person_obj->nachname = $mitarbeiter->nachname; $person_obj->geschlecht = $mitarbeiter->geschlecht; $person_obj->geschlechtX = $mitarbeiter->geschlechtX; $person_obj->geburtsjahr = $datum_obj->formatDatum($mitarbeiter->gebdatum, 'Y'); @@ -311,6 +330,8 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // XML generieren // ********************************************************************************************************************* $xml = ''; + +_outputHTML($person_arr); $xml = _generateXML($person_arr); $xml_datei = 'bisdaten/bismeldung_mitarbeiter.xml'; @@ -318,12 +339,7 @@ $dateiausgabe = fopen($xml_datei,'w'); fwrite($dateiausgabe, $xml); fclose($dateiausgabe); -echo 'Herunterladen'; - -//header("Content-Type: text/xml"); -//echo $xml; - - +echo 'XML Herunterladen'; // --------------------------------------------------------------------------------------------------------------------- // Private Functions @@ -823,10 +839,19 @@ function _generateXML($person_arr) $xml = ''; $xml .= ''; -// TODO: ErhKz und Meldedatum aendern + $erhalter = new erhalter(); + $erhalter->getAll(); + + if(isset($erhalter->result[0])) + { + $erhalter = sprintf("%03s",trim($erhalter->result[0]->erhalter_kz)); + } + else + $erhalter = ''; + $xml .= ''; - $xml .= '005'; - $xml .= '15042020'; + $xml .= ''.$erhalter.''; + $xml .= '1504'.date('Y').''; $xml .= ''; foreach ($person_arr as $person) @@ -835,7 +860,8 @@ function _generateXML($person_arr) $xml .= 'personalnummer. ']]>'; $xml .= 'geschlecht. ']]>'; - $xml .= 'geschlechtX. ']]>'; + if ($person->geschlecht == 'x') + $xml .= 'geschlechtX. ']]>'; $xml .= 'geburtsjahr. ']]>'; $xml .= 'staatsangehoerigkeit. ']]>'; $xml .= 'hoechste_abgeschlossene_ausbildung. ']]>'; @@ -903,4 +929,187 @@ function _generateXML($person_arr) return $xml; } +/** + * Prints the HTML Table with all Persons + * @param $person_arr Array of PersonData + */ +function _outputHTML($person_arr) +{ + echo ' + + BIS - Meldung Personal + + '; + include('../../include/meta/jquery.php'); + include('../../include/meta/jquery-tablesorter.php'); + echo ' + + +

    Personalmeldung

    '; + echo ' + + '; + + echo "Anzahl der gemeldeten Personen: ".count($person_arr); + + echo ' + + + + + + + + + + + + + + + + + + + '; + + + foreach ($person_arr as $person) + { + echo ' + + + + + + + + + + + '; + + echo ''; + + echo ''; + + echo ' + '; + } + + echo ' +
    PersNrVornameNachnameUIDGeschlecht (X)Geb.JahrStaatHöchste Ausb.Habil.HautpberufcodeVerwendungFunktionLehre
    '.$person->personalnummer.''.$person->vorname.''.$person->nachname.''.$person->uid.''.$person->geschlecht.($person->geschlecht=='x'?'('.$person->geschlechtX.')':'').''.$person->geburtsjahr.''.$person->staatsangehoerigkeit.''.$person->hoechste_abgeschlossene_ausbildung.''.$person->habilitation.''.$person->hauptberufcode.''; + + if (count($person->verwendung_arr) > 0) + { + echo ' + + + + + + + + + + + + '; + + foreach ($person->verwendung_arr as $verwendung) + { + echo ' + + + + + + + '; + } + echo ' +
    VerwendungBa1CodeBa2CodeVZÄJVZÄ
    '.$verwendung->verwendung_code.''.$verwendung->ba1code.''.$verwendung->ba2code.''.$verwendung->vzae.''.$verwendung->jvzae.'
    '; + } + echo '
    '; + + if (count($person->funktion_arr) > 0) + { + echo ' + + + + + + + + + + '; + + foreach ($person->funktion_arr as $funktion) + { + echo ' + + + + + '; + } + echo ' +
    FunktionBes.QualStgKZ
    '. $funktion->funktionscode. ''. $funktion->besondereQualifikationCode. ''; + + if ($funktion->funktionscode == 5 || $funktion->funktionscode == 7) + { + if (is_array($funktion->studiengang)) + { + foreach ($funktion->studiengang as $studiengang) + { + echo $studiengang.' '; + } + } + else if (!is_null($funktion->studiengang)) + { + echo $funktion->studiengang.' '; + } + } + echo '
    '; + } + echo '
    '; + if ($person->lehre_arr > 0) + { + echo ' + + + + + + + + + '; + + foreach ($person->lehre_arr as $lehre) + { + echo ' + + + + + '; + } + + echo ' +
    StgKZSommerSWSWinterSWS
    '. $lehre->StgKz. ''. $lehre->SommersemesterSWS. ''. $lehre->WintersemesterSWS. '
    '; + } + echo '
    '; +} From 8c76f38b4d29b956ef7cfa36b3c3fb0c79caf8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Mon, 16 Mar 2020 13:52:29 +0100 Subject: [PATCH 23/24] =?UTF-8?q?Plausibilit=C3=A4tspr=C3=BCfungen=20f?= =?UTF-8?q?=C3=BCr=20Personalmeldung=20erg=C3=A4nzt.=20Anpassungen=20f?= =?UTF-8?q?=C3=BCr=20Studiengang-Container?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vilesci/bis/personalmeldung.php | 105 ++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 4 deletions(-) diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 2e2910247..3b2a43411 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -891,21 +891,21 @@ function _generateXML($person_arr) if ($funktion->funktionscode == 5 || $funktion->funktionscode == 7) { - $xml .= ''; - if (is_array($funktion->studiengang)) { foreach ($funktion->studiengang as $studiengang) { + $xml .= ''; $xml .= ''; + $xml .= ''; } } else if (!is_null($funktion->studiengang)) { + $xml .= ''; $xml .= 'studiengang. ']]>'; - + $xml .= ''; } - $xml .= ''; } $xml .= ''; @@ -947,6 +947,7 @@ function _outputHTML($person_arr)

    Personalmeldung

    '; + outputPlausibilitaetschecks($person_arr); echo ' '; + echo "

    Meldedaten

    "; echo "Anzahl der gemeldeten Personen: ".count($person_arr); echo ' @@ -1113,3 +1115,98 @@ function _outputHTML($person_arr) echo ' '; } + +function outputPlausibilitaetschecks($person_arr) +{ + echo "

    Plausibilitätsprüfung

    "; + + foreach ($person_arr as $row) + { + $msg = array(); + if ($row->personalnummer == '') + { + $msg[] = 'Personalnummer fehlt '; + } + if ($row->geschlecht == '') + { + $msg[] = 'Geschlecht fehlt '; + } + if ($row->geburtsjahr == '') + { + $msg[] = 'Geburtsjahr fehlt '; + } + if (date('Y') - $row->geburtsjahr >= 100) + { + $msg[] = 'Person darf nicht älter als 100 sein '; + } + if (date('Y') - $row->geburtsjahr <= 10) + { + $msg[] = 'Person darf nicht jünger als 10 sein '; + } + if ($row->staatsangehoerigkeit == '') + { + $msg[] = 'Staatsangehoerigkeit fehlt '; + } + if ($row->hoechste_abgeschlossene_ausbildung == '') + { + $msg[] = 'Höchste Abgeschlossene Ausbildung fehlt '; + } + if ($row->habilitation == '') + { + $msg[] = 'Habilitation fehlt '; + } + + if (isset($row->verwendung_arr) && is_array($row->verwendung_arr) && count($row->verwendung_arr) > 0) + { + foreach ($row->verwendung_arr as $verwendung) + { + if($verwendung->vzae < -1) + { + $msg[] = 'VZAE ist zu klein -> Vertragsstunden prüfen'; + } + if($verwendung->vzae > 100) + { + $msg[] = 'VZAE ist zu gross -> Vertragsstunden prüfen'; + } + + if($verwendung->jvzae < -1) + { + $msg[] = 'JVZAE ist zu klein -> Vertragsstunden prüfen'; + } + if($verwendung->jvzae > 100) + { + $msg[] = 'JVZAE ist zu gross -> Vertragsstunden prüfen'; + } + } + } + + if (isset($row->lehre_arr) && is_array($row->lehre_arr) && count($row->lehre_arr) > 0) + { + foreach ($row->lehre_arr as $lehre) + { + if ($lehre->SommersemesterSWS > 40) + { + $msg[] = 'Sommersemester SWS zu groß '.$lehre->SommersemesterSWS; + } + if ($lehre->WintersemesterSWS < 0) + { + $msg[] = 'Wintersemester SWS zu groß '.$lehre->WintersemesterSWS; + } + if ($lehre->SommersemesterSWS < 0) + { + $msg[] = 'Sommersemester SWS zu klein '.$lehre->SommersemesterSWS; + } + if ($lehre->WintersemesterSWS < 0) + { + $msg[] = 'Wintersemester SWS zu klein '.$lehre->WintersemesterSWS; + } + } + } + + if (count($msg) > 0) + { + echo "Fehler bei ".$row->vorname.' '.$row->nachname.' : '.implode($msg,', '); + echo "\n
    "; + } + } +} From 91ab79d6ebe35c6a960d12b5ad8e6ffae1c8fa37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Tue, 17 Mar 2020 12:09:36 +0100 Subject: [PATCH 24/24] =?UTF-8?q?Config=20Eintr=C3=A4ge=20f=C3=BCr=20BIS?= =?UTF-8?q?=20Meldung=20aktualisiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/vilesci.config-default.inc.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index e737fc58a..1647cb59a 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -214,13 +214,13 @@ define('CI_ENVIRONMENT', 'development'); // Code igniter environment variable define('BIS_EXCLUDE_STG', array()); // Basis Vollzeit Arbeitsstunden für Berechnung von Jahresvollzeitaequivalenz JVZAE (echte Dienstverträge) -define('BIS_VOLLZEIT_ARBEITSSTUNDEN', '0'); +define('BIS_VOLLZEIT_ARBEITSSTUNDEN', '40'); // Basis Vollzeit Semesterwochenstunden für Berechnung von Jahresvollzeitaequivalenz JVZAE auf Stundenbasis (freie Dienstverträge) -define('BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS', '0'); +define('BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS', '15'); // Basis Vollzeit Semesterwochenstunden für Berechnung von Jahresvollzeitaequivalenz JVZAE für inkludierte Lehre bei echten Dienstverträgen -define('BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE', '0'); +define('BIS_VOLLZEIT_SWS_INKLUDIERTE_LEHRE', '25'); // Semester Gewichtung für Berechnung von Jahresvollzeitaequivalenz JVZAE define('BIS_HALBJAHRES_GEWICHTUNG_SWS', 0.5); @@ -239,10 +239,12 @@ define('BIS_FUNKTIONSCODE_1234_ARR', array( 'kollegium' => 4 // Mitglied des Kollegiums )); +// Liste der Leitungsfunktionen define('BIS_FUNKTIONSCODE_5_ARR', array( 'Leitung' )); +// Organisationseinheitstypen bei denen KEINE Leiter gemeldet werden define('BIS_FUNKTIONSCODE_6_ARR', array( 'Team' ));