mivita/dev/22-01-2026/dhl-cancellation-info.md
2026-01-23 17:35:23 +01:00

2.6 KiB

DHL Sendungs-Stornierung - Troubleshooting

Problem: "RF-UndefinedResource" Fehler

Aktuelle Situation:

  • Config: Sandbox-Modus aktiv (DHL_SANDBOX=true)
  • Base URL: https://api-sandbox.dhl.com
  • Sendung: ID 11, Nr. 0034043333301020021021115
  • Status: created (stornierbar)
  • Fehler: "RF-UndefinedResource"

Ursachen:

1. Sandbox-Einschränkungen

Im DHL Sandbox-Modus:

  • Sendungen sind nur für begrenzte Zeit verfügbar
  • Test-Sendungen werden nach kurzer Zeit automatisch gelöscht
  • Stornierung ist nur innerhalb weniger Stunden möglich

2. Zeitfenster überschritten

  • Sendung erstellt: 2026-01-23 13:08:07
  • Wenn mehr als 2-3 Stunden vergangen: Nicht mehr stornierbar

3. Sandbox vs. Production Mismatch

  • Sendung im Sandbox erstellt
  • Versuch im Production-Modus zu stornieren (oder umgekehrt)

Lösungen:

Option 1: Neue Test-Sendung erstellen

# Neue Sendung erstellen und SOFORT stornieren (innerhalb von Minuten)
# Im DHL Cockpit: Neue Sendung erstellen → Sofort Storno-Button klicken

Option 2: Production-Modus testen (nur mit echten Credentials!)

# .env
DHL_SANDBOX=false
DHL_BASE_URL=https://api-eu.dhl.com
DHL_API_KEY=<production_key>
DHL_USERNAME=<production_user>
DHL_PASSWORD=<production_password>

Option 3: Status manuell setzen (nur für Entwicklung)

php artisan tinker
$shipment = Acme\Dhl\Models\DhlShipment::find(11);
$shipment->update(['status' => 'canceled']);

Empfehlung:

Für Sandbox-Tests:

  1. Sendung erstellen
  2. SOFORT (innerhalb von 1-2 Minuten) stornieren
  3. Nicht länger warten

Für Production:

  • Stornierung funktioniert zuverlässig innerhalb von 24 Stunden
  • Sendungen bleiben länger in der API verfügbar

Debug-Commands:

# Prüfe Sendung
php artisan tinker --execute="
\$s = Acme\Dhl\Models\DhlShipment::find(11);
echo 'Status: ' . \$s->status . PHP_EOL;
echo 'Created: ' . \$s->created_at . PHP_EOL;
echo 'Age: ' . \$s->created_at->diffForHumans() . PHP_EOL;
"

# Prüfe Config
php artisan tinker --execute="
\$c = (new \App\Http\Controllers\SettingController())->getDhlConfig();
echo 'Mode: ' . (\$c['base_url'] == 'https://api-sandbox.dhl.com' ? 'SANDBOX' : 'PRODUCTION') . PHP_EOL;
"

Workaround für alte Sandbox-Sendungen:

Da alte Sandbox-Sendungen nicht mehr storniert werden können, setzen wir den Status manuell:

// Alle alten "created" Sendungen als "failed" markieren
Acme\Dhl\Models\DhlShipment::where('status', 'created')
    ->where('created_at', '<', now()->subHours(6))
    ->update(['status' => 'failed']);