first commit
This commit is contained in:
314
func_LB_LZ.php
Executable file
314
func_LB_LZ.php
Executable file
@ -0,0 +1,314 @@
|
||||
<?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<65>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<67>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<32>. Diese k<>nnen sich aber ab einem bestimmten Datum <20>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 <20>berschritten sein. Der Zulageempf<70>nger hat W2, die Obergrenze liegt beim Grundgehalt C3: prog_tmp_lb_obergrenze berechnet die Obergrenze jeden Monat
|
||||
|
||||
/*
|
||||
Schleife <20>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 <20>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<65>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<72>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<67>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<72>ht
|
||||
|
||||
$lb_fz_zaehler = 1000;
|
||||
for ($j = 0; $j < $row2['anz_zulagen']; $j++) {
|
||||
if ($j == 0) {
|
||||
|
||||
// Beim ersten Durchlauf wird gepr<70>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<67>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 <20>ber die Professoren
|
||||
} // Ende Funktion
|
||||
|
||||
#func_LB_LZ();
|
||||
|
||||
?>
|
Reference in New Issue
Block a user