From b388c729ce8a9f74727fffd21effb87a10601ddd Mon Sep 17 00:00:00 2001 From: Julien Nahum Date: Thu, 27 Feb 2025 15:04:38 +0800 Subject: [PATCH] Refactor Stripe subscription line item management in WorkspaceUsersUpdated job - Improve handling of extra user line items in Stripe subscriptions - Add logic to remove line item when quantity is zero - Optimize line item creation and update process - Simplify environment check using app() helper method --- .../Jobs/Billing/WorkspaceUsersUpdated.php | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/api/app/Jobs/Billing/WorkspaceUsersUpdated.php b/api/app/Jobs/Billing/WorkspaceUsersUpdated.php index dc052c1c..cba639b7 100644 --- a/api/app/Jobs/Billing/WorkspaceUsersUpdated.php +++ b/api/app/Jobs/Billing/WorkspaceUsersUpdated.php @@ -38,7 +38,7 @@ class WorkspaceUsersUpdated implements ShouldQueue public function handle(): void { // If self-hosted, no need to update billing - if (!pricing_enabled() || \App::environment('testing')) { + if (!pricing_enabled() || app()->environment('testing')) { return; } @@ -80,16 +80,27 @@ class WorkspaceUsersUpdated implements ShouldQueue $subscriptionInterval = BillingHelper::getLineItemInterval($mainSubscriptionItem); $extraUserLineItem = $this->getLineItem($lineItems, 'extra_user'); - if ($extraUserLineItem) { - $stripe->subscriptionItems->update( - $extraUserLineItem->id, - ['quantity' => $quantity] - ); + + if ($quantity === 0) { + // If quantity is 0, remove the line item if it exists + if ($extraUserLineItem) { + $stripe->subscriptionItems->delete($extraUserLineItem->id); + } } else { - $stripeSub->items->create([ - 'price' => $extraUserPricing[$subscriptionInterval], - 'quantity' => $quantity, - ]); + // If quantity is greater than 0 + if ($extraUserLineItem) { + // Update existing line item + $stripe->subscriptionItems->update( + $extraUserLineItem->id, + ['quantity' => $quantity] + ); + } else { + // Create new line item + $stripeSub->items->create([ + 'price' => $extraUserPricing[$subscriptionInterval], + 'quantity' => $quantity, + ]); + } } }