From 9ed49bfc806b3ae8d693e68d71c4cea6761b24d3 Mon Sep 17 00:00:00 2001 From: Tanmay Deep Sharma Date: Tue, 9 Jun 2026 18:43:45 +0530 Subject: [PATCH] feat(billing): allow trialing subscriptions to switch currency --- .../services/enterprise/billing/switch_currency_service.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/enterprise/app/services/enterprise/billing/switch_currency_service.rb b/enterprise/app/services/enterprise/billing/switch_currency_service.rb index fa7ca38e1..b2f7464ed 100644 --- a/enterprise/app/services/enterprise/billing/switch_currency_service.rb +++ b/enterprise/app/services/enterprise/billing/switch_currency_service.rb @@ -9,6 +9,9 @@ class Enterprise::Billing::SwitchCurrencyService # Stripe statuses that are done and can't reactivate — ignored when checking switch eligibility. TERMINAL_STATUSES = %w[canceled incomplete_expired].freeze + # Healthy statuses that may switch currency; trialing covers a sub left trialing by a prior paid switch. + SWITCHABLE_STATUSES = %w[active trialing].freeze + pattr_initialize [:account!, :currency!] # Only the simple happy path is allowed: exactly one active subscription (paid or default plan), @@ -43,10 +46,10 @@ class Enterprise::Billing::SwitchCurrencyService raise Error, I18n.t('errors.billing.stripe_customer_not_configured') if stripe_customer_id.blank? end - # Exactly one live subscription, active (paid or default plan). Anything else (pending or extra) is rejected. + # Exactly one live subscription in a switchable state (paid or default plan). Anything else (pending or extra) is rejected. def eligible_active_subscription! subscription = live_subscriptions.first - eligible = live_subscriptions.one? && subscription.status == 'active' + eligible = live_subscriptions.one? && SWITCHABLE_STATUSES.include?(subscription.status) raise Error, I18n.t('errors.billing.switch_requires_active_subscription') unless eligible subscription