Files
MatchLiveTv/backend/app/controllers/public/club_billing_controller.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

94 lines
2.9 KiB
Ruby

module Public
class ClubBillingController < WebBaseController
before_action :require_login!
before_action :set_club
before_action :require_club_owner_for_club!
def profile
end
def update_profile
@club.assign_attributes(billing_profile_params)
if @club.save(context: :billing_profile)
if premium_checkout_return_params.present? && @club.billing_profile_complete?
redirect_to public_club_checkout_path(
@club,
plan: premium_checkout_return_params[:plan],
interval: premium_checkout_return_params[:interval]
), notice: "Dati salvati. Procedi con il pagamento."
else
redirect_to public_club_billing_path(@club), notice: "Dati di fatturazione aggiornati."
end
else
flash.now[:alert] = @club.errors.full_messages.join(", ")
render :profile, status: :unprocessable_entity
end
end
def cancel_subscription
unless MatchLiveTv.stripe_enabled?
redirect_to public_club_billing_path(@club), alert: "Stripe non configurato."
return
end
Billing::Stripe::CancelSubscription.call(club: @club)
sub = @club.subscription.reload
date = sub.current_period_end ? helpers.l_local(sub.current_period_end.to_date) : "fine periodo"
redirect_to public_club_billing_path(@club),
notice: "Abbonamento disdetto. Resta attivo fino al #{date}; da quel giorno passerai al piano Free."
rescue ArgumentError, RuntimeError => e
redirect_to public_club_billing_path(@club), alert: e.message
rescue ::Stripe::StripeError => e
redirect_to public_club_billing_path(@club), alert: "Errore Stripe: #{e.message}"
end
def download_invoice
invoice = @club.billing_invoices.find(params[:invoice_id])
unless invoice.pdf.attached?
redirect_to public_club_billing_path(@club), alert: "PDF fattura non disponibile."
return
end
redirect_to rails_blob_path(invoice.pdf, disposition: "attachment"), allow_other_host: true
end
private
def set_club
@club = current_user.owned_clubs.find(params[:id])
end
def require_club_owner_for_club!
require_club_owner!(@club)
end
def premium_checkout_return_params
plan = params[:plan].presence_in(%w[premium_light premium_full])
return nil if plan.blank?
{
plan: plan,
interval: params[:interval].presence || Billing::Stripe::PriceCatalog::DEFAULT_INTERVAL
}
end
def billing_profile_params
params.require(:club).permit(
:billing_entity_type,
:billing_legal_name,
:billing_vat_number,
:billing_fiscal_code,
:billing_email,
:billing_phone,
:billing_address_line,
:billing_city,
:billing_province,
:billing_postal_code,
:billing_country,
:billing_recipient_code,
:billing_pec
)
end
end
end