Files
MatchLiveTv/backend/app/services/billing/stripe/webhook_handler.rb
Emiliano Frascaro a5e781729c Billing: fatture manuali, profilo obbligatorio e piani Stripe mensile/annuale.
Rimuove link al portale Stripe in area cliente, aggiunge flusso admin per PDF
fattura e email, blocca checkout senza dati di fatturazione, allinea prezzi
a €4,90/€39,90 e €9,90/€69,90, locale italiano e documentazione deploy.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-02 17:10:12 +02:00

64 lines
1.7 KiB
Ruby

module Billing
module Stripe
class WebhookHandler
def self.call(event)
new(event).call
end
def initialize(event)
@event = event
end
def call
case @event.type
when "checkout.session.completed"
CheckoutSync.from_session(@event.data.object)
when "customer.subscription.updated", "customer.subscription.created"
CheckoutSync.from_subscription(@event.data.object)
when "customer.subscription.deleted"
downgrade_to_free(@event.data.object)
when "invoice.payment_failed"
mark_past_due(@event.data.object)
when "invoice.paid"
record_payment(@event.data.object)
end
end
private
def downgrade_to_free(stripe_sub)
club = Club.joins(:subscription)
.find_by(subscriptions: { stripe_subscription_id: stripe_sub.id })
return unless club
Billing::AssignPlan.call(
club: club,
plan_slug: "free",
status: "active",
stripe_attrs: {
stripe_subscription_id: nil,
current_period_start: nil,
current_period_end: nil,
cancel_at_period_end: false
}
)
end
def record_payment(invoice)
Billing::Stripe::RecordPayment.call(stripe_invoice: invoice)
end
def mark_past_due(invoice)
return if invoice.subscription.blank?
club = Club.joins(:subscription)
.find_by(subscriptions: { stripe_subscription_id: invoice.subscription })
return unless club&.subscription
club.subscription.update!(status: "past_due")
end
end
end
end