basecomm_sdk 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +94 -0
  5. data/CHANGELOG +3 -0
  6. data/Gemfile +4 -0
  7. data/Guardfile +26 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +102 -0
  10. data/Rakefile +14 -0
  11. data/basecomm_sdk.gemspec +40 -0
  12. data/lib/basecomm_sdk/address.rb +25 -0
  13. data/lib/basecomm_sdk/bank_account.rb +29 -0
  14. data/lib/basecomm_sdk/bank_account_transaction.rb +48 -0
  15. data/lib/basecomm_sdk/bank_card.rb +26 -0
  16. data/lib/basecomm_sdk/bank_card_transaction.rb +52 -0
  17. data/lib/basecomm_sdk/base.rb +91 -0
  18. data/lib/basecomm_sdk/client.rb +151 -0
  19. data/lib/basecomm_sdk/push_notification.rb +22 -0
  20. data/lib/basecomm_sdk/settlement_batch.rb +18 -0
  21. data/lib/basecomm_sdk/triple_des_service.rb +36 -0
  22. data/lib/basecomm_sdk/version.rb +3 -0
  23. data/lib/basecomm_sdk.rb +31 -0
  24. data/spec/cassettes/BasecommSdk_Client/_add_bank_account/fails_when_passing_an_invalid_bank_account.yml +34 -0
  25. data/spec/cassettes/BasecommSdk_Client/_add_bank_account/returns_the_new_bank_account_instance.yml +34 -0
  26. data/spec/cassettes/BasecommSdk_Client/_add_bank_card/fails_when_passing_an_invalid_bank_card.yml +34 -0
  27. data/spec/cassettes/BasecommSdk_Client/_add_bank_card/returns_a_valid_new_bank_card_instance.yml +34 -0
  28. data/spec/cassettes/BasecommSdk_Client/_get_bank_account_transaction/fails_when_passing_invalid_bat_transaction.yml +34 -0
  29. data/spec/cassettes/BasecommSdk_Client/_get_bank_account_transaction/fails_when_passing_invalid_transaction.yml +34 -0
  30. data/spec/cassettes/BasecommSdk_Client/_get_bank_account_transaction/returns_the_specified_bank_account_transaction.yml +34 -0
  31. data/spec/cassettes/BasecommSdk_Client/_get_bank_card_transaction/collects_proper_responses_for_missing_transactions.yml +34 -0
  32. data/spec/cassettes/BasecommSdk_Client/_get_bank_card_transaction/returns_the_specified_bank_card_transaction.yml +34 -0
  33. data/spec/cassettes/BasecommSdk_Client/_process_bank_account_transaction/fails_when_passing_invalid_transaction.yml +34 -0
  34. data/spec/cassettes/BasecommSdk_Client/_process_bank_account_transaction/populates_messages_with_failure_reasons.yml +34 -0
  35. data/spec/cassettes/BasecommSdk_Client/_process_bank_account_transaction/returns_the_processed_bank_account_transaction.yml +34 -0
  36. data/spec/cassettes/BasecommSdk_Client/_process_bank_card_transaction/returns_the_processed_bank_account_transaction_for_auth.yml +34 -0
  37. data/spec/factories.rb +95 -0
  38. data/spec/lib/basecomm_sdk/address_spec.rb +53 -0
  39. data/spec/lib/basecomm_sdk/bank_account_spec.rb +53 -0
  40. data/spec/lib/basecomm_sdk/bank_account_transaction_spec.rb +60 -0
  41. data/spec/lib/basecomm_sdk/bank_card_spec.rb +55 -0
  42. data/spec/lib/basecomm_sdk/bank_card_transaction_spec.rb +55 -0
  43. data/spec/lib/basecomm_sdk/base_spec.rb +7 -0
  44. data/spec/lib/basecomm_sdk/client_spec.rb +204 -0
  45. data/spec/lib/basecomm_sdk/push_notification_spec.rb +14 -0
  46. data/spec/lib/basecomm_sdk/settlement_batch_spec.rb +14 -0
  47. data/spec/lib/basecomm_sdk/triple_des_service_spec.rb +39 -0
  48. data/spec/lib/basecomm_sdk_spec.rb +17 -0
  49. data/spec/spec_helper.rb +56 -0
  50. data/spec/support/shared_class_with_messages.rb +7 -0
  51. metadata +374 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 57612b710ed2938369cf6b2def054be9b99bbf6b
4
+ data.tar.gz: 4b2662337f31a3d61f5d705ef8539c2fc6d206b4
5
+ SHA512:
6
+ metadata.gz: 7acdd36efda79ca4cacf833efce4c508efd4e5026e7c67bccf5db556fcebe2bd402ebe5e7e0e6814bd19d795baba37b02b2c114545235334b77e1f4452a166f2
7
+ data.tar.gz: a2152e94cbaa08a116d714dd099b31f7e0172a053e3e3b0d64501519258d0cf9593f550f528c2e33a85c00278a66401d1dcf26b26158dd87b6301a3af34dbeab
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendor/ruby/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ mkmf.log
16
+ .env
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format doc
data/.rubocop.yml ADDED
@@ -0,0 +1,94 @@
1
+ Style/Documentation:
2
+ Enabled: false
3
+
4
+ Style/AlignParameters:
5
+ EnforcedStyle: with_fixed_indentation
6
+
7
+ Metrics/MethodLength:
8
+ CountComments: false # count full line comments?
9
+ Max: 16
10
+
11
+ Style/RegexpLiteral:
12
+ Enabled: false
13
+
14
+ Encoding:
15
+ Enabled: false
16
+
17
+ # MethodLength:
18
+ # CountComments: false
19
+ # Max: 30
20
+
21
+ #AlignHash:
22
+ # EnforcedColonStyle: table
23
+ # EnforcedHashRocketStyle: table
24
+
25
+ HashSyntax:
26
+ Enabled: true
27
+
28
+ Lambda:
29
+ Description: 'Use the new lambda literal syntax for single-line blocks.'
30
+ Enabled: true
31
+
32
+ LambdaCall:
33
+ Description: 'Use lambda.call(...) instead of lambda.(...).'
34
+ Enabled: true
35
+
36
+ LineLength:
37
+ Max: 90
38
+
39
+ AlignParameters:
40
+ Description: >
41
+ Align the parameters of a method call if they span more
42
+ than one line.
43
+ Enabled: false
44
+
45
+ # Checks formatting of special comments
46
+ CommentAnnotation:
47
+ Keywords:
48
+ - TODO
49
+ - FIXME
50
+ - OPTIMIZE
51
+ - HACK
52
+ - REVIEW
53
+
54
+ AllCops:
55
+ # Include gemspec and Rakefile
56
+ Include:
57
+ - '**/*.gemspec'
58
+ - '**/*.podspec'
59
+ - '**/*.jbuilder'
60
+ - '**/*.rake'
61
+ - '**/Gemfile'
62
+ - '**/Rakefile'
63
+ - '**/Capfile'
64
+ - '**/Guardfile'
65
+ - '**/Podfile'
66
+ - '**/Thorfile'
67
+ - '**/Vagrantfile'
68
+ Exclude:
69
+ - 'vendor/**/*'
70
+ - 'stubs/**/*'
71
+
72
+ Lint/Eval:
73
+ Enabled: false
74
+
75
+ Metrics/LineLength:
76
+ Max: 110
77
+
78
+ Metrics/MethodLength:
79
+ Max: 20
80
+
81
+ Metrics/ClassLength:
82
+ Max: 120
83
+
84
+ Style/RaiseArgs:
85
+ Enabled: false
86
+
87
+ Style/PredicateName:
88
+ Enabled: false
89
+
90
+ Style/TrivialAccessors:
91
+ Enabled: false
92
+
93
+ Style/EachWithObject:
94
+ Enabled: false
data/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ *0.0.1* (January 07, 2015)
2
+
3
+ * Initial
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in basecomm_sdk.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,26 @@
1
+ guard :bundler do
2
+ watch('Gemfile')
3
+ watch(/^.+\.gemspec/)
4
+ end
5
+
6
+ CLI = 'bundle exec rspec --format doc --color'
7
+
8
+ def rspec_watchers
9
+ watch(%r{^spec/.+_spec\.rb$})
10
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
11
+ watch(%r{^lib/.+/base\.rb$}) { 'spec' }
12
+ watch(%r{^providers/(.+)\.rb$}) { |m| "spec/providers/#{m[1]}_spec.rb" }
13
+ watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
14
+ watch('spec/spec_helper.rb') { 'spec' }
15
+ end
16
+
17
+ group :default do
18
+ # guard :rubocop, cli: ['-D'] do
19
+ # watch(%r{.+\.rb$})
20
+ # watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
21
+ # end
22
+
23
+ guard :rspec, cmd: CLI do
24
+ rspec_watchers
25
+ end
26
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Chris Blackburn
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # Base Commerce SDK
2
+
3
+ **Version: 0.0.1**
4
+
5
+ A gem for interfacing with the [Base Commerce](http://www.basecommerce.com/) API. This gem was developed with their help and serves to provide a Gem wrapper around their own Ruby SDK. Please contact them for more information about the Ruby SDK.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'basecomm_sdk'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install basecomm_sdk
22
+
23
+ ## Usage
24
+
25
+ First, you will need to setup an account with [Base Commerce](http://www.basecommerce.com/). Use their sandbox for testing, and please read their documentation before you begin.
26
+
27
+ Read the RSpec examples in the './spec' directory for detailed usage of this gem.
28
+
29
+ ### Basics
30
+
31
+ Include the module.
32
+
33
+ require 'basecomm_sdk'
34
+
35
+ ### Insantiate the Client
36
+
37
+ ```ruby
38
+ # Get your sandbox credentials from Base Commerce
39
+ config = {
40
+ gateway_username: ENV['BASECOMM_UID'],
41
+ gateway_password: ENV['BASECOMM_PWD'],
42
+ key: ENV['BASECOMM_KEY'],
43
+ sandbox: true # For production set this to false or not at all
44
+ }
45
+ client = Client.new(config)
46
+ ```
47
+
48
+ ### Add Bank Account
49
+
50
+ ```ruby
51
+ bank_account = BankAccount.new(...)
52
+ returned_bank_account = client.add_bank_account(bank_account)
53
+ ```
54
+
55
+ ### Add Bank Card
56
+
57
+ ```ruby
58
+ bank_card = BankCard.new(...)
59
+ returned_bank_card = client.add_bank_card(bank_card)
60
+ ```
61
+
62
+ ### Get Bank Account Transaction
63
+
64
+ ```ruby
65
+ bat = client.get_bank_account_transaction(id) # id of the transaction you want
66
+ ```
67
+
68
+ ### Get Bank Card Transaction
69
+
70
+ ```ruby
71
+ bct = client.get_bank_card_transaction(id)
72
+ ```
73
+
74
+ ### Process Bank Account Transaction (ACH)
75
+
76
+ ```ruby
77
+ bat = BankAccountTransaction.new(...)
78
+ returned_bat = client.process_bank_account_transaction(bat)
79
+ ```
80
+
81
+ ### Process Bank Card Transaction
82
+
83
+ ```ruby
84
+ bct = BankCardTransaction.new(...)
85
+ returned_bct = client.process_bank_card_transaction(bct)
86
+ ```
87
+
88
+ ## Errata
89
+
90
+ * We have not used or tested Push Notifications or Settlement Batch APIs.
91
+
92
+ ## Updates
93
+
94
+ We plan to keep this code updated and in sync with any changes in the Base Commerce API. However, for the latest code see the Base Commerce Ruby SDK.
95
+
96
+ ## Contributing
97
+
98
+ 1. Fork it ( https://github.com/[my-github-username]/basecomm_sdk/fork )
99
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
100
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
101
+ 4. Push to the branch (`git push origin my-new-feature`)
102
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ begin
4
+ require 'midwire_common/rake_tasks'
5
+ rescue StandardError => e
6
+ puts ">>> Could not load 'midwire_common/rake_tasks': #{e}"
7
+ exit
8
+ end
9
+
10
+ require 'rspec/core/rake_task'
11
+
12
+ RSpec::Core::RakeTask.new(:spec)
13
+
14
+ task default: :spec
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'basecomm_sdk/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'basecomm_sdk'
8
+ spec.version = BasecommSdk::VERSION
9
+ spec.authors = ['Chris Blackburn', 'Jason Cartwright']
10
+ spec.email = ['chris@gosimplefin.com', 'jasonc@gosimplefin.com']
11
+ spec.summary = 'Ruby client gem for Base Commerce ACH provider'
12
+ spec.description = spec.summary
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'dotenv', '~> 1.0'
22
+ spec.add_runtime_dependency 'json', '~> 1.8'
23
+ spec.add_runtime_dependency 'faraday', '~> 0.9'
24
+ spec.add_runtime_dependency 'excon', '~> 0.42'
25
+ spec.add_runtime_dependency 'midwire_common', '>= 0.1.12'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.7'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.1'
30
+ spec.add_development_dependency 'factory_girl', '~> 4.5'
31
+ spec.add_development_dependency 'simplecov', '~> 0.9'
32
+ spec.add_development_dependency 'vcr'
33
+ spec.add_development_dependency 'webmock'
34
+ spec.add_development_dependency 'pry'
35
+ spec.add_development_dependency 'pry-nav'
36
+ spec.add_development_dependency 'guard'
37
+ spec.add_development_dependency 'guard-rspec'
38
+ spec.add_development_dependency 'guard-bundler'
39
+ spec.add_development_dependency 'guard-rubocop'
40
+ end
@@ -0,0 +1,25 @@
1
+ module BasecommSdk
2
+ class Address < Base
3
+ NAME = {
4
+ xs_address_name_home: 'HOME',
5
+ xs_address_name_work: 'WORK',
6
+ xs_address_name_mailing: 'MAILING',
7
+ xs_address_name_shipping: 'SHIPPING',
8
+ xs_address_name_billing: 'BILLING',
9
+ xs_address_name_dba: 'DBA',
10
+ xs_address_name_legal: 'LEGAL'
11
+ }
12
+
13
+ attr_accessor :name, :line1, :line2, :line3, :city, :state, :zipcode,
14
+ :country
15
+
16
+ def self.build_from_json(json)
17
+ Address.new(JSON.parse(json).recursively_symbolize_keys!)
18
+ end
19
+ singleton_class.send(:alias_method, :from_json, :build_from_json)
20
+
21
+ def json_prefix
22
+ :address
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module BasecommSdk
2
+ class BankAccount < Base
3
+ TYPE = {
4
+ xs_ba_type_checking: 'CHECKING',
5
+ xs_ba_type_savings: 'SAVINGS'
6
+ }
7
+ ENTITY = {
8
+ xs_ba_entity_individual: 'INDIVIDUAL',
9
+ xs_ba_entity_organization: 'ORGANIZATION'
10
+ }
11
+ STATUS = {
12
+ xs_ba_status_active: 'ACTIVE',
13
+ xs_ba_status_deleted: 'DELETED',
14
+ xs_ba_status_failed: 'FAILED'
15
+ }
16
+
17
+ attr_accessor :name, :alias, :account_number, :routing_number, :token,
18
+ :status, :type
19
+
20
+ def self.build_from_json(json)
21
+ BankAccount.new(JSON.parse(json).recursively_symbolize_keys!)
22
+ end
23
+ singleton_class.send(:alias_method, :from_json, :build_from_json)
24
+
25
+ def json_prefix
26
+ :bank_account
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ module BasecommSdk
2
+ class BankAccountTransaction < Base
3
+ ACCOUNT_TYPE = {
4
+ xs_bat_account_type_checking: 'CHECKING',
5
+ xs_bat_account_type_savings: 'SAVINGS'
6
+ }
7
+ TYPE = {
8
+ xs_bat_type_credit: 'CREDIT',
9
+ xs_bat_type_debit: 'DEBIT',
10
+ xs_bat_type_reversal: 'REVERSAL',
11
+ xs_bat_type_cancel: 'CANCEL'
12
+ }
13
+ STATUS = {
14
+ xs_bat_status_created: 'CREATED',
15
+ xs_bat_status_initiated: 'INITIATED',
16
+ xs_bat_status_settled: 'SETTLED',
17
+ xs_bat_status_returned: 'RETURNED',
18
+ xs_bat_status_canceled: 'CANCELED',
19
+ xs_bat_status_failed: 'FAILED',
20
+ xs_bat_status_rejected: 'REJECTED'
21
+ }
22
+ METHOD = {
23
+ xs_bat_method_ccd: 'CCD',
24
+ xs_bat_method_ppd: 'PPD',
25
+ xs_bat_method_tel: 'TEL',
26
+ xs_bat_method_web: 'WEB'
27
+ }
28
+
29
+ attr_accessor :id, :type, :status, :method,
30
+ :account_type, :routing_number, :account_number, :account_name,
31
+ :return_code, :trace, :merchant_transaction_id, :bank_account_token,
32
+ :micr_data, :amount, :effective_date, :settlement_date, :return_date,
33
+ :recurring_indicator
34
+
35
+ attr_accessor :custom_field1, :custom_field2, :custom_field3,
36
+ :custom_field4, :custom_field5, :custom_field6, :custom_field7,
37
+ :custom_field8, :custom_field9, :custom_field10
38
+
39
+ def self.build_from_json(json)
40
+ BankAccountTransaction.new(JSON.parse(json).recursively_symbolize_keys!)
41
+ end
42
+ singleton_class.send(:alias_method, :from_json, :build_from_json)
43
+
44
+ def json_prefix
45
+ :bank_account_transaction
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,26 @@
1
+ module BasecommSdk
2
+ class BankCard < Base
3
+ STATUS = {
4
+ xs_bc_status_active: 'ACTIVE',
5
+ xs_bc_status_deleted: 'DELETED',
6
+ xs_bc_status_failed: 'FAILED'
7
+ }
8
+
9
+ attr_accessor :name, :number, :alias, :expiration_month, :expiration_year,
10
+ :status, :billing_address, :token, :creation_date, :last_used_date
11
+
12
+ def self.build_from_json(json)
13
+ BankCard.new(JSON.parse(json).recursively_symbolize_keys!)
14
+ end
15
+ singleton_class.send(:alias_method, :from_json, :build_from_json)
16
+
17
+ def initialize(options = {})
18
+ super
19
+ @billing_address = Address.new
20
+ end
21
+
22
+ def json_prefix
23
+ :bank_card
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ module BasecommSdk
2
+ class BankCardTransaction < Base
3
+ TYPE = {
4
+ xs_bct_type_auth: 'AUTH',
5
+ xs_bct_type_sale: 'SALE',
6
+ xs_bct_type_void: 'VOID',
7
+ xs_bct_type_capture: 'CAPTURE',
8
+ xs_bct_type_refund: 'REFUND',
9
+ xs_bct_type_credit: 'CREDIT'
10
+ }
11
+
12
+ STATUS = {
13
+ xs_bct_status_created: 'CREATED',
14
+ xs_bct_status_authorized: 'AUTHORIZED',
15
+ xs_bct_status_captured: 'CAPTURED',
16
+ xs_bct_status_settled: 'SETTLED',
17
+ xs_bct_status_voided: 'VOIDED',
18
+ xs_bct_status_declined: 'DECLINED',
19
+ xs_bct_status_failed: 'FAILED',
20
+ xs_bct_status_3dsecure: '3DSECURE',
21
+ xs_bct_status_verified: 'VERIFIED'
22
+ }
23
+
24
+ attr_accessor :billing_address, :type, :card_number, :card_name,
25
+ :expiration_month, :expiration_year, :card_cvv2,
26
+ :card_track1_data, :card_track2_data, :ip_address, :po_number,
27
+ :authorization_code,
28
+ :response_code, :status, :response_message, :cvv_response_code,
29
+ :avs_response_code, :encrypted_track_data, :merchant_transaction_id,
30
+ :verify_complete_url, :verify_url, :amount, :tax_amount, :tip_amount,
31
+ :id, :settlement_batch_id, :check_secure_code, :recurring_indicator,
32
+ :token, :settlement_date, :creation_date
33
+
34
+ attr_accessor :custom_field1, :custom_field2, :custom_field3,
35
+ :custom_field4, :custom_field5, :custom_field6, :custom_field7,
36
+ :custom_field8, :custom_field9, :custom_field10
37
+
38
+ def self.build_from_json(json)
39
+ BankCardTransaction.new(JSON.parse(json).recursively_symbolize_keys!)
40
+ end
41
+ singleton_class.send(:alias_method, :from_json, :build_from_json)
42
+
43
+ def initialize(options = {})
44
+ super
45
+ @billing_address = Address.new
46
+ end
47
+
48
+ def json_prefix
49
+ :bank_card_transaction
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,91 @@
1
+ # rubocop:disable Style/TrivialAccessors
2
+ module BasecommSdk
3
+ class Base
4
+ def self.attr_accessor(*vars)
5
+ @attributes ||= []
6
+ @attributes.concat(vars)
7
+ super(*vars)
8
+ end
9
+
10
+ def self.attributes
11
+ @attributes
12
+ end
13
+
14
+ # Accepts prefixed attribute keys as well as non-prefixed
15
+ def initialize(options = {})
16
+ @messages = []
17
+ instance_hash = options.fetch(json_prefix, options)
18
+ attributes.each do |atr|
19
+ instance_variable_set(
20
+ "@#{atr}",
21
+ instance_hash.fetch(
22
+ "#{json_prefix}_#{atr}".to_sym,
23
+ instance_hash.fetch(
24
+ "#{atr}".to_sym,
25
+ nil
26
+ )
27
+ )
28
+ )
29
+ end
30
+ # Populate messages with exceptions
31
+ if options[:exception]
32
+ options[:exception].each_pair do |k, v|
33
+ messages << {k => v}
34
+ end
35
+ end
36
+ end
37
+
38
+ def messages
39
+ @messages
40
+ end
41
+
42
+ def attributes
43
+ self.class.attributes
44
+ end
45
+
46
+ def qualified_attributes
47
+ array = []
48
+ attributes.each do |atr|
49
+ array << qualified_key(atr)
50
+ end
51
+ array
52
+ end
53
+
54
+ def to_json(_options = {})
55
+ hash = {}
56
+ instance_variables.each do |iv|
57
+ var_name = iv.to_s[1..-1]
58
+ next if var_name.match(/messages$/)
59
+ var = instance_variable_get(iv)
60
+ hash[qualified_key(var_name)] = format(var) unless var.nil?
61
+ end
62
+ hash.to_json
63
+ end
64
+
65
+ def self.json_prefix
66
+ new.json_prefix
67
+ end
68
+
69
+ def qualified_key(key)
70
+ "#{json_prefix}_#{key}".to_sym
71
+ end
72
+
73
+ def format(instance_var)
74
+ case instance_var.class.name
75
+ when 'Date', 'Time', 'DateTime'
76
+ instance_var.strftime('%m/%d/%Y %H:%M:%S')
77
+ else
78
+ instance_var
79
+ end
80
+ end
81
+
82
+ def status_name
83
+ status["#{qualified_key('status')}_name".to_sym]
84
+ end
85
+
86
+ def status_description
87
+ status["#{qualified_key('status')}_description".to_sym]
88
+ end
89
+ end
90
+ end
91
+ # rubocop:enable Style/TrivialAccessors