$catalogItems */ public function attach(Collection $catalogItems, ?int $userId): void { $remaining = $this->purchaseLimits->remainingByCatalogItem($catalogItems, $userId); foreach ($catalogItems as $catalogItem) { $catalogItem->setAttribute( 'remaining_user_quota', $remaining->get($catalogItem->getKey()), ); } } public function maximumAddableQuantity(?int $availableStock, ?int $remainingUserQuota): ?int { if ($availableStock === null) { return $remainingUserQuota; } if ($remainingUserQuota === null) { return $availableStock; } return min($availableStock, $remainingUserQuota); } public function unavailableMessage(?int $availableStock, ?int $remainingUserQuota): ?string { if ($remainingUserQuota !== null && $remainingUserQuota <= 0) { return self::USER_QUOTA_REACHED_MESSAGE; } if ($availableStock !== null && $availableStock <= 0) { return self::OUT_OF_STOCK_MESSAGE; } return null; } }