Abstaende: Im Template hat das Label 1em Abstand nach unten, das Eingabefeld aber gar keinen, und die Formular-Grids nutzen keinen vertikalen Gutter (gtr-uniform). Dadurch war der Abstand vom Feld zum naechsten Label 0, waehrend Label zu eigenem Feld 1em betrug - das Label wirkte, als gehoere es zum Feld darueber. Jetzt sitzt das Label eng an seinem eigenen Feld (0,5em) und die Felder haben 1,5em Abstand nach unten. Ausserdem stylt main.css die Typen number, date, datetime-local und file gar nicht; diese Felder erschienen als kleine native Kaestchen zwischen den sonst einheitlichen Feldern (z. B. "Listenfenster in Tagen" und "Zeilenhoehe im Ausdruck"). Sie bekommen jetzt dasselbe Aussehen wie die Textfelder. Die Anpassungen liegen in einer eigenen assets/css/app.css, damit main.css als Template-Datei unveraendert bleibt. Nebenbei: .hint-box.error war nirgends definiert, obwohl es die haeufigste Variante ist - Fehlermeldungen erschienen ungefaerbt wie neutrale Hinweise. In faq.php, hinweise.php, namenanpassen.php und stricheintragen.php standen <br>/<br><br> als Abstandsersatz hinter Labels und Feldern; mit den neuen Abstaenden waere daraus doppelter Leerraum geworden. Entfernt, das Layout kommt jetzt aus dem CSS. Anleitung: Neue Seite anleitung.php mit den wichtigsten Funktionen, gegliedert nach Zielgruppe. Die Abschnitte fuer Kassenwart bzw. Administration werden nur eingeblendet, wenn die Rolle sie auch nutzen kann - sonst stuenden dort Hinweise auf Menuepunkte, die es fuer den Nutzer nicht gibt. Verlinkt im Menue unter "Kaffeeliste" und im Smoke-Test abgedeckt. Geprueft: alle 12 Formularseiten rendern fehlerfrei, http-smoke 34/0, role-matrix 55/0, tenant-isolation 12/0, settings-flow 15/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
244 lines
11 KiB
PHP
244 lines
11 KiB
PHP
<?php
|
||
|
||
include "functions.php";
|
||
require_once __DIR__ . "/app/ledger.php";
|
||
|
||
$pdo = app_db_pdo();
|
||
$saasUser = saas_current_user($pdo);
|
||
|
||
// Die Anleitung ist bewusst fuer alle angemeldeten Rollen lesbar - auch
|
||
// Mitglieder sollen nachschlagen koennen. Die Verwaltungsabschnitte werden
|
||
// nur eingeblendet, wenn die Rolle sie auch nutzen kann; sonst waere die
|
||
// Seite voller Hinweise auf Menuepunkte, die es fuer diesen Nutzer nicht gibt.
|
||
$istKassenwart = $saasUser !== null && saas_user_has_role(['owner', 'admin', 'treasurer'], $saasUser);
|
||
$istAdmin = $saasUser !== null && saas_user_has_role(['owner', 'admin'], $saasUser);
|
||
|
||
// Einstellungen fuer die Hinweise zu den aktivierten Zahlungswegen.
|
||
$settings = $saasUser !== null ? saas_fetch_tenant_settings($pdo, (int)$saasUser['tenant_id']) : null;
|
||
|
||
include "header.php";
|
||
include "headerline.php";
|
||
include "nav.php";
|
||
?>
|
||
|
||
<section id="banner">
|
||
<div class="content">
|
||
|
||
<h2>Anleitung</h2>
|
||
<p>Diese Seite erklärt die wichtigsten Funktionen der Kaffeeliste. Oben stehen
|
||
die Punkte, die jedes Mitglied betreffen, darunter die Verwaltungsfunktionen.</p>
|
||
|
||
<?php if ($saasUser === null): ?>
|
||
<div class="hint-box">
|
||
<p>Du bist nicht angemeldet. Nach der Anmeldung siehst du hier zusätzlich die
|
||
Anleitung zu den Funktionen deiner Rolle.</p>
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<hr>
|
||
|
||
<h2>Für alle Mitglieder</h2>
|
||
|
||
<h3>Meine Kaffeeliste</h3>
|
||
<p>Das ist deine Startseite. Sie zeigt deinen <b>aktuellen Stand</b>, deine
|
||
Jahresübersicht sowie die letzten Einzahlungen und Striche.</p>
|
||
<ul>
|
||
<li><b>Guthaben</b> (positiver Betrag): Du hast mehr eingezahlt, als du verbraucht hast.</li>
|
||
<li><b>Schulden</b> (negativer Betrag): Es ist Zeit für eine Einzahlung.</li>
|
||
</ul>
|
||
<p>In der <b>Monatsübersicht</b> siehst du, wie viele Striche in welchem Monat
|
||
zusammengekommen sind.</p>
|
||
|
||
<h3>Striche selbst eintragen</h3>
|
||
<p>Wenn die Verwaltung das freigeschaltet hat, kannst du deinen Kaffee direkt auf
|
||
der Startseite eintragen – ein oder zwei Striche pro Vorgang.</p>
|
||
<div class="hint-box">
|
||
<p><b>Vertippt?</b> Direkt darunter kannst du deinen <b>zuletzt selbst
|
||
eingetragenen</b> Strich wieder stornieren. Striche, die der Kassenwart über die
|
||
Sammelerfassung eingetragen hat, kannst du nicht selbst stornieren – wende dich
|
||
dafür an die Verwaltung.</p>
|
||
</div>
|
||
|
||
<h3>Bezahlen</h3>
|
||
<p>Welche Wege zur Verfügung stehen, legt die Verwaltung fest. Möglich sind:</p>
|
||
<ul>
|
||
<li><b>Barzahlung</b> – beim angegebenen Ansprechpartner.</li>
|
||
<li><b>PayPal</b> – über die Schaltflächen auf der Startseite.</li>
|
||
<li><b>Überweisung</b> – auf die angegebene IBAN.</li>
|
||
</ul>
|
||
<?php if ($settings !== null): ?>
|
||
<p><small>In eurem Mandanten sind aktuell aktiv:
|
||
<?php
|
||
$wege = [];
|
||
if ((int)$settings['cash_enabled'] === 1) { $wege[] = 'Barzahlung'; }
|
||
if ((int)$settings['paypal_enabled'] === 1) { $wege[] = 'PayPal'; }
|
||
if ((int)$settings['bank_transfer_enabled'] === 1) { $wege[] = 'Überweisung'; }
|
||
echo $wege === [] ? '<b>noch kein Zahlungsweg</b>' : '<b>' . saas_html(implode(', ', $wege)) . '</b>';
|
||
?>.</small></p>
|
||
<?php endif; ?>
|
||
<div class="hint-box">
|
||
<p><b>Wichtig bei PayPal:</b> Nutzt die Funktion „Geld an Freunde senden“. Bei
|
||
Zahlungen für „Waren und Dienstleistungen“ zieht PayPal Gebühren ab – gutgeschrieben
|
||
wird dann nur der Betrag, der tatsächlich angekommen ist.</p>
|
||
</div>
|
||
|
||
<h3>Anzeigenamen ändern</h3>
|
||
<p>Unter <b>Namensanpassung</b> kannst du festlegen, wie dein Name auf der
|
||
Kaffeeliste und im Ausdruck erscheint (maximal 20 Zeichen).</p>
|
||
|
||
<h3>Kundenkonto</h3>
|
||
<p>Unter <b>Kundenkonto</b> findest du deine Zugangsdaten, kannst deine E-Mail-Adresse
|
||
bestätigen und dein Passwort ändern.</p>
|
||
|
||
<?php if ($istKassenwart): ?>
|
||
<hr>
|
||
|
||
<h2>Für Kassenwart und Verwaltung</h2>
|
||
<p><small>Sichtbar für die Rollen <b>Kassenwart</b>, <b>Administrator</b> und
|
||
<b>Inhaber</b>.</small></p>
|
||
|
||
<h3>Einzahlung eintragen</h3>
|
||
<p>Trage hier ein, wer wie viel eingezahlt hat. Du kannst mehrere Mitglieder in
|
||
einem Durchgang erfassen; leere Felder werden übersprungen.</p>
|
||
<ul>
|
||
<li><b>Bemerkung</b>: optionale Notiz, damit später nachvollziehbar bleibt, worum es ging.</li>
|
||
<li><b>Negativer Betrag</b> = Abzug (z. B. Auszahlung bei Austritt oder eine
|
||
Erstattung). Dabei ist eine Bemerkung <b>Pflicht</b>.</li>
|
||
</ul>
|
||
<div class="hint-box">
|
||
<p><b>Falsch eingetragen ist kein Abzug.</b> Wenn eine Buchung schlicht falsch war,
|
||
storniere sie unter <b>Letzte Einträge</b>. Ein Gegen-Abzug würde die Auswertung
|
||
verfälschen, weil dann beide Buchungen als Umsatz zählen.</p>
|
||
<p>Zum Schutz vor Vertippern werden Beträge über 1.000 € abgelehnt. Schlägt eine
|
||
Zeile fehl, wird <b>nichts</b> gebucht und deine Eingaben bleiben stehen.</p>
|
||
</div>
|
||
|
||
<h3>Striche eintragen</h3>
|
||
<p>Sammelerfassung für die Papierliste. Über die Schaltflächen wählst du:</p>
|
||
<ul>
|
||
<li><b>Vorderseite</b>: Vieltrinker – Mitglieder mit mindestens 10 Strichen im Listenfenster.</li>
|
||
<li><b>Rückseite</b>: alle übrigen aktiven Mitglieder.</li>
|
||
<li><b>Alle</b>: die komplette Liste.</li>
|
||
</ul>
|
||
<p>Der <b>Preis pro Strich</b> wird aus den Mandant-Einstellungen vorbelegt und kann
|
||
für den einzelnen Vorgang überschrieben werden.</p>
|
||
|
||
<h3>Letzte Einträge – stornieren</h3>
|
||
<p>Zeigt die letzten 100 Einzahlungen und Striche. Fehlerhafte Buchungen werden
|
||
<b>storniert</b>, nicht gelöscht: Sie verschwinden aus der Auswertung, bleiben aber
|
||
im Journal nachvollziehbar.</p>
|
||
|
||
<h3>PayPal-Zahlungen automatisch verbuchen</h3>
|
||
<p>Die Kaffeeliste kann PayPal-Zahlungen selbstständig gutschreiben:</p>
|
||
<ol>
|
||
<li>Auf der Seite <b>PayPal-Zahlungen</b> steht eure persönliche Eingangsadresse.</li>
|
||
<li>Richtet in eurem Mailprogramm eine <b>automatische Weiterleitung</b> der
|
||
PayPal-Benachrichtigungen an diese Adresse ein.</li>
|
||
<li>Erkannte Zahlungen werden dem passenden Mitglied automatisch gutgeschrieben.</li>
|
||
</ol>
|
||
<p>Gutgeschrieben wird immer der Betrag, der <b>tatsächlich angekommen</b> ist – bei
|
||
Waren & Dienstleistungen also nach Abzug der PayPal-Gebühr.</p>
|
||
<div class="hint-box">
|
||
<p>Zahlungen, die sich nicht eindeutig zuordnen lassen, landen in der Warteschlange
|
||
„Offene Zahlungen“ und können dort von Hand einem Mitglied zugeordnet oder ignoriert
|
||
werden. Damit die automatische Zuordnung möglichst oft greift, hinterlege den
|
||
<b>PayPal-Namen</b> beim Mitglied.</p>
|
||
</div>
|
||
|
||
<h3>CSV-Import</h3>
|
||
<p>Über <b>CSV Upload</b> lassen sich Einzahlungen aus einer Datei einlesen. Der Import
|
||
zeigt zuerst eine <b>Vorschau</b>; erst danach wird gebucht. Zeilen ohne eindeutige
|
||
Zuordnung werden markiert und nicht verbucht.</p>
|
||
|
||
<h3>Kaffeeliste, Ausdruck und Auswertung</h3>
|
||
<ul>
|
||
<li><b>Kaffeeliste anzeigen</b>: Gesamtübersicht aller aktiven Mitglieder. Ein Klick
|
||
auf den Namen öffnet die Einzelauswertung.</li>
|
||
<li><b>PDF-Export</b>: die Liste zum Ausdrucken und Aufhängen.</li>
|
||
<li><b>Journal-Vorschau</b>: alle Buchungen mit Herkunft – nützlich zur Kontrolle.</li>
|
||
</ul>
|
||
|
||
<h3>Info-Mails versenden</h3>
|
||
<p>Unter <b>Mailversand</b> lassen sich Mitglieder über ihren Stand informieren. Der
|
||
<b>Dry-Run</b> zeigt zuerst, wer eine Mail bekäme, ohne etwas zu verschicken. Das
|
||
Versandlog hält fest, was tatsächlich rausging.</p>
|
||
|
||
<h3>Jahresabschluss</h3>
|
||
<p>Verteilt einen frei wählbaren Gesamtbetrag als Guthaben auf alle Mitglieder –
|
||
anteilig zu ihren Strichen im laufenden Jahr. Auch hier gilt: erst <b>Dry-Run</b>
|
||
zur Vorschau, dann buchen. Beim echten Lauf werden die Mitglieder per Mail informiert.</p>
|
||
<?php endif; ?>
|
||
|
||
<?php if ($istAdmin): ?>
|
||
<hr>
|
||
|
||
<h2>Für Administratoren</h2>
|
||
<p><small>Sichtbar für die Rollen <b>Administrator</b> und <b>Inhaber</b>.</small></p>
|
||
|
||
<h3>Mitglieder verwalten</h3>
|
||
<ul>
|
||
<li><b>Anlegen und bearbeiten</b> von Mitgliedern (Name, E-Mail, PayPal-Name).</li>
|
||
<li><b>PayPal-Name</b>: entscheidend für die automatische Zuordnung von Zahlungen.</li>
|
||
<li><b>Deaktivieren</b> statt löschen: Das Mitglied verschwindet aus den Listen,
|
||
die Buchungshistorie bleibt erhalten.</li>
|
||
<li><b>Anonymisieren</b>: ersetzt Name und E-Mail durch einen Platzhalter (DSGVO-Auskunft),
|
||
die Buchungen der Kasse bleiben für die Abrechnung bestehen.</li>
|
||
<li><b>Zugang gewähren / entziehen</b>: steuert, ob ein Mitglied sich anmelden kann.</li>
|
||
<li><b>CSV-Import</b> für viele Mitglieder auf einmal – eine passende Vorlage gibt es
|
||
zum Herunterladen.</li>
|
||
</ul>
|
||
|
||
<h3>Hinweise verwalten</h3>
|
||
<p>Ein Hinweis erscheint als gelber Balken oben auf jeder Seite – z. B. „Kaffeekasse
|
||
ist leer“. Jeder Hinweis hat ein <b>Gültig bis</b>-Datum und verschwindet danach
|
||
automatisch.</p>
|
||
|
||
<h3>Mandant-Einstellungen</h3>
|
||
<p>Hier stellst du das Verhalten der Kaffeeliste ein:</p>
|
||
<ul>
|
||
<li><b>Preis pro Strich</b> – Grundlage jeder Verbrauchsbuchung.</li>
|
||
<li><b>Listenfenster in Tagen</b> – Zeitraum für die Vorder-/Rückseiten-Aufteilung.</li>
|
||
<li><b>Schulden-Warnschwelle</b> – ab welchem Minus gewarnt bzw. erinnert wird.</li>
|
||
<li><b>Bezahloptionen</b> – Barzahlung, PayPal und Überweisung samt Kontaktdaten.
|
||
Nur aktivierte Wege erscheinen bei den Mitgliedern.</li>
|
||
<li><b>Web-Striche erlauben</b> – ob Mitglieder selbst eintragen dürfen.</li>
|
||
<li><b>Ausdruck</b> – Sortierung, Zeilenhöhe, leere Zeilen, Wasserzeichen und Fußzeile.</li>
|
||
<li><b>Zahlungserinnerungen</b> – automatische Mails an Mitglieder unterhalb der
|
||
Warnschwelle, samt Mindestabstand zwischen zwei Erinnerungen.</li>
|
||
</ul>
|
||
<p>Im <b>Protokoll</b> unten auf der Seite steht, wer wann welche Änderung vorgenommen hat.</p>
|
||
|
||
<h3>Konto, Abo und Daten</h3>
|
||
<ul>
|
||
<li><b>Kundenkonto</b>: Tarif, Rechnungen und Zahlungsdaten.</li>
|
||
<li><b>Datenexport</b>: alle Daten des Mandanten als Datei – für ein Backup oder
|
||
einen Umzug.</li>
|
||
<li><b>Mandant löschen</b>: entfernt den Mandanten mit allen Daten endgültig.</li>
|
||
</ul>
|
||
<div class="hint-box error">
|
||
<p><b>Das Löschen eines Mandanten kann nicht rückgängig gemacht werden.</b> Lade dir
|
||
vorher über den Datenexport eine Kopie herunter.</p>
|
||
</div>
|
||
|
||
<h3>Rollen im Überblick</h3>
|
||
<table>
|
||
<tr><th>Rolle</th><th>Darf</th></tr>
|
||
<tr><td><b>Inhaber</b></td><td>alles, inklusive Abo, Datenexport und Löschen des Mandanten</td></tr>
|
||
<tr><td><b>Administrator</b></td><td>alle Verwaltungsfunktionen inklusive Mitglieder, Hinweise und Einstellungen</td></tr>
|
||
<tr><td><b>Kassenwart</b></td><td>Buchen: Einzahlungen, Striche, Stornos, Import, Ausdruck, Mails, Jahresabschluss</td></tr>
|
||
<tr><td><b>Mitglied</b></td><td>eigene Kaffeeliste, Striche selbst eintragen, eigenen Namen anpassen</td></tr>
|
||
<tr><td><b>Betrachter</b></td><td>nur die eigene Übersicht ansehen</td></tr>
|
||
</table>
|
||
<?php endif; ?>
|
||
|
||
<hr>
|
||
|
||
<h3>Noch Fragen?</h3>
|
||
<p>Häufige Fragen und die Antworten eurer Verwaltung stehen unter
|
||
<a href="faq.php">FAQ Kaffeeliste</a>.</p>
|
||
|
||
</div>
|
||
</section>
|
||
|
||
<?php include "footer.php"; ?>
|