Class: OrderTransaction

Inherits:
ApplicationRecord show all
Includes:
Models::Auditable
Defined in:
app/models/order_transaction.rb

Overview

== Schema Information

Table name: order_transactions
Database name: primary

id :integer not null, primary key
action :string(255)
amount :decimal(12, 2)
message :string(255)
params :text
reference :string(255)
success :boolean
test :boolean
created_at :datetime
updated_at :datetime
authorization_id :integer
creator_id :integer
payment_id :integer
updater_id :integer

Indexes

action_payment_id (action,payment_id)
index_order_transactions_on_payment_id (payment_id)

Constant Summary

Constants included from Models::Auditable

Models::Auditable::ALWAYS_IGNORED

Constants included from Models::Schedulable

Models::Schedulable::SIMPLE_FORM_OPTIONS

Belongs to collapse

Methods included from Models::Auditable

#creator, #updater

Class Method Summary collapse

Methods included from Models::Auditable

#all_skipped_columns, #audit_reference_data, #should_not_save_version, #stamp_record

Methods inherited from ApplicationRecord

ransackable_associations, ransackable_attributes, ransackable_scopes, ransortable_attributes, #to_relation

Methods included from Models::Schedulable

config

Methods included from Models::AfterCommittable

#after_commit

Methods included from Models::EventPublishable

#publish_event

Class Method Details

.record_paypal(action:, paypal_response:, amount_cents: nil) ⇒ OrderTransaction

Parameters:

  • action (String)
  • paypal_response (Hash)
  • amount_cents (Integer, nil) (defaults to: nil)

Returns:



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'app/models/order_transaction.rb', line 97

def record_paypal(action:, paypal_response:, amount_cents: nil)
  result = OrderTransaction.new
  result.amount = amount_cents
  result.action = action

  http_success = paypal_response['_http_success']
  status = paypal_response['status']

  success_statuses = case action
                     when 'authorization', 'reauthorization'
                       %w[CREATED PENDING]
                     when 'capture'
                       %w[COMPLETED PENDING]
                     when 'refund'
                       %w[COMPLETED PENDING]
                     when 'void'
                       [nil, '']
                     else
                       %w[COMPLETED CREATED PENDING]
                     end

  result.success = http_success && (status.blank? || status.in?(success_statuses))
  result.reference = paypal_response['id']
  result.message = status || (http_success ? 'ok' : "HTTP #{paypal_response['_http_status']}")
  result.params = paypal_response.except('_http_status', '_http_success', '_raw_body')
  result.test = !Rails.env.production?
  result
end

.record_paypal_error(action:, error:, amount_cents: nil) ⇒ OrderTransaction

Parameters:

  • action (String)
  • error (StandardError)
  • amount_cents (Integer, nil) (defaults to: nil)

Returns:



130
131
132
133
134
135
136
137
138
139
140
# File 'app/models/order_transaction.rb', line 130

def record_paypal_error(action:, error:, amount_cents: nil)
  result = OrderTransaction.new
  result.amount = amount_cents
  result.action = action
  result.success = false
  result.reference = nil
  result.message = error.respond_to?(:message) ? error.message : error.to_s
  result.params = {}
  result.test = !Rails.env.production?
  result
end

.record_stripe(action:, stripe_object:, amount_cents: nil) ⇒ OrderTransaction

Parameters:

  • action (String)
  • stripe_object (Stripe::PaymentIntent, Stripe::Charge, Stripe::Refund)
  • amount_cents (Integer, nil) (defaults to: nil)

Returns:



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
# File 'app/models/order_transaction.rb', line 42

def record_stripe(action:, stripe_object:, amount_cents: nil)
  result = OrderTransaction.new
  result.amount = amount_cents
  result.action = action

  id = stripe_object.try(:id).to_s

  if id.start_with?('pi_') || stripe_object.is_a?(::Stripe::PaymentIntent)
    success_statuses = %w[requires_capture succeeded]
    success_statuses << 'canceled' if action == 'void'
    result.success = stripe_object.status.in?(success_statuses)
    result.reference = stripe_object.id
    result.message = stripe_object.status
    result.params = stripe_object.try(:to_hash) || {}
    result.test = stripe_object.try(:livemode) == false
  elsif id.start_with?('ch_') || stripe_object.is_a?(::Stripe::Charge) ||
        id.start_with?('re_') || stripe_object.is_a?(::Stripe::Refund)
    success_statuses = %w[succeeded pending]
    success_statuses << 'refunded' if action == 'void' && stripe_object.is_a?(::Stripe::Charge)
    result.success = stripe_object.status.in?(success_statuses)
    result.reference = stripe_object.id
    result.message = stripe_object.status
    result.params = stripe_object.try(:to_hash) || {}
    result.test = stripe_object.respond_to?(:livemode) ? stripe_object.livemode == false : !Rails.env.production?
  else
    result.success = true
    result.reference = stripe_object.try(:id)
    result.message = stripe_object.try(:status) || 'ok'
    result.params = stripe_object.try(:to_hash) || {}
    result.test = !Rails.env.production?
  end

  result
end

.record_stripe_error(action:, error:, amount_cents: nil) ⇒ OrderTransaction

Parameters:

  • action (String)
  • error (Stripe::StripeError)
  • amount_cents (Integer, nil) (defaults to: nil)

Returns:



81
82
83
84
85
86
87
88
89
90
91
# File 'app/models/order_transaction.rb', line 81

def record_stripe_error(action:, error:, amount_cents: nil)
  result = OrderTransaction.new
  result.amount = amount_cents
  result.action = action
  result.success = false
  result.reference = nil
  result.message = error.message
  result.params = error.respond_to?(:json_body) ? (error.json_body || {}) : {}
  result.test = !Rails.env.production?
  result
end

Instance Method Details

#paymentPayment?

Returns:



31
# File 'app/models/order_transaction.rb', line 31

belongs_to :payment, optional: true