M5 abschliessen: Schreibseiten aufs Ledger umstellen, Storno statt Delete
- stricheintragen.php und einzahlung.php erhielten bisher gar keine Zugriffskontrolle (nur CSRF), jetzt Rollen-/Legacy-Fallback wie in kaffeeliste.php; Sammeleintraege spiegeln transaktional ins Ledger (ledger_mirror_legacy_payment neu ergaenzt). - letzteneintraege.php war rein ueber Legacy-Admin gesperrt und haette neue SaaS-Mandanten ausgeschlossen; Loeschen markiert den gespiegelten Ledger-Eintrag jetzt per voided_at statt ihn zu entfernen (ledger_void_entry_by_legacy_id). - check-m4-ledger-migration.php an das Storno-Modell angepasst: verwaiste Ledger-Zeilen sind nur noch ein Fehler, wenn sie nicht voided sind. - Nebenbei: PHP-Warning bei Sammelerfassung behoben, toten Code entfernt, veraltete README (verwies auf nicht existierende saas-app/-Struktur) korrigiert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+51
-55
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
include "functions.php";
|
||||
require_once __DIR__ . "/app/ledger.php";
|
||||
app_require_csrf();
|
||||
include "header.php";
|
||||
include "headerline.php";
|
||||
@@ -14,65 +15,55 @@ include "nav.php";
|
||||
<div class="content">
|
||||
|
||||
<?php
|
||||
if(checkKaffeelisteAdmin($conn, $mailadress)){
|
||||
|
||||
// Funktion zum Berechnen der Gesamtausgabe und Gesamtstriche pro Mitarbeiter
|
||||
function berechneGesamtausgabe($mitarbeiterID, $conn) {
|
||||
// Gesamtausgabe für Kaffeeverbrauch pro Mitarbeiter
|
||||
$sqlAusgabe = "SELECT SUM(Kosten) AS Gesamtausgabe FROM kl_Kaffeeverbrauch WHERE MitarbeiterID = ?";
|
||||
$stmtAusgabe = sqlsrv_query($conn, $sqlAusgabe, array($mitarbeiterID));
|
||||
$rowAusgabe = sqlsrv_fetch_array($stmtAusgabe, SQLSRV_FETCH_ASSOC);
|
||||
$gesamtausgabe = $rowAusgabe['Gesamtausgabe'];
|
||||
$pdo = app_db_pdo();
|
||||
$saasUser = saas_current_user($pdo);
|
||||
$tenantId = 0;
|
||||
$hasAccess = false;
|
||||
|
||||
return $gesamtausgabe;
|
||||
if ($saasUser !== null && saas_user_has_role(['owner', 'admin', 'treasurer'], $saasUser)) {
|
||||
$tenantId = (int)$saasUser['tenant_id'];
|
||||
$hasAccess = true;
|
||||
}
|
||||
|
||||
if (!$hasAccess && $saasUser === null && checkKaffeelisteAdmin($conn, $mailadress)) {
|
||||
$tenant = ledger_fetch_default_tenant($pdo);
|
||||
if ($tenant !== null) {
|
||||
$tenantId = (int)$tenant['id'];
|
||||
$hasAccess = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Funktion zum Berechnen der Gesamtstriche pro Mitarbeiter
|
||||
function berechneGesamtstriche($mitarbeiterID, $conn) {
|
||||
// Gesamtstriche pro Mitarbeiter
|
||||
$sqlStriche = "SELECT SUM(AnzahlStriche) AS Gesamtstriche FROM kl_Kaffeeverbrauch WHERE MitarbeiterID = ?";
|
||||
$stmtStriche = sqlsrv_query($conn, $sqlStriche, array($mitarbeiterID));
|
||||
$rowStriche = sqlsrv_fetch_array($stmtStriche, SQLSRV_FETCH_ASSOC);
|
||||
$gesamtstriche = $rowStriche['Gesamtstriche'];
|
||||
if($hasAccess){
|
||||
|
||||
return $gesamtstriche;
|
||||
}
|
||||
// Funktion zum Berechnen der Gesamteinzahlungen pro Mitarbeiter
|
||||
function berechneGesamteinzahlungen($mitarbeiterID, $conn) {
|
||||
// Gesamteinzahlungen pro Mitarbeiter
|
||||
$sqlEinzahlungen = "SELECT SUM(Betrag) AS Gesamteinzahlungen FROM kl_Einzahlungen WHERE MitarbeiterID = ?";
|
||||
$stmtEinzahlungen = sqlsrv_query($conn, $sqlEinzahlungen, array($mitarbeiterID));
|
||||
$rowEinzahlungen = sqlsrv_fetch_array($stmtEinzahlungen, SQLSRV_FETCH_ASSOC);
|
||||
$gesamteinzahlungen = $rowEinzahlungen['Gesamteinzahlungen'];
|
||||
|
||||
return $gesamteinzahlungen;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Funktion zum Löschen einer Einzahlung
|
||||
function loescheEinzahlung($einzahlungID, $conn) {
|
||||
// Funktion zum Löschen einer Einzahlung: der Ledger-Eintrag wird als Storno
|
||||
// markiert statt geloescht, damit die Buchungshistorie nachvollziehbar bleibt.
|
||||
function loescheEinzahlung($einzahlungID, PDO $pdo, int $tenantId) {
|
||||
try {
|
||||
$sql = "DELETE FROM kl_Einzahlungen WHERE EinzahlungsID = ?";
|
||||
$params = array($einzahlungID);
|
||||
$pdo->beginTransaction();
|
||||
|
||||
$stmt = sqlsrv_query($conn, $sql, $params);
|
||||
ledger_void_entry_by_legacy_id($pdo, $tenantId, 'kl_Einzahlungen', $einzahlungID);
|
||||
|
||||
if ($stmt === false) {
|
||||
throw new Exception(print_r(sqlsrv_errors(), true));
|
||||
}
|
||||
$stmt = $pdo->prepare('DELETE FROM kl_Einzahlungen WHERE EinzahlungsID = ?');
|
||||
$stmt->execute([$einzahlungID]);
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
return true; // Erfolgreich gelöscht
|
||||
} catch (Exception $e) {
|
||||
return $e->getMessage(); // Fehlermeldung zurückgeben
|
||||
} catch (Throwable $e) {
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
return 'Die Einzahlung konnte nicht gelöscht werden.';
|
||||
}
|
||||
}
|
||||
|
||||
// Überprüfen, ob ein Löschvorgang angefordert wurde
|
||||
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["aktion"]) && $_POST["aktion"] == "loescheneinzahlung") {
|
||||
$einzahlungID = $_POST["einzahlungID"];
|
||||
$einzahlungID = (int)$_POST["einzahlungID"];
|
||||
|
||||
$ergebnis = loescheEinzahlung($einzahlungID, $conn);
|
||||
$ergebnis = loescheEinzahlung($einzahlungID, $pdo, $tenantId);
|
||||
|
||||
if ($ergebnis === true) {
|
||||
echo "Einzahlung erfolgreich gelöscht.";
|
||||
@@ -136,29 +127,34 @@ $stmtEinzahlungen = sqlsrv_query($conn, $sqlEinzahlungen);
|
||||
|
||||
<br><br>
|
||||
<?php
|
||||
// Funktion zum Löschen eines Strich-Eintrags
|
||||
function loescheStrichEintrag($strichID, $conn) {
|
||||
// Funktion zum Löschen eines Strich-Eintrags: der Ledger-Eintrag wird als
|
||||
// Storno markiert statt geloescht, damit die Buchungshistorie nachvollziehbar bleibt.
|
||||
function loescheStrichEintrag($strichID, PDO $pdo, int $tenantId) {
|
||||
try {
|
||||
$sql = "DELETE FROM kl_Kaffeeverbrauch WHERE VerbrauchID = ?";
|
||||
$params = array($strichID);
|
||||
$pdo->beginTransaction();
|
||||
|
||||
$stmt = sqlsrv_query($conn, $sql, $params);
|
||||
ledger_void_entry_by_legacy_id($pdo, $tenantId, 'kl_Kaffeeverbrauch', $strichID);
|
||||
|
||||
if ($stmt === false) {
|
||||
throw new Exception(print_r(sqlsrv_errors(), true));
|
||||
}
|
||||
$stmt = $pdo->prepare('DELETE FROM kl_Kaffeeverbrauch WHERE VerbrauchID = ?');
|
||||
$stmt->execute([$strichID]);
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
return true; // Erfolgreich gelöscht
|
||||
} catch (Exception $e) {
|
||||
return $e->getMessage(); // Fehlermeldung zurückgeben
|
||||
} catch (Throwable $e) {
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
return 'Der Strich-Eintrag konnte nicht gelöscht werden.';
|
||||
}
|
||||
}
|
||||
|
||||
// Überprüfen, ob ein Löschvorgang angefordert wurde
|
||||
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["aktion"]) && $_POST["aktion"] == "loeschen") {
|
||||
$strichID = $_POST["strichID"];
|
||||
$strichID = (int)$_POST["strichID"];
|
||||
|
||||
$ergebnis = loescheStrichEintrag($strichID, $conn);
|
||||
$ergebnis = loescheStrichEintrag($strichID, $pdo, $tenantId);
|
||||
|
||||
if ($ergebnis === true) {
|
||||
echo "Strich-Eintrag erfolgreich gelöscht.";
|
||||
|
||||
Reference in New Issue
Block a user