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:
2026-07-14 23:43:39 +02:00
co-authored by Claude Sonnet 5
parent aa9444f076
commit 968a55f442
7 changed files with 344 additions and 120 deletions
+57 -18
View File
@@ -1,6 +1,7 @@
<?php
include "functions.php";
require_once __DIR__ . "/app/ledger.php";
app_require_csrf();
include "header.php";
@@ -17,33 +18,71 @@ include "nav.php";
<?php
$pdo = app_db_pdo();
$saasUser = saas_current_user($pdo);
$tenantId = 0;
$hasAccess = false;
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;
}
}
if (!$hasAccess) {
echo "<h2>Kein Zugriff</h2>";
include "footer.php";
exit;
}
// Verarbeitung des Formulars, wenn es gesendet wurde
if ($_SERVER["REQUEST_METHOD"] == "POST" ) {
// Iteriere über alle Mitarbeiter
foreach ($_POST["anzahlBetrag"] as $mitarbeiterID => $anzahlBetrag) {
// Validierung könnte hier hinzugefügt werden
#$anzahlBetrag = $anzahlBetrag;
$anzahlBetrag = floatval($anzahlBetrag);
if($anzahlBetrag != 0){
$datum = date("Y-m-d H:i:s"); // Das aktuelle Datum verwenden
$datum = date("Y-m-d H:i:s"); // Das aktuelle Datum verwenden
$eingetragen = 0;
$fehlgeschlagen = false;
// SQL-Abfrage zum Einfügen der Daten
$sql = "INSERT INTO kl_Einzahlungen (MitarbeiterID, Betrag, Datum) VALUES (?, ?, ?)";
$params = array($mitarbeiterID, $anzahlBetrag, $datum);
try {
$pdo->beginTransaction();
$insert = $pdo->prepare(
"INSERT INTO kl_Einzahlungen (MitarbeiterID, Betrag, Datum) VALUES (?, ?, ?)"
);
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
foreach ($_POST["anzahlBetrag"] ?? [] as $mitarbeiterID => $anzahlBetrag) {
$mitarbeiterID = (int)$mitarbeiterID;
$anzahlBetrag = floatval($anzahlBetrag);
if ($mitarbeiterID <= 0 || $anzahlBetrag == 0.0) {
continue;
}
}
}
echo "Einträge erfolgreich hinzugefügt.";
$insert->execute([$mitarbeiterID, $anzahlBetrag, $datum]);
$legacyPaymentId = (int)$pdo->lastInsertId();
ledger_mirror_legacy_payment($pdo, $tenantId, $legacyPaymentId);
$eingetragen++;
}
$pdo->commit();
} catch (Throwable $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
$fehlgeschlagen = true;
}
if ($fehlgeschlagen) {
echo "Die Einzahlungen konnten nicht gespeichert werden.";
} else {
echo $eingetragen . " Einträge erfolgreich hinzugefügt.";
}
// Mitarbeiter aus der Datenbank abrufen und nach Namen sortieren
$sqlMitarbeiter = "SELECT MitarbeiterID, Name FROM kl_Mitarbeiter WHERE aktiv = 1 ORDER BY Name";
}elseif($_SERVER["REQUEST_METHOD"] == "GET" AND isset($_GET["action"])){
if($_GET["action"] == "vorderseite"){