1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| class Transaction < ApplicationRecord include AASM
aasm column: 'status', no_direct_assignment: true, requires_lock: true do state :waiting_for_payment, initial: true state :paid state :failed state :canceled state :expired state :refunded
after_all_transitions :generate_status_transition_log!
event :mark_as_paid do transitions from: :waiting_for_payment, to: :paid end
event :mark_as_paid do transitions from: :waiting_for_payment, to: :failed end
event :mark_as_canceled do transitions from: :waiting_for_payment, to: :canceled end
event :mark_as_expired do transitions from: :waiting_for_payment, to: :expired end
event :mark_as_refunded, after: :check_all_transactions_refunded! do transitions from: :paid, to: :refunded end end
after_initialize :generate_trade_number after_create :generate_status_change_log! after_update :update_order_status!
private def generate_status_change_log! status_logs.create!(status: aasm.current_state) end
def generate_status_transition_log! status_logs.create!(status: aasm.to_state) end
def update_order_status! return if payment_info.nil?
if self.paid? self.order.transactions.waiting_for_payment.each do |transaction| transaction.mark_as_canceled! if transaction.may_mark_as_canceled? end
self.order.mark_as_paid! if self.order.may_mark_as_paid? end end
def check_all_transactions_refunded! if !Transaction.where(order_id: self.order_id, status: %i(waiting_for_payment paid)).exists? self.order.mark_as_refunded! end end end
|