Initale Einrichtung
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user