class Trustev::Transaction

Constants

COUNTRY_CODES
CURRENCY_CODES
SERVICE_URL

Public Class Methods

new(transaction_number) click to toggle source
# File lib/trustev/transaction.rb, line 42
def initialize(transaction_number)
  raise Error.new('TransactionNumber is required.') if transaction_number.nil?
  @transaction_number = transaction_number
end

Public Instance Methods

create(transaction=nil) click to toggle source
# File lib/trustev/transaction.rb, line 47
def create(transaction=nil)
  raise Error.new('Transaction options are missing') if transaction.nil?
  validate(transaction)
  Trustev.send_request SERVICE_URL, build(transaction), 'POST'
end
set_bin(bin) click to toggle source
# File lib/trustev/transaction.rb, line 71
def set_bin(bin)
  raise Error.new('BIN is required') if bin.nil?
  body = {
    BINNumber: bin
  }
  Trustev.send_request "#{SERVICE_URL}/#{@transaction_number}/BIN", body, 'PUT'
end
set_status(status, reason, comment) click to toggle source
# File lib/trustev/transaction.rb, line 59
def set_status(status, reason, comment)
  raise Error.new('Invalid Status Code') if Trustev::STATUS_TYPES.key(status).nil?
  raise Error.new('Invalid Reason Code') if Trustev::REASON_TYPES.key(reason).nil?
  raise Error.new('Status comment cannot be blank') if comment.nil? || comment.empty?
  body = {
    Status: status,
    Reason: reason,
    Comment: comment
  }
  Trustev.send_request "#{SERVICE_URL}/#{@transaction_number}/Status", body, 'PUT'
end
update(transaction=nil) click to toggle source
# File lib/trustev/transaction.rb, line 53
def update(transaction=nil)
  raise Error.new('Transaction options are missing') if transaction.nil?
  validate(transaction)
  Trustev.send_request "#{SERVICE_URL}/#{@transaction_number}", build(transaction), 'PUT'
end

Private Instance Methods

address_to_object(address) click to toggle source
# File lib/trustev/transaction.rb, line 179
def address_to_object(address)
  {
    Type: address[:type],
    FirstName: address[:first_name] || ' ',
    LastName: address[:last_name] || ' ',
    Address1: address[:address_1] || ' ',
    Address2: address[:address_2] || ' ',
    Address3: address[:address_3] || ' ',
    City: address[:city] || ' ',
    State: address[:state] || ' ',
    PostalCode: address[:postal_code] || ' ',
    CountryIsoA2Code: address[:country_code]
  }
end
build(transaction) click to toggle source
# File lib/trustev/transaction.rb, line 106
def build(transaction)
  built_transaction = {
    TransactionNumber: @transaction_number,
    TransactionData: {
      Currency: transaction[:transaction_data][:currency_code],
      TotalDelivery: transaction[:transaction_data][:total_delivery] || 0,
      TotalBeforeTax: transaction[:transaction_data][:total_before_tax] || 0,
      TotalDiscount: transaction[:transaction_data][:total_discount] || 0,
      TotalTax: transaction[:transaction_data][:total_tax] || 0,
      TotalTransactionValue: transaction[:transaction_data][:total_transaction_value],
      Timestamp: "\/Date(#{transaction[:transaction_data][:timestamp]})\/"
    },
    Customer: {
      FirstName: transaction[:customer][:first_name] || ' ',
      LastName: transaction[:customer][:last_name] || ' ',
      PhoneNumber: transaction[:customer][:phone_number] || '0000',
      Email: []
    },
    SessionId: transaction[:session_id]
  }

  built_transaction[:Customer][:DateOfBirth] =
    "\/Date(#{transaction[:customer][:dob]})\/" unless transaction[:customer][:dob].nil?

  unless transaction[:social_network].nil?
    built_transaction[:SocialNetwork] = {
      Type: transaction[:social_network][:type],
      Id: transaction[:social_network][:id]
    }
  end

  unless transaction[:transaction_data][:address].nil? || transaction[:transaction_data][:address].size == 0
    built_transaction[:TransactionData][:Address] = []
    transaction[:transaction_data][:address].each do | address |
      built_transaction[:TransactionData][:Address].push(address_to_object address)
    end
  end

  unless transaction[:transaction_data][:item].nil? || transaction[:transaction_data][:item].size == 0
    built_transaction[:TransactionData][:Item] = []
    transaction[:transaction_data][:item].each do | item |
      built_transaction[:TransactionData][:Item].push({
        Name: item[:name] || ' ',
        URL: item[:url] || ' ',
        ImageURL: item[:image_url] || ' ',
        Quantity: item[:quantity] || 0,
        TotalBeforeTax: item[:total_before_tax] || 0,
        TotalDiscount: item[:total_discount] || 0,
        TotalTax: item[:total_tax] || 0,
        TotalItemValue: item[:total_item_value] || 0
    })
    end
  end

  transaction[:customer][:email].each do | email |
    built_transaction[:Customer][:Email].push({
      IsDefault: email[:is_default] || false,
      EmailAddress: email[:address] || ' '
    })
  end

  unless transaction[:customer][:address].nil? || transaction[:customer][:address].size == 0
    built_transaction[:Customer][:Address] = []
    transaction[:customer][:address].each do | address |
      address_object = address_to_object address
      address_object[:IsDefault] = address[:is_default] || false
      built_transaction[:Customer][:Address].push(address_object)
    end
  end

  built_transaction
end
validate(transaction) click to toggle source
# File lib/trustev/transaction.rb, line 81
def validate(transaction)
  raise Error.new('Session ID is required.') if transaction[:session_id].nil?
  unless transaction[:social_network].nil?
    raise Error.new('Social Network Type is required') if transaction[:social_network][:type].nil? && !transaction[:social_network][:id].nil?
    raise Error.new('Social Network ID is required') if transaction[:social_network][:id].nil? && !transaction[:social_network][:type].nil?
  end
  raise Error.new('Invalid Currency Code') if CURRENCY_CODES.index(transaction[:transaction_data][:currency_code]).nil?
  raise Error.new('Total Transaction Value is required') if transaction[:transaction_data][:total_transaction_value].nil?
  transaction[:transaction_data][:address].each_with_index do | address, i |
    transaction[:transaction_data][:address][i] = validate_address address
  end
  raise Error.new('Customer is required') if transaction[:customer].nil?
  transaction[:customer][:address].each_with_index do | address, i |
    transaction[:customer][:address][i] = validate_address address
  end
  raise Error.new('Customer email is required') if transaction[:customer][:email].nil? || transaction[:customer][:email].size == 0
end
validate_address(address) click to toggle source
# File lib/trustev/transaction.rb, line 99
def validate_address(address)
  address[:country_code] = 'NS' if address[:country_code].nil?
  raise Error.new('Invalid Country Code') if COUNTRY_CODES.index(address[:country_code]).nil?
  raise Error.new('Invalid Address Type') if Trustev::ADDRESS_TYPES.key(address[:type]).nil?
  address
end