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

496 lines
18 KiB
PHP
Executable File

<?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');
*/
?>