# DHL Tracking E-Mails - Erweiterte Funktionen ## 📧 Mehrere Sendungen in einer E-Mail ### Problem gelöst: Wenn eine Bestellung in **mehrere Pakete** aufgeteilt wird, erhalten Kunden jetzt **eine gesammelte E-Mail** mit allen Tracking-Nummern, statt mehrere einzelne E-Mails. --- ## ✨ Neue Features ### 1. **Automatische Zusammenfassung** Alle Sendungen einer Bestellung werden automatisch in einer E-Mail zusammengefasst: ``` ┌─────────────────────────────────────┐ │ Deine 3 Sendungen sind unterwegs! │ ├─────────────────────────────────────┤ │ │ │ Paket 1 │ │ Sendungsnummer: 00340433333... │ │ [Sendung bei DHL verfolgen] │ │ │ │ Paket 2 │ │ Sendungsnummer: 00340433334... │ │ [Sendung bei DHL verfolgen] │ │ │ │ Paket 3 │ │ Sendungsnummer: 00340433335... │ │ [Sendung bei DHL verfolgen] │ └─────────────────────────────────────┘ ``` ### 2. **Intelligente Versand-Logik** - ✅ Sammelt alle Sendungen einer Bestellung - ✅ Versendet eine E-Mail pro Bestellung (nicht pro Paket) - ✅ Markiert alle Sendungen als versendet - ✅ Verhindert doppelte E-Mails ### 3. **Manuelle Versand-Option** Im Admin unter **DHL Cockpit** oder **Bestelldetails**: - Button "Tracking-E-Mail senden" klicken - Sendet automatisch **alle** Sendungen der Bestellung - Zeigt Anzahl der Sendungen in der Bestätigung ### 4. **Test-Modus für Cronjob** Testen Sie E-Mails, bevor sie an Kunden gehen! --- ## 🚀 Verwendung ### Manuelle E-Mail versenden (Admin) #### Option 1: Aus Bestelldetails 1. Bestellung öffnen 2. DHL Sendungen-Block scrollen 3. Button "📧" klicken 4. Alle Sendungen dieser Bestellung werden versendet #### Option 2: Aus DHL Cockpit 1. DHL Cockpit öffnen 2. Sendung finden 3. Button "📧" klicken 4. Alle Sendungen dieser Bestellung werden versendet ### Automatischer Cronjob #### Standard (täglich 06:00 Uhr) ```bash # Läuft automatisch via Cron # Definiert in: app/Console/Kernel.php ``` #### Manuell ausführen ```bash # Normale Ausführung php artisan dhl:update-tracking --send-emails # Mit Test-E-Mail php artisan dhl:update-tracking --send-emails --test-email=admin@example.com # Für bestimmte Bestellung php artisan dhl:update-tracking --send-emails --order=45078 # Dry-Run (keine Änderungen) php artisan dhl:update-tracking --send-emails --dry-run ``` --- ## 🧪 Test-Optionen ### Option 1: Test-E-Mail an eigene Adresse ```bash php artisan dhl:update-tracking --send-emails --test-email=meine@email.de ``` ✅ Sendet E-Mails an angegebene Adresse statt an Kunden ✅ Perfekt zum Testen des Layouts und Inhalts ✅ Markiert Sendungen TROTZDEM als versendet ### Option 2: Dry-Run (Simulation) ```bash php artisan dhl:update-tracking --send-emails --dry-run ``` ✅ Simuliert alle Aktionen ✅ Sendet KEINE E-Mails ✅ Markiert Sendungen NICHT als versendet ✅ Zeigt was passieren würde ### Option 3: Bestimmte Bestellung testen ```bash php artisan dhl:update-tracking --send-emails --order=45078 --test-email=test@example.com ``` ✅ Nur für eine Order-ID ✅ An Test-Adresse ✅ Perfekt für gezielte Tests --- ## 📊 Versand-Status in Bestelldetails ### Anzeige Für jede Sendung wird angezeigt: | Sendung | Status | Tracking | **E-Mail** | Aktionen | |---------|--------|----------|------------|----------| | #11 | created | - | ✅ 23.01.2026
🤖 Automatisch | 👁️ 📥 📧 | | #12 | in_transit | ... | ✅ 23.01.2026
👤 Manuell | 👁️ 📥 🔄 📧 | | #13 | created | - | ⏳ Nicht gesendet | 👁️ 📥 📧 | ### Informationen - **✅ Datum**: Wann wurde E-Mail versendet - **🤖 Automatisch**: Via Cronjob versendet - **👤 Manuell**: Über Admin-Button versendet - **⏳ Nicht gesendet**: Noch keine E-Mail --- ## ⚙️ Technische Details ### Datenbank-Felder ```sql -- dhl_package_shipments Tabelle tracking_email_sent_at TIMESTAMP NULL -- Wann versendet tracking_email_type VARCHAR(20) -- 'auto' oder 'manual' ``` ### Mail-Klasse ```php // Unterstützt jetzt Collection von Shipments new MailDhlTracking($shipments, $order) // Oder einzelne Sendung (backward compatible) new MailDhlTracking($shipment, $order) ``` ### Logik ```php // Sammelt alle Sendungen einer Bestellung $allShipments = DhlShipment::where('order_id', $order->id) ->whereNotNull('dhl_shipment_no') ->whereIn('status', ['created', 'in_transit', 'out_for_delivery']) ->get(); // Sendet eine E-Mail mit allen Sendungen Mail::to($email)->send(new MailDhlTracking($allShipments, $order)); // Markiert alle als versendet foreach ($allShipments as $shipment) { $shipment->markTrackingEmailSent('manual'); } ``` --- ## 🎯 Anwendungsfälle ### Fall 1: Mehrere Pakete bei Erstellung ``` 1. Admin erstellt 3 Labels für Order #45078 2. Alle 3 Labels werden erstellt (Status: created) 3. Cronjob läuft (06:00 Uhr) 4. Status wird aktualisiert (created → in_transit) 5. EINE E-Mail mit allen 3 Sendungen wird versendet ``` ### Fall 2: Nachträgliches Label ``` 1. Order #45078 hat bereits 2 Labels (E-Mail bereits versendet) 2. Admin erstellt 3. Label 3. Admin klickt "📧" Button 4. NEUE E-Mail mit allen 3 Sendungen wird versendet ``` ### Fall 3: Test vor Produktiv-Einsatz ```bash # 1. Test mit eigener E-Mail php artisan dhl:update-tracking --send-emails --test-email=admin@firma.de # 2. Prüfen der E-Mail # 3. Bei OK: Cronjob aktivieren (läuft automatisch) ``` --- ## 🔧 Konfiguration ### Cronjob-Einstellung ```php // app/Console/Kernel.php $schedule->command('dhl:update-tracking --days=14 --send-emails') ->dailyAt('06:00') ->withoutOverlapping() ->runInBackground(); ``` ### Anpassungen ```php // Andere Uhrzeit ->dailyAt('08:00') // Nur Werktage ->weekdays()->at('06:00') // Nur wenn Sendungen vorhanden ->when(function() { return DhlShipment::active()->count() > 0; }) ``` --- ## 📝 Übersetzungen Neue Übersetzungs-Keys in `resources/lang/{de,en,es}/email.php`: ```php 'dhl_tracking_subject_multiple' => 'Deine :count Sendungen sind unterwegs' 'dhl_tracking_message_multiple' => 'Deine Bestellung wurde in :count Paketen versendet' 'dhl_tracking_package_label' => 'Paket :number' ``` --- ## ✅ Vorteile | Vorher | Nachher | |--------|---------| | 3 Pakete = 3 E-Mails | 3 Pakete = 1 E-Mail | | Kunde verwirrt | Kunde hat Überblick | | Einzelne Tracking-Nummern | Alle Nummern auf einen Blick | | Manuell testen schwierig | Test-Modus integriert | | Kein Überblick über Versand | Klare Anzeige in Admin | --- ## 🐛 Troubleshooting ### Problem: E-Mail wird nicht versendet ```bash # Prüfen ob Sendungen vorhanden php artisan tinker >>> Acme\Dhl\Models\DhlShipment::active()->count() # Prüfen ob E-Mail-Adresse vorhanden >>> $order = App\Models\ShoppingOrder::find(45078); >>> $order->shopping_user->email ``` ### Problem: Mehrfache E-Mails ```bash # Prüfen welche Sendungen noch keine E-Mail haben php artisan tinker >>> Acme\Dhl\Models\DhlShipment::whereNull('tracking_email_sent_at')->count() ``` ### Problem: Test-E-Mail kommt nicht an ```bash # Queue prüfen php artisan queue:work --once # Logs prüfen tail -f storage/logs/laravel.log ``` --- ## 📞 Support Bei Fragen zur Implementierung siehe: - `/dev/22-01-2026/next-steps.md` - Vollständige Dokumentation - `app/Console/Commands/DhlUpdateTracking.php` - Command-Code - `app/Mail/MailDhlTracking.php` - Mail-Klasse - `resources/views/emails/dhl_tracking.blade.php` - E-Mail Template