# 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) |