Initial commit: WitShop Laravel Online-Shop

- Laravel 11, Blade, Alpine.js, Tailwind CSS
- Produkt- & Kategorieverwaltung mit Varianten
- Checkout (Vorkasse + Rechnung), Session-Warenkorb
- Admin-Backend (Dashboard, Bestellungen, Kunden, CMS)
- DSGVO-konform: Cookie-Consent, Impressum, Widerruf, AGB
- PDF-Rechnung via dompdf, SMTP-Mailversand
- Kundenverwaltung mit manueller Freischaltung

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 00:34:09 +02:00
co-authored by Claude Sonnet 4.6
commit 41078fdc08
208 changed files with 21725 additions and 0 deletions
@@ -0,0 +1,65 @@
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
h1 { color: #1d4ed8; }
table { width: 100%; border-collapse: collapse; }
th, td { padding: 8px; border-bottom: 1px solid #eee; text-align: left; }
th { background: #f8fafc; }
.total { font-weight: bold; font-size: 1.1em; }
.box { background: #f8fafc; padding: 16px; border-radius: 8px; margin: 16px 0; }
</style></head>
<body>
<h1>Vielen Dank für Ihre Bestellung!</h1>
<p>Guten Tag {{ $order->billingAddress()?->full_name ?? $order->guest_email }},</p>
<p>wir haben Ihre Bestellung <strong>{{ $order->order_number }}</strong> erhalten und bestätigen sie hiermit.</p>
@if($order->payment_method === 'prepayment')
<div class="box">
<strong>Bitte überweisen Sie den Betrag auf folgendes Konto:</strong><br>
Empfänger: {{ \App\Models\Setting::get('shop_owner') }}<br>
Bank: {{ \App\Models\Setting::get('bank_name') }}<br>
IBAN: {{ \App\Models\Setting::get('bank_iban') }}<br>
BIC: {{ \App\Models\Setting::get('bank_bic') }}<br>
Verwendungszweck: <strong>{{ $order->order_number }}</strong><br>
Betrag: <strong>{{ number_format($order->total, 2, ',', '.') }} €</strong>
</div>
@else
<div class="box">
Sie erhalten Ihre Rechnung separat per E-Mail sobald Ihre Bestellung bearbeitet wird.<br>
Zahlungsziel: {{ \App\Models\Setting::get('invoice_payment_days', 14) }} Tage nach Rechnungserhalt.
</div>
@endif
<h2>Bestellübersicht</h2>
<table>
<thead><tr><th>Artikel</th><th>Menge</th><th>Einzelpreis</th><th>Gesamt</th></tr></thead>
<tbody>
@foreach($order->items as $item)
<tr>
<td>{{ $item->product_name }}@if($item->variant_label) <small>({{ $item->variant_label }})</small>@endif</td>
<td>{{ $item->quantity }}</td>
<td>{{ number_format($item->unit_price, 2, ',', '.') }} €</td>
<td>{{ number_format($item->line_total, 2, ',', '.') }} €</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr><td colspan="3">Zwischensumme</td><td>{{ number_format($order->subtotal, 2, ',', '.') }} €</td></tr>
<tr><td colspan="3">Versand</td><td>{{ number_format($order->shipping_cost, 2, ',', '.') }} €</td></tr>
<tr class="total"><td colspan="3">Gesamt (inkl. MwSt.)</td><td>{{ number_format($order->total, 2, ',', '.') }} €</td></tr>
</tfoot>
</table>
@if($addr = $order->billingAddress())
<h3>Rechnungsadresse</h3>
<p>{{ $addr->full_name }}<br>{{ $addr->street }}<br>{{ $addr->zip }} {{ $addr->city }}</p>
@endif
<hr>
<p style="font-size:0.85em;color:#666;">
{{ \App\Models\Setting::get('shop_name') }} | {{ \App\Models\Setting::get('shop_address') }}<br>
Bei Fragen: <a href="mailto:{{ \App\Models\Setting::get('shop_email') }}">{{ \App\Models\Setting::get('shop_email') }}</a>
</p>
</body>
</html>
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
h1 { color: #1d4ed8; }
.box { background: #f0fdf4; padding: 16px; border-radius: 8px; border: 1px solid #86efac; }
</style></head>
<body>
<h1>Ihre Bestellung ist unterwegs! 📦</h1>
<p>Ihre Bestellung <strong>{{ $order->order_number }}</strong> wurde versendet.</p>
@if($order->tracking_code)
<div class="box">
<strong>Sendungsverfolgung:</strong><br>
Tracking-Nummer: <strong>{{ $order->tracking_code }}</strong>
</div>
@endif
<p>Bei Fragen zu Ihrer Lieferung können Sie uns jederzeit kontaktieren.</p>
<hr>
<p style="font-size:0.85em;color:#666;">{{ \App\Models\Setting::get('shop_name') }} | {{ \App\Models\Setting::get('shop_email') }}</p>
</body>
</html>
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
h1 { color: #16a34a; }
</style></head>
<body>
<h1>Zahlung eingegangen</h1>
<p>Guten Tag,</p>
<p>Ihre Zahlung für Bestellung <strong>{{ $order->order_number }}</strong> ({{ number_format($order->total, 2, ',', '.') }} €) ist eingegangen.</p>
<p>Im Anhang finden Sie Ihre Rechnung als PDF.</p>
<p>Wir werden Ihre Bestellung schnellstmöglich bearbeiten und versenden.</p>
<hr>
<p style="font-size:0.85em;color:#666;">{{ \App\Models\Setting::get('shop_name') }} | {{ \App\Models\Setting::get('shop_email') }}</p>
</body>
</html>
+24
View File
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"></head>
<body style="font-family: Arial, sans-serif; color: #333;">
@if($isConfirmation)
<h2>Bestätigung Ihres Widerrufs</h2>
<p>Guten Tag {{ $data['name'] }},</p>
<p>Ihr Widerruf ist bei uns eingegangen. Wir werden ihn schnellstmöglich bearbeiten.</p>
@else
<h2>Neues Widerrufsformular</h2>
@endif
<table style="border-collapse:collapse;width:100%">
<tr><td style="padding:6px;font-weight:bold">Name</td><td style="padding:6px">{{ $data['name'] }}</td></tr>
<tr><td style="padding:6px;font-weight:bold">E-Mail</td><td style="padding:6px">{{ $data['email'] }}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Bestellnummer</td><td style="padding:6px">{{ $data['order_number'] ?? '—' }}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Produkt</td><td style="padding:6px">{{ $data['product'] }}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Datum</td><td style="padding:6px">{{ $data['date'] }}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Begründung</td><td style="padding:6px">{{ $data['reason'] ?? '—' }}</td></tr>
</table>
<p style="font-size:0.85em;color:#666;">{{ \App\Models\Setting::get('shop_name') }}</p>
</body>
</html>