10.April 2026

This commit is contained in:
Kevin Adametz 2026-04-10 17:15:27 +02:00
parent a00c42e770
commit f58c709945
208 changed files with 19280 additions and 2914 deletions

127
dev/2026-03-12/tasks.md Normal file
View file

@ -0,0 +1,127 @@
# 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) |