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