Class: Elements::Api

Inherits:
Object
  • Object
show all
Defined in:
lib/elements.rb

Overview

Api class defaults to the V2 of the elements API

Direct Known Subclasses

ApiV1

Class Method Summary collapse

Class Method Details

.add_forex_offer(exchange_rate) ⇒ Object

Add Forex Offer is a class method that add the foreign exchange rate for virtual currencies input: ‘AMG’, 100, ‘AMS’, 60



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/elements.rb', line 90

def self.add_forex_offer(exchange_rate)
  params = { 
    storeId: 3190, 
    description: exchange_rate.to_s,
    fromCurrencyName: exchange_rate.from_currency.vcx_name, 
    toCurrencyName: exchange_rate.to_currency.vcx_name,
    exchangeRate: exchange_rate.exchange_rate,
    externalKey: exchange_rate.id,
    effectiveDate: generate_date(DateTime.now),
    expirationDate: generate_date(DateTime.now + 75.years),
    isDefault: false,
    isSpecial: false,
    status: 'ACTIVE'
   }
  post_data("forexOffer", params)
end

.add_user(user) ⇒ Object

Add_user is a class method of Api class that provides adding users to elements



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/elements.rb', line 15

def self.add_user(user)
  params = {
    name:         user.email.gsub('@','_'),
    emailaddress: user.email,
    namespaceId: '0'
    #gender:       user.gender,
    #dateOfBirth:  user.dob.strftime("%m/%d/%Y")
  }
  response = post_data 'user', params
  result = XmlSimple.xml_in(response)
  user.update_column(:elements_id, result['id'])
end

.buy_purchase_info(order, ipaddress) ⇒ Object

Buy Purchase Info is a class method that returns the buy line items and payment information for the order



157
158
159
# File 'lib/elements.rb', line 157

def self.buy_purchase_info(order, ipaddress)
  sell_purchase_info(order, ipaddress)
end

.cancel_forex_offer(forex_offer_id, ipaddress) ⇒ Object

Update Forex Offer to Status CANCELLED



83
84
85
86
# File 'lib/elements.rb', line 83

def self.cancel_forex_offer(forex_offer_id, ipaddress)
  params = {'forexOfferId' => forex_offer_id, 'ipAddress' => ipaddress, 'status' => 'CANCELLED'}
  put_data("forexOffer/#{forex_offer_id}", params)
end

.cancel_purchase_order(order, ipaddress = '1.1.1.1') ⇒ Object

Cancel Purchase Order is a class method that cancels an order that has already been created



141
142
143
144
145
146
# File 'lib/elements.rb', line 141

def self.cancel_purchase_order( order, ipaddress='1.1.1.1' )
  params = {
    commandType: 'CANCEL'
  }
  XmlSimple.xml_in post_xml_data("purchaseOrder/#{order.elements_id}/command", params,"purchaseOrderCommand")
end

.cashin_purchase_info(order, ipaddress) ⇒ Object

Sell Purchase Info is a class method that returns the sell line items and payment information for the order



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/elements.rb', line 162

def self.cashin_purchase_info(order, ipaddress)
  #Configurable Elements Ids
  cashin_forex_elements_id = '1850'
  cashin_config_id = '1347'

  line_items = [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.total_due.abs, '@id' => cashin_forex_elements_id} } }]

  payment_profile = order.payment_profile
  payment = [{
    '@configId' => cashin_config_id,
    'creditCard' => {
      'billToStreetAddress' => payment_profile.billing_address1 + payment_profile.billing_address2,
      'billToZipCode' => payment_profile.zipcode,
      'creditCardNumber' => payment_profile.,
      'creditCardType' => payment_profile..upcase,
      'expDate' => payment_profile.expiration_date.gsub('/',''), #To be fixed
      'securityCode' => payment_profile.ccv,
      'firstname' => payment_profile.name.split[0],
      'surname' => payment_profile.name.split[1],
      'stateProvince' => payment_profile.state,
      'countryCode' => 'US' #To be fixed
    }
  }]

  return line_items, payment
end

.create_account(account, ip_address) ⇒ Object

Create account is a class method that creates an account in elements from the Account model object input: eg. Account.find(254), ‘255.255.255.255’ output: elements id



266
267
268
269
270
271
272
273
274
275
276
277
278
# File 'lib/elements.rb', line 266

def self.(, ip_address)
  params ={
    program: "
      var accountId = es.addAccount(#{.user.elements_id}, 'account#{.id}', #{.currency.elements_id}, null, authInfo);
      es.addToAccountBalance(new java.lang.Long(accountId), new java.math.BigDecimal(#{.balance}), requestContext, authInfo);
      '' + accountId;
    ", 
    ipAddress: ip_address
  }
   = post_data("batch", params) + '' 
  #account.update_column('elements_id', elements_account_id.to_i)
  
end

.create_purchase_order(order, ipaddress = '1.1.1.1') ⇒ Object

Create purchase order is a class method that creates a new purchaseOrder in the elements system depending on the order type



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/elements.rb', line 108

def self.create_purchase_order( order, ipaddress='1.1.1.1' )
  lineItems, payment = send("#{order.order_type}_purchase_info", order, ipaddress)
  elements_ids = Array.new


  lineItems.each_with_index do |lineItem, index|
    params = {
      orderCommand: order.order_type=='cashin' ? 'CHARGE' : 'AUTHORIZE',
      buyerUser: {'@id' => order.user.elements_id},
      lineItems: lineItem,
      payment: payment[index]
    }
    rs = XmlSimple.xml_in post_xml_data("purchaseOrder", params,"purchaseOrder")
    elements_ids << rs['id']
  end
  save_order_elements(elements_ids, order)
end

.exchange_purchase_info(order, ipaddress) ⇒ Object

Sell Purchase Info is a class method that returns the exchange line items and payment information for the order



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/elements.rb', line 203

def self.exchange_purchase_info(order, ipaddress)
  vcx_currency = Currency.find_by_currency_type('real')

  sell_exchange_rate = Forex.find_exchange_rate(Forex.find_by_currency_id(order.from_currency), Forex.find_by_currency_id(vcx_currency))
  buy_exchange_rate = Forex.find_exchange_rate(Forex.find_by_currency_id(vcx_currency), Forex.find_by_currency_id(order.to_currency))

  line_items = Array.new
  line_items << [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.from_amount.abs, '@id' => find_or_create_forex_offer(sell_exchange_rate, ipaddress), '@buyerAccountId' => order.user.accounts.find_by_currency_id(vcx_currency).elements_id }  } }]
  line_items << [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.from_amount.abs * sell_exchange_rate.exchange_rate, '@id' => find_or_create_forex_offer(buy_exchange_rate, ipaddress), '@buyerAccountId' => order..elements_id }  } }]


  payment = [
    {
      '@currencyId' => order.from_currency.elements_id, 
      'tfeAccountId' => order..elements_id 
    },
    {
      '@currencyId' => vcx_currency.elements_id, 
      'tfeAccountId' => order.user.accounts.find_by_currency_id(vcx_currency).elements_id
    }
  ]

  return line_items, payment
end

.fetch_order_elements(order) ⇒ Object

Fetch Order Elements is a class method that fetches the elements_id from order table depending on the order type



230
231
232
233
234
235
236
237
238
239
240
# File 'lib/elements.rb', line 230

def self.fetch_order_elements(order)
  elements_id = order.elements_id
  case order.order_type
  when 'cashin'
    [order.cashin_elements_id]
  when 'exchange'
    order.elements_id.split('|')
  when /['sell'|'buy']/
    [elements_id]
  end
end

.find_account_name(account) ⇒ Object

Find account is a class method that find account via account_id input: eg. Account.find(254)

output: eg. “account254”



258
259
260
261
# File 'lib/elements.rb', line 258

def self.()
  params = {program: "var account = es.findAccountById(#{.elements_id}, authInfo); '' + account.name;", ipAddress: '123.123.123.123'}
  post_data("batch", params)
end

.find_active_forex_offer(exchange_rate) ⇒ Object

Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies input: eg. exchange_rate output: xml with attributes eg. exchangeRate=“0.011”



52
53
54
55
56
# File 'lib/elements.rb', line 52

def self.find_active_forex_offer(exchange_rate)
  params = {'fromCurrencyName' => exchange_rate.from_currency.vcx_name, 'toCurrencyName' => exchange_rate.to_currency.vcx_name, 'statuses' => 'ACTIVE' }
  get_data("forexOffers", params)
  
end

.find_balance(account, ip_address) ⇒ Object

Find balance is a class method that returns the balance of the Account model object from elements input eg. Account.find(254), ‘255.255.255.255’ output: eg. 3214



283
284
285
286
287
288
289
290
291
292
# File 'lib/elements.rb', line 283

def self.find_balance(, ip_address)
  params = {
    program: "
      var balance =  es.balanceInquiry(#{.elements_id}, authInfo);
      '' + balance.amount;
    ",
    ipAddress: ip_address  
    }
  post_data("batch", params)  
end

.find_forex_offer_by_currency(from_currency, to_currency) ⇒ Object

Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies input: eg. ‘AMS’, ‘AMG’ output: xml with attributes eg. exchangeRate=“0.011”



44
45
46
47
# File 'lib/elements.rb', line 44

def self.find_forex_offer_by_currency(from_currency, to_currency)
  params = {'fromCurrencyName' => from_currency, 'toCurrencyName' => to_currency }
  get_data("forexOffers", params)
end

.find_forex_offer_by_external_key(external_key) ⇒ Object

Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies input: eg. exchange_rate output: xml with attributes eg. exchangeRate=“0.011”



77
78
79
80
# File 'lib/elements.rb', line 77

def self.find_forex_offer_by_external_key(external_key)
  params = {'externalKey' => external_key}
  get_data("forexOffers", params)
end

.find_forex_offer_by_id(forex_offer_id) ⇒ Object

Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies input: eg. ‘AMS’, ‘AMG’ output: xml with attributes eg. exchangeRate=“0.011”



36
37
38
39
# File 'lib/elements.rb', line 36

def self.find_forex_offer_by_id(forex_offer_id)
  params = {'id' => forex_offer_id }
  get_data("forexOffer/#{forex_offer_id}", params)
end

.find_or_create_forex_offer(exchange_rate, ipaddress) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/elements.rb', line 58

def self.find_or_create_forex_offer(exchange_rate, ipaddress)
  response = XmlSimple.xml_in find_active_forex_offer(exchange_rate)
  if(!response.nil? and !response['forexOffer'].nil?)
    response['forexOffer'].each do |forex_offer|
      if(forex_offer['externalKey'] == exchange_rate.id.to_s and forex_offer['status']== "ACTIVE") then
        return forex_offer["id"]
      else
        cancel_forex_offer(forex_offer["id"], ipaddress) 
      end
    end
  end
  add_forex_offer(exchange_rate)
  #TODO Header info needs to be captured for optimization
  find_or_create_forex_offer(exchange_rate, ipaddress)
end

.find_purchase_order(purchase_order_id) ⇒ Object

Find purchase Order is a class method that returns the purchase order output: xml with attributes



150
151
152
153
# File 'lib/elements.rb', line 150

def self.find_purchase_order(purchase_order_id)
  params = {'id' => purchase_order_id }
  get_data("purchaseOrder/#{purchase_order_id}", params)
end

.find_user(user) ⇒ Object

Find_user is a class method of Api class that provides finding users that are added in elements



29
30
31
# File 'lib/elements.rb', line 29

def self.find_user(user)
  get_data "user/#{user.elements_id}"
end

.process_purchase_order(order, ipaddress = '1.1.1.1') ⇒ Object

Process purchase order is a class method that processes an already created order



127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/elements.rb', line 127

def self.process_purchase_order( order, ipaddress='1.1.1.1' )
  #elements_id = create_purchase_order(order, ipaddress)
  params = {
  commandType: 'CHARGE'
  }

  elements_ids = fetch_order_elements(order)
  elements_ids.each do |elements_id|
    XmlSimple.xml_in post_xml_data("purchaseOrder/#{elements_id}/command", params,"purchaseOrderCommand")
  end

end

.save_order_elements(elements_ids, order) ⇒ Object

Save Order Elements is a class method that saves the elements_id from order table depending on the order type



243
244
245
246
247
248
249
250
251
252
# File 'lib/elements.rb', line 243

def self.save_order_elements(elements_ids, order)
  case order.order_type
  when 'cashin'
    order.update_column 'cashin_elements_id', elements_ids.first
  when 'exchange'
    order.update_column 'elements_id', elements_ids.join('|')
  when /['sell'|'buy']/
    order.update_column 'elements_id', elements_ids.first
  end
end

.sell_purchase_info(order, ipaddress) ⇒ Object

Sell Purchase Info is a class method that returns the sell line items and payment information for the order



190
191
192
193
194
195
196
197
198
199
200
# File 'lib/elements.rb', line 190

def self.sell_purchase_info(order, ipaddress)
  line_items = Array.new
  line_items << [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.from_amount.abs, '@id' => find_or_create_forex_offer(ExchangeRate.find(order.exchange_rate_id), ipaddress), '@buyerAccountId' => order..elements_id } } }]

  payment = [{
    '@currencyId' => order.from_currency.elements_id, 
    'tfeAccountId' => order..elements_id 
  }]

  return line_items, payment
end

.set_account_balance(account, ip_address) ⇒ Object

Add account balance is a class method that adds the account balance to the elements input: eg. Account.find(254), ‘255.255.255.255’ output



297
298
299
300
301
302
# File 'lib/elements.rb', line 297

def self.(, ip_address)
  balance = .balance.to_f - find_balance(, ip_address).to_f
  command = balance >=0 ? "addToAccountBalance" : "subtractFromAccountBalance"
  params ={program: "es.#{command}(#{.elements_id}, new java.math.BigDecimal(#{balance.abs}), requestContext, authInfo);''", ipAddress: ip_address}
  post_data('batch', params)
end