Phase1 Bearbeitung
This commit is contained in:
@@ -1,19 +1,44 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
<?php
|
||||
$tenantRole = (string) ($authState['tenant_role'] ?? 'member');
|
||||
$isSelfService = $tenantRole === 'member';
|
||||
$selectedMemberId = (string) old('member_id');
|
||||
$selectedProductId = (string) old('product_id');
|
||||
$selectedSourceCode = (string) old('source_code', 'digital_self');
|
||||
require __DIR__ . '/../partials/layout-top.php';
|
||||
?>
|
||||
|
||||
<section class="page-head">
|
||||
<span class="eyebrow">Selbstbedienung</span>
|
||||
<h1>Digitale Buchungen</h1>
|
||||
<p>Dies ist der produktive Kern fuer Browser, Tablet und spaetere Kiosk-Workflows.</p>
|
||||
<span class="eyebrow"><?= e($isSelfService ? 'Selbstbuchung' : 'Digitale Erfassung') ?></span>
|
||||
<h1><?= e($isSelfService ? 'Getraenke buchen' : 'Digitale Buchungen') ?></h1>
|
||||
<?php if ($isSelfService): ?>
|
||||
<p>Diese Seite ist auf taegliche Member-Self-Service-Buchungen zugeschnitten. Korrekturen, Sammelbuchungen und Exporte bleiben im Pilot vorerst beim Standortteam.</p>
|
||||
<?php else: ?>
|
||||
<p>Browser, Tablet und Kiosk landen im selben Ledger. Das Standortteam kann hier Selbstbuchung und Backoffice-Buchungen sichtbar trennen.</p>
|
||||
<?php endif; ?>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<span class="eyebrow">Export & Korrekturen</span>
|
||||
<p class="muted">
|
||||
<?= e($isSelfService
|
||||
? 'Hier ist bewusst Platz fuer persoenliche Exporte und klare Korrekturhinweise reserviert, ohne heute schon neue Backend-Logik vorwegzunehmen.'
|
||||
: 'Hier ist bewusst Platz fuer CSV-Exporte, Sammelkorrekturen und Rueckfragen reserviert, ohne heute schon neue Controllerpfade vorwegzunehmen.') ?>
|
||||
</p>
|
||||
<ul class="feature-list">
|
||||
<li>Download-Link fuer Buchungs-Export: Platzhalter fuer spaetere CSV- oder Monatsansicht</li>
|
||||
<li>Storno- und Korrekturhinweise: Platzhalter fuer kuenftige Bedienhilfe direkt am Workflow</li>
|
||||
<li><?= e($isSelfService ? 'Bis dahin bitte im Pilot nur den eigenen Namen waehlen; persoenliche Vorauswahl folgt.' : 'Sammelkorrekturen und Nachbuchungen bleiben vorerst beim Standortteam.') ?></li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<div class="two-column">
|
||||
<form class="card form-card" method="post" action="<?= e(tenant_url($tenant['slug'], 'bookings')) ?>">
|
||||
<?= csrf_field($csrf) ?>
|
||||
<label>
|
||||
<span>Mitglied</span>
|
||||
<span><?= e($isSelfService ? 'Dein Mitgliedseintrag' : 'Mitglied') ?></span>
|
||||
<select name="member_id" required>
|
||||
<?php foreach ($members as $member): ?>
|
||||
<option value="<?= e((string) $member['id']) ?>"><?= e($member['display_name']) ?></option>
|
||||
<option value="<?= e((string) $member['id']) ?>" <?= $selectedMemberId === (string) $member['id'] ? 'selected' : '' ?>><?= e($member['display_name']) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</label>
|
||||
@@ -21,17 +46,21 @@
|
||||
<span>Produkt</span>
|
||||
<select name="product_id" required>
|
||||
<?php foreach ($products as $product): ?>
|
||||
<option value="<?= e((string) $product['id']) ?>"><?= e($product['name']) ?> (<?= e(money_from_cents((int) $product['price_cents'])) ?>)</option>
|
||||
<option value="<?= e((string) $product['id']) ?>" <?= $selectedProductId === (string) $product['id'] ? 'selected' : '' ?>><?= e($product['name']) ?> (<?= e(money_from_cents((int) $product['price_cents'])) ?>)</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>Quelle</span>
|
||||
<select name="source_code">
|
||||
<option value="digital_self">Digitale Selbstbuchung</option>
|
||||
<option value="admin_backoffice">Backoffice-Buchung</option>
|
||||
</select>
|
||||
</label>
|
||||
<?php if ($isSelfService): ?>
|
||||
<input type="hidden" name="source_code" value="digital_self">
|
||||
<?php else: ?>
|
||||
<label>
|
||||
<span>Quelle</span>
|
||||
<select name="source_code">
|
||||
<option value="digital_self" <?= $selectedSourceCode === 'digital_self' ? 'selected' : '' ?>>Digitale Selbstbuchung</option>
|
||||
<option value="admin_backoffice" <?= $selectedSourceCode === 'admin_backoffice' ? 'selected' : '' ?>>Backoffice-Buchung</option>
|
||||
</select>
|
||||
</label>
|
||||
<?php endif; ?>
|
||||
<label>
|
||||
<span>Menge</span>
|
||||
<input type="number" name="quantity" min="0.25" step="0.25" value="<?= e((string) old('quantity', '1')) ?>" required>
|
||||
@@ -44,33 +73,61 @@
|
||||
<span>Notiz</span>
|
||||
<input type="text" name="notes" value="<?= e((string) old('notes')) ?>">
|
||||
</label>
|
||||
<button class="button button-primary" type="submit">Buchung speichern</button>
|
||||
<button class="button button-primary" type="submit"><?= e($isSelfService ? 'Jetzt buchen' : 'Buchung speichern') ?></button>
|
||||
<?php if ($isSelfService): ?>
|
||||
<p class="muted">Wenn du mehrere Namen siehst, nutze im Pilot bitte nur deinen eigenen Eintrag. Falsche Buchungen korrigiert das Standortteam.</p>
|
||||
<?php endif; ?>
|
||||
</form>
|
||||
|
||||
<section class="table-card">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Zeit</th>
|
||||
<th>Mitglied</th>
|
||||
<th>Produkt</th>
|
||||
<th>Quelle</th>
|
||||
<th>Betrag</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($bookings as $booking): ?>
|
||||
<?php if ($isSelfService): ?>
|
||||
<section class="card">
|
||||
<span class="eyebrow">Pilot-Hinweis</span>
|
||||
<ul class="stack-list">
|
||||
<li>
|
||||
<strong>Eigene Historie</strong>
|
||||
<small>Ein persoenlicher Verlauf wird spaeter hier eingeblendet.</small>
|
||||
</li>
|
||||
<li>
|
||||
<strong>Korrekturen</strong>
|
||||
<small>Falsche Buchungen bitte direkt an das Standortteam melden.</small>
|
||||
</li>
|
||||
<li>
|
||||
<strong>Exporte</strong>
|
||||
<small>Downloads und Monatsauszuege folgen nach weiterem Pilotfeedback.</small>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<?php else: ?>
|
||||
<section class="table-card">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td><?= e($booking['recorded_at']) ?></td>
|
||||
<td><?= e($booking['member_name']) ?></td>
|
||||
<td><?= e($booking['product_name']) ?></td>
|
||||
<td><?= e($booking['source_name']) ?></td>
|
||||
<td><?= e(money_from_cents((int) $booking['total_cents'])) ?></td>
|
||||
<th>Zeit</th>
|
||||
<th>Mitglied</th>
|
||||
<th>Produkt</th>
|
||||
<th>Quelle</th>
|
||||
<th>Betrag</th>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($bookings === []): ?>
|
||||
<tr>
|
||||
<td colspan="5">Noch keine Buchungen erfasst.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($bookings as $booking): ?>
|
||||
<tr>
|
||||
<td><?= e($booking['recorded_at']) ?></td>
|
||||
<td><?= e($booking['member_name']) ?></td>
|
||||
<td><?= e($booking['product_name']) ?></td>
|
||||
<td><?= e($booking['source_name']) ?></td>
|
||||
<td><?= e(money_from_cents((int) $booking['total_cents'])) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php require __DIR__ . '/../partials/layout-bottom.php'; ?>
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
<?php
|
||||
$tenantRole = (string) ($authState['tenant_role'] ?? 'member');
|
||||
$isSelfService = $tenantRole === 'member';
|
||||
require __DIR__ . '/../partials/layout-top.php';
|
||||
?>
|
||||
|
||||
<section class="page-head inline-head">
|
||||
<div>
|
||||
<span class="eyebrow"><?= e(ucfirst($tenant['plan'])) ?> Paket</span>
|
||||
<span class="eyebrow"><?= e($isSelfService ? 'Member-Self-Service' : ucfirst((string) $tenant['plan']) . ' Paket') ?></span>
|
||||
<h1><?= e($tenant['name']) ?></h1>
|
||||
<p>Rolle: <?= e((string) ($authState['tenant_role'] ?? 'member')) ?>. Hier laufen digitale Buchungen, Papierlisten und Betriebszahlen zusammen.</p>
|
||||
<?php if ($isSelfService): ?>
|
||||
<p>Rolle: <?= e($tenantRole) ?>. Dieser Zugang ist fuer die taegliche Selbstbuchung gedacht; Stammdaten, Saldenpflege und Korrekturen bleiben beim Standortteam.</p>
|
||||
<?php else: ?>
|
||||
<p>Rolle: <?= e($tenantRole) ?>. Hier laufen digitale Buchungen, Backoffice-Korrekturen und Standortzahlen zusammen.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<form method="post" action="<?= e(tenant_url($tenant['slug'], 'logout')) ?>">
|
||||
<?= csrf_field($csrf) ?>
|
||||
@@ -12,49 +20,92 @@
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="metric-cards">
|
||||
<article class="metric-card">
|
||||
<span>Mitglieder</span>
|
||||
<strong><?= e((string) $summary['member_count']) ?></strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Produkte</span>
|
||||
<strong><?= e((string) $summary['product_count']) ?></strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Papierlisten</span>
|
||||
<strong><?= e((string) $summary['paper_sheet_count']) ?></strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Offene Salden</span>
|
||||
<strong><?= e(money_from_cents((int) $summary['open_balance_cents'])) ?></strong>
|
||||
</article>
|
||||
</section>
|
||||
<?php if ($isSelfService): ?>
|
||||
<div class="two-column">
|
||||
<section class="card">
|
||||
<span class="eyebrow">Was du hier tun kannst</span>
|
||||
<ul class="feature-list">
|
||||
<li>Digitale Buchungen fuer deinen Standort erfassen</li>
|
||||
<li>Produktpreise vor dem Buchen einsehen</li>
|
||||
<li>Passwort-Reset oder Buchungskorrekturen ueber das Standortteam anstossen</li>
|
||||
</ul>
|
||||
<p class="muted">Die Navigation zeigt hier bewusst nur Self-Service-Seiten, damit dieser Zugang nicht wie Volladministration wirkt.</p>
|
||||
</section>
|
||||
<section class="card">
|
||||
<span class="eyebrow">Pilotbetrieb</span>
|
||||
<ul class="stack-list">
|
||||
<li>
|
||||
<strong>Stammdaten und Mitglieder</strong>
|
||||
<small>Pflegt weiterhin das Standortteam im Backoffice.</small>
|
||||
</li>
|
||||
<li>
|
||||
<strong>Einzahlungen und Papierlisten</strong>
|
||||
<small>Werden separat verbucht und bei Bedarf dort korrigiert.</small>
|
||||
</li>
|
||||
<li>
|
||||
<strong>Exporte und persoenliche Historie</strong>
|
||||
<small>Werden im Pilot noch schrittweise nachgezogen.</small>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<section class="metric-cards">
|
||||
<article class="metric-card">
|
||||
<span>Mitglieder</span>
|
||||
<strong><?= e((string) $summary['member_count']) ?></strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Produkte</span>
|
||||
<strong><?= e((string) $summary['product_count']) ?></strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Papierlisten</span>
|
||||
<strong><?= e((string) $summary['paper_sheet_count']) ?></strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Offene Salden</span>
|
||||
<strong><?= e(money_from_cents((int) $summary['open_balance_cents'])) ?></strong>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<div class="two-column">
|
||||
<section class="card">
|
||||
<span class="eyebrow">Letzte Buchungen</span>
|
||||
<ul class="stack-list">
|
||||
<?php foreach ($latestEvents as $event): ?>
|
||||
<li>
|
||||
<strong><?= e($event['member_name']) ?></strong>
|
||||
<span><?= e($event['product_name']) ?> via <?= e($event['source_name']) ?></span>
|
||||
<small><?= e(money_from_cents((int) $event['total_cents'])) ?> am <?= e($event['recorded_at']) ?></small>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="card">
|
||||
<span class="eyebrow">Hohe Salden</span>
|
||||
<ul class="stack-list">
|
||||
<?php foreach ($memberBalances as $balance): ?>
|
||||
<li>
|
||||
<strong><?= e($balance['display_name']) ?></strong>
|
||||
<small><?= e(money_from_cents((int) $balance['balance_cents'])) ?></small>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<div class="two-column">
|
||||
<section class="card">
|
||||
<span class="eyebrow">Letzte Buchungen</span>
|
||||
<ul class="stack-list">
|
||||
<?php if ($latestEvents === []): ?>
|
||||
<li>
|
||||
<strong>Noch keine Buchungen</strong>
|
||||
<small>Die letzten Ereignisse erscheinen hier, sobald der Pilotstandort aktiv bucht.</small>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($latestEvents as $event): ?>
|
||||
<li>
|
||||
<strong><?= e($event['member_name']) ?></strong>
|
||||
<span><?= e($event['product_name']) ?> via <?= e($event['source_name']) ?></span>
|
||||
<small><?= e(money_from_cents((int) $event['total_cents'])) ?> am <?= e($event['recorded_at']) ?></small>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="card">
|
||||
<span class="eyebrow">Hohe Salden</span>
|
||||
<ul class="stack-list">
|
||||
<?php if ($memberBalances === []): ?>
|
||||
<li>
|
||||
<strong>Noch keine Salden</strong>
|
||||
<small>Sobald Buchungen oder Einzahlungen vorliegen, erscheint hier die Uebersicht.</small>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($memberBalances as $balance): ?>
|
||||
<li>
|
||||
<strong><?= e($balance['display_name']) ?></strong>
|
||||
<small><?= e(money_from_cents((int) $balance['balance_cents'])) ?></small>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php require __DIR__ . '/../partials/layout-bottom.php'; ?>
|
||||
|
||||
@@ -1,22 +1,40 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
<?php
|
||||
$resetRequestUrl = '/password/forgot?scope=tenant&tenantSlug=' . rawurlencode((string) $tenant['slug'])
|
||||
. '&tenantName=' . rawurlencode((string) $tenant['name']);
|
||||
require __DIR__ . '/../partials/layout-top.php';
|
||||
?>
|
||||
|
||||
<section class="page-head">
|
||||
<span class="eyebrow">Mandant</span>
|
||||
<span class="eyebrow">Standortzugang</span>
|
||||
<h1><?= e($tenant['name']) ?></h1>
|
||||
<p>Digitale Strichliste, Papierlisten-Nacherfassung und spaetere RFID-Anbindung fuer diesen Standort.</p>
|
||||
<p>Login fuer Owner, Standortteam und Mitglieder-Self-Service im Pilotbetrieb. Verwaltungsseiten bleiben bewusst dem Standortteam vorbehalten.</p>
|
||||
</section>
|
||||
|
||||
<form class="card form-card slim" method="post" action="<?= e(tenant_url($tenant['slug'], 'login')) ?>">
|
||||
<?= csrf_field($csrf) ?>
|
||||
<label>
|
||||
<span>E-Mail</span>
|
||||
<input type="email" name="email" value="<?= e((string) old('email')) ?>" required>
|
||||
</label>
|
||||
<label>
|
||||
<span>Passwort</span>
|
||||
<input type="password" name="password" required>
|
||||
</label>
|
||||
<button class="button button-primary" type="submit">Anmelden</button>
|
||||
</form>
|
||||
<div class="two-column">
|
||||
<form class="card form-card" method="post" action="<?= e(tenant_url($tenant['slug'], 'login')) ?>">
|
||||
<?= csrf_field($csrf) ?>
|
||||
<label>
|
||||
<span>Login-E-Mail</span>
|
||||
<input type="email" name="email" value="<?= e((string) old('email')) ?>" required>
|
||||
</label>
|
||||
<label>
|
||||
<span>Passwort</span>
|
||||
<input type="password" name="password" required>
|
||||
</label>
|
||||
<button class="button button-primary" type="submit">Standort anmelden</button>
|
||||
<p class="muted">Passwort vergessen? <a class="text-link" href="<?= e($resetRequestUrl) ?>">Reset anfragen</a></p>
|
||||
</form>
|
||||
|
||||
<aside class="card" id="reset-help">
|
||||
<span class="eyebrow">Reset & Hilfe</span>
|
||||
<h2>Member-Self-Service bleibt schlank</h2>
|
||||
<p class="muted">Wenn ein Passwort vergessen wurde, prueft das Standortteam die Anfrage im Pilot zunaechst manuell. Die eigene Reset-Seite fuer dieses Login ist bereits vorgesehen.</p>
|
||||
<ul class="feature-list">
|
||||
<li>Mitglieder buchen ueber ihren Standortzugang, nicht ueber die Plattform</li>
|
||||
<li>PIN und RFID sind getrennt vom Passwort-Reset</li>
|
||||
<li>Korrekturen an Salden, Produkten und Papierlisten bleiben beim Standortteam</li>
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<?php require __DIR__ . '/../partials/layout-bottom.php'; ?>
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
|
||||
<section class="page-head">
|
||||
<span class="eyebrow">Stammdaten</span>
|
||||
<h1>Mitglieder verwalten</h1>
|
||||
<p>Mitglieder koennen rein fachlich gefuehrt werden oder optional einen Login fuer die digitale Buchung erhalten.</p>
|
||||
<span class="eyebrow">Standortteam</span>
|
||||
<h1>Mitglieder und Zugaenge</h1>
|
||||
<p>Mitglieder koennen rein fachlich gefuehrt werden oder optional einen Login fuer die Selbstbuchung erhalten. PINs werden nach dem Speichern nicht mehr im Klartext angezeigt.</p>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<span class="eyebrow">Export & Korrekturen</span>
|
||||
<p class="muted">Hier ist bewusst Platz fuer spaetere CSV-Exporte, Sammelimporte und Statuskorrekturen reserviert, ohne dafuer heute schon neue Controllerlogik zu verlangen.</p>
|
||||
<ul class="feature-list">
|
||||
<li>Mitgliederliste als Export: Platzhalter fuer kuenftigen Download-Link</li>
|
||||
<li>Login-, Rollen- oder PIN-Korrekturen: Platzhalter fuer Hinweise direkt am Datensatz</li>
|
||||
<li>Self-Service-Logins bleiben getrennt von den Backoffice-Feldern des Standortteams</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<div class="two-column">
|
||||
@@ -14,18 +24,19 @@
|
||||
<input type="text" name="display_name" value="<?= e((string) old('display_name')) ?>" required>
|
||||
</label>
|
||||
<label>
|
||||
<span>E-Mail fuer Login</span>
|
||||
<span>Login-E-Mail fuer Self-Service</span>
|
||||
<input type="email" name="email" value="<?= e((string) old('email')) ?>">
|
||||
</label>
|
||||
<label>
|
||||
<span>Login-Passwort</span>
|
||||
<span>Startpasswort fuer den ersten Login</span>
|
||||
<input type="password" name="login_password" minlength="12">
|
||||
</label>
|
||||
<label>
|
||||
<span>PIN fuer Kiosk / Tablet</span>
|
||||
<span>Optionale PIN fuer Kiosk / Tablet</span>
|
||||
<input type="text" name="access_pin" value="<?= e((string) old('access_pin')) ?>">
|
||||
</label>
|
||||
<button class="button button-primary" type="submit">Mitglied speichern</button>
|
||||
<p class="muted">Wenn eine Login-E-Mail gesetzt ist, wird automatisch ein Member-Login fuer die digitale Selbstbuchung angelegt.</p>
|
||||
</form>
|
||||
|
||||
<section class="table-card">
|
||||
@@ -33,17 +44,32 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>E-Mail</th>
|
||||
<th>PIN</th>
|
||||
<th>Login</th>
|
||||
<th>PIN-Status</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($members as $member): ?>
|
||||
<?php $loginEmail = (string) ($member['login_email'] ?: $member['email']); ?>
|
||||
<?php $hasPin = trim((string) ($member['access_pin'] ?? '')) !== ''; ?>
|
||||
<tr>
|
||||
<td><?= e($member['display_name']) ?></td>
|
||||
<td><?= e((string) ($member['login_email'] ?: $member['email'])) ?></td>
|
||||
<td><?= e((string) ($member['access_pin'] ?? '')) ?></td>
|
||||
<td>
|
||||
<?php if ($loginEmail !== ''): ?>
|
||||
<strong>aktiv</strong><br>
|
||||
<small><?= e($loginEmail) ?></small>
|
||||
<?php else: ?>
|
||||
<span class="muted">nur Listenprofil</span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($hasPin): ?>
|
||||
<code>****</code> hinterlegt
|
||||
<?php else: ?>
|
||||
<span class="muted">nicht gesetzt</span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?= e($member['status']) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
|
||||
<section class="page-head">
|
||||
<span class="eyebrow">Klassische Liste</span>
|
||||
<span class="eyebrow">Backoffice</span>
|
||||
<h1>Papierlisten und Nacherfassung</h1>
|
||||
<p>Die klassische Kaffeeliste bleibt erhalten, wird aber als geordneter Beleg mit sauberem Posting ins Ledger behandelt.</p>
|
||||
<p>Die klassische Kaffeeliste bleibt erhalten, wird aber als geordneter Beleg mit sauberem Posting ins Ledger behandelt. Dieser Bereich ist bewusst fuer das Standortteam formuliert, nicht fuer Member-Self-Service.</p>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<span class="eyebrow">Export & Korrekturen</span>
|
||||
<ul class="feature-list">
|
||||
<li>Druck- oder CSV-Export fuer Papierlisten: Platzhalter fuer spaetere Links</li>
|
||||
<li>Rueckfragen zu einzelnen Positionen: Platzhalter fuer kuenftige Korrekturhinweise am Entwurf</li>
|
||||
<li>Member-Self-Service bleibt von Entwurf, Posting und Nachbearbeitung getrennt</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<div class="grid-three">
|
||||
@@ -105,6 +114,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($sheets === []): ?>
|
||||
<tr>
|
||||
<td colspan="4">Noch keine Papierlisten angelegt.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($sheets as $sheet): ?>
|
||||
<tr>
|
||||
<td><?= e($sheet['title']) ?></td>
|
||||
@@ -127,6 +141,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($sheetLines === []): ?>
|
||||
<tr>
|
||||
<td colspan="4">Noch keine Positionen erfasst.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($sheetLines as $line): ?>
|
||||
<tr>
|
||||
<td>#<?= e((string) $line['paper_sheet_id']) ?></td>
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
|
||||
<section class="page-head">
|
||||
<span class="eyebrow">Finanzen</span>
|
||||
<span class="eyebrow">Backoffice</span>
|
||||
<h1>Einzahlungen verbuchen</h1>
|
||||
<p>Einzahlungen laufen ins selbe Ledger und reduzieren den offenen Saldo des Mitglieds nachvollziehbar.</p>
|
||||
<p>Diese Seite bleibt bewusst beim Standortteam. Einzahlungen laufen ins selbe Ledger und reduzieren offene Salden nachvollziehbar, waehrend Mitglieder nur die Selbstbuchung sehen.</p>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<span class="eyebrow">Export & Korrekturen</span>
|
||||
<ul class="feature-list">
|
||||
<li>Kassenexport oder Monatsabschluss: Platzhalter fuer kuenftige Download-Links</li>
|
||||
<li>Rueckfragen zu Bareinzahlungen: Platzhalter fuer spaetere Korrekturhinweise direkt am Vorgang</li>
|
||||
<li>Member-Self-Service blendet diesen Backoffice-Bereich bewusst aus</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<div class="two-column">
|
||||
@@ -43,6 +52,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($payments === []): ?>
|
||||
<tr>
|
||||
<td colspan="4">Noch keine Einzahlungen verbucht.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($payments as $payment): ?>
|
||||
<tr>
|
||||
<td><?= e($payment['occurred_at']) ?></td>
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
<?php require __DIR__ . '/../partials/layout-top.php'; ?>
|
||||
|
||||
<section class="page-head">
|
||||
<span class="eyebrow">Integration</span>
|
||||
<span class="eyebrow">Pilot & Integration</span>
|
||||
<h1>RFID-Roadmap und Event-Inbox</h1>
|
||||
<p>Das MVP speichert Geraete, Karten und rohe Events bereits produktionsnah, ohne die spaetere Hardwareentscheidung vorwegzunehmen.</p>
|
||||
<p>Das MVP speichert Geraete, Karten und rohe Events bereits produktionsnah, ohne die spaetere Hardwareentscheidung vorwegzunehmen. Dieser Bereich bleibt klar beim Standortteam und der Pilotbetreuung.</p>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<span class="eyebrow">Export & Korrekturen</span>
|
||||
<ul class="feature-list">
|
||||
<li>Event-Export oder Inbox-Download: Platzhalter fuer spaetere Support-Links</li>
|
||||
<li>Karten- und Geraetekorrekturen: Platzhalter fuer Hinweise direkt an den Tabellen</li>
|
||||
<li>Member-Self-Service blendet RFID-Setup bewusst aus, bis der Pilot weiter ist</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<div class="grid-three">
|
||||
@@ -68,6 +77,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($devices === []): ?>
|
||||
<tr>
|
||||
<td colspan="4">Noch keine RFID-Geraete vorbereitet.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($devices as $device): ?>
|
||||
<tr>
|
||||
<td><?= e($device['name']) ?></td>
|
||||
@@ -90,6 +104,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($tags === []): ?>
|
||||
<tr>
|
||||
<td colspan="4">Noch keine RFID-Karten zugewiesen.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($tags as $tag): ?>
|
||||
<tr>
|
||||
<td><?= e((string) ($tag['label'] ?: 'ohne Label')) ?></td>
|
||||
@@ -114,6 +133,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ($events === []): ?>
|
||||
<tr>
|
||||
<td colspan="4">Noch keine RFID-Events empfangen.</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($events as $event): ?>
|
||||
<tr>
|
||||
<td><?= e($event['received_at']) ?></td>
|
||||
|
||||
Reference in New Issue
Block a user