# V07PAK vs V01PAK für Return-Labels

**Datum:** 23.01.2026  
**Problem:** V07PAK wird als "unknown product" abgelehnt

## Fehler-Analyse

### DHL API Response:
```json
{
  "validationMessages": [{
    "property": "product",
    "validationMessage": "The product entered is unknown.",
    "validationState": "Error"
  }]
}
```

### Request Payload:
```json
{
  "product": "V07PAK",
  "billingNumber": "33333333330102"
}
```

## Produkt-Codes Vergleich

### V07PAK - DHL Retoure Online

**Beschreibung:** Spezieller Produktcode für Retouren

**Eigenschaften:**
- Designiert für Retouren
- Separate Billing-Nummer oft erforderlich
- Nicht für alle Accounts verfügbar
- Benötigt spezielle Freischaltung

**Account-Nummer:** `63144073550701` (laut config)

**Problem:** ❌ Nicht für diesen Account freigeschaltet

### V01PAK - DHL Paket

**Beschreibung:** Standard DHL Paket-Versand

**Eigenschaften:**
- ✅ Standard-Produkt, für alle Accounts verfügbar
- ✅ Keine spezielle Freischaltung nötig
- ✅ Mit vertauschten Adressen = Retoure
- ✅ Identische Funktionalität

**Account-Nummer:** `33333333330102` (laut Logs)

**Lösung:** ✅ Verwenden für Returns!

## Technischer Vergleich

| Feature | V07PAK | V01PAK (für Returns) |
|---------|--------|----------------------|
| Verfügbarkeit | Spezielle Freischaltung | ✅ Immer verfügbar |
| Billing Number | Separate Nummer | Standard-Nummer |
| Label-Aussehen | DHL Retoure | DHL Paket |
| Tracking | ✅ Ja | ✅ Ja |
| Funktionalität | Retoure | Mit vertauschten Adressen = Retoure |
| Kosten | Ggf. anders | Standard-Tarif |

## Warum V01PAK für Returns funktioniert

### Normale Sendung (Outbound):
```
Shipper: Unser Lager (mivita care)
  ↓
Consignee: Kunde
  ↓
= Normale Lieferung an Kunde
```

### Return-Sendung mit V01PAK:
```
Shipper: Kunde (sendet zurück)
  ↓
Consignee: Unser Lager (mivita care)
  ↓
= Retoure! (durch vertauschte Adressen)
```

DHL erkennt an den vertauschten Adressen, dass es eine Rücksendung ist!

## Implementierung

### Alte Version (V07PAK):
```php
$shipmentData = [
    'product_code' => 'V07PAK', // ❌ Nicht verfügbar
    'shipper' => $customer,
    'consignee' => $warehouse,
];
```

### Neue Version (V01PAK):
```php
$shipmentData = [
    'product_code' => 'V01PAK', // ✅ Funktioniert!
    'shipper' => $customer,     // Kunde als Absender
    'consignee' => $warehouse,  // Lager als Empfänger
];
// Nach Erstellung:
DB::update(['type' => 'return']); // Markierung als Retoure
```

## DHL Produktcodes Übersicht

| Code | Name | Verwendung |
|------|------|------------|
| V01PAK | DHL Paket | Standard Paketversand (auch für Returns!) |
| V53PAK | DHL Paket International | Internationaler Versand |
| V62WP | Warenpost | Kleinteile bis 1kg |
| V07PAK | DHL Retoure Online | Spezial-Retouren (oft nicht verfügbar) |

## Konfiguration

### config/dhl.php
```php
'account_numbers' => [
    'V01PAK' => env('DHL_ACCOUNT_NUMBER_V01PAK', '33333333330102'),
    'V07PAK' => env('DHL_ACCOUNT_NUMBER_V07PAK', '63144073550701'),
    // ...
],

'dimensions' => [
    'V01PAK' => ['length' => 120, 'width' => 60, 'height' => 60],
    'V07PAK' => ['length' => 120, 'width' => 60, 'height' => 60],
    // Gleiche Maße!
],
```

## Fallback-Änderung

### ReturnsService.php

```php
private function createReturnViaRegularShipment(array $returnData): array
{
    $shipmentData = [
        // Geändert von V07PAK zu V01PAK
        'product_code' => 'V01PAK', // ✅ Standard DHL Paket
        
        // Shipper = Kunde (sendet zurück)
        'shipper' => $customer,
        
        // Consignee = Lager (empfängt Retoure)
        'consignee' => $warehouse,
        
        // V01PAK Dimensions
        'dimensions' => [
            'length' => 120,
            'width' => 60,
            'height' => 60,
        ],
    ];
    
    $result = $shippingService->createLabel($shipmentData);
    
    // Wichtig: Als Retoure markieren!
    DhlShipment::find($result['shipmentId'])
        ->update(['type' => 'return']);
}
```

## Label-Unterschiede

### V07PAK Label (falls verfügbar):
- ❓ "DHL Retoure Online" Logo
- ❓ Spezielle Retouren-Kennzeichnung
- ❓ Evtl. andere Barcode-Formatierung

### V01PAK Label (als Retoure):
- ✅ Standard "DHL Paket" Logo
- ✅ Normale Tracking-Nummer
- ✅ Kunde als Absender sichtbar
- ✅ **Funktioniert identisch für Tracking & Zustellung**

## Vorteile V01PAK Lösung

1. ✅ **Sofort verfügbar** - Keine Freischaltung nötig
2. ✅ **Keine Extra-Kosten** - Standard-Tarif
3. ✅ **Identische Funktion** - Tracking & Zustellung gleich
4. ✅ **Einfachere Verwaltung** - Eine Billing-Nummer
5. ✅ **Weniger Fehler** - Kein "unknown product"

## Nachteile V01PAK Lösung

1. ❌ Keine spezielle "Retoure" Kennzeichnung auf Label
2. ❌ Evtl. andere Abrechnung als V07PAK
3. ❌ Nicht sofort als Retoure erkennbar (nur im System via `type='return'`)

## Tracking

**Beide Produktcodes generieren gültige DHL Tracking-Nummern:**

- Format: `222201234567890` (15 Stellen)
- Tracking-URL: `https://www.dhl.de/de/privatkunden/pakete-empfangen/verfolgen.html?piececode=...`
- Funktioniert identisch für V01PAK und V07PAK

## Empfehlung

### Kurzfristig (Aktuell):
✅ **V01PAK verwenden**
- Funktioniert sofort
- Keine Änderungen am Account nötig
- Identische Funktionalität

### Langfristig (Optional):
📞 **V07PAK beantragen bei DHL**
- Kontakt: DHL Geschäftskundenberater
- Vorteile: Spezielle Retouren-Kennzeichnung
- Evtl. bessere Abrechnung

## Testing

```bash
# Return-Label erstellen mit V01PAK
# Erwartung: Erfolg!

# Logs prüfen:
tail -f storage/logs/laravel.log | grep "DHL"

# Erwartete Ausgabe:
# [DHL Returns] Using regular Shipping API as fallback
# [DHL API] Sending payload {"product":"V01PAK",...}
# [DHL API] Response received (200)
# [DHL Returns] Return label created successfully ✅
```

## Fazit

V01PAK ist die praktische Lösung für Return-Labels wenn V07PAK nicht verfügbar ist. Die Funktionalität ist identisch, nur die Label-Optik unterscheidet sich minimal.
