$purchaseData */ public function startCheckout(Tenant $tenant, int $userId, array $purchaseData): Purchase { return $this->starter->start($tenant, $userId, $purchaseData); } public function completePurchase(Purchase $purchase): Purchase { return $this->completer->complete($purchase); } public function submitForReview(Purchase $purchase): Purchase { return $this->completer->submitForReview($purchase); } /** @param array $customerData */ public function updateCustomerData(Purchase $purchase, array $customerData): Purchase { return $this->editor->updateCustomer($purchase, $customerData); } public function updateItemQuantity( Purchase $purchase, PurchaseItem $purchaseItem, int $quantity, ): Purchase { return $this->editor->updateItemQuantity($purchase, $purchaseItem, $quantity); } public function prepareItemEditing(Purchase $purchase): Purchase { return $this->editor->prepareItemEditing($purchase); } public function confirmPurchase(Purchase $purchase): void { $this->completer->confirm($purchase); } public function confirmPaidPurchase(Purchase $purchase): Purchase { return DB::transaction(function () use ($purchase): Purchase { $this->completer->confirm($purchase); $purchase->markAsPaid(); return $purchase->refresh()->load(['items.imageAttachment']); }); } public function cancelPurchase(Purchase $purchase): Purchase { return $this->releaser->cancel($purchase); } public function cancelPurchaseWithoutRestoringCart(Purchase $purchase): Purchase { return $this->releaser->cancelWithoutRestoringCart($purchase); } public function expirePurchase(Purchase $purchase): Purchase { return $this->releaser->expire($purchase); } public function expireOverduePurchases(): int { return $this->releaser->expireOverdue(); } }