Files
aperonight/app/controllers/booking/payments_controller.rb
2025-09-06 01:44:48 +02:00

92 lines
3.4 KiB
Ruby

# Handle payment callbacks for booking workflow
class Booking::PaymentsController < ApplicationController
before_action :authenticate_user!
# Handle successful payment callback
def success
session_id = params[:session_id]
# Check if Stripe is properly configured
stripe_configured = Rails.application.config.stripe[:secret_key].present?
Rails.logger.debug "Payment success - Stripe configured: #{stripe_configured}"
unless stripe_configured
redirect_to root_path, alert: "Le système de paiement n'est pas correctement configuré. Veuillez contacter l'administrateur."
return
end
begin
stripe_session = Stripe::Checkout::Session.retrieve(session_id)
if stripe_session.payment_status == "paid"
# Get order_id from session metadata
order_id = stripe_session.metadata["order_id"]
unless order_id.present?
redirect_to dashboard_path, alert: "Informations de commande manquantes"
return
end
# Find and update the order
@order = current_user.orders.includes(tickets: :ticket_type).find(order_id)
@order.mark_as_paid!
# Schedule Stripe invoice generation in background
begin
StripeInvoiceGenerationJob.perform_later(@order.id)
Rails.logger.info "Scheduled Stripe invoice generation for order #{@order.id}"
rescue => e
Rails.logger.error "Failed to schedule invoice generation for order #{@order.id}: #{e.message}"
end
# Send confirmation emails
@order.tickets.each do |ticket|
begin
TicketMailer.purchase_confirmation(ticket).deliver_now
rescue => e
Rails.logger.error "Failed to send confirmation email for ticket #{ticket.id}: #{e.message}"
end
end
# Clear session data
session.delete(:pending_cart)
session.delete(:ticket_names)
session.delete(:draft_order_id)
render "payment_success"
else
redirect_to dashboard_path, alert: "Le paiement n'a pas été complété avec succès"
end
rescue Stripe::StripeError => e
error_message = e.message.present? ? e.message : "Erreur Stripe inconnue"
redirect_to dashboard_path, alert: "Erreur lors du traitement de votre confirmation de paiement : #{error_message}"
rescue => e
error_message = e.message.present? ? e.message : "Erreur inconnue"
Rails.logger.error "Payment success error: #{e.class} - #{error_message}"
redirect_to dashboard_path, alert: "Une erreur inattendue s'est produite : #{error_message}"
end
end
# Handle payment cancellation callback
def cancel
order_id = params[:order_id] || session[:draft_order_id]
if order_id.present?
order = current_user.orders.find_by(id: order_id, status: "draft")
if order&.can_retry_payment?
# Extract year and month from event start_time for SEO URL
year = order.event.start_time.year
month = format("%02d", order.event.start_time.month)
redirect_to event_checkout_path(year: year, month: month, slug: order.event.slug),
alert: "Le paiement a été annulé. Vous pouvez réessayer."
else
session.delete(:draft_order_id)
redirect_to root_path, alert: "Le paiement a été annulé et votre commande a expiré."
end
else
redirect_to root_path, alert: "Le paiement a été annulé"
end
end
end