query("TRUNCATE TABLE prog_tmp_lb_lz"); // Teil 1: Vorhandene Leistungsbezüge monatlich hochrechnen $query = "SELECT lblzid, date_format(startdat,'%Y-%m-01') startdat_form, date_format(enddat,'%Y-%m-28') enddat_form, wert, did FROM prog_lb_lz ORDER BY startdat ASC"; $result = $db->query($query) or die("Cannot execute query"); while ($row = $result->fetch_array()) { $ende = $row['enddat_form']; if ($ende == '0000-00-28') { // Wenn kein Enddatum vorhanden ist, dann wird das Auschscheidedatum/Ruhestandsdatum verwendet $result_weggang = $db->query("SELECT date_format(date_sub(weggang, INTERVAL 1 MONTH),'%Y-%m-28') enddat_form FROM prog_tmp_professor WHERE did = $row[did] "); $row_weggang = $result_weggang->fetch_array(); $ende = $row_weggang['enddat_form']; } $end = date_create($ende, new DateTimeZone('GMT')); // echo "
".print_r($end)."

"; $start = date_create_from_format('Y-m-d', $row['startdat_form'], new DateTimeZone('GMT')); // Foreach Schleife dauert lange. Ggf. // Es scheint so, dass DateInterval den letzten Monat weglässt wenn jmd z.B. am 01. August in Ruhestand , dann rechnet die foreach-Schleife nur bis Juli. Daher wird oben im Select der 28 als Monatsende eingetragen foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) { // echo $cur->format('Y-m-01')."
"; // echo "INSERT INTO prog_tmp_lb_lz (lblzid, monat, did, wert) VALUES ($row[lblzid], '".$cur->format('Y-m-01')."', $row[did], $row[wert])
"; $result_insert = $db->query("INSERT INTO prog_tmp_lb_lz (lblzid, monat, did, wert, art) VALUES ($row[lblzid], '" . $cur->format('Y-m-01') . "', $row[did], $row[wert], 'B')"); } // echo "
"; } // Teil 1: Ende // Teil 2: Die fiktiven Zulagen berechnen // 3 Jahren nach Beginn der letzten Zulage // Hat ein Professor noch keine Zulage, dann 3 Jahre nach dem Einstiegsdatum(Zugangsdatum) // Es gibt eine maximale Anzahl an Gesamtzulagen (Variabel, Standard 7) // Fiktive Zulagen gehen bis zum Ruhestand // Die LBZ mtl. der Zulagen sind aktuell 125€. Diese können sich aber ab einem bestimmten Datum ändern. Dann gilt für neue fiktiven Zulagen der neue Betrag. // Bestands-fiktive-Zulagen werden mit dem Startwert der fiktiven Zulage durchgerechnet // Es dürfen die in dem Monat, bei der es eine Zulage gibt, die Obergrenze nicht überschritten sein. Der Zulageempfänger hat W2, die Obergrenze liegt beim Grundgehalt C3: prog_tmp_lb_obergrenze berechnet die Obergrenze jeden Monat /* Schleife über alle Professoren mit W-Besoldung -> Hat der Professor bereits eine Zulage? -Ja Schleife aus Anzahl der Rest möglichen Zulagen Startdatum der fiktiven Zulage: letzte Zulage+3Jahre Delta ermitteln, wie hoch der Betrag zum Startdatum war Schleife von Startdatum bis Ruhestand mit Deltabetrag Startdatum+3 Jahre -Nein Schleife aus Anzahl der hinterlegten Anzahl der Zulagen Tab. Professoren Startdatum der fiktiven Zulage: Zugangsdatum zur Hochschule+3Jahre Delta ermitteln, wie hoch der Betrag zum Startdatum war Schleife von Startdatum bis Ruhestand mit Deltabetrag Startdatum+3 Jahre */ // Schleife über alle Professoren $query_teil2 = "SELECT did, zugang, date_format(date_sub(weggang, INTERVAL 1 MONTH),'%Y-%m-28') enddat_form, anz_zulagen FROM prog_tmp_professor WHERE zugang != '0000-00-00' ORDER BY zugang ASC"; $result_teil2 = $db->query($query_teil2) or die("Cannot execute query_teil2"); while ($row2 = $result_teil2->fetch_array()) { // Hat der Professor bereits eine Zulage? // Wieviele Zulagen hat er bereits bekommen. Wenn der Wert im System 0 ist, dann wurde der Wert 0 erfasst, da er keine Zulage in einem Jahr beantragt hat, das zählt aber nicht als gewährte Zulage $result_zulvorh = $db->query("SELECT count(1) Anz FROM prog_lb_lz WHERE did = $row2[did] AND wert !=0 "); $row_zulvorh = $result_zulvorh->fetch_array(); if ($row_zulvorh['Anz'] > 0) { // Professor bekam schon eine Zulage // Schleife aus Anzahl der Rest möglichen Zulagen $anzahl = $row2['anz_zulagen'] - $row_zulvorh['Anz']; // Fiktive Zulagen der Professoren unterscheiden: lblzid beginnt ab 1000 und wird bei jeder Zulage um 1 erhöht $lb_fz_zaehler = 1000; for ($i = 0; $i < $anzahl; $i++) { if ($i == 0) { // Startdatum der fiktiven Zulage: letzte Zulage+3Jahre // Nur beim ersten Durchlauf, dann wird bassierend auf diesem Datum wieder 3 Jahre addiert $result_next = $db->query("SELECT date_format(date_add(max(startdat), INTERVAL 3 YEAR),'%Y-%m-01') startdat_form, max(startdat) startdat FROM prog_lb_lz WHERE did=$row2[did] "); $row_next = $result_next->fetch_array(); // Wurde bewusst auf eine Zulage verzichtet, dann ist zu diesem Monat ein 0 Wert erfasst. Dann kann der Prof, nach einem Jahr wieder beantragen, also ist mit einer fiktiven Zulage zu rechnen // Neu in Stufe 2: Im folgenden Jahr ab. 1. Januar # Ein fiktiver Wert darf es nur nach der letzten realen Zulage geben. Was nicht sein kann ist, das 0-Wert herangezogen wird, und danach gab es eine reale Zulage $result_next2 = $db->query("SELECT date_format(date_add(startdat, INTERVAL 1 YEAR),'%Y-%m-01') startdat_form FROM prog_lb_lz WHERE did=$row2[did] AND wert = 0 AND startdat >= '$row_next[startdat]' ORDER BY startdat DESC LIMIT 1 "); $row_next2 = $result_next2->fetch_array(); // Wenn ein Professor vergessen hat einen Antrag auf LZ zu stellen, wird 0 erfasst, damit kein fiktiver Wert berechnet wird. Bei 0 wird aber bereits nach einem Jahr wieder die fiktive Zulage berechnet statt nach 3 Jahren wenn man eine Zulage bekommen hat. if ($row_next2['startdat_form'] < $row_next['startdat_form'] AND $row_next2['startdat_form'] <> "") { // Wenn am möglichen Termin nach Einstellung auf eine Zulage verzichtet wurde, dann erst wieder in 3 Jahren eine fiktive Zulage $next_date = $row_next2['startdat_form']; } else { // Wenn am möglichen Termin nach Einstellung kein 0 Wert in prog_lb_lz vorliegt, dann 3 Jahre nach Einstellung eine fiktive Zulage berechnen $next_date = $row_next['startdat_form']; } } // Delta ermitteln, wie hoch der Betrag zum Startdatum war $result_delta = $db->query("SELECT wert FROM prog_delta_datum WHERE datum <= '$next_date' ORDER BY datum desc LIMIT 1 "); $row_delta = $result_delta->fetch_array(); $start = date_create_from_format('Y-m-d', $next_date, new DateTimeZone('GMT')); $ende = $row2['enddat_form']; $end = date_create($ende, new DateTimeZone('GMT')); // Foreach Schleife dauert lange. Ggf. // Es scheint so, dass DateInterval den letzten Monat weglässt wenn jmd z.B. am 01. August in Ruhestand , dann rechnet die foreach-Schleife nur bis Juli. Daher wird oben im Select der 28 als Monatsende eingetragen foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) { // echo $cur->format('Y-m-01')."
"; // Nur Professoren der W-Besoldung bekommen eine fiktive Zulage $result_wbes = $db->query("SELECT count(*) Anz FROM prog_tmp_professor_besoldung WHERE startdat <= '" . $cur->format('Y-m-01') . "' AND besoldung like '%W%' AND did = '$row2[did]' ORDER BY startdat desc LIMIT 1 "); $row_wbes = $result_wbes->fetch_array(); if ($row_wbes['Anz'] > 0) { $result_insert = $db->query("INSERT INTO prog_tmp_lb_lz (lblzid, monat, did, wert, art) VALUES ('$lb_fz_zaehler', '" . $cur->format('Y-m-01') . "', $row2[did], $row_delta[wert], 'F')"); } } // ID soll sich unterscheiden bei jeder neuen fiktiven Zulage $lb_fz_zaehler = $lb_fz_zaehler + 1; // +3 Jahr addieren $result_next = $db->query("SELECT date_add('$next_date', INTERVAL 3 YEAR) startdat_form FROM dual "); $row_next = $result_next->fetch_array(); $next_date = $row_next['startdat_form']; // echo $next_date."
"; } } else { // Professor noch keine Zulage // Fiktive Zulagen der Professoren unterscheiden: lblzid beginnt ab 1000 und wird bei jeder Zulage um 1 erhöht $lb_fz_zaehler = 1000; for ($j = 0; $j < $row2['anz_zulagen']; $j++) { if ($j == 0) { // Beim ersten Durchlauf wird geprüft wann der Professor eingestellt wurde, dann nach 3 Jahre kann er eine fiktive Zulage haben // Es kann auch sein, dass bewusst ein 0 Wert erfasst wurde, um eine fiktive Zulage zu verhindern // Wann bekommt er nach Anstellung theoretisch das erste Mal eine Zulage? // Neu in Stufe 2: Im folgenden Jahr ab. 1. Januar $result_next = $db->query("SELECT date_format(date_add(max(zugang), INTERVAL 3 YEAR),'%Y-%m-01') startdat_form, max(zugang) startdat FROM prog_tmp_professor WHERE did=$row2[did] "); $row_next = $result_next->fetch_array(); // Wurde bewusst auf eine Zulage verzichtet, dann ist zu diesem Monat ein 0 Wert erfasst. Dann kann der Prof, nach einem Jahr wieder beantragen, also ist mit einer fiktiven Zulage zu rechnen // Neu in Stufe 2: Im folgenden Jahr ab. 1. Januar # Ein fiktiver Wert darf es nur nach der letzten realen Zulage geben. Was nicht sein kann ist, das 0-Wert herangezogen wird, und danach gab es eine reale Zulage $result_next2 = $db->query("SELECT date_format(date_add(startdat, INTERVAL 1 YEAR),'%Y-%m-01') startdat_form FROM prog_lb_lz WHERE did=$row2[did] AND wert = 0 AND startdat >= '$row_next[startdat]' ORDER BY startdat desc LIMIT 1 "); $row_next2 = $result_next2->fetch_array(); // Wenn ein Professor vergessen hat einen Antrag auf LZ zu stellen, wird 0 erfasst, damit kein fiktiver Wert berechnet wird. Bei 0 wird aber bereits nach einem Jahr wieder die fiktive Zulage berechnet statt nach 3 Jahren wenn man eine Zulage bekommen hat. if ($row_next2['startdat_form'] > $row_next['startdat_form']) { // Wenn am möglichen Termin nach Einstellung auf eine Zulage verzichtet wurde, dann erst wieder in 1 Jahre eine fiktive Zulage $next_date = $row_next2['startdat_form']; } else { // Wenn am möglichen Termin nach Einstellung kein 0 Wert in prog_lb_lz vorliegt, dann 3 Jahre nach Einstellung eine fiktive Zulage berechnen $next_date = $row_next['startdat_form']; } } // Delta ermitteln, wie hoch der Betrag zum Startdatum war $result_delta = $db->query("SELECT wert FROM prog_delta_datum WHERE datum <= '$next_date' ORDER BY datum desc LIMIT 1 "); $row_delta = $result_delta->fetch_array(); $start = date_create_from_format('Y-m-d', $next_date, new DateTimeZone('GMT')); $ende = $row2['enddat_form']; $end = date_create($ende, new DateTimeZone('GMT')); // Foreach Schleife dauert lange. Ggf. // Es scheint so, dass DateInterval den letzten Monat weglässt wenn jmd z.B. am 01. August in Ruhestand , dann rechnet die foreach-Schleife nur bis Juli. Daher wird oben im Select der 28 als Monatsende eingetragen foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) { // echo $lb_fz_zaehler."
"; // echo $lb_fz_zaehler." -> ".$cur->format('Y-m-01')."
"; // echo "INSERT INTO prog_tmp_lb_lz (lblzid, monat, did, wert, art) VALUES ('$lb_fz_zaehler', '".$cur->format('Y-m-01')."', $row2[did], $row_delta[wert], 'F');
"; // Nur Professoren der W-Besoldung bekommen eine fiktive Zulage $akt_mon = $cur->format('Y-m-01'); $result_wbes = $db->query("SELECT count(*) Anz FROM prog_tmp_professor_besoldung WHERE startdat <= '$akt_mon' AND besoldung like '%W%' AND did = '$row2[did]' ORDER BY startdat desc LIMIT 1 "); $row_wbes = $result_wbes->fetch_array(); if ($row_wbes['Anz'] > 0) { $result_insert = $db->query("INSERT INTO prog_tmp_lb_lz (lblzid, monat, did, wert, art) VALUES ('$lb_fz_zaehler', '" . $cur->format('Y-m-01') . "', $row2[did], $row_delta[wert], 'F')"); } } // ID soll sich unterscheiden bei jeder neuen fiktiven Zulage $lb_fz_zaehler = $lb_fz_zaehler + 1; // echo"
"; // +3 Jahr addieren // echo $next_date."
"; $result_next = $db->query("SELECT date_add('$next_date', INTERVAL 3 YEAR) startdat_form FROM dual "); $row_next = $result_next->fetch_array(); $next_date = $row_next['startdat_form']; // echo $next_date."
"; } } // Ende IF Professor bereits eine Zulage im System hinterlegt hatte } // Ende While über die Professoren } // Ende Funktion #func_LB_LZ(); ?>