Files
kaffeekasse-saas/anleitung.php
T
clemensandClaude Opus 5 d24ee9bf91 Betreiber-Zentralstelle, Mandanten-Design und schlankerer Einstieg
Funktions-Schalter je Mandant (app/features.php, tenant_features): der
Betreiber schaltet FAQ, Selbsteintrag, PDF, PayPal-Eingang, CSV-Import,
Mailversand, Jahresabschluss, Datenexport und eigenes Design pro Mandant
frei. Gesperrte Funktionen verschwinden aus Menue und Schaltflaechen, ihre
Seiten weisen Aufrufe und POSTs ab. Das Back-Office ist jetzt fuer
Platform-Admins im Menue verlinkt statt nur per URL erreichbar.

Eigenes Design je Mandant: Akzentfarbe und Logo in den Mandant-
Einstellungen, eingebettet ueber app/branding.php; das Logo liegt
geschuetzt in var/tenant_logos und wird nur ueber
tenant-logo-anzeigen.php an den eigenen Mandanten ausgeliefert.

Weniger Startinformationen: Startpaket neuer Mandanten auf zwei
Beispielfragen gekuerzt, Anleitung von ~1400 auf ~750 Woerter gestrafft
und um Abschnitte zu gesperrten Funktionen bereinigt.

Vorder-/Rueckseite erst bei mehr als 50 Personen (vorher schon ab 50).
Die Schwelle liegt jetzt gemeinsam in app/ledger.php und gilt auch fuer
die Vorder-/Rueckseiten-Auswahl beim Erfassen, wo sie bisher unabhaengig
von der Teamgroesse angeboten wurde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 22:52:55 +02:00

192 lines
7.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
include "functions.php";
require_once __DIR__ . "/app/ledger.php";
require_once __DIR__ . "/app/features.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;
// Gleiche Logik wie im Menue: was der Betreiber fuer diesen Mandanten
// gesperrt hat, wird hier auch nicht erklaert.
$anleitungTenantId = $saasUser !== null ? (int)$saasUser['tenant_id'] : 0;
$kann = static function (string $feature) use ($pdo, $anleitungTenantId): bool {
return $anleitungTenantId <= 0 || app_feature_enabled($pdo, $anleitungTenantId, $feature);
};
include "header.php";
include "headerline.php";
include "nav.php";
?>
<section id="banner">
<div class="content">
<h2>Anleitung</h2>
<p>Kurzüberblick über die Funktionen. Oben steht, was jedes Mitglied betrifft,
darunter die Verwaltung.</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>Deine Startseite zeigt den aktuellen Stand, die Jahres- und Monatsübersicht sowie
die letzten Buchungen. Positiver Betrag = Guthaben, negativer Betrag = offener Betrag.</p>
<?php if ($kann('self_entry')): ?>
<h3>Striche selbst eintragen</h3>
<p>Wenn die Verwaltung das freigeschaltet hat, trägst du deinen Kaffee direkt auf der
Startseite ein. Vertippt? Mit „Letzten Strich stornieren" nimmst du deinen jüngsten
<b>selbst</b> eingetragenen Strich zurück vom Kassenwart erfasste Striche nicht.</p>
<?php endif; ?>
<h3>Bezahlen</h3>
<p>Welche Wege offen stehen, legt die Verwaltung fest: Barzahlung, PayPal oder Überweisung.</p>
<?php if ($settings !== null): ?>
<p><small>Bei euch 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> „Geld an Freunde senden" nutzen. Bei „Waren und
Dienstleistungen" zieht PayPal Gebühren ab gutgeschrieben wird nur, was ankommt.</p>
</div>
<h3>Eigene Angaben</h3>
<p>Unter <b>Namensanpassung</b> legst du fest, wie dein Name in der Liste und im Ausdruck
erscheint (max. 20 Zeichen). Unter <b>Kundenkonto</b> änderst du Passwort und E-Mail.</p>
<?php if ($istKassenwart): ?>
<hr>
<h2>Für Kassenwart und Verwaltung</h2>
<h3>Buchen</h3>
<ul>
<li><b>Einzahlung eintragen</b>: mehrere Mitglieder in einem Durchgang; leere Felder
werden übersprungen. Negativer Betrag = Abzug, dann ist eine Bemerkung Pflicht.</li>
<li><b>Striche eintragen</b>: Sammelerfassung für die Papierliste. Der Preis pro Strich
kommt aus den Einstellungen und ist pro Vorgang überschreibbar.</li>
<li><b>Letzte Einträge</b>: falsche Buchungen hier <b>stornieren</b>, nicht per
Gegenbuchung ausgleichen sonst zählen beide als Umsatz in der Auswertung.</li>
</ul>
<div class="hint-box">
<p>Zum Schutz vor Vertippern werden Beträge über 1.000&nbsp;€ abgelehnt. Schlägt eine
Zeile fehl, wird <b>nichts</b> gebucht und deine Eingaben bleiben stehen.</p>
</div>
<?php if ($kann('paypal_inbox')): ?>
<h3>PayPal-Zahlungen automatisch verbuchen</h3>
<p>Auf der Seite <b>PayPal-Zahlungen</b> steht eure Eingangsadresse. Leitet die
PayPal-Benachrichtigungen aus eurem Postfach automatisch dorthin weiter, dann werden
erkannte Zahlungen selbstständig gutgeschrieben immer der tatsächlich angekommene
Betrag. Nicht eindeutig zuordenbare Zahlungen landen in der Warteschlange „Offene
Zahlungen". Ein hinterlegter <b>PayPal-Name</b> beim Mitglied verbessert die Trefferquote.</p>
<?php endif; ?>
<h3>Auswertung und Ausdruck</h3>
<ul>
<li><b>Kaffeeliste anzeigen</b>: Gesamtübersicht; ein Klick auf den Namen öffnet die
Einzelauswertung.</li>
<?php if ($kann('pdf_export')): ?>
<li><b>PDF-Export</b>: die Liste zum Aufhängen. Bis 50 Mitglieder eine Seite, darüber
Vorder- und Rückseite.</li>
<?php endif; ?>
<li><b>Journal-Vorschau</b>: alle Buchungen mit Herkunft.</li>
<?php if ($kann('csv_import')): ?>
<li><b>CSV Upload</b>: Einzahlungen aus einer Datei einlesen erst Vorschau, dann
buchen. Zeilen ohne eindeutige Zuordnung werden nicht verbucht.</li>
<?php endif; ?>
</ul>
<?php if ($kann('mail_dispatch') || $kann('year_closing')): ?>
<h3>Mails und Jahresabschluss</h3>
<ul>
<?php if ($kann('mail_dispatch')): ?>
<li><b>Info-Mail versenden</b>: informiert Mitglieder über ihren Stand. Der Dry-Run
zeigt vorher, wer eine Mail bekäme.</li>
<?php endif; ?>
<?php if ($kann('year_closing')): ?>
<li><b>Jahresabschluss</b>: verteilt einen frei wählbaren Betrag anteilig zu den
Strichen des Jahres als Guthaben. Auch hier erst Dry-Run, dann buchen.</li>
<?php endif; ?>
</ul>
<?php endif; ?>
<?php endif; ?>
<?php if ($istAdmin): ?>
<hr>
<h2>Für Administratoren</h2>
<h3>Mitglieder verwalten</h3>
<ul>
<li><b>Deaktivieren</b> statt löschen: das Mitglied verschwindet aus den Listen, die
Buchungshistorie bleibt.</li>
<li><b>Anonymisieren</b>: ersetzt Name und E-Mail durch einen Platzhalter, die Buchungen
der Kasse bleiben bestehen.</li>
<li><b>Zugang gewähren / entziehen</b> steuert, ob sich jemand anmelden kann.</li>
</ul>
<h3>Hinweise</h3>
<p>Ein Hinweis erscheint als gelber Balken oben auf jeder Seite und verschwindet nach dem
<b>Gültig bis</b>-Datum automatisch.</p>
<h3>Mandant-Einstellungen</h3>
<p>Preis pro Strich, Listenfenster, Warnschwelle, Bezahloptionen, Web-Striche, Gestaltung
des Ausdrucks<?php echo $kann('branding') ? ', eigenes Design (Logo und Akzentfarbe)' : ''; ?>
und Zahlungserinnerungen. Unten steht das Protokoll aller Admin-Änderungen.</p>
<h3>Konto, Abo und Daten</h3>
<ul>
<li><b>Kundenkonto</b>: Tarif, Rechnungen und Zahlungsdaten.</li>
<?php if ($kann('data_export')): ?>
<li><b>Datenexport</b>: alle Daten des Mandanten als Datei.</li>
<?php endif; ?>
<li><b>Mandant löschen</b>: entfernt alles endgültig<?php echo $kann('data_export') ? ' vorher Datenexport ziehen' : ''; ?>.</li>
</ul>
<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; ?>
<?php if ($kann('faq')): ?>
<hr>
<p>Weitere Fragen beantwortet eure Verwaltung unter <a href="faq.php">FAQ Kaffeeliste</a>.</p>
<?php endif; ?>
</div>
</section>
<?php include "footer.php"; ?>