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; +} + +