$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 updateItem( Purchase $purchase, PurchaseItem $purchaseItem, ?int $quantity, ?int $variantId, bool $updateVariant, ): Purchase { return $this->editor->updateItem( $purchase, $purchaseItem, $quantity, $variantId, $updateVariant, ); } 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(); } public function syncReservationExpiration(Purchase $purchase): void { $this->reservations->syncPurchaseExpiration($purchase); } }