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

?>