deputat/func_jahresabschluss_erm.php
2023-04-25 13:25:59 +02:00

456 lines
23 KiB
PHP
Executable File

<?php
## Funktion berechnet die Ermäßigungen eines Jahres
## Funktion muss überarbeitet werden, da Ausgangspunkt nicht mehr 594 LVS pauschal sind, sondern erst in Rangfolge 2 (sort_order) kommt.
function jahresabschluss_erm($imtuid, $jahr)
{
$jahr2 = $jahr + 1;
require("config.inc.php");
require("func_sperre_erm.php");
$db = dbconnect();
# Startwert: 594
$query_startlvs = $db->query("SELECT lvs, sw, sws
FROM dep_kat_lvs
WHERE jahr <= '$jahr'
ORDER BY jahr DESC
LIMIT 1
");
$row_startlvs = $query_startlvs->fetch_array();
$start_lvs = $row_startlvs['lvs'];
$start_sw = $row_startlvs['sw'];
# Ermäßigte LVS auf 0 setzen. Wird folgend neu berechnet in while Schleife
# Wird auch neu berechnet, wenn sie davor nicht auf 0 gesetzt wurden
# Mutterschutz wird z.B. nicht berechnet. Das trägt der Admin ein
#$result_init = $db->query("UPDATE dep_deputat_ermaessigung
# SET lvs = 0
# WHERE imtuid = $imtuid
# AND jahr=$jahr
# ");
$query0 = "SELECT deid, art, funktion, beginn, ende, sws, lvs, prozent, sort_order
FROM dep_deputat_ermaessigung
WHERE imtuid=$imtuid
AND jahr=$jahr
ORDER BY sort_order ASC, beginn ASC";
$result0 = $db->query($query0) or die("Cannot execute query 0");
while ($row0 = $result0->fetch_array()) {
# Summe der bisherigen Ermäßigungen herausfinden: < sort_order
$query_starterm = $db->query("SELECT sum(lvs) erm_ges
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
AND sort_order < $row0[sort_order]
");
$row_starterm = $query_starterm->fetch_array();
$sumerm = $row_starterm['erm_ges'];
########################################
# Schwerbehinderung
########################################
if ($row0['prozent'] > 0 and $row0['art'] == 'Schwerbehinderung') {
$lvs = "";
$start = new DateTime($row0['beginn']);
# Endtag definiert?
# --> Beginn der nächsten Schwerbehinderungs wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
$query_endnext = $db->query("SELECT date_sub(beginn, INTERVAL 1 DAY) ende
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
AND art = 'Schwerbehinderung'
and beginn > '$row0[beginn]'
ORDER BY beginn ASC
LIMIT 1
");
$row_endnext = $query_endnext->fetch_array();
if ($row_endnext['ende'] == '') {
# keine weitere Schwerbehinderung im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row_endnext['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden Schwerbehinderung
$ende = $row_endnext['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
$anz_mon2 = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
# Schleife läuft alle Monate des Studienjahrs durch und prüft monatliche Schwerbehinderung
$akt_mon = $cur->format('Y-m');
$sperre = erm_sperre($imtuid, $akt_mon);
if (!$sperre) {
$anz_mon++;
$bish_lvs = $db->query("SELECT sum(lvs) bish_lvs
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
AND sort_order < $row0[sort_order]
");
$row_bish_lvs = $bish_lvs->fetch_array();
$cur_lvs = $start_lvs - $row_bish_lvs['bish_lvs'];
# Monatliche Ermäßigung
} else {
$anz_mon2++;
} #Ende Sperrmonate
}
$result_umf = $db->query("SELECT prozent
FROM dep_deputat_ermaessigung
WHERE date_format(beginn, '%Y-%m') <= '$akt_mon'
AND imtuid = $imtuid
AND art = 'Schwerbehinderung'
AND jahr = '$jahr'
ORDER BY beginn desc
LIMIT 1
");
$row_umf = $result_umf->fetch_array();
$lvs_ber = $cur_lvs * $row_umf['prozent'] / (12 - $anz_mon2) * $anz_mon;
#echo $akt_mon." - $row_umf[prozent] - $cur_lvs - $lvs_ber<br>";
# Summe LVS - Während der Dauer der Schwerbehinderung
$lvs = $lvs + $lvs_ber;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art = 'Schwerbehinderung'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Schwerbehinderung
########################################
# Teilzeit
########################################
if ($row0['prozent'] > 0 and $row0['art'] == 'Teilzeit') {
$lvs = "";
$start = new DateTime($row0['beginn']);
# Endtag definiert?
# --> Beginn der nächsten Teilzeit wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
$query_endnext = $db->query("SELECT date_sub(beginn, INTERVAL 1 DAY) ende
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
AND art = 'Teilzeit'
and beginn > '$row0[beginn]'
ORDER BY beginn ASC
LIMIT 1
");
$row_endnext = $query_endnext->fetch_array();
if ($row_endnext['ende'] == '') {
# keine weitere Teilzeit im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row_endnext['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden Teilzeit
$ende = $row_endnext['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
# Schleife läuft alle Monate des Studienjahrs durch und prüft monatliche Teilzeit
$akt_mon = $cur->format('Y-m');
$sperre = erm_sperre($imtuid, $akt_mon);
if (!$sperre) {
$anz_mon++;
}
}
# Berechnung im Zeitraum
$lvs = $start_lvs * (1 - $row0['prozent']) / 12 * $anz_mon;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art = 'Teilzeit'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Teilzeit
########################################
# Mutterschutz / Elternzeit
########################################
# Trägt Admin ein
########################################
# Ermäßigung/Freistellung Rektorat/Dekanat (§§ 7, 8 LVVO)
########################################
if ($row0['sws'] > 0 and strpos($row0['art'], "§§ 7, 8 LVVO") !== false) {
$lvs = "";
$start = new DateTime($row0['beginn']);
# Endtag definiert?
# Das meiste wird bei der Erfassung vom Prof. abgefangen. Es wird bis max 31.8 erfasst. Wenn leer, dann auch 31.8. Keine mehrjährigen Erfassungen möglich.
# Somit ist eigentlich immer ein Ende definiert.
# --> Beginn der nächsten Teilzeit wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
if ($row0['ende'] == '') {
# keine weitere Ermäßigung/Freistellung Rektorat/Dekanat (§§ 7, 8 LVVO) im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row0['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden Ermäßigung/Freistellung Rektorat/Dekanat (§§ 7, 8 LVVO)
$ende = $row0['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
$akt_mon = $cur->format('Y-m');
$sperre = erm_sperre($imtuid, $akt_mon);
if (!$sperre) {
$anz_mon++;
} #Ende Sperrmonate
}
$lvs = $row0['sws'] * $start_sw / 12 * $anz_mon;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art like '%7, 8 LVVO%'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Ermäßigung/Freistellung Rektorat/Dekanat (§§ 7, 8 LVVO)
########################################
# Ermäßigung/Freistellung Funktion/Beauftragung (§ 11 LVVO)
########################################
if ($row0['sws'] > 0 and strpos($row0['art'], "§ 11 LVVO") !== false) {
$lvs = "";
$start = new DateTime($row0['beginn']);
# Endtag definiert?
# Das meiste wird bei der Erfassung vom Prof. abgefangen. Es wird bis max 31.8 erfasst. Wenn leer, dann auch 31.8. Keine mehrjährigen Erfassungen möglich.
# Somit ist eigentlich immer ein Ende definiert.
# --> Beginn der nächsten Teilzeit wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
if ($row0['ende'] == '') {
# keine weitere Ermäßigung/Freistellung Rektorat/Dekanat (§ 11 LVVO) im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row0['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden Ermäßigung/Freistellung Rektorat/Dekanat (§ 11 LVVO)
$ende = $row0['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
$akt_mon = $cur->format('Y-m');
$sperre = erm_sperre($imtuid, $akt_mon);
if (!$sperre) {
$anz_mon++;
} #Ende Sperrmonate
}
$lvs = $row0['sws'] * $start_sw / 12 * $anz_mon;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art like '%11 LVVO%'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Ermäßigung/Freistellung Rektorat/Dekanat (§ 11 LVVO)
########################################
# Ermäßigung/Freistellung Forschungs- und Entwicklungsaufgaben ($ 2 Abs. 8, 9 LVVO)
########################################
if ($row0['sws'] > 0 and strpos($row0['art'], "§ 2 Abs. 8, 9 LVVO") !== false) {
$lvs = "";
$start = new DateTime($row0['beginn']);
# Endtag definiert?
# Das meiste wird bei der Erfassung vom Prof. abgefangen. Es wird bis max 31.8 erfasst. Wenn leer, dann auch 31.8. Keine mehrjährigen Erfassungen möglich.
# Somit ist eigentlich immer ein Ende definiert.
# --> Beginn der nächsten Teilzeit wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
if ($row0['ende'] == '') {
# keine weitere Ermäßigung/Freistellung Forschung- und Enwicklungsaufgaben (§ 2 Abs. 8, 9 LVVO) im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row0['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden Ermäßigung/Freistellung Forschung- und Enwicklungsaufgaben (§ 2 Abs. 8, 9 LVVO)
$ende = $row0['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
$akt_mon = $cur->format('Y-m');
$sperre = erm_sperre($imtuid, $akt_mon);
if (!$sperre) {
$anz_mon++;
}
}
$lvs = $row0['sws'] * $start_sw / 12 * $anz_mon;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art like '%§ 2 Abs. 8, 9 LVVO%'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Ermäßigung/Freistellung Forschungs- und Entwicklungsaufgaben (§ 2 Abs. 8, 9 LVVO)
########################################
# Ermäßigung Forschungssemester/Praxissemester/Abordnungen
########################################
if (($row0['beginn'] != '' OR $row0['beginn'] != '0000-00-00') and strpos($row0['art'], "Forschungssemester/Praxissemester/Abordnungen") !== false) {
$lvs = "";
$start = new DateTime($row0['beginn']);
# Endtag definiert?
# Das meiste wird bei der Erfassung vom Prof. abgefangen. Es wird bis max 31.8 erfasst. Wenn leer, dann auch 31.8. Keine mehrjährigen Erfassungen möglich.
# Somit ist eigentlich immer ein Ende definiert.
# --> Beginn der nächsten Teilzeit wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
if ($row0['ende'] == '') {
# keine weitere Ermäßigung Forschungssemester/Praxissemester/Abordnungen im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row0['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden ErmäßigungForschungssemester/Praxissemester/Abordnungen
$ende = $row0['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
$anz_mon++;
}
$bish_lvs = $db->query("SELECT sum(lvs) bish_lvs
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
AND sort_order < $row0[sort_order]
");
$row_bish_lvs = $bish_lvs->fetch_array();
$cur_lvs = $start_lvs - $row_bish_lvs['bish_lvs'];
$lvs = $cur_lvs / 12 * $anz_mon;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art like '%Forschungssemester/Praxissemester/Abordnungen%'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Ermäßigung Forschungssemester/Praxissemester/Abordnungen
########################################
# Ermäßigung Ruhestand
########################################
if (($row0['beginn'] != '' OR $row0['beginn'] != '0000-00-00') and strpos($row0['art'], "Ruhestand") !== false) {
$lvs = "";
# Erfasst wird der letzte Arbeitstag. Programm setzt das immer auf den Monatsletzten. Daher muss für den Beginn 1 Tag addiert werden. Erfasst wurde 28.2 Beginn ist dann 01.03
$newDate = new DateTime($row0['beginn']);
$newDate->add(new DateInterval('P1D')); // P1D means a period of 1 day
$newDateForm= $newDate->format('Y-m-d');
$start = new DateTime($newDateForm);
# Endtag definiert?
# Das meiste wird bei der Erfassung vom Prof. abgefangen. Es wird bis max 31.8 erfasst. Wenn leer, dann auch 31.8. Keine mehrjährigen Erfassungen möglich.
# Somit ist eigentlich immer ein Ende definiert.
# --> Beginn der nächsten Teilzeit wenn kleiner 31.8 im Jahr2 sonst 31.8 vom Jahr2. Wenn nichts definiert, dann 31.8 Jahr2
if ($row0['ende'] == '' or $row0['ende'] == '0000-00-00') {
# keine weitere Ermäßigung Forschungssemester/Praxissemester/Abordnungen im aktuellen Jahr, dann 31.8 Jahr2
$ende = $jahr2 . '-08-31';
} elseif ($row0['ende'] >= $jahr2 . '-08-31') {
# Wenn das nächste Datum höher als der 31.8 im Folgejahr ist, dann 31.8 Jahr2 als Enddatum setzen
$ende = $jahr2 . '-08-31';
} else {
# Ende ist der Tag vor der nächsten beginnenden ErmäßigungForschungssemester/Praxissemester/Abordnungen
$ende = $row0['ende'];
}
#echo $ende."<br>";
$end = date_create($ende, new DateTimeZone('GMT'));
$anz_mon = 0;
foreach (new DatePeriod($start, new DateInterval('P1M'), $end) as $cur) {
$anz_mon++;
}
$bish_lvs = $db->query("SELECT sum(lvs) bish_lvs
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
AND sort_order < $row0[sort_order]
");
$row_bish_lvs = $bish_lvs->fetch_array();
$cur_lvs = $start_lvs - $row_bish_lvs['bish_lvs'];
$lvs = $cur_lvs / 12 * $anz_mon;
$result = $db->query("UPDATE dep_deputat_ermaessigung
SET lvs = '$lvs'
,monate = $anz_mon
WHERE imtuid = $imtuid
AND art like '%Ruhestand%'
AND jahr=$jahr
AND deid = $row0[deid]
");
} # Ende Ermäßigung Ruhestand
} # Ende äußere While Schleife
$bish_lvs = $db->query("SELECT sum(lvs) bish_lvs
FROM dep_deputat_ermaessigung
WHERE jahr = '$jahr'
AND imtuid = $imtuid
");
$row_bish_lvs = $bish_lvs->fetch_array();
$cur_lvs = $start_lvs - $row_bish_lvs['bish_lvs'];
#echo $cur_lvs."<br>";
}
#echo jahresabschluss_erm(1,2019);
?>