# Korrekturen & Verbesserungen - 12.03.2026

---

## 1. Bug-Fix: Falsche Zahlungsbeträge bei Abo-Bestellungen

**Datei:** `app/Cron/UserMakeOrder.php` (Zeile 71)

**Problem:** Bei der automatischen Abo-Zahlungsausführung wurde `subtotal_ws` (Nettobetrag + Versand) statt `total_shipping` (Bruttobetrag + Versand) als Zahlungsbetrag an Payone gesendet. Dadurch wurde bei Kunden mit Umsatzsteuer nur der Nettobetrag eingezogen - die MwSt fehlte.

**Fix:**
```php
// Vorher (falsch):
$amount = $this->shopping_order->subtotal_ws * 100;

// Nachher (korrekt):
$amount = $this->shopping_order->total_shipping * 100;
```

**Auswirkung:** Betrifft alle Abo-Bestellungen seit Go-Live, bei denen Umsatzsteuer anfällt. Bei Nettobeträgen (Drittländer, USt-ID hinterlegt) war der Betrag zufällig korrekt.

---

## 2. SysAdmin Tool: Abo-Bestellungen Zahlungsdifferenzen

**Neue Dateien:**
- `app/Services/SyS/AboOrdersOverview.php`
- `resources/views/sys/tools/abo-orders-overview.blade.php`

**Geänderte Dateien:**
- `app/Http/Controllers/SyS/SysController.php` (neuer case `abo_orders_overview`)
- `resources/views/sys/index.blade.php` (neuer Menüpunkt)

**Beschreibung:** Übersichtstool unter `sysadmin/tool/abo_orders_overview` zur Nachverfolgung der durch den Bug betroffenen Abo-Bestellungen. Zeigt pro Bestellung:
- Netto+Versand (`subtotal_ws`) = was eingezogen wurde
- MwSt (`tax`) = was gefehlt hat
- Brutto+Versand (`total_shipping`) = was hätte eingezogen werden sollen
- Differenz = fehlender Betrag (rot markiert)

**Features:**
- Filter: Alle / Berater / Kunden (Button-Gruppe)
- Summary-Karten: Gesamtanzahl, betroffene Bestellungen, Gesamtfehlbetrag
- Betroffene Zeilen rot hervorgehoben

---

## 3. Bug-Fix: Abo-Einstellungen - Vergleichsoperator

**Datei:** `app/Repositories/AboRepository.php` (Zeile 66)

**Problem:** Bei der Reaktivierung eines pausierten Abos wurde statt eines Vergleichs (`==`) eine Zuweisung (`=`) verwendet. Dadurch wurde der Status immer auf 6 gesetzt, bevor er auf 2 geändert wurde.

**Fix:**
```php
// Vorher (falsch - Zuweisung):
if ($this->model->status = 6)

// Nachher (korrekt - Vergleich):
if ($this->model->status == 6)
```

---

## 4. Abo-Liefertag: Validierung und Sperren

**Datei:** `app/Repositories/AboRepository.php`

**Problem:** Beim Ändern des Abo-Liefertags konnte ein Datum gewählt werden, das nur wenige Tage entfernt liegt. Da Pakete vorgepackt werden, muss ein Mindestabstand eingehalten werden.

**Lösung:** Zwei Klassenkonstanten steuern die Sperren:

```php
private const LOCK_DAYS_CHANGE = 10;       // Liefertag-Änderung
private const LOCK_DAYS_PAUSE_CANCEL = 3;  // Pausieren/Kündigen
```

### Regeln:

| Aktion | Sperre | Beschreibung |
|--------|--------|--------------|
| Liefertag ändern | < 10 Tage vor aktueller Ausführung | `error_change_locked` - Pakete werden vorgepackt |
| Neuen Liefertag wählen | Neues Datum < 10 Tage entfernt | `error_abo_interval_too_soon` - Berechnung via `setNextDate()` |
| Abo pausieren | < 3 Tage vor Ausführung | `error_pause_locked` |
| Abo kündigen | < 3 Tage vor Ausführung | `error_cancel_locked` |

### Validierungslogik:
1. Aktuelles `next_date` prüfen: Wenn < 10 Tage entfernt → komplett gesperrt
2. Neues Datum berechnen via `AboHelper::setNextDate()` und prüfen ob >= 10 Tage entfernt
3. Nach erfolgreichem Speichern: Orange Alert mit exaktem nächsten Ausführungsdatum

### Beispiele (heute = 12. März):
| Von | Auf | Berechnet | Tage | Ergebnis |
|-----|-----|-----------|------|----------|
| 5. | 20. | 20. März | 8 | blockiert |
| 5. | 25. | 25. März | 13 | erlaubt |
| 20. | 10. | 10. April | ~29 | erlaubt (nächster Monat) |

---

## 5. Warnungen bei Abo-Erstellung (Bestellformular)

**Geänderte Dateien:**
- `app/Services/HTMLHelper.php` (`getAboDeliveryOptions`)
- `resources/views/user/order/yard_view_form.blade.php`
- `resources/views/portal/abo/_create_check.blade.php`

**Beschreibung:** Beim Erstellen eines neuen Abos zeigt das Liefertag-Dropdown eine dynamische Warnung (orange) an, wenn die erste Abo-Ausführung weniger als 20 Tage entfernt ist. Die Warnung aktualisiert sich beim Wechsel des Liefertags.

**Umsetzung:**
- `HTMLHelper::getAboDeliveryOptions()` gibt pro Option `data-days` und `data-date` Attribute aus
- JavaScript im Formular prüft beim Ändern der Auswahl die Tage und zeigt/versteckt die Warnung

---

## 6. Neue Übersetzungen (DE/EN/ES)

**Dateien:** `resources/lang/{de,en,es}/abo.php`

| Key | Beschreibung |
|-----|-------------|
| `warning_next_date_soon` | Warnung: Nächste Ausführung < 20 Tage (Backend-Flash) |
| `warning_next_date_soon_select` | Warnung: Nächste Ausführung < 20 Tage (Frontend-Select) |
| `warning_next_date_info` | Info nach Speichern: Nächste Ausführung in X Tagen am Datum |
| `error_change_locked` | Fehler: Änderung gesperrt (< 10 Tage) |
| `error_abo_interval_too_soon` | Fehler: Neuer Liefertag zu nah (< 10 Tage) |
| `error_cancel_locked` | Fehler: Kündigung gesperrt (< 3 Tage) |
| `error_pause_locked` | Fehler: Pausierung gesperrt (< 3 Tage) |
