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