5 KiB
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:
// 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.phpresources/views/sys/tools/abo-orders-overview.blade.php
Geänderte Dateien:
app/Http/Controllers/SyS/SysController.php(neuer caseabo_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:
// 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:
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:
- Aktuelles
next_dateprüfen: Wenn < 10 Tage entfernt → komplett gesperrt - Neues Datum berechnen via
AboHelper::setNextDate()und prüfen ob >= 10 Tage entfernt - 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.phpresources/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 Optiondata-daysunddata-dateAttribute 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) |