prognose_ludwigsburg/func_LB_LZ.php
2023-04-26 13:17:21 +02:00

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();
?>