Haushaltsbuch/forms/kontobewegung.php
2025-11-18 20:37:13 +01:00

293 lines
13 KiB
PHP

<?php
require_once __DIR__ . '/../includes/db_connect.php';
session_start();
$return = $_POST['return'] ?? 'index.php';
$kontobewegung_id = $_POST['kontobewegung_id'] ?? -1;
$kontobewegung_submit = $_POST['kontobewegung_submit'] ?? 'c';
$datum_ausgegeben = $_POST['datum_ausgegeben'] ?? '';
$datum_abgebucht = $_POST['datum_abgebucht'] ?? '';
$konto_id = $_POST['konto_id'] ?? '';
$gegenkonto_id = $_POST['gegenkonto_id'] ?? '';
$beschreibung = $_POST['beschreibung'] ?? '';
$betrag = $_POST['betrag'] ?? '';
$fehler = [];
if($datum_ausgegeben === '') $fehler[] = "Kein Datum eingegeben";
if($konto_id === '') $fehler[] = "Kein Konto ausgewählt";
if($beschreibung === '') $fehler[] = "Keine Beschreibung eingegeben";
if($betrag === '') $fehler[] = "Kein Betrag eingegeben";
if($fehler) {
$_SESSION['errors'] = $fehler;
$_SESSION['formdata'] = $_POST;
header("LOCATION: /../kontobewegung_neu.php");
exit;
} else {
$returnOfFunction = 0;
switch($kontobewegung_submit) {
case 'hinzufügen':
$returnOfFunction += insertKontobewegung($pdo,
$konto_id,
$betrag,
$beschreibung,
$datum_ausgegeben);
if(!empty($gegenkonto_id)) {
$returnOfFunction += insertKontobewegung($pdo,
$gegenkonto_id,
$betrag * -1,
$beschreibung,
$datum_ausgegeben);
}
break;
case 'speichern':
$returnOfFunction += updateKontobewegung($pdo,
$kontobewegung_id,
$konto_id,
$betrag,
$beschreibung,
$datum_ausgegeben,
$datum_abgebucht);
break;
case 'löschen':
$returnOfFunction += deleteKontobewegung($pdo,
$kontobewegung_id);
break;
}
if($returnOfFunction > 0) {
$fehler[] = "Fehler bei Datenbankoperation";
$_SESSION['errors'] = $fehler;
$_SESSION['formdata'] = $_POST;
header("LOCATION: /../umsatz_neu.php");
exit;
}
header("Location: /../$return");
exit;
}
function insertKontobewegung($para_pdo,
$para_konto_id,
$para_betrag,
$para_beschreibung,
$para_datum_ausgegeben) {
$stmt = $para_pdo->prepare("INSERT INTO kontobewegung (konto_id, betrag, beschreibung, datum_ausgegeben)
VALUES(:konto_id, :betrag, :beschreibung, :datum_ausgegeben);");
$stmt->execute(['konto_id' => $para_konto_id,
'betrag' => $para_betrag,
'beschreibung' => $para_beschreibung,
'datum_ausgegeben' => $para_datum_ausgegeben]);
/*updateHistRestguthaben($para_pdo,
$para_datum_ausgegeben,
$para_betrag,
false);*/
return 0;
}
function updateKontobewegung($para_pdo,
$para_kontobewegung_id,
$para_konto_id,
$para_betrag,
$para_beschreibung,
$para_datum_ausgegeben,
$para_datum_abgebucht) {
$para_datum_abgebucht = $para_datum_abgebucht ?: null;
try {
$para_pdo->beginTransaction();
$stmt = $para_pdo->prepare("SELECT kb.datum_abgebucht,
kb.betrag,
k.kontostand,
kb.konto_id
FROM kontobewegung kb
JOIN konto k ON k.id = kb.konto_id
WHERE kb.id = :kontobewegung_id;");
$stmt->execute(['kontobewegung_id' => $para_kontobewegung_id]);
$kontobewegung = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($kontobewegung) > 1) throw new Exception('Mehr als eine Kontobewegung gefunden');
$konto_id_vorher = $kontobewegung[0]['konto_id'];
$datum_abgebucht_vorher = $kontobewegung[0]['datum_abgebucht'];
$kontostand_vorher_konto_vorher = $kontobewegung[0]['kontostand'];
$betrag_vorher = $kontobewegung[0]['betrag'];
$stmt = $para_pdo->prepare("SELECT kontostand
FROM konto
WHERE id = :konto_id;");
$stmt->execute(['konto_id' => $para_konto_id]);
$konto_nachher = $stmt->fetchAll(PDO::FETCH_ASSOC);
$kontostand_vorher_konto_nachher = $konto_nachher[0]['kontostand'];
$kontostand_nachher_konto_vorher = $kontostand_vorher_konto_vorher;
if($konto_id_vorher == $para_konto_id) {
if(isset($datum_abgebucht_vorher) && isset($para_datum_abgebucht)) {
$kontostand_nachher_konto_vorher = $kontostand_vorher_konto_vorher - $betrag_vorher + $para_betrag;
} elseif(isset($datum_abgebucht_vorher) && !isset($para_datum_abgebucht)) {
$kontostand_nachher_konto_vorher = $kontostand_vorher_konto_vorher - $betrag_vorher;
} elseif(!isset($datum_abgebucht_vorher) && isset($para_datum_abgebucht)) {
$kontostand_nachher_konto_vorher = $kontostand_vorher_konto_vorher + $para_betrag;
} elseif(!isset($datum_abgebucht_vorher) && !isset($para_datum_abgebucht)) {
$kontostand_nachher_konto_vorher = $kontostand_vorher_konto_vorher;
}
} else {
if(isset($datum_abgebucht_vorher)) {
$kontostand_nachher_konto_vorher = $kontostand_vorher_konto_vorher - $betrag_vorher;
$kontostand_nachher_konto_nachher = $kontostand_vorher_konto_nachher + $para_betrag;
$stmt = $para_pdo->prepare("UPDATE konto
SET kontostand = :kontostand_neu
WHERE id = :konto_id;");
$stmt->execute(['kontostand_neu' => $kontostand_nachher_konto_nachher,
'konto_id' => $para_konto_id]);
}
}
$stmt = $para_pdo->prepare("UPDATE kontobewegung
SET konto_id = :konto_id,
betrag = :betrag,
beschreibung = :beschreibung,
datum_ausgegeben = :datum_ausgegeben,
datum_abgebucht = :datum_abgebucht
WHERE id = :kontobewegung_id;");
$stmt->execute(['konto_id' => $para_konto_id,
'betrag' => $para_betrag,
'beschreibung' => $para_beschreibung,
'datum_ausgegeben' => $para_datum_ausgegeben,
'datum_abgebucht' => $para_datum_abgebucht,
'kontobewegung_id' => $para_kontobewegung_id]);
$stmt = $para_pdo->prepare("UPDATE konto
SET kontostand = :kontostand_neu
WHERE id = :konto_id;");
$stmt->execute(['kontostand_neu' => $kontostand_nachher_konto_vorher,
'konto_id' => $konto_id_vorher]);
//TODO
/*updateHistRestguthaben($para_pdo,
$para_datum_ausgegeben,
$para_betrag,
false);*/
$para_pdo->commit();
return 0;
} catch (Exception $e) {
$para_pdo->rollBack();
echo "Fehler: " . $e->getMessage();
return 1;
}
}
function deleteKontobewegung($para_pdo,
$para_kontobewegung_id) {
$stmt = $para_pdo->prepare("SELECT datum_abgebucht, betrag, konto_id
FROM kontobewegung
WHERE id = :kontobewegung_id;");
$stmt->execute(['kontobewegung_id' => $para_kontobewegung_id]);
$kontobewegung = $stmt->fetchAll(PDO::FETCH_ASSOC);
try {
if(count($kontobewegung) > 1) throw new Exception("Multiple Kontobewegungen gefunden");
$datum_abgebucht = $kontobewegung[0]['datum_abgebucht'];
$betrag = $kontobewegung[0]['betrag'];
$konto_id = $kontobewegung[0]['konto_id'];
$para_pdo->beginTransaction();
if(isset($datum_abgebucht)) {
$stmt = $para_pdo->prepare("UPDATE konto
SET kontostand = kontostand - :betrag
WHERE id = :konto_id;");
$stmt->execute(['konto_id' => $konto_id,
'betrag' => $betrag]);
}
$stmt = $para_pdo->prepare("DELETE FROM kontobewegung
WHERE id = :kontobewegung_id;");
$stmt->execute(['kontobewegung_id' => $para_kontobewegung_id]);
//TODO
/*updateHistRestguthaben($para_pdo,
$para_datum_ausgegeben,
$para_betrag,
false);*/
$para_pdo->commit();
return 0;
} catch (Exception $e) {
$para_pdo->rollBack();
echo "Fehler: " . $e->getMessage();
return 1;
}
}
function updateHistRestguthaben($para_pdo,
$para_datum_ausgegeben,
$para_betrag,
$para_delete) {
try {
$para_pdo->beginTransaction();
$stmt = $para_pdo->prepare("SELECT EXTRACT(YEAR FROM CAST(:datum_ausgegeben AS DATE)) AS jahr,
id
FROM monat
WHERE EXTRACT(MONTH FROM CAST(:datum_ausgegeben AS DATE)) = CAST(wert AS INT);");
$stmt->execute(['datum_ausgegeben' => $para_datum_ausgegeben]);
$monat = $stmt->fetchAll(PDO::FETCH_ASSOC)[0];
$monat_id = $monat['id'];
$jahr = $monat['jahr'];
$stmt = $para_pdo->prepare("SELECT betrag
FROM hist_restguthaben
WHERE monat_id = :monat_id
AND jahr = :jahr;");
$stmt->execute(['monat_id' => $monat_id,
'jahr' => $jahr]);
$hist_restguthaben = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(isset($hist_restguthaben)) {
$betrag = $hist_restguthaben[0]['betrag'] + $para_betrag;
$stmt = $para_pdo->prepare("UPDATE hist_restguthaben
SET betrag = :betrag
WHERE monat_id = :monat_id
AND jahr = :jahr;");
$stmt->execute(['betrag' => $betrag,
'monat_id' => $monat_id,
'jahr' => $jahr]);
} elseif(!$para_delete) {
$stmt = $para_pdo->prepare("INSERT INTO hist_restguthaben (monat_id, jahr, betrag)
VALUES (:monat_id, :jahr, :betrag);");
$stmt->execute(['monat_id' => $monat_id,
'jahr' => $jahr,
'betrag' => $para_betrag]);
}
$para_pdo->commit();
return 0;
} catch (Exception $e) {
$para_pdo->rollBack();
echo "Fehler: " . $e->getMessage();
return 1;
}
}
?>