Initale Einrichtung

This commit is contained in:
2026-05-04 18:46:12 +02:00
parent 8f944776a9
commit a675873437
24 changed files with 2776 additions and 1 deletions
+120
View File
@@ -0,0 +1,120 @@
<section class="admin-section narrow-section">
<div class="section-header">
<div>
<p class="eyebrow">Manuelle Buchung</p>
<h1>Bestellung fuer Kunden anlegen</h1>
</div>
<a class="button-secondary" href="/admin">Zurueck zum Dashboard</a>
</div>
<?php if (!empty($flashSuccess)): ?>
<div class="flash flash-success"><?= h((string) $flashSuccess) ?></div>
<?php endif; ?>
<?php if (!empty($flashError)): ?>
<div class="flash flash-error"><?= h((string) $flashError) ?></div>
<?php endif; ?>
<form method="post" action="/admin/create" class="booking-form admin-form" data-day-rate="<?= h((string) $defaults['price_per_day_cents']) ?>">
<div class="form-grid">
<label>
<span>Name</span>
<input type="text" name="customer_name" value="<?= h((string) ($old['customer_name'] ?? '')) ?>" required>
</label>
<label>
<span>Firma</span>
<input type="text" name="company" value="<?= h((string) ($old['company'] ?? '')) ?>">
</label>
<label>
<span>E-Mail</span>
<input type="email" name="email" value="<?= h((string) ($old['email'] ?? '')) ?>" required>
</label>
<label>
<span>Telefon</span>
<input type="text" name="phone" value="<?= h((string) ($old['phone'] ?? '')) ?>" required>
</label>
<label>
<span>Strasse</span>
<input type="text" name="street" value="<?= h((string) ($old['street'] ?? '')) ?>" required>
</label>
<label>
<span>PLZ</span>
<input type="text" name="postal_code" value="<?= h((string) ($old['postal_code'] ?? '')) ?>" required>
</label>
<label>
<span>Ort</span>
<input type="text" name="city" value="<?= h((string) ($old['city'] ?? '')) ?>" required>
</label>
<label>
<span>Anlass</span>
<input type="text" name="event_type" value="<?= h((string) ($old['event_type'] ?? '')) ?>">
</label>
<label>
<span>Veranstaltungsort</span>
<input type="text" name="event_location" value="<?= h((string) ($old['event_location'] ?? '')) ?>">
</label>
<label>
<span>Mietbeginn</span>
<input type="date" name="start_date" data-booking-start value="<?= h((string) ($old['start_date'] ?? '')) ?>" required>
</label>
<label>
<span>Mietende</span>
<input type="date" name="end_date" data-booking-end value="<?= h((string) ($old['end_date'] ?? '')) ?>" required>
</label>
<label>
<span>Tagespreis in Cent</span>
<input type="number" name="price_per_day_cents" min="0" value="<?= h((string) ($old['price_per_day_cents'] ?? $defaults['price_per_day_cents'])) ?>" required>
</label>
<label>
<span>Status</span>
<select name="status">
<option value="confirmed" <?= selected((string) ($old['status'] ?? $defaults['status']), 'confirmed') ?>>Bestaetigt</option>
<option value="reserved" <?= selected((string) ($old['status'] ?? ''), 'reserved') ?>>Reserviert</option>
<option value="requested" <?= selected((string) ($old['status'] ?? ''), 'requested') ?>>Neue Anfrage</option>
<option value="cancelled" <?= selected((string) ($old['status'] ?? ''), 'cancelled') ?>>Storniert</option>
</select>
</label>
<label>
<span>Zahlungsstatus</span>
<select name="payment_status">
<option value="unpaid" <?= selected((string) ($old['payment_status'] ?? $defaults['payment_status']), 'unpaid') ?>>Offen</option>
<option value="paid" <?= selected((string) ($old['payment_status'] ?? ''), 'paid') ?>>Bezahlt</option>
<option value="refunded" <?= selected((string) ($old['payment_status'] ?? ''), 'refunded') ?>>Erstattet</option>
</select>
</label>
<label>
<span>Lieferart</span>
<select name="delivery_mode">
<option value="self_pickup" <?= selected((string) ($old['delivery_mode'] ?? $defaults['delivery_mode']), 'self_pickup') ?>>Selbstabholung</option>
<option value="delivery_setup" <?= selected((string) ($old['delivery_mode'] ?? ''), 'delivery_setup') ?>>Lieferung und Aufbau</option>
<option value="on_site_support" <?= selected((string) ($old['delivery_mode'] ?? ''), 'on_site_support') ?>>Lieferung, Aufbau und Vor-Ort-Betreuung</option>
</select>
</label>
<label>
<span>Zahlungsart</span>
<select name="payment_method">
<option value="invoice_transfer" <?= selected((string) ($old['payment_method'] ?? $defaults['payment_method']), 'invoice_transfer') ?>>Rechnung / Ueberweisung</option>
<option value="paypal" <?= selected((string) ($old['payment_method'] ?? ''), 'paypal') ?>>PayPal</option>
</select>
</label>
</div>
<label>
<span>Hinweis fuer Kunden</span>
<textarea name="notes_customer" rows="4"><?= h((string) ($old['notes_customer'] ?? '')) ?></textarea>
</label>
<label>
<span>Interne Notiz</span>
<textarea name="internal_notes" rows="4"><?= h((string) ($old['internal_notes'] ?? '')) ?></textarea>
</label>
<div class="price-summary">
<div>
<span>Mietdauer</span>
<strong data-summary-days>Noch nicht gewaehlt</strong>
</div>
<div>
<span>Gesamtpreis</span>
<strong data-summary-total><?= h(formatCurrency((int) $defaults['price_per_day_cents'])) ?></strong>
</div>
</div>
<button type="submit" class="button-primary">Bestellung speichern</button>
</form>
</section>
+119
View File
@@ -0,0 +1,119 @@
<section class="admin-section">
<div class="section-header">
<div>
<p class="eyebrow">Dashboard</p>
<h1>Anfragen, Buchungen und Rechnungen</h1>
</div>
<a class="button-primary" href="/admin/create">Bestellung fuer Kunden anlegen</a>
</div>
<?php if (!empty($flashSuccess)): ?>
<div class="flash flash-success"><?= h((string) $flashSuccess) ?></div>
<?php endif; ?>
<?php if (!empty($flashError)): ?>
<div class="flash flash-error"><?= h((string) $flashError) ?></div>
<?php endif; ?>
<div class="stats-grid">
<article class="stat-card">
<span>Alle Auftraege</span>
<strong><?= h((string) $stats['bookings_total']) ?></strong>
</article>
<article class="stat-card">
<span>Offene Anfragen</span>
<strong><?= h((string) $stats['open_requests']) ?></strong>
</article>
<article class="stat-card">
<span>Bestaetigte Buchungen</span>
<strong><?= h((string) $stats['confirmed_bookings']) ?></strong>
</article>
<article class="stat-card">
<span>Planumsatz</span>
<strong><?= h(formatCurrency((int) $stats['revenue_cents'])) ?></strong>
</article>
<article class="stat-card">
<span>Rechnungen</span>
<strong><?= h((string) $stats['invoice_total']) ?></strong>
</article>
<article class="stat-card">
<span>Offene Rechnungen</span>
<strong><?= h((string) $stats['invoice_open']) ?></strong>
</article>
</div>
<div class="admin-grid">
<section class="table-card">
<div class="table-card-header">
<h2>Auftraege</h2>
<span><?= h((string) count($bookings)) ?> Eintraege</span>
</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Referenz</th>
<th>Kunde</th>
<th>Termin</th>
<th>Status</th>
<th>Zahlung</th>
<th>Preis</th>
</tr>
</thead>
<tbody>
<?php foreach ($bookings as $booking): ?>
<tr>
<td><a href="/admin/order?id=<?= h(urlencode($booking['id'])) ?>"><?= h($booking['reference']) ?></a></td>
<td><?= h($booking['customer']['name']) ?></td>
<td><?= h(formatDate($booking['start_date'])) ?> - <?= h(formatDate($booking['end_date'])) ?></td>
<td><?= h($booking['status_label']) ?></td>
<td><?= h($booking['payment_status_label']) ?></td>
<td><?= h(formatCurrency((int) $booking['subtotal_cents'])) ?></td>
</tr>
<?php endforeach; ?>
<?php if ($bookings === []): ?>
<tr>
<td colspan="6">Noch keine Auftraege vorhanden.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</section>
<section class="table-card">
<div class="table-card-header">
<h2>Rechnungen</h2>
<span><?= h((string) count($invoices)) ?> Eintraege</span>
</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Nummer</th>
<th>Auftrag</th>
<th>Faellig</th>
<th>Zahlungsart</th>
<th>Gesamt</th>
</tr>
</thead>
<tbody>
<?php foreach ($invoices as $invoice): ?>
<tr>
<td><a href="/admin/invoice/pdf?id=<?= h(urlencode($invoice['id'])) ?>" target="_blank"><?= h($invoice['invoice_number']) ?></a></td>
<td><?= h($invoice['booking_id']) ?></td>
<td><?= h(formatDate($invoice['due_date'])) ?></td>
<td><?= h($invoice['payment_method_label']) ?></td>
<td><?= h(formatCurrency((int) $invoice['total_cents'])) ?></td>
</tr>
<?php endforeach; ?>
<?php if ($invoices === []): ?>
<tr>
<td colspan="5">Noch keine Rechnungen erstellt.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</section>
</div>
</section>
+26
View File
@@ -0,0 +1,26 @@
<section class="admin-login-section">
<div class="admin-login-card">
<p class="eyebrow">Verwaltung</p>
<h1>Admin-Login</h1>
<p>Hier verwaltest du Anfragen, Kundenbestellungen und Rechnungen.</p>
<?php if (!empty($flashSuccess)): ?>
<div class="flash flash-success"><?= h((string) $flashSuccess) ?></div>
<?php endif; ?>
<?php if (!empty($flashError)): ?>
<div class="flash flash-error"><?= h((string) $flashError) ?></div>
<?php endif; ?>
<form method="post" action="/admin/login" class="stack-form">
<label>
<span>Benutzername</span>
<input type="text" name="username" value="admin" required>
</label>
<label>
<span>Passwort</span>
<input type="password" name="password" required>
</label>
<button type="submit" class="button-primary button-block">Anmelden</button>
</form>
</div>
</section>
+105
View File
@@ -0,0 +1,105 @@
<section class="admin-section narrow-section">
<div class="section-header">
<div>
<p class="eyebrow">Auftragsdetail</p>
<h1><?= h($booking['reference']) ?></h1>
</div>
<a class="button-secondary" href="/admin">Zurueck zum Dashboard</a>
</div>
<?php if (!empty($flashSuccess)): ?>
<div class="flash flash-success"><?= h((string) $flashSuccess) ?></div>
<?php endif; ?>
<?php if (!empty($flashError)): ?>
<div class="flash flash-error"><?= h((string) $flashError) ?></div>
<?php endif; ?>
<div class="detail-grid">
<article class="table-card">
<h2>Kundendaten</h2>
<dl class="detail-list">
<div><dt>Name</dt><dd><?= h($booking['customer']['name']) ?></dd></div>
<div><dt>Firma</dt><dd><?= h($booking['customer']['company'] ?: '-') ?></dd></div>
<div><dt>E-Mail</dt><dd><?= h($booking['customer']['email']) ?></dd></div>
<div><dt>Telefon</dt><dd><?= h($booking['customer']['phone']) ?></dd></div>
<div><dt>Adresse</dt><dd><?= h($booking['customer']['street']) ?>, <?= h($booking['customer']['postal_code']) ?> <?= h($booking['customer']['city']) ?></dd></div>
<div><dt>Anlass</dt><dd><?= h($booking['customer']['event_type'] ?: '-') ?></dd></div>
<div><dt>Ort</dt><dd><?= h($booking['customer']['event_location'] ?: '-') ?></dd></div>
<div><dt>Mietzeitraum</dt><dd><?= h(formatDate($booking['start_date'])) ?> bis <?= h(formatDate($booking['end_date'])) ?></dd></div>
<div><dt>Leistung</dt><dd><?= h($booking['delivery_mode_label']) ?></dd></div>
<div><dt>Zahlungsart</dt><dd><?= h($booking['payment_method_label']) ?></dd></div>
<div><dt>Gesamt</dt><dd><?= h(formatCurrency((int) $booking['subtotal_cents'])) ?></dd></div>
</dl>
</article>
<article class="table-card">
<h2>Verwaltung</h2>
<form method="post" action="/admin/order/update" class="stack-form">
<input type="hidden" name="booking_id" value="<?= h($booking['id']) ?>">
<label>
<span>Status</span>
<select name="status">
<?php foreach ($statusOptions as $value => $label): ?>
<option value="<?= h($value) ?>" <?= selected((string) $booking['status'], (string) $value) ?>><?= h($label) ?></option>
<?php endforeach; ?>
</select>
</label>
<label>
<span>Zahlungsstatus</span>
<select name="payment_status">
<?php foreach ($paymentOptions as $value => $label): ?>
<option value="<?= h($value) ?>" <?= selected((string) $booking['payment_status'], (string) $value) ?>><?= h($label) ?></option>
<?php endforeach; ?>
</select>
</label>
<label>
<span>Kundennotiz</span>
<textarea name="notes_customer" rows="4"><?= h((string) $booking['notes_customer']) ?></textarea>
</label>
<label>
<span>Interne Notiz</span>
<textarea name="internal_notes" rows="4"><?= h((string) $booking['internal_notes']) ?></textarea>
</label>
<button type="submit" class="button-primary">Aenderungen speichern</button>
</form>
</article>
</div>
<div class="detail-grid">
<article class="table-card">
<h2>Rechnung</h2>
<?php if ($invoice !== null): ?>
<p>Rechnung <strong><?= h($invoice['invoice_number']) ?></strong> ist erstellt.</p>
<ul class="check-list compact-list">
<li>Faellig am <?= h(formatDate($invoice['due_date'])) ?></li>
<li>Gesamtbetrag <?= h(formatCurrency((int) $invoice['total_cents'])) ?></li>
<li>Zahlungsart <?= h($invoice['payment_method_label']) ?></li>
</ul>
<a class="button-secondary" href="/admin/invoice/pdf?id=<?= h(urlencode($invoice['id'])) ?>" target="_blank">PDF oeffnen</a>
<?php else: ?>
<p>Fuer diesen Auftrag wurde noch keine Rechnung erstellt.</p>
<form method="post" action="/admin/order/invoice" class="stack-form">
<input type="hidden" name="booking_id" value="<?= h($booking['id']) ?>">
<label>
<span>Faelligkeitsdatum</span>
<input type="date" name="due_date">
</label>
<label>
<span>Rechnungsnotiz</span>
<textarea name="invoice_notes" rows="4">Vielen Dank fuer deinen Auftrag.</textarea>
</label>
<button type="submit" class="button-primary">Rechnung erstellen</button>
</form>
<?php endif; ?>
</article>
<article class="table-card">
<h2>Systeminfos</h2>
<dl class="detail-list">
<div><dt>ID</dt><dd><?= h($booking['id']) ?></dd></div>
<div><dt>Quelle</dt><dd><?= h($booking['source']) ?></dd></div>
<div><dt>Erstellt</dt><dd><?= h($booking['created_at']) ?></dd></div>
<div><dt>Aktualisiert</dt><dd><?= h($booking['updated_at']) ?></dd></div>
</dl>
</article>
</div>
</section>
+272
View File
@@ -0,0 +1,272 @@
<?php
$dayRate = $config['pricing']['default_day_rate_cents'];
$company = $config['company'];
?>
<section class="hero-section">
<div class="hero-copy">
<p class="eyebrow">Fotobox-Vermietung neu gedacht</p>
<h1>Die Fotobox fuer Hochzeiten, Geburtstage und Firmenevents</h1>
<p class="hero-text">
Unkompliziert mieten, schnell aufbauen, kinderleicht bedienen und alle Bilder direkt digital sichern.
Unsere Fotobox verbindet hochwertige Technik mit einem klaren Buchungsprozess ohne Shop-Chaos.
</p>
<div class="hero-actions">
<a class="button-primary" href="#buchung">Verfuegbarkeit pruefen</a>
<a class="button-secondary" href="#ablauf">So funktioniert die Miete</a>
</div>
<ul class="hero-points">
<li>Spiegelreflexkamera, Studioblitz und Softbox</li>
<li>WLAN-Download direkt aufs Handy</li>
<li>Selbstabholung oder Lieferung mit Aufbau</li>
<li>99,99 EUR pro Kalendertag</li>
</ul>
</div>
<div class="hero-card">
<div class="hero-card-panel hero-card-panel-top">
<span>Eventbereit in wenigen Minuten</span>
<strong>Abholung ab 17:00 Uhr</strong>
</div>
<div class="hero-card-visual">
<div class="camera-glow"></div>
<div class="camera-body">
<div class="camera-lens"></div>
<div class="camera-screen"></div>
</div>
</div>
<div class="hero-card-panel">
<span>Digitale Galerie inklusive</span>
<strong>Rueckgabe bis 13:00 Uhr</strong>
</div>
</div>
</section>
<section class="feature-strip" id="leistungen">
<article>
<h2>Technik, die nicht zickt</h2>
<p>Spiegelreflexkamera, Bildschirm und Studioblitz mit Softbox sorgen fuer helle, scharfe Bilder bei jedem Anlass.</p>
</article>
<article>
<h2>Direkt aufs Handy</h2>
<p>Per WLAN koennen deine Gaeste ihre Fotos sofort laden und teilen. Nach dem Event gibt es alle Bilder digital.</p>
</article>
<article>
<h2>Flexible Logistik</h2>
<p>Selbst abholen, liefern lassen oder auf Wunsch mit Aufbau und Vor-Ort-Unterstuetzung buchen.</p>
</article>
</section>
<section class="content-grid" id="ablauf">
<div class="content-block">
<p class="eyebrow">Ablauf</p>
<h2>So laeuft die Miete ab</h2>
<ol class="step-list">
<li>
<strong>1. Zeitraum waehlen</strong>
<span>Du waehlst Mietbeginn und Mietende und siehst sofort die voraussichtlichen Kosten.</span>
</li>
<li>
<strong>2. Leistung festlegen</strong>
<span>Selbstabholung, Lieferung mit Aufbau oder Vor-Ort-Betreuung passend zu deinem Event.</span>
</li>
<li>
<strong>3. Anfrage absenden</strong>
<span>Wir speichern alle Kundendaten und bereiten auf Wunsch direkt die Rechnungsabwicklung vor.</span>
</li>
<li>
<strong>4. Fotos geniessen</strong>
<span>Am Eventtag steht die Box bereit und danach bekommst du alle Bilder digital zur Weitergabe.</span>
</li>
</ol>
</div>
<div class="content-block equipment-block">
<p class="eyebrow">Ausstattung</p>
<h2>Alles drin fuer einen reibungslosen Party-Hit</h2>
<ul class="check-list">
<li>Spiegelreflexkamera fuer gestochen scharfe Aufnahmen</li>
<li>Bildschirm mit einfacher Bedienung per Touch</li>
<li>Studioblitz mit grosser Softbox fuer gleichmaessiges Licht</li>
<li>Digitale Uebergabe aller Fotos nach dem Event</li>
<li>Optionaler Hintergrund und Betreuung vor Ort</li>
</ul>
</div>
</section>
<section class="pricing-panel">
<div>
<p class="eyebrow">Preis und Logistik</p>
<h2>Transparent statt versteckt</h2>
<p>
Standardmaessig berechnen wir <strong><?= h(formatCurrency($dayRate)) ?></strong> pro Kalendertag.
Mietbeginn und Mietende zaehlen beide mit. Selbstabholung spart Zeit in der Abstimmung,
Lieferung und Aufbau machen es vor Ort noch entspannter.
</p>
</div>
<div class="pricing-aside">
<div>
<span>Tagespreis</span>
<strong><?= h(formatCurrency($dayRate)) ?></strong>
</div>
<div>
<span>Zahlungsarten</span>
<strong>Rechnung / Ueberweisung und PayPal</strong>
</div>
<div>
<span>Servicefenster</span>
<strong>Abholung ab 17:00 Uhr, Rueckgabe bis 13:00 Uhr</strong>
</div>
</div>
</section>
<section class="availability-section">
<div>
<p class="eyebrow">Online-Verfuegbarkeit</p>
<h2>Bereits reservierte Zeitraeume</h2>
<p>Diese Liste zeigt geblockte oder bestaetigte Termine aus dem Verwaltungssystem.</p>
</div>
<div class="availability-list">
<?php if ($bookings === []): ?>
<article class="availability-card availability-card-empty">
<strong>Aktuell sind keine festen Reservierungen hinterlegt.</strong>
<span>Du kannst direkt eine neue Anfrage senden.</span>
</article>
<?php endif; ?>
<?php foreach ($bookings as $booking): ?>
<article class="availability-card">
<strong><?= h($booking['reference']) ?></strong>
<span><?= h(formatDate($booking['start_date'])) ?> bis <?= h(formatDate($booking['end_date'])) ?></span>
<small><?= h($booking['status_label']) ?></small>
</article>
<?php endforeach; ?>
</div>
</section>
<section class="booking-section" id="buchung">
<div class="booking-copy">
<p class="eyebrow">Buchungsanfrage</p>
<h2>Fotobox jetzt anfragen</h2>
<p>
Zwei Termine auswaehlen, Wunschleistung festlegen und Kundendaten hinterlegen.
Die Verwaltung kann deine Anfrage danach direkt bestaetigen, als Kundenbestellung uebernehmen und eine Rechnung erzeugen.
</p>
<div class="booking-info-card">
<strong>Kontakt fuer Rueckfragen</strong>
<span><?= h($company['email']) ?></span>
<span><?= h($company['phone']) ?></span>
</div>
</div>
<div class="booking-form-card">
<?php if (!empty($flashSuccess)): ?>
<div class="flash flash-success"><?= h((string) $flashSuccess) ?></div>
<?php endif; ?>
<?php if (!empty($flashError)): ?>
<div class="flash flash-error"><?= h((string) $flashError) ?></div>
<?php endif; ?>
<form method="post" action="/book" class="booking-form" data-day-rate="<?= h((string) $dayRate) ?>">
<div class="form-grid">
<label>
<span>Name</span>
<input type="text" name="customer_name" value="<?= h((string) ($old['customer_name'] ?? '')) ?>" required>
</label>
<label>
<span>Firma</span>
<input type="text" name="company" value="<?= h((string) ($old['company'] ?? '')) ?>">
</label>
<label>
<span>E-Mail</span>
<input type="email" name="email" value="<?= h((string) ($old['email'] ?? '')) ?>" required>
</label>
<label>
<span>Telefon</span>
<input type="text" name="phone" value="<?= h((string) ($old['phone'] ?? '')) ?>" required>
</label>
<label>
<span>Strasse</span>
<input type="text" name="street" value="<?= h((string) ($old['street'] ?? '')) ?>" required>
</label>
<label>
<span>PLZ</span>
<input type="text" name="postal_code" value="<?= h((string) ($old['postal_code'] ?? '')) ?>" required>
</label>
<label>
<span>Ort</span>
<input type="text" name="city" value="<?= h((string) ($old['city'] ?? '')) ?>" required>
</label>
<label>
<span>Anlass</span>
<input type="text" name="event_type" value="<?= h((string) ($old['event_type'] ?? '')) ?>" placeholder="z. B. Hochzeit oder Sommerfest">
</label>
<label>
<span>Veranstaltungsort</span>
<input type="text" name="event_location" value="<?= h((string) ($old['event_location'] ?? '')) ?>" placeholder="Location oder Stadt">
</label>
<label>
<span>Mietbeginn</span>
<input type="date" name="start_date" data-booking-start value="<?= h((string) ($old['start_date'] ?? '')) ?>" required>
</label>
<label>
<span>Mietende</span>
<input type="date" name="end_date" data-booking-end value="<?= h((string) ($old['end_date'] ?? '')) ?>" required>
</label>
<label>
<span>Lieferart</span>
<select name="delivery_mode">
<option value="self_pickup" <?= selected((string) ($old['delivery_mode'] ?? 'self_pickup'), 'self_pickup') ?>>Selbstabholung</option>
<option value="delivery_setup" <?= selected((string) ($old['delivery_mode'] ?? ''), 'delivery_setup') ?>>Lieferung und Aufbau</option>
<option value="on_site_support" <?= selected((string) ($old['delivery_mode'] ?? ''), 'on_site_support') ?>>Lieferung, Aufbau und Vor-Ort-Betreuung</option>
</select>
</label>
<label>
<span>Zahlungsart</span>
<select name="payment_method">
<option value="invoice_transfer" <?= selected((string) ($old['payment_method'] ?? 'invoice_transfer'), 'invoice_transfer') ?>>Rechnung / Ueberweisung</option>
<option value="paypal" <?= selected((string) ($old['payment_method'] ?? ''), 'paypal') ?>>PayPal</option>
</select>
</label>
</div>
<label>
<span>Nachricht</span>
<textarea name="notes_customer" rows="4" placeholder="Sonderwuensche, Lieferdetails oder Aufbauhinweise"><?= h((string) ($old['notes_customer'] ?? '')) ?></textarea>
</label>
<div class="price-summary">
<div>
<span>Mietdauer</span>
<strong data-summary-days>Noch nicht gewaehlt</strong>
</div>
<div>
<span>Gesamtpreis</span>
<strong data-summary-total><?= h(formatCurrency($dayRate)) ?></strong>
</div>
</div>
<button type="submit" class="button-primary button-block">Anfrage absenden</button>
<p class="form-note">Mit dem Absenden wird eine verwaltbare Anfrage angelegt. Die finale Bestaetigung erfolgt durch den Verwalter.</p>
</form>
</div>
</section>
<section class="faq-section" id="faq">
<div>
<p class="eyebrow">FAQ</p>
<h2>Wichtige Fragen auf einen Blick</h2>
</div>
<div class="faq-list">
<article>
<h3>Wie schnell ist die Fotobox einsatzbereit?</h3>
<p>Durch den einfachen Aufbau und die kurze Einweisung ist die Box in wenigen Minuten startklar.</p>
</article>
<article>
<h3>Bekommen wir alle Fotos?</h3>
<p>Ja. Alle Bilder werden nach dem Event digital zur Verfuegung gestellt. Auf Wunsch koennen Gaeste sie schon vor Ort aufs Handy laden.</p>
</article>
<article>
<h3>Kann ich auch Lieferung und Betreuung buchen?</h3>
<p>Ja. Du kannst zwischen Selbstabholung, Lieferung mit Aufbau oder zusaetzlicher Vor-Ort-Unterstuetzung waehlen.</p>
</article>
<article>
<h3>Ist PayPal schon moeglich?</h3>
<p>Ja, PayPal ist als Zahlungsart im Ablauf vorgesehen. Sobald du echte MySQL- und PayPal-Daten hinterlegst, laesst sich der operative Betrieb direkt anbinden.</p>
</article>
</div>
</section>
+46
View File
@@ -0,0 +1,46 @@
<?php
$metaTitle = isset($pageTitle) ? $pageTitle . ' | Fotobox Moments' : 'Fotobox Moments';
$isAdminArea = str_contains($viewPath, '/admin/');
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= h($metaTitle) ?></title>
<meta name="description" content="Fotobox mieten mit einfacher Online-Anfrage, flexibler Lieferung und kompletter Admin-Verwaltung.">
<link rel="stylesheet" href="<?= h(asset('assets/styles.css')) ?>">
<script defer src="<?= h(asset('assets/app.js')) ?>"></script>
</head>
<body class="<?= $isAdminArea ? 'theme-admin' : 'theme-public' ?>">
<div class="page-shell">
<header class="site-header">
<a class="brand" href="<?= $isAdminArea ? '/admin' : '/' ?>">
<span class="brand-mark">FM</span>
<span>
<strong>Fotobox Moments</strong>
<small>Vermietung & Verwaltung</small>
</span>
</a>
<nav class="site-nav">
<?php if ($isAdminArea): ?>
<a href="/admin">Dashboard</a>
<a href="/admin/create">Bestellung anlegen</a>
<form method="post" action="/admin/logout">
<button type="submit" class="ghost-button">Logout</button>
</form>
<?php else: ?>
<a href="#leistungen">Leistungen</a>
<a href="#ablauf">Ablauf</a>
<a href="#faq">FAQ</a>
<a class="primary-link" href="#buchung">Verfuegbarkeit pruefen</a>
<?php endif; ?>
</nav>
</header>
<main>
<?php require $viewPath; ?>
</main>
</div>
</body>
</html>