Abo Einmalprodukte: Phase 4 - Ausfuehrung, Purge & User-Retry

- UserMakeOrder: bestaetigte Einmal-Artikel in den Yard, is_abo_addon
  auf ShoppingOrderItem; amount bleibt reiner Abo-Betrag (Reihenfolge)
- AboOneTimeService::purgeAfterExecution: loescht alle Einmal-Artikel
  und rechnet Comp-Produkte neu - nur im Erfolgszweig (Cron + Retry)
- User-Retry in Sales Center und Portal mit Berechtigungspruefung,
  gemeinsames Confirm-Modal; Admin-Retry unveraendert
- Tests: AboMakeOrderOneTimeTest, AboUserRetryTest; Plan-Doku Phase 4

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin 2026-06-08 15:32:27 +00:00
parent 8288ea59ac
commit ee04146217
14 changed files with 536 additions and 19 deletions

View file

@ -177,8 +177,13 @@ class UserMakeOrder
}
// hier wird die Bestellung erstellt inkl aktueller Preise
// (setzt user_abos.amount auf den REINEN Abo-Betrag)
AboOrderCart::makeOrderYard($this->userAbo);
// Verbindlich bestätigte Einmal-Artikel zusätzlich in den Yard laden
// (verändert user_abos.amount NICHT; Versand/Gewicht werden kombiniert berechnet).
AboOrderCart::addOneTimeItemsToYard($this->userAbo);
$yard = Yard::instance(AboOrderCart::INSTANCE);
// Debug: Logge welche Produkte im Cart sind
@ -268,6 +273,7 @@ class UserMakeOrder
'row_id' => $item->rowId,
'product_id' => $item->id,
'comp' => $item->options->comp,
'is_abo_addon' => (bool) ($item->options->abo_addon ?? false),
'qty' => $item->qty,
'price' => $item->price,
'price_net' => $price_net,