314 lines
16 KiB
PHP
Executable File
314 lines
16 KiB
PHP
Executable File
<?php
|
|
require_once("config.inc.php");
|
|
|
|
function func_LB_LZ()
|
|
{
|
|
|
|
// Berechnung der Leistungszulagen in die Zukunft sowie die fiktiven Zulagen, die der Professor nach 3 Jahren beantragen könnte.
|
|
|
|
$db = dbconnect();
|
|
$result_truncate = $db->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 "<pre>".print_r($end)."</pre><br />";
|
|
|
|
$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')."<br />";
|
|
// echo "INSERT INTO prog_tmp_lb_lz (lblzid, monat, did, wert) VALUES ($row[lblzid], '".$cur->format('Y-m-01')."', $row[did], $row[wert])<br />";
|
|
|
|
$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 "<hr>";
|
|
|
|
}
|
|
|
|
// 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')."<br />";
|
|
|
|
|
|
// 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."<br />";
|
|
|
|
}
|
|
} 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."<br />";
|
|
// echo $lb_fz_zaehler." -> ".$cur->format('Y-m-01')."<br />";
|
|
// 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');<br />";
|
|
|
|
|
|
// 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"<hr>";
|
|
// +3 Jahr addieren
|
|
// echo $next_date."<br />";
|
|
|
|
$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."<br />";
|
|
|
|
}
|
|
} // Ende IF Professor bereits eine Zulage im System hinterlegt hatte
|
|
} // Ende While über die Professoren
|
|
} // Ende Funktion
|
|
|
|
#func_LB_LZ();
|
|
|
|
?>
|