class NmiDirectPost::Transaction
Constants
- SAFE_PARAMS
Attributes
auth_code[R]
avs_response[R]
condition[R]
cvv_response[R]
dup_seconds[R]
order_id[R]
transaction_id[R]
type[R]
Public Class Methods
find_by_transaction_id(transaction_id, username=nil, password=nil)
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 56 def self.find_by_transaction_id(transaction_id, username=nil, password=nil) raise StandardError, "TransactionID cannot be blank" if transaction_id.blank? NmiDirectPost.logger.debug { "Looking up NMI transaction by transaction_id(#{transaction_id})" } begin new(:transaction_id => transaction_id, username: username, password: password) rescue TransactionNotFoundError return nil end end
new(attributes)
click to toggle source
Calls superclass method
NmiDirectPost::Base::new
# File lib/nmi_direct_post/transaction.rb, line 27 def initialize(attributes) super @username = attributes[:username] if attributes[:username] @password = attributes[:password] if attributes[:password] @type, @amount = attributes[:type].to_s, attributes[:amount].to_f @transaction_id = attributes[:transaction_id].to_i if attributes[:transaction_id] @customer_vault_id = attributes[:customer_vault_id].to_i if attributes[:customer_vault_id] reload if (finding_by_transaction_id? && self.valid?) @type, @amount = attributes[:type].to_s, attributes[:amount].to_f if ['void', 'capture'].include?(attributes[:type].to_s) end
Public Instance Methods
cleared?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 70 def cleared? "complete" == condition end
customer_vault()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 87 def customer_vault @customer_vault ||= CustomerVault.find_by_customer_vault_id(@customer_vault_id, @username, @password) unless @customer_vault_id.blank? end
declined?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 78 def declined? 2 == response end
failed?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 74 def failed? "failed" == condition end
pending?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 66 def pending? 'pendingsettlement' == condition end
reload()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 91 def reload get(transaction_params) if finding_by_transaction_id? self end
save()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 38 def save return false if invalid? if condition.blank? if 'void' == type reload @type = 'void' end end _safe_params = safe_params logger.info { "Sending Direct Post Transaction to NMI: #{_safe_params}" } post([_safe_params, transaction_params].join('&')) valid?.tap { |_| reload if _ } end
save!()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 52 def save! save || raise(TransactionNotSavedError) end
void!()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 82 def void! @type='void' save end
Private Instance Methods
customer_vault_is_checking?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 131 def customer_vault_is_checking? !customer_vault.blank? && customer_vault.checking? end
finding_by_transaction_id?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 135 def finding_by_transaction_id? !transaction_id.blank? end
get(query)
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 105 def get(query) hash = self.class.get(query)["transaction"] hash = hash.keep_if { |v| v['transaction_id'].to_s == self.transaction_id.to_s }.first if hash.is_a?(Array) raise TransactionNotFoundError, "No transaction found for TransactionID #{@transaction_id}" if hash.nil? @auth_code = hash["authorization_code"] @customer_vault_id = hash["customerid"].to_i @avs_response = hash["avs_response"] @condition = hash["condition"] action = hash["action"] action = action.last unless action.is_a?(Hash) @amount = action["amount"].to_f @type = action["action_type"] @response = action["success"].to_i if action.key?("success") @response_code = action["response_code"].to_i if action.key?("response_code") @response_text = action["response_text"] end
is_auth?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 147 def is_auth? !finding_by_transaction_id? && ('auth' == type.to_s) end
is_sale?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 143 def is_sale? !finding_by_transaction_id? && (['sale', ''].include?(type.to_s)) end
is_validate?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 139 def is_validate? !finding_by_transaction_id? && ('validate' == type.to_s) end
is_void?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 151 def is_void? !customer_vault_is_checking? && ('void' == type.to_s) end
persisted?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 166 def persisted? self.errors.add(:type, "Void is only a valid action for a transaction that has already been sent to NMI") unless finding_by_transaction_id? end
post(query)
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 122 def post(query) response = self.class.post(query) @response = response["response"].to_i if response.key?("response") @response_code = response["response_code"].to_i if response.key?("response_code") @response_text, @avs_response, @cvv_response = response["responsetext"], response["avsresponse"], response["cvvresponse"] @dup_seconds, @order_id, @auth_code = response["dup_seconds"], response["orderid"], response["authcode"] @transaction_id = response["transactionid"] end
safe_params()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 97 def safe_params generate_query_string(SAFE_PARAMS) end
save_successful?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 155 def save_successful? return if (success? || declined?) self.errors.add(:response, response.to_s) self.errors.add(:response_code, response_code.to_s) self.errors.add(:response_text, response_text) end
transaction_params()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 101 def transaction_params generate_query_string([AUTH_PARAMS, :transaction_id].flatten) end
voidable_transaction?()
click to toggle source
# File lib/nmi_direct_post/transaction.rb, line 162 def voidable_transaction? self.errors.add(:type, "Void is only a valid action for a pending or unsettled authorization, or an unsettled sale") if (finding_by_transaction_id? && !['pending', 'pendingsettlement'].include?(condition)) unless condition.blank? end