<?php
/*
##################################################################################
## Vorgehensweise basierend auf "190605 Muster Excel mit Formeln.xlsx":
1) IST erfassen Zeile 7
2) SOLL erfassen Zeile 8
3) Über-Unterdeputat lfd Jahr berechnen Zeile 9: Zeile 7-8
4) Ist Ergebnis aus 3 negativ
JA: (Zeile 11-17) Schauen, ob in den letzten 5 Jahren ob ein Überdeputat vorhanden ist, welches verwendet werden kann. Es gilt: Das äteste ÜD muss zuerst verbraucht werden
Ggf: Vorhandene Stunden bis zum SOLL aufrechnen
(Nein: Ist Ergebnis 3 (Zeile 9) 0 oder Positiv muss nichts gemacht werden. Dieser Wert wird 1:1 in Zeile 18 übertragen Differenz)
4a) Differenz bilden (Rechenerleichterung): Differenz ist bei JA: 3 + Summe aus 4ja; Nein: Ergebnis aus 3 (Zeile 9)

5) Über- bzw. Unterdeputat aus dem Vorjahr übernehmen? (Zeile 19)
6) Summe 4a und 5 bilden (Zeile 20)
7) Gibt es noch Std, die verfallen, also die, die 5 Jahre alt sind (Zeile 22)
8) Jahresabschluss gesamtstand (Zeile 24): Übertrag ins nächste Jahr (Zeile 20-22)
9) Berechnung des Überdeputatverbrauchs mit Restwerten der Vorjahre (Zeile 25-29)
10) Übertrag des Rests des aktuellen Jahres
Wenn: 5 (Zeile 19) kleiner 0, dann Wert aus 6 (Zeile 20) sonst Wert aus 18
##################################################################################
*/
require_once("config.inc.php");
require_once("functions.php");


function jahresabschlussberechnung($uid, $jahrgang, $soll, $ist, $debug=0)
{
  $vorjahr1 = $jahrgang - 1;

  if ($debug == 1) {
    $jahrgang_next = $jahrgang+1;
    echo "<h1>$jahrgang/$jahrgang_next</h1>";
  }
  
  # Funktion um das Array aufsteigend zu sortieren
  
/*
  # In functions.php
  function sortArrayByFields($arr, $fields)
  {
    $sortFields = array();
    $args       = array();
    
    foreach ($arr as $key => $row) {
      foreach ($fields as $field => $order) {
        $sortFields[$field][$key] = $row[$field];
      }
    }
    
    foreach ($fields as $field => $order) {
      $args[] = $sortFields[$field];
      
      if (is_array($order)) {
        foreach ($order as $pt) {
          $args[$pt];
        }
      } else {
        $args[] = $order;
      }
    }
    
    $args[] =& $arr;
    
    call_user_func_array('array_multisort', $args);
    
    return $arr;
  }
*/
  
  if ($debug == 1) {
    echo "<table border=1>
            <tr>
              <td>Bezeichnung</td>
              <td>Wert</td>
            </tr>
            <tr>
              <td>Ist</td>
              <td>$ist</td>
            </tr>
            <tr>
              <td>Soll</td>
              <td>$soll</td>
            </tr>";
  }
  $db   = dbconnect();
  # Jahrgang bereinigen
  $sql0 = $db->query("DELETE FROM dep_jahresabschluss WHERE imtuid =$uid AND jahr=$jahrgang");
  $sql0 = $db->query("DELETE FROM dep_jahresabschluss_restdeputate WHERE imtuid =$uid AND jahr=$jahrgang");
  
  # Anzahl der zu berücksichtigenden Verfallsjahre
  $result_verfall = $db->query("SELECT abjahr, jahre FROM dep_kat_depverfall WHERE abjahr <= $jahrgang ORDER BY abjahr DESC limit 1");
  $row_verfall    = $result_verfall->fetch_array();
  $anz_vj = $row_verfall['jahre'];
  
  if ($debug == 1) {
    echo "
    <tr>
      <td>Überdeputatsverfall nach Jahren</td>
      <td>$anz_vj</td>
    </tr>";
  }
  
  # Punkt 3: Ergebnis laufendes Jahr
  $deperg_aktjahr = $ist - $soll;
  
  if ($debug == 1) {
    echo "
    <tr>
      <td>Über-Unterdeputat (Zeile 9)</td>
      <td>$deperg_aktjahr</td>
    </tr>";
  }
  
  # Punkt 4: Bewertung des Ergebnisses
  if ($deperg_aktjahr < 0) {
    # 4JA: Ergebnis ist negativ
    # Die letzten 5 Jahre holen
    
    $result_vj1 = $db->query("SELECT deperg_aktjahr FROM dep_jahresabschluss WHERE jahr = $vorjahr1 AND imtuid=$uid");
    $row_vj1    = $result_vj1->fetch_array();
    
    $vorjahre[0]['vorjahr']       = $vorjahr1;
    $vorjahre[0]['startwert']     = 0;
    $vorjahre[0]['differenz']     = 0;
    $vorjahre[0]['differenzjahr'] = 0;
    $vorjahre[0]['endwert']       = $row_vj1[deperg_aktjahr];
    
    for ($i = 0; $i < $anz_vj; $i++) {

      if ($i >= 1) {
        
        $vorjahr   = $vorjahr1 - $i;
        $result_vj = $db->query("SELECT startwert, differenz, differenzjahr, endwert FROM dep_jahresabschluss_restdeputate WHERE jahr = $vorjahr1 AND imtuid=$uid AND vorjahr= $vorjahr");
        $row_vj    = $result_vj->fetch_array();
        
        $vorjahre[$i]['vorjahr']       = $vorjahr;
        $vorjahre[$i]['startwert']     = $row_vj[startwert];
        $vorjahre[$i]['differenz']     = $row_vj[differenz];
        $vorjahre[$i]['differenzjahr'] = $row_vj[differenzjahr];
        $vorjahre[$i]['endwert']       = $row_vj[endwert];
      }
    }
    
    if(isset($vorjahre)){
    $sorted_vj = sortArrayByFields($vorjahre, array(
      'vorjahr' => SORT_ASC
    ));
    }
    
    
    
    #$vorjahre = ksort($vorjahre);
    #print_r($sorted_vj);
    
    # Vorjahre durchlaufen, wo man das Unterdeputat ausgleichen kann
    $unterdeputat = $deperg_aktjahr * -1;
    
    $genommene_stdges = 0;
    
    for ($k = 0; $k < count($sorted_vj); $k++) {
      $akt_vorjahr = $sorted_vj[$k][vorjahr];
      $akt_endwert = $sorted_vj[$k][endwert];
      if ($sorted_vj[$k][endwert] > 0) {
        ## Dann kann man ausgleichen, die Frage ist, ob es für das Unterdeputat ($deperg_aktjahr) ausreicht:
        
        if ($akt_endwert >= $unterdeputat) {
          # Endwert passt voll
          $rest             = $akt_endwert - $unterdeputat;
          $genommene_std    = $unterdeputat;
          $genommene_stdges = $genommene_stdges + $genommene_std;
          $unterdeputat     = 0;
          
          $aktjahr[$k]['vorjahr']       = $akt_vorjahr;
          $aktjahr[$k]['startwert']     = $akt_endwert;
          $aktjahr[$k]['differenz']     = $genommene_std * -1;
          $aktjahr[$k]['differenzjahr'] = $jahrgang;
          $aktjahr[$k]['endwert']       = $rest;
          $test                         = 1;
        } else {
          # vorhandenes Überdeputat reicht nicht aus. Es bleibt ein Restunterdeputat
          $unterdeputat                 = $unterdeputat - $akt_endwert;
          $genommene_std                = $akt_endwert;
          $genommene_stdges             = $genommene_stdges + $genommene_std;
          $rest                         = 0;
          $test                         = 2;
          $aktjahr[$k]['vorjahr']       = $akt_vorjahr;
          $aktjahr[$k]['startwert']     = $akt_endwert;
          $aktjahr[$k]['differenz']     = $genommene_std * -1;
          $aktjahr[$k]['differenzjahr'] = $jahrgang;
          $aktjahr[$k]['endwert']       = $rest;
          
        }
        
      } else {
        # Nichts zu holen in diesem Jahr
        $aktjahr[$k]['vorjahr']       = $akt_vorjahr;
        $aktjahr[$k]['startwert']     = 0;
        $aktjahr[$k]['differenz']     = 0;
        $aktjahr[$k]['differenzjahr'] = 0;
        $aktjahr[$k]['endwert']       = 0;
        $genommene_std                = 0;
        $genommene_stdges             = $genommene_stdges + $genommene_std;
      }
      if ($debug == 1) {
        echo "
        <tr>
          <td>Überdeputat abbauen $akt_vorjahr</td>
          <td>$genommene_std</td>
        </tr>";
      }
    }
    
    if ($debug == 1) {
      echo "
      <tr>
        <td>Genommene Gesamtstd (Zeile 11)</td>
        <td>$genommene_stdges</td>
      </tr>";
    }
    # Zeile 18: Differenz
    if ($deperg_aktjahr > 0) {
      $differenz = 0 + $deperg_aktjahr;
    } else {
      $differenz = $genommene_stdges + $deperg_aktjahr;
    }
    if(isset($aktjahr)){
    $sorted_aj = sortArrayByFields($aktjahr, array(
      'vorjahr' => SORT_ASC
    ));
    }
  } else {
    # 4Nein: Ergebnis ist positiv, dann ist es der gleiche Wert wie Zeile 9
    $differenz = $deperg_aktjahr;
  }
  if ($debug == 1) {
    echo "
    <tr>
      <td>Differenz (Zeile 18)</td>
      <td>$differenz</td>
    </tr>";
  }
  
  #5) Über- Unterdeputat aus Vorjahr übernehmen
  
  $result_vj_ende   = $db->query("SELECT dep_gesamt_nach_verfall FROM dep_jahresabschluss WHERE jahr = $vorjahr1 AND imtuid=$uid");
  $row_vj_ende      = $result_vj_ende->fetch_array();
  $vorjahresendwert = $row_vj_ende[dep_gesamt_nach_verfall] - $genommene_stdges;
  
  
  if ($vorjahresendwert == '') {
    $vorjahresendwert = 0;
  }
  if ($debug == 1) {
    echo "
    <tr>
      <td>Vorjahreswert (Zeile 19)</td>
      <td>$vorjahresendwert</td>
    </tr>";
  }
  #6) Über- Unterdeputat gesamt (Zeile 20)
  $deputat_gesamt = $differenz + $vorjahresendwert;
  
  if ($debug == 1) {
    echo "
    <tr>
      <td>Deputat gesamt (Zeile 20)</td>
      <td>$deputat_gesamt</td>
    </tr>";
  }
  
  # 7) verfallene Stunden prüfen
  # Es verfallen Stunden, die Älter als 5 Jahre sind. Entweder sind diese im aktuellen Jahr genommen worden
  
  # Welches Jahr ist das betroffene Jahr
  $verfall_jahr = $jahrgang - $anz_vj;
  
  $key = strval(@array_search($verfall_jahr, array_column($sorted_aj, 'vorjahr')));
  # Wenn eine arraykey gefunden wird, dann den endwert, sonst den Wert aus DB, da dieser Verfallswert dann im aktuellen Jahr nicht angefasst wurde
  
  if ($key != '') {
    # im aktuellen Jahr wurde etwas verwendet um ein Unterdeputat auszugleichen. Dann verfällt nur der Restwert
    $verfall = $sorted_aj[$key]['endwert'];
  } else {
    # Wert wurde nicht angefasst, dann ist der letzte Wert in der Datenbank maßgebend für den Verfall
    $result_verfall = $db->query("SELECT endwert FROM dep_jahresabschluss_restdeputate WHERE jahr = $vorjahr1 AND imtuid=$uid AND vorjahr= $verfall_jahr");
    $row_verfall    = $result_verfall->fetch_array();
    $verfall        = $row_verfall['endwert'];
  }
  
  if ($debug == 1) {
    echo "
    <tr>
      <td>Verfall (Zeile 22)</td>
      <td>$verfall</td>
    </tr>";
  }
  # 8) Jahresabschluss gesamtstand: Zeile 20-22
  $jahresabschluss_gesamt = $deputat_gesamt - $verfall;
  
  if ($debug == 1) {
    echo "
    <tr>
      <td>Rest nach Verfall (Zeile 24)</td>
      <td>$jahresabschluss_gesamt</td>
    </tr>";
  }
  
  # 9) Restdeputate übernehmen: Zeile 25-29; Tabelle "dep_jahresabschluss_restdeputate"
  #    Sind Überdeputate verbraucht worden, dann sind sie in array $sorted_aj, sonst verganene Werte nehmen
  
  # Vorjahre durchlaufen

# 02.06.2022: -1 gelöscht. Ansicht ist sonst nicht 5 Jahre im Jahresabschluss
#  for ($i = 0; $i < $anz_vj - 1; $i++) {
  for ($i = 0; $i < $anz_vj; $i++) {
    $vorjahr_rest               = $vorjahr1 - $i;
    $rest_nach_jahren[$i][jahr] = $vorjahr_rest;
    
    $key_rest = strval(@array_search($vorjahr_rest, array_column($sorted_aj, 'vorjahr')));
    
    # Wenn eine arraykey gefunden wird, dann den endwert, sonst den Wert aus DB, da dieser Verfallswert dann im aktuellen Jahr nicht angefasst wurde
    if ($key_rest != '') {
      # Endwert aus array holen
      $startwert                           = $sorted_aj[$key_rest]['startwert'];
      $differenz1                          = $sorted_aj[$key_rest]['differenz'];
      $differenzjahr1                      = $sorted_aj[$key_rest]['differenzjahr'];
      $endwert                             = $sorted_aj[$key_rest]['endwert'];
      $rest_nach_jahren[$i][startwert]     = $startwert;
      $rest_nach_jahren[$i][differenz]     = $differenz1;
      $rest_nach_jahren[$i][differenzjahr] = $differenzjahr1;
      $rest_nach_jahren[$i][endwert]       = $endwert;
      
      if ($debug == 1) {
        echo "
        <tr>
          <td>Endwert1 $vorjahr_rest (Zeile 25-28)</td>
          <td>$endwert</td>
        </tr>";
      }
    } else {
      # letzte Endwert auslesen
      
      if ($vorjahr1 == $vorjahr_rest) {
        $result_endwert                      = $db->query("SELECT deperg_aktjahr FROM dep_jahresabschluss WHERE jahr = $vorjahr1");
        $row_endwert                         = $result_endwert->fetch_array();
        $rest_nach_jahren[$i][startwert]     = 0;
        $rest_nach_jahren[$i][differenz]     = 0;
        $rest_nach_jahren[$i][differenzjahr] = 0;
        $endwert                             = $row_endwert['deperg_aktjahr'];
        if ($endwert <= 0) {
          $endwert                       = 0;
          $rest_nach_jahren[$i][endwert] = 0;
        } else {
          $rest_nach_jahren[$i][endwert] = $endwert;
        }
      } else {
        $result_endwert                      = $db->query("SELECT endwert FROM dep_jahresabschluss_restdeputate WHERE jahr = $vorjahr1 AND imtuid=$uid AND vorjahr= $vorjahr_rest");
        $row_endwert                         = $result_endwert->fetch_array();
        $rest_nach_jahren[$i][startwert]     = 0;
        $rest_nach_jahren[$i][differenz]     = 0;
        $rest_nach_jahren[$i][differenzjahr] = 0;
        $endwert                             = $row_endwert['endwert'];
        if ($endwert <= 0) {
          $endwert                       = 0;
          $rest_nach_jahren[$i][endwert] = 0;
        } else {
          $rest_nach_jahren[$i][endwert] = $endwert;
        }
      }
      if ($debug == 1) {
        echo "<tr>
                <td>Endwert2 $vorjahr_rest (Zeile 25-28)</td>
                <td>$endwert</td>
              </tr>";
      }
    }
    
  }
  if(isset($rest_nach_jahren)){
  $sorted_rest_nach_jahren = sortArrayByFields($rest_nach_jahren, array(
    'jahr' => SORT_ASC
  ));
  }
  for ($k = 0; $k < count($sorted_rest_nach_jahren); $k++) {
    $vorjahr        = $sorted_rest_nach_jahren[$k][jahr];
    $startwert      = $sorted_rest_nach_jahren[$k][startwert];
    $differenz2     = $sorted_rest_nach_jahren[$k][differenz];
    $differenzjahr2 = $sorted_rest_nach_jahren[$k][differenzjahr];
    $endwert        = $sorted_rest_nach_jahren[$k][endwert];
    
    
    $sql1 = $db->query("INSERT INTO dep_jahresabschluss_restdeputate ( imtuid
                                                                     , jahr
                                                                     , vorjahr
                                                                     , startwert
                                                                     , differenz
                                                                     , differenzjahr
                                                                     , endwert
                                                                     )
                                                                     VALUES
                                                                     ( '$uid'
                                                                     , '$jahrgang'
                                                                     , '$vorjahr'
                                                                     , '$startwert'
                                                                     , '$differenz2'
                                                                     , '$differenzjahr2'
                                                                     , '$endwert'
                                                                     )
                                                                     ");
    
  }
  
  # 10) Vorjaresendwert
  if ($vorjahresendwert < 0) {
    # Zeile 20
    $jahresendwert_uebertrag = $deputat_gesamt;
  } else {
    # Zeile 18
    $jahresendwert_uebertrag = $differenz;
  }
  
  if ($debug == 1) {
    echo "
    <tr>
      <td>Übertrag $jahrgang (Zeile 29)</td>
      <td>$jahresendwert_uebertrag</td>
    </tr>";
  }
  
  
  $sql1 = $db->query("INSERT INTO dep_jahresabschluss ( imtuid
                                                      , jahr
                                                      , soll
                                                      , ist
                                                      , dep_gesamt
                                                      , dep_verfall_jahr
                                                      , dep_verfall
                                                      , dep_gesamt_nach_verfall
                                                      , deperg_aktjahr
                                                      )
                                                      VALUES
                                                      ( '$uid'
                                                      , '$jahrgang'
                                                      , '$soll'
                                                      , '$ist'
                                                      , '$deputat_gesamt'
                                                      , '$verfall_jahr'
                                                      , '$verfall'
                                                      , '$jahresabschluss_gesamt'
                                                      , '$jahresendwert_uebertrag'
                                                      )
                                                      ");
  
  
}

#echo jahresabschlussberechnung(1, 2024, 594, 500, 1);
#echo jahresabschlussberechnung(1, 2023, 594, 450, 1);
#echo jahresabschlussberechnung(1, 2022, 594, 500, 1);
#echo jahresabschlussberechnung(1, 2021, 594, 800, 1);
#echo jahresabschlussberechnung(1, 2020, 594, 600, 1);
#echo jahresabschlussberechnung(1, 2019, 594, 694, 1);
#echo jahresabschlussberechnung(1, 2018, 594, 129.15, 1);
#echo jahresabschlussberechnung(1, 2017, 594, 694, 1);
#echo jahresabschlussberechnung(1, 2016, 594, 694, 1);
#echo jahresabschlussberechnung(1, 2015, 594, 750, 1);
#echo jahresabschlussberechnung(1, 2014, 594, 603.6, 1);
#echo jahresabschlussberechnung(1, 2013, 594, 500, 1);
#echo jahresabschlussberechnung(1, 2012, 594, 500, 1);

/*

TRUNCATE TABLE `dep_jahresabschluss`;
TRUNCATE TABLE `dep_jahresabschluss_restdeputate`;

DELETE FROM `dep_jahresabschluss`  where jahr > 2011;
DELETE FROM `dep_jahresabschluss_restdeputate`  where jahr > 2011;

# Dummy 2011
INSERT INTO `dep_jahresabschluss_restdeputate` (`drdid`, `jahr`, `imtuid`, `vorjahr`, `startwert`, `differenz`, `differenzjahr`, `endwert`) VALUES
(2, 2011, 1, 2010, '0.00', '0.00', 0, '0.00');

INSERT INTO `dep_jahresabschluss` (`djaid`, `imtuid`, `jahr`, `soll`, `ist`, `dep_gesamt`, `dep_verfall`, `dep_gesamt_nach_verfall`, `deperg_aktjahr`) VALUES
(1, 1, 2011, '0.00', '0.00', '0.00', '0.00', '0.00', '0.00');


INSERT INTO `dep_jahresabschluss` (`djaid`, `imtuid`, `jahr`, `soll`, `ist`, `dep_gesamt`, `dep_verfall`, `dep_gesamt_nach_verfall`, `deperg_aktjahr`) VALUES
(1, 1, 2015, '0.00', '0.00', '72.80', '0.00', '72.80', '72.80');

INSERT INTO `dep_jahresabschluss_restdeputate` (`drdid`, `jahr`, `imtuid`, `vorjahr`, `startwert`, `differenz`, `differenzjahr`, `endwert`) VALUES
(1, 2015, 1, 2011, '0.00', '0.00', 0, '0.00'),
(2, 2015, 1, 201, '0.00', '0.00', 0, '0.00');

*/
?>