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>
192 lines
7.8 KiB
PHP
192 lines
7.8 KiB
PHP
<?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 € 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"; ?>
|