61 lines
2.0 KiB
Ruby
61 lines
2.0 KiB
Ruby
class QrPaymentService
|
|
attr_reader :sale_id, :current_login_employee, :sale, :booking, :processed_sale_payment
|
|
|
|
def initialize(sale_id, current_login_employee)
|
|
@sale_id = sale_id
|
|
@current_login_employee = current_login_employee
|
|
end
|
|
|
|
def process
|
|
return { status: false, message: "Sale ID is required." } unless sale_id.present?
|
|
|
|
SalePayment.transaction do
|
|
find_sale_and_booking
|
|
return { status: false, message: "There is no sale for '#{sale_id}'!" } unless sale
|
|
return { status: false, message: "Already paid for '#{sale_id}'!" } unless sale.sale_status == "new"
|
|
|
|
status, payment_attempt = process_the_payment
|
|
unless status
|
|
error_message = payment_attempt&.errors&.full_messages&.join(', ') || "Payment processing failed."
|
|
return { status: false, message: error_message }
|
|
end
|
|
|
|
process_orders_and_broadcast
|
|
return { status: true, message: "Payment successful." }
|
|
end
|
|
rescue ActiveRecord::RecordNotFound
|
|
{ status: false, message: "Sale not found for ID '#{sale_id}'." }
|
|
rescue StandardError => e
|
|
Rails.logger.error "QrPaymentService Error: #{e.message}\n#{e.backtrace.join("\n")}"
|
|
{ status: false, message: "An unexpected error occurred: #{e.message}" }
|
|
end
|
|
|
|
private
|
|
|
|
def find_sale_and_booking
|
|
@sale = Sale.find_by_sale_id(sale_id) # Consider find_by_sale_id! if you want RecordNotFound earlier
|
|
@booking = @sale&.booking
|
|
end
|
|
|
|
def process_the_payment
|
|
sale_payment_creator = SalePayment.new
|
|
status, payment = sale_payment_creator.process_payment(
|
|
sale,
|
|
current_login_employee,
|
|
sale.grand_total,
|
|
"MMQR".parameterize
|
|
)
|
|
[status, payment]
|
|
end
|
|
|
|
def process_orders_and_broadcast
|
|
booking.orders.each do |order|
|
|
oqs = OrderQueueStation.new
|
|
oqs.pay_process_order_queue(order.order_id, booking.dining_facility_id)
|
|
|
|
assign_order = AssignedOrderItem.assigned_order_item_by_job(order.order_id)
|
|
ActionCable.server.broadcast "order_queue_station_channel", order: assign_order
|
|
end
|
|
end
|
|
end
|