# 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