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).'
-
-
-
-
- | UID |
- Vorname |
- Nachname |
- Personalnummer |
- Fixangestellt |
- Lektor |
- BeschaeftigungsArt1 |
- BeschaeftigungsArt2 |
- Ausmass |
- Verwendung |
- Details (Funktion/Lehre) |
-
-
-';
-
-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 '| '.$row['uid'].' | ';
- echo ''.$row['vorname'].' | ';
- echo ''.$row['nachname'].' | ';
- echo ''.$row['personalnummer'].' | ';
- echo ''.($row['fixangestellt']?'Ja':'Nein').' | ';
- echo ''.($row['lektor']?'Ja':'Nein').' | ';
- foreach($row['verwendung'] as $row_verwendung)
+ global $tage_imJahr;
+
+ foreach ($bisverwendung_arr as &$bisverwendung)
{
- // Ba1Code
- if(isset($ba1_arr[$row_verwendung['ba1code']]))
- echo ''.$ba1_arr[$row_verwendung['ba1code']].' | ';
- else
- echo ''.$row_verwendung['ba1code'].' | ';
+ $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 ''.$ba2_arr[$row_verwendung['ba2code']].' | ';
- else
- echo ''.$row_verwendung['ba2code'].' | ';
-
- // Ausmass
- if(isset($ausmass_arr[$row_verwendung['beschausmasscode']]))
- echo ''.$ausmass_arr[$row_verwendung['beschausmasscode']].' | ';
- else
- echo ''.$row_verwendung['beschausmasscode'].' | ';
-
- // Verwendung
- if(isset($verwendung_arr[$row_verwendung['verwendung_code']]))
- echo ''.$verwendung_arr[$row_verwendung['verwendung_code']].' | ';
- else
- echo ''.$row_verwendung['verwendung_code'].' | ';
-
- echo '';
- // 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 ' | ';
+ $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 '
';
-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;
+}
+
+