Billing upgrade/downgrade, inviti in app e diretta YouTube da mobile.
Upgrade Stripe con addebito immediato; downgrade programmato a fine periodo. UX billing più sobria con box info; icone piani. API inviti e OAuth YouTube per staff trasmissione; deep link join; scelta partita programmata o nuova. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
module Public
|
||||
module BillingHelper
|
||||
def plan_billing_action(current_slug:, target_plan:, stripe_subscription_active:, current_interval: nil)
|
||||
def plan_billing_action(current_slug:, target_plan:, stripe_subscription_active:, current_interval: nil, subscription: nil)
|
||||
if target_plan.slug == "free"
|
||||
return { kind: :contact, label: "Contatta il supporto per downgrade." } unless current_slug == "free"
|
||||
return { kind: :current, label: "Piano attuale" } if current_slug == "free"
|
||||
return { kind: :none } if stripe_subscription_active
|
||||
|
||||
return { kind: :current, label: "Piano attuale" }
|
||||
return { kind: :contact, label: "Per passare al piano Free, contatta il supporto." }
|
||||
end
|
||||
|
||||
unless MatchLiveTv.stripe_enabled?
|
||||
@@ -16,20 +17,34 @@ module Public
|
||||
|
||||
active_interval = current_interval.presence || Billing::Stripe::PriceCatalog::DEFAULT_INTERVAL
|
||||
|
||||
if current_slug == target_plan.slug && stripe_subscription_active
|
||||
if current_slug == target_plan.slug && stripe_subscription_active && !subscription&.plan_change_pending?
|
||||
other_intervals = intervals - [active_interval]
|
||||
if other_intervals.empty?
|
||||
label = "Piano attuale — #{Billing::Stripe::PriceCatalog.label(plan_slug: target_plan.slug, interval: active_interval)}"
|
||||
return { kind: :current, label: label }
|
||||
end
|
||||
|
||||
return { kind: :interval_switch, plan: target_plan, intervals: other_intervals, current_interval: active_interval }
|
||||
return {
|
||||
kind: :interval_switch,
|
||||
plan: target_plan,
|
||||
intervals: other_intervals,
|
||||
current_interval: active_interval,
|
||||
current_slug: current_slug,
|
||||
subscription: subscription
|
||||
}
|
||||
end
|
||||
|
||||
if current_slug == "free" || !stripe_subscription_active
|
||||
{ kind: :checkout_options, plan: target_plan, intervals: intervals }
|
||||
{ kind: :checkout_options, plan: target_plan, intervals: intervals, subscription: subscription }
|
||||
else
|
||||
{ kind: :change_options, plan: target_plan, intervals: intervals }
|
||||
{
|
||||
kind: :change_options,
|
||||
plan: target_plan,
|
||||
intervals: intervals,
|
||||
current_slug: current_slug,
|
||||
current_interval: active_interval,
|
||||
subscription: subscription
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -37,14 +52,13 @@ module Public
|
||||
public_club_checkout_path(club, plan: plan.slug, interval: interval)
|
||||
end
|
||||
|
||||
def plan_interval_button_label(plan, interval, kind: :checkout)
|
||||
price = Billing::Stripe::PriceCatalog.label(plan_slug: plan.slug, interval: interval)
|
||||
case kind
|
||||
when :change, :interval_switch
|
||||
"Passa a #{plan.name} — #{price}"
|
||||
else
|
||||
"Attiva #{plan.name} — #{price}"
|
||||
end
|
||||
def plan_interval_button_label(plan, interval, kind: :checkout, **)
|
||||
btn_kind = kind == :checkout_options ? :checkout : :change
|
||||
Billing::Stripe::PlanChangeMessages.button_label(plan: plan, interval: interval, kind: btn_kind)
|
||||
end
|
||||
|
||||
def billing_plan_change_info_lines(subscription: nil)
|
||||
Billing::Stripe::PlanChangeMessages.billing_info_lines(subscription: subscription)
|
||||
end
|
||||
|
||||
def stripe_subscription_active?(subscription)
|
||||
@@ -55,7 +69,7 @@ module Public
|
||||
Billing::Stripe::PriceCatalog.configured?(plan_slug: plan_slug, interval: interval)
|
||||
end
|
||||
|
||||
def plan_interval_button_class(interval)
|
||||
def plan_interval_button_class(interval, **)
|
||||
if interval.to_s == "yearly"
|
||||
"btn btn-primary plan-interval-btn plan-interval-btn--yearly"
|
||||
else
|
||||
@@ -77,5 +91,6 @@ module Public
|
||||
|
||||
"Mancano: #{missing.join(", ")}."
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user