module Billing module Stripe class CheckoutSession VALID_PLANS = %w[premium_light premium_full].freeze def initialize(club:, user:, plan_slug: "premium_light") @club = club @user = user @plan_slug = plan_slug.to_s end def url raise "Stripe non configurato" unless MatchLiveTv.stripe_enabled? raise "Piano non valido" unless VALID_PLANS.include?(@plan_slug) plan = Plan[@plan_slug] price_id = plan.stripe_price_id.presence || stripe_price_id_for(@plan_slug) raise "Price ID Stripe mancante per #{@plan_slug}" if price_id.blank? customer_id = ensure_customer_id! CustomerSync.call(club: @club, customer_id: customer_id) session_params = { mode: "subscription", customer: customer_id, line_items: [{ price: price_id, quantity: 1 }], success_url: success_url, cancel_url: cancel_url, metadata: { club_id: @club.id, user_id: @user.id, plan_slug: @plan_slug }, subscription_data: { metadata: { club_id: @club.id, plan_slug: @plan_slug } }, billing_address_collection: "required", customer_update: { address: "auto", name: "auto" }, allow_promotion_codes: true } existing_subscription_id = active_stripe_subscription_id if existing_subscription_id.present? # Cambio piano: conferma su pagina Stripe (mai dati carta sul nostro server). session_params[:subscription] = existing_subscription_id session_params.delete(:subscription_data) end session = ::Stripe::Checkout::Session.create(session_params) session.url end def portal_url raise "Stripe non configurato" unless MatchLiveTv.stripe_enabled? customer_id = ensure_customer_id! CustomerSync.call(club: @club, customer_id: customer_id) session = ::Stripe::BillingPortal::Session.create( customer: customer_id, return_url: billing_url ) session.url end private def stripe_price_id_for(slug) case slug when "premium_light" then MatchLiveTv.stripe_premium_light_price_id when "premium_full" then MatchLiveTv.stripe_premium_full_price_id end end def active_stripe_subscription_id sub = @club.subscription return nil unless sub&.stripe_subscription_id.present? && sub.active? sub.stripe_subscription_id end def ensure_customer_id! sub = @club.subscription || @club.build_subscription(plan: Plan["free"], status: "active") return sub.stripe_customer_id if sub.stripe_customer_id.present? customer = ::Stripe::Customer.create( email: @user.email, name: @club.billing_legal_name.presence || @club.name, metadata: { club_id: @club.id } ) sub.update!(stripe_customer_id: customer.id) customer.id end def success_url "#{billing_url}?checkout=success" end def cancel_url "#{billing_url}?checkout=canceled" end def billing_url "#{MatchLiveTv.app_public_url.chomp('/')}/clubs/#{@club.id}/billing" end end end end