"
+echo
+
+WIP_COMMIT="e3dc1af"
+if ! git cat-file -e "${WIP_COMMIT}" 2>/dev/null; then
+ echo "FEHLER: Commit ${WIP_COMMIT} existiert nicht in diesem Repo."
+ echo " Wenn das Repo neu geklont wurde, musst du stattdessen manuell"
+ echo " die Dateien aus dem Tarball wiederherstellen."
+ echo " Siehe MANIFEST.md → Abschnitt 'Manuell'."
+ exit 2
+fi
+
+if ! ${FORCE}; then
+ echo
+ read -r -p " Wurde Phase 1 auf Live erfolgreich deployed und migriert? (yes/NO): " answer
+ if [[ "${answer}" != "yes" ]]; then
+ echo " Abbruch. Bitte erst Phase 1 auf Live einspielen."
+ exit 3
+ fi
+ echo
+ read -r -p " Trotzdem fortfahren? (yes/NO): " confirm
+ if [[ "${confirm}" != "yes" ]]; then
+ echo " Abbruch durch User."
+ exit 3
+ fi
+fi
+
+echo
+echo "--- 1/4 --- Migrationen zurückspielen"
+cp -v "${BACKUP_DIR}/FILES/migrations/"*.php database/migrations/
+echo " → $(ls "${BACKUP_DIR}/FILES/migrations/" | wc -l) Migrationen kopiert"
+
+echo
+echo "--- 2/4 --- Offer-Models zurückspielen"
+cp -v "${BACKUP_DIR}/FILES/models/"*.php app/Models/
+echo " → 6 Models kopiert (inkl. Überschreiben Legacy-Offer.php)"
+
+echo
+echo "--- 3/4 --- Code-Reverts aus Git-Commit ${WIP_COMMIT}"
+FILES_TO_RESTORE=(
+ "app/Models/Booking.php"
+ "app/Models/Customer.php"
+ "app/Models/Contact.php"
+ "app/Models/Lead.php"
+ "app/Repositories/BookingPDFRepository.php"
+ "app/Repositories/LeadRepository.php"
+ "app/Repositories/CustomerMailRepository.php"
+ "app/Http/Controllers/RequestController.php"
+ "app/Http/Controllers/API/BookingController.php"
+ "app/Http/Controllers/Admin/ReportController.php"
+ "app/Http/Controllers/Admin/ReportProviderController.php"
+ "app/Http/Controllers/Admin/ReportLeadsController.php"
+ "app/Http/Controllers/LeadController.php"
+ "app/Http/Controllers/CustomerController.php"
+ "app/Http/Controllers/ContactController.php"
+ "app/Services/BookingImport.php"
+ "app/Console/Commands/SyncNewsletterKulturreisen.php"
+ "app/Console/Commands/ContactsFindDuplicates.php"
+ "app/Console/Commands/ContactsMergeDuplicates.php"
+ "resources/views/customer/mail/modal-show-mail-inner.blade.php"
+ "resources/views/pdf/components/booking_head.blade.php"
+ "resources/views/pdf/components/booking_header.blade.php"
+ "config/filesystems.php"
+)
+for f in "${FILES_TO_RESTORE[@]}"; do
+ git checkout "${WIP_COMMIT}" -- "${f}"
+ echo " ↺ ${f}"
+done
+
+echo
+echo "--- 4/4 --- Verifikation"
+echo
+echo " git status (sollte Phase-2 + Offers-Dateien als modifiziert zeigen):"
+git status --short | head -40
+echo
+echo " Verbliebene Phase-2-Marker im Code (sollten nun wieder da sein):"
+grep -rn "inquiry_id" app/ 2>/dev/null | head -5 || echo " (keine gefunden — Restore eventuell nicht vollständig)"
+echo
+
+echo "=========================================="
+echo " Restore abgeschlossen."
+echo "=========================================="
+echo
+echo " Nächste Schritte:"
+echo " 1. php -l auf allen geänderten Dateien (Syntax-Check)"
+echo " 2. composer dump-autoload (neue Models registrieren)"
+echo " 3. Weiterarbeit an Phase 2 + Offers nach Plan"
+echo " 4. Phase-2-Migrationen ausführen:"
+echo " php artisan migrate --path=database/migrations/2025_04_15_200001_phase2_rename_customer_to_contacts.php"
+echo " php artisan migrate --path=database/migrations/2025_04_15_200002_phase2_rename_lead_to_inquiries.php"
+echo " php artisan migrate --path=database/migrations/2025_04_15_200003_phase2_rename_booking_lead_id_to_inquiry_id.php"
+echo
diff --git a/dev/customer-bookings/phase-1-live-deploy.md b/dev/customer-bookings/phase-1-live-deploy.md
new file mode 100644
index 0000000..fabc883
--- /dev/null
+++ b/dev/customer-bookings/phase-1-live-deploy.md
@@ -0,0 +1,241 @@
+# Phase-1-Live-Deploy — Anleitung
+
+**Ausgangssituation:**
+- Test-System läuft mit Phase 1 (Laravel-10-Upgrade, Contacts-Modul, Duplicats-Commands, Soft-Delete- & Merge-Fields auf `customer`-Tabelle)
+- Live-Server ist bei Git-Commit `389d5d1` (Januar 2026) — noch ohne Phase 1
+- Der Workspace wurde per `dev/backups/phase2-offers-2026-04-17/` um Phase 2 + Offers bereinigt und ist jetzt **exakt auf Phase-1-Stand** wie Test
+
+---
+
+## Vorbereitung (einmalig)
+
+1. **Backup auf Live-Server**
+ - Vollständiges DB-Backup (mysqldump oder Hoster-Tool) — speichere mit Zeitstempel
+ - Vollständiges Dateisystem-Backup (zumindest `/app`, `/config`, `/routes`, `/resources`, `/database/migrations`, `/composer.json`, `/composer.lock`)
+
+2. **Maintenance-Mode aktivieren** (empfohlen für 15–30 min)
+ ```bash
+ php artisan down --render="errors::503" --secret="dein-geheimer-preview-token"
+ ```
+ Mit `--secret` kannst du über `https://domain/dein-geheimer-preview-token` weiter auf Live zugreifen, während alle anderen die 503-Seite sehen.
+
+3. **Abhängigkeiten abklären**
+ - Läuft auf Live mindestens **PHP 8.1** (Laravel-10-Anforderung)? Prüfen: `php -v`
+ - Ist **Composer** auf dem Live-Server installiert? Falls Managed Hosting: `composer install` vor dem Deploy auf einem Staging-Server ausführen und das `vendor/`-Verzeichnis mitsyncen
+
+---
+
+## Upload (rsync / scp / SFTP)
+
+### Was **muss** hochgeladen werden
+
+**Neue Dateien:**
+```
+database/migrations/2025_04_15_100001_phase1_add_merge_fields_to_customer_table.php
+database/migrations/2025_04_15_100002_phase1_add_soft_delete_to_customer_table.php
+app/Models/Contact.php
+app/Repositories/ContactRepository.php
+app/Http/Controllers/ContactController.php
+app/Console/Commands/ContactsFindDuplicates.php
+app/Console/Commands/ContactsMergeDuplicates.php
+app/Services/MailDirService.php
+resources/views/contact/_detail_contact.blade.php
+resources/views/contact/_detail_history.blade.php
+resources/views/contact/detail.blade.php
+resources/views/contact/duplicates.blade.php
+resources/views/contact/index.blade.php
+database/factories/BookingFactory.php
+database/factories/CustomerFactory.php
+database/factories/LeadFactory.php
+tests/Feature/Api/BookingImportTest.php
+tests/Feature/Auth/LoginTest.php
+tests/Feature/BookingControllerTest.php
+tests/Unit/Services/UtilTest.php
+```
+
+**Modifizierte Dateien** — vollständige Upload-Liste generieren:
+
+```bash
+cd /workspace/mein.sterntours.de
+git diff --name-only HEAD^ \
+ | grep -Ev "^(dev/|tests/|\.env|\.mcp\.json$|CLAUDE\.md$|boost\.json$|_ide_helper|\.devcontainer/|bootstrap/cache/|mein\.sterntours\.de\.code-workspace$|docker-compose\.yml$|public/storage$)" \
+ > /tmp/phase1-files-to-upload.txt
+cat /tmp/phase1-files-to-upload.txt
+wc -l /tmp/phase1-files-to-upload.txt
+```
+
+Das filtert die unerwünschten Dateien automatisch raus.
+
+Die wichtigsten modifizierten Dateien (komplette Liste in der generierten Textdatei):
+- `app/Models/Customer.php`, `Booking.php`, `Lead.php` (und viele weitere Models — Laravel-10-Upgrade)
+- `app/Http/Controllers/*.php` (Controllers mit Laravel-10-Anpassungen)
+- `app/Http/Kernel.php`, `app/Console/Kernel.php`, `app/Providers/*.php`, `app/Http/Middleware/TrustProxies.php` (Laravel-10-Upgrade)
+- `app/Repositories/*.php` (Laravel-10: `Storage::disk()->path()` statt `getAdapter()->getPathPrefix()`)
+- `app/Libraries/CreatePDF.php`
+- `routes/web.php` (neue `/contacts`-Routen)
+- `resources/views/layouts/application.blade.php`, `resources/views/layouts/includes/layout-sidenav.blade.php`
+- `config/trustedproxy.php`
+- `packages/digital-bird/shoppingcart/**`, `packages/iqcontent/laravel-filemanager/**` (Package-Updates)
+- `composer.json`, `composer.lock`
+- `phpunit.xml`
+
+### Was **nicht** hochgeladen werden darf
+
+- **Alles unter `dev/`** — dort liegt Entwicklungsdokumentation und die Backups (Phase 2, Offers)
+- `.env`, `.env.*` — enthält produktive Credentials, wird separat verwaltet
+- `_ide_helper.php`, `_ide_helper_models.php` — lokale IDE-Hilfen (von barryvdh/laravel-ide-helper generiert)
+- `bootstrap/cache/config.php` — wird auf Live per `php artisan config:cache` frisch generiert
+- `.mcp.json`, `CLAUDE.md`, `boost.json` — Dev-Tools-Konfiguration
+- `.devcontainer/` — Entwicklungsumgebung (VSCode-Devcontainer)
+- `storage/logs/*`, `storage/framework/cache/*`, `storage/framework/views/*`, `storage/framework/sessions/*` — Runtime-Daten
+- `vendor/` — wird auf Live per `composer install` generiert (außer Managed Hosting, siehe oben)
+- `node_modules/` — genauso
+- `.git/` — Repo-Metadaten
+- `tests/` — nur auf Test relevant; auf Live-Production nicht nötig (aber nicht schädlich, falls mit rauf kommt)
+- `mein.sterntours.de.code-workspace` — IDE-Workspace-Datei
+- `docker-compose.yml` — lokale Dev-Orchestrierung
+
+### Beispiel rsync-Kommando (als Orientierung)
+
+```bash
+# Von lokal → Live
+# Achtung: --dry-run zuerst, dann ohne --dry-run wiederholen!
+rsync -av --dry-run \
+ --exclude='.git/' \
+ --exclude='dev/' \
+ --exclude='node_modules/' \
+ --exclude='vendor/' \
+ --exclude='storage/logs/' \
+ --exclude='storage/framework/cache/' \
+ --exclude='storage/framework/views/' \
+ --exclude='storage/framework/sessions/' \
+ --exclude='storage/app/public/temp/' \
+ --exclude='public/storage' \
+ --exclude='.env*' \
+ --exclude='bootstrap/cache/' \
+ --exclude='_ide_helper*' \
+ --exclude='.mcp.json' \
+ --exclude='CLAUDE.md' \
+ --exclude='boost.json' \
+ --exclude='.devcontainer/' \
+ /workspace/mein.sterntours.de/ \
+ user@live-server:/pfad/zu/mein.sterntours.de/
+```
+
+Falls du **nur geänderte Dateien** syncen möchtest (sicherer bei großer Codebase):
+```bash
+git diff --name-only HEAD^ | grep -v "^dev/" > /tmp/phase1-files.txt
+rsync -av --files-from=/tmp/phase1-files.txt . user@live-server:/pfad/zu/mein.sterntours.de/
+```
+
+---
+
+## Ausführung auf Live-Server
+
+Nach dem Upload, per SSH auf dem Live-Server:
+
+```bash
+cd /pfad/zu/mein.sterntours.de
+
+# 1. Composer Dependencies aktualisieren (Laravel 10 Upgrade!)
+composer install --no-dev --optimize-autoloader
+
+# 2. Alle Caches leeren (wichtig wegen Struktur-Änderungen)
+php artisan config:clear
+php artisan route:clear
+php artisan view:clear
+php artisan cache:clear
+
+# 3. DB-Migrationen ausführen (nur die 2 Phase-1-Migrationen)
+php artisan migrate --force
+# Sollte zeigen:
+# Running: 2025_04_15_100001_phase1_add_merge_fields_to_customer_table
+# Running: 2025_04_15_100002_phase1_add_soft_delete_to_customer_table
+
+# 4. Autoload neu generieren (neue Klassen: Contact, ContactRepository, MailDirService)
+composer dump-autoload --optimize
+
+# 5. Duplicats-Analyse (read-only, erzeugt Reports)
+php artisan contacts:find-duplicates
+# → Reports unter storage/app/contacts/duplicates/*.csv
+
+# 6. Duplicats-Merging (DRY-RUN zuerst!)
+php artisan contacts:merge-duplicates --dry-run
+# Review der Ausgabe. Wenn OK:
+
+# 7. Duplicats-Merging (echt)
+php artisan contacts:merge-duplicates --confidence=HIGH --force
+# Merged nur hochkonfidente Duplikate automatisch.
+# Mittlere/niedrige Konfidenz bleibt für manuelle Review.
+
+# 8. Production-Caches wieder aufbauen (für Performance)
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+# Optional: php artisan event:cache
+# NICHT php artisan optimize (das cached auch, aber einige Setups haben damit Probleme)
+
+# 9. Maintenance-Mode deaktivieren
+php artisan up
+```
+
+---
+
+## Smoke-Tests nach dem Deploy
+
+Nach dem `php artisan up` diese Kernfunktionen manuell testen:
+
+- [ ] Login funktioniert (`/login`)
+- [ ] Buchungsliste lädt (`/booking`)
+- [ ] Einzelne Buchung öffnen, Detailseite lädt
+- [ ] Anfragenliste lädt (`/lead`)
+- [ ] Einzelne Anfrage öffnen, Detailseite lädt
+- [ ] **NEU**: Kontakte-Liste lädt (`/contacts` oder `/contact` je nach Route)
+- [ ] **NEU**: Kontakte-Duplikats-Übersicht lädt (`/contacts/duplicates` oder ähnlich)
+- [ ] PDF-Erzeugung funktioniert (Buchungsbestätigung, Voucher, Storno) — testet `Storage::disk()->path()`-Änderung
+- [ ] Mail-Versand über CustomerMail funktioniert
+- [ ] Admin-Report läuft durch (`/admin/report`)
+
+---
+
+## Rollback-Plan (falls etwas schiefgeht)
+
+1. **Maintenance-Mode aktivieren:** `php artisan down`
+2. **DB-Rollback:**
+ ```bash
+ php artisan migrate:rollback --step=2
+ ```
+ oder — falls das fehlschlägt — das zuvor erstellte DB-Backup einspielen.
+3. **Dateisystem-Rollback:** das zuvor erstellte Dateisystem-Backup zurückspielen (überschreiben).
+4. **Caches leeren + Up:**
+ ```bash
+ php artisan config:clear && php artisan cache:clear && php artisan view:clear && php artisan up
+ ```
+
+---
+
+## Nach erfolgreichem Live-Deploy
+
+1. **Lokal** im Workspace: Restore-Script laufen lassen, um Phase 2 + Offers zurückzuholen:
+ ```bash
+ cd /workspace/mein.sterntours.de
+ bash dev/backups/phase2-offers-2026-04-17/restore.sh
+ ```
+2. Der Workspace enthält dann wieder Phase 2 Code + Offers-Modul. Weitermachen nach Plan in:
+ - `dev/customer-bookings/umsetzung.md` (Phase 2–4)
+ - `dev/offers/umsetzung.md` (Offers-Modul)
+3. **Master-Branch** im Git kann bei Gelegenheit mit dem WIP-Commit `e3dc1af` aktualisiert werden (push), damit der Remote-Stand den aktuellen Arbeitsstand abbildet.
+
+---
+
+## Dateien in diesem Backup
+
+- `dev/backups/phase2-offers-2026-04-17/MANIFEST.md` — detaillierte Übersicht
+- `dev/backups/phase2-offers-2026-04-17/FILES/migrations/` — 18 Migrations-Dateien
+- `dev/backups/phase2-offers-2026-04-17/FILES/models/` — 6 Offer-Models
+- `dev/backups/phase2-offers-2026-04-17/PATCHES/` — 11 Diff-Dateien zur Dokumentation
+- `dev/backups/phase2-offers-2026-04-17/restore.sh` — automatisches Restore
+
+**Zusätzliche Sicherheitsnetze:**
+- Tarball: `../backups-safety/workspace-pre-phase1-rollback-2026-04-17.tar.gz` (182 MB, kompletter Workspace-State vor dem Rückbau)
+- Git-Commit: `e3dc1af` auf lokalem `master` (nicht gepusht) — enthält Phase 1 + 2 + Offers gemischt
diff --git a/resources/views/customer/mail/modal-show-mail-inner.blade.php b/resources/views/customer/mail/modal-show-mail-inner.blade.php
index bff0511..0c4eaf2 100644
--- a/resources/views/customer/mail/modal-show-mail-inner.blade.php
+++ b/resources/views/customer/mail/modal-show-mail-inner.blade.php
@@ -45,7 +45,7 @@
Kunde:
{{ $customer_mail->customer->salutation->name }} {{ $customer_mail->customer->title }} {{ $customer_mail->customer->firstname }} {{ $customer_mail->customer->name }}
@if($customer_mail->booking)
- ({{$customer_mail->booking->inquiry_id}})
+ ({{$customer_mail->booking->lead_id}})
@endif
@endif
diff --git a/resources/views/emails/exception.blade.php b/resources/views/emails/exception.blade.php
new file mode 100644
index 0000000..4eef74b
--- /dev/null
+++ b/resources/views/emails/exception.blade.php
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ Exception — {{ config('app.name') }}
+
+
+
+
+ {!! $content !!}
+
+
+
diff --git a/resources/views/pdf/components/booking_head.blade.php b/resources/views/pdf/components/booking_head.blade.php
index d043bb9..50ea257 100644
--- a/resources/views/pdf/components/booking_head.blade.php
+++ b/resources/views/pdf/components/booking_head.blade.php
@@ -22,7 +22,7 @@
{{-- @endif --}}
- Buchungsnummer: {{ $booking->inquiry_id }}
+ Buchungsnummer: {{ $booking->lead_id }}
Buchungsdatum: {{ _format_date($booking->booking_date) }}
Reisetermin: {{ _format_date($booking->start_date) }} -
{{ _format_date($booking->end_date) }}
diff --git a/resources/views/pdf/components/booking_header.blade.php b/resources/views/pdf/components/booking_header.blade.php
index 265985e..89a44c6 100644
--- a/resources/views/pdf/components/booking_header.blade.php
+++ b/resources/views/pdf/components/booking_header.blade.php
@@ -35,7 +35,7 @@
|
| Buchungsnummer: |
- {{ $booking->inquiry_id }} |
+ {{ $booking->lead_id }} |
| Buchungsdatum: |
diff --git a/vendor.tar b/vendor.tar
new file mode 100644
index 0000000..eba74bf
Binary files /dev/null and b/vendor.tar differ