erp_commerce 4.0.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/app/models/accepted_credit_card.rb +10 -0
  4. data/app/models/bank_account.rb +13 -0
  5. data/app/models/bank_account_type.rb +9 -0
  6. data/app/models/credit_card.rb +54 -19
  7. data/app/models/credit_card_account.rb +31 -9
  8. data/app/models/credit_card_account_party_role.rb +17 -0
  9. data/app/models/credit_card_account_purpose.rb +24 -0
  10. data/app/models/extensions/financial_txn.rb +62 -1
  11. data/app/models/extensions/order_txn.rb +48 -0
  12. data/app/models/extensions/party.rb +26 -13
  13. data/app/models/extensions/simple_product_offer.rb +3 -0
  14. data/app/models/payment.rb +21 -0
  15. data/app/models/payment_gateway.rb +12 -0
  16. data/app/models/payment_gateway_action.rb +12 -0
  17. data/app/models/pricing_plan.rb +29 -1
  18. data/db/data_migrations/20150125202814_add_payment_transaction_types.rb +14 -0
  19. data/db/migrate/20100823174238_erp_commerce_base.rb +196 -192
  20. data/db/migrate/20160310163057_add_created_by_updated_by_to_erp_commerce.rb +35 -0
  21. data/lib/erp_commerce.rb +1 -2
  22. data/lib/erp_commerce/config.rb +2 -3
  23. data/lib/erp_commerce/engine.rb +1 -5
  24. data/lib/erp_commerce/extensions/active_record/acts_as_priceable.rb +1 -2
  25. data/lib/erp_commerce/version.rb +1 -1
  26. metadata +12 -32
  27. data/app/mailers/checkout_mailer.rb +0 -9
  28. data/app/views/checkout_mailer/email_confirmation.html.erb +0 -15
  29. data/app/widgets/orders/base.rb +0 -36
  30. data/app/widgets/orders/javascript/orders.js +0 -12
  31. data/app/widgets/orders/views/index.html.erb +0 -63
  32. data/app/widgets/product_catalog/base.rb +0 -52
  33. data/app/widgets/product_catalog/javascript/product_catalog.js +0 -64
  34. data/app/widgets/product_catalog/views/add_to_cart.html.erb +0 -10
  35. data/app/widgets/product_catalog/views/index.html.erb +0 -69
  36. data/app/widgets/product_catalog/views/show.html.erb +0 -23
  37. data/app/widgets/shopping_cart/base.rb +0 -175
  38. data/app/widgets/shopping_cart/javascript/shopping_cart.js +0 -110
  39. data/app/widgets/shopping_cart/views/cart_items.html.erb +0 -83
  40. data/app/widgets/shopping_cart/views/confirmation.html.erb +0 -11
  41. data/app/widgets/shopping_cart/views/demographics.html.erb +0 -142
  42. data/app/widgets/shopping_cart/views/login.html.erb +0 -1
  43. data/app/widgets/shopping_cart/views/payment.html.erb +0 -81
  44. data/app/widgets/shopping_cart/views/price_summary.html.erb +0 -4
  45. data/lib/erp_commerce/active_merchant_wrappers.rb +0 -3
  46. data/lib/erp_commerce/active_merchant_wrappers/authorize_net_wrapper.rb +0 -66
  47. data/lib/erp_commerce/active_merchant_wrappers/brain_tree_gateway_wrapper.rb +0 -68
  48. data/lib/erp_commerce/active_merchant_wrappers/credit_card_validation.rb +0 -34
  49. data/lib/erp_commerce/order_helper.rb +0 -245
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4e6b6692526e51decb1e65fe0e0c8f144722105
4
- data.tar.gz: 6c0d00362d5a6c460588775a8fe18eb22bc5ddc6
3
+ metadata.gz: 0a6407956b3a3bc60b5271fd3fa5f00682d0f7ac
4
+ data.tar.gz: 4124637d314b584201f71d652975e2c05729df26
5
5
  SHA512:
6
- metadata.gz: d3289c22d87a6549677659a617b9f36777700c2510f2996453e3748f3db53a2fcd9f24a808842b8fe2181bc7531df340a57bc94db6c6f1d92ebd6caa44202041
7
- data.tar.gz: bb1b935e104f9979aa6fc8b8729e4009f62d35b69e12340810af4354548392302e2b1e1f52c55cd6a63db9407fd44c8a8865bde77bb454c8c87397d5e9677eb4
6
+ metadata.gz: eb84968b78265e2ba95216c81a2f124b71d839be133d849857b810f1463f1fd4c85d7cb9afa2d12b1af141ee1dc2eecee74595bf682e7504d96dc112ddf8fef2
7
+ data.tar.gz: d3d8c59cde92c6c51e800fbb246aa236ced5c6daa37c876b568e4f11336db5e1c8bceb49789e4c5757e030333122928327f2b5e31555910cb3f65910383f2d03
data/README.md CHANGED
@@ -8,6 +8,5 @@ To override these settings simple create a erp_commerce.rb file in your initiali
8
8
 
9
9
  Rails.application.config.erp_commerce.configure do |config|
10
10
  config.encryption_key = 'my_secret_code'
11
- config.active_merchant_gateway_wrapper = ErpCommerce::ActiveMerchantWrappers::BrainTreeGatewayWrapper
12
11
  end
13
12
  Rails.application.config.erp_commerce.configure!
@@ -1,3 +1,13 @@
1
+ ### Table Definition ###############################
2
+ # create_table :accepted_credit_cards do |t|
3
+ #
4
+ # t.references :organization
5
+ # t.string :card_type
6
+ #
7
+ # t.timestamps
8
+ # end
9
+ ###################################################
10
+
1
11
  class AcceptedCreditCard < ActiveRecord::Base
2
12
  attr_protected :created_at, :updated_at
3
13
 
@@ -1,3 +1,16 @@
1
+ ### Table Definition ###############################
2
+ # create_table :bank_accounts do |t|
3
+ # t.string :routing_number
4
+ # t.string :crypted_private_account_number
5
+ # t.string :name_on_account
6
+ # t.references :bank_account_type
7
+ #
8
+ # t.timestamps
9
+ # end
10
+ #
11
+ # add_index :bank_accounts, :bank_account_type_id, :name => 'bank_accounts_account_type_idx'
12
+ ####################################################
13
+
1
14
  class BankAccount < ActiveRecord::Base
2
15
  attr_protected :created_at, :updated_at
3
16
 
@@ -1,3 +1,12 @@
1
+ ### Table Definition ###############################
2
+ # create_table :bank_account_types do |t|
3
+ # t.string :description
4
+ # t.string :internal_identifier
5
+ #
6
+ # t.timestamps
7
+ # end
8
+ ####################################################
9
+
1
10
  class BankAccountType < ActiveRecord::Base
2
11
  attr_protected :created_at, :updated_at
3
12
 
@@ -1,13 +1,30 @@
1
+ #### Table Definition ####################################
2
+ # create_table :credit_cards do |t|
3
+ #
4
+ # t.column :crypted_private_card_number, :string
5
+ # t.column :crypted_private_cvc, :string
6
+ # t.column :expiration_month, :integer
7
+ # t.column :expiration_year, :integer
8
+ #
9
+ # t.column :description, :string
10
+ # t.column :name_one_card, :string
11
+ # t.column :card_type, :string
12
+ #
13
+ # t.column :postal_address_id, :integer
14
+ # t.column :credit_card_token, :string
15
+ #
16
+ # t.timestamps
17
+ # end
18
+ #########################################################
19
+
1
20
  class CreditCard < ActiveRecord::Base
2
21
  attr_protected :created_at, :updated_at
3
22
 
4
- require 'attr_encrypted'
5
-
6
- belongs_to :postal_address
7
- has_one :credit_card_account_party_role, :dependent => :destroy
23
+ tracks_created_by_updated_by
24
+
25
+ belongs_to :postal_address
26
+ has_one :credit_card_account_party_role, :dependent => :destroy
8
27
 
9
- validates :first_name_on_card, :presence => {:message => 'First name on card cannot be blank.'}
10
- validates :last_name_on_card, :presence => {:message => 'Last name on card cannot be blank.'}
11
28
  #validates :card_type, :presence => {:message => 'Card type cannot be blank.'}
12
29
  validates :expiration_month, :presence => {:message => 'Expiration month cannot be blank.'}
13
30
  validates :expiration_year, :presence => {:message => 'Expiration year cannot be blank.'}
@@ -15,13 +32,24 @@ class CreditCard < ActiveRecord::Base
15
32
 
16
33
  #the function EncryptionKey.get_key is meant to be overridden to provide a means for implementations to specify their
17
34
  #own encryption schemes and locations. It will default to a simple string for development and testing
18
- attr_encrypted :private_card_number, :key => Rails.application.config.erp_commerce.encryption_key, :marshall => true, :attribute => :crypted_private_card_number
35
+ attr_encrypted :private_card_number, :key => Rails.application.config.erp_commerce.encryption_key, :attribute => :crypted_private_card_number
36
+ attr_encrypted :private_cvc, :key => Rails.application.config.erp_commerce.encryption_key, :attribute => :crypted_private_cvc
19
37
 
20
38
  # These methods are exposed for the purposes of displaying a version of the card number
21
39
  # string containing the last four digits of the card number. The idea is to make it
22
40
  # painfully obvious when any coder is using the private_card_number, which should
23
41
  # be used only in limited circumstances.
24
42
 
43
+ #these two methods allow us to assign instance level attributes that are not persisted. These are used for validators
44
+ def instance_attributes
45
+ @instance_attrs.nil? ? {} : @instance_attrs
46
+ end
47
+
48
+ def add_instance_attribute(k, v)
49
+ @instance_attrs = {} if @instance_attrs.nil?
50
+ @instance_attrs[k] = v
51
+ end
52
+
25
53
  def card_number
26
54
  if self.private_card_number
27
55
  CreditCard.mask_number(self.private_card_number)
@@ -30,29 +58,36 @@ class CreditCard < ActiveRecord::Base
30
58
  end
31
59
  end
32
60
 
33
- # Note that the setter method allows the same variable to be set, and delegates through
34
- # the encryption process
35
-
61
+ def last_4
62
+ card_number[card_number.length-4..card_number.length]
63
+ end
64
+
65
+ def expires
66
+ "#{expiration_month}/#{expiration_year}"
67
+ end
68
+
69
+ def cvc=(cvc)
70
+ self.private_cvc=cvc
71
+ end
72
+
36
73
  def card_number=(num)
37
74
  self.private_card_number=num
38
75
  end
39
-
76
+
40
77
  def to_label
41
78
  "#{card_type}: #{card_number}"
42
79
  end
43
-
80
+
44
81
  def to_s
45
82
  "#{card_type}: #{card_number}"
46
83
  end
47
84
 
48
- def add_party_with_role(party, role_type)
49
-
50
- end
51
-
52
85
  def cardholder
53
- return self.credit_card_account_party_role.party
86
+ if self.credit_card_account_party_role
87
+ self.credit_card_account_party_role.party
88
+ end
54
89
  end
55
-
90
+
56
91
  def before_create
57
92
  token = CreditCardToken.new
58
93
  self.credit_card_token = token.cc_token.strip
@@ -63,7 +98,7 @@ class CreditCard < ActiveRecord::Base
63
98
  'XXXX-XXXX-XXXX-' + number[number.length-4..number.length]
64
99
  end
65
100
  end
66
-
101
+
67
102
  end
68
103
 
69
104
 
@@ -1,3 +1,9 @@
1
+ ### Table Definition ###############################
2
+ # create_table :credit_card_accounts do |t|
3
+ # t.timestamps
4
+ # end
5
+ ####################################################
6
+
1
7
  class CreditCardAccount < ActiveRecord::Base
2
8
  attr_protected :created_at, :updated_at
3
9
 
@@ -34,7 +40,6 @@ class CreditCardAccount < ActiveRecord::Base
34
40
  def authorize(financial_txn, cvv, gateway_wrapper, gateway_options={}, credit_card_to_use=nil)
35
41
  credit_card_to_use = self.credit_card unless credit_card_to_use
36
42
 
37
- gateway_options[:debug] = true
38
43
  result = gateway_wrapper.authorize(credit_card_to_use, financial_txn.money.amount, cvv, gateway_options)
39
44
 
40
45
  unless result[:payment].nil?
@@ -58,7 +63,6 @@ class CreditCardAccount < ActiveRecord::Base
58
63
  def purchase(financial_txn, cvv, gateway_wrapper, gateway_options={}, credit_card_to_use=nil)
59
64
  credit_card_to_use = self.credit_card unless credit_card_to_use
60
65
 
61
- gateway_options[:debug] = true
62
66
  result = gateway_wrapper.purchase(credit_card_to_use, financial_txn.money.amount, cvv, gateway_options)
63
67
 
64
68
  unless result[:payment].nil?
@@ -71,6 +75,29 @@ class CreditCardAccount < ActiveRecord::Base
71
75
  result
72
76
  end
73
77
 
78
+ # purchase with credit card associated to this CreditCardAccount
79
+ def purchase_with_existing_card(financial_txn, gateway_wrapper, gateway_options={})
80
+ result = gateway_wrapper.purchase_with_existing_card(self.credit_card, financial_txn.money.amount, gateway_options)
81
+
82
+ unless result[:payment].nil?
83
+ result[:payment].financial_txn = financial_txn
84
+ result[:payment].save
85
+ financial_txn.payments << result[:payment]
86
+ financial_txn.save
87
+ end
88
+
89
+ result
90
+ end
91
+
92
+ # purchase with credit card associated to this CreditCardAccount
93
+ def refund(financial_txn, gateway_wrapper, gateway_options={}, amount=nil)
94
+ if amount.nil?
95
+ amount = financial_txn.money.amount
96
+ end
97
+
98
+ gateway_wrapper.refund(financial_txn.most_recent_payment, amount, gateway_options)
99
+ end
100
+
74
101
  #params
75
102
  #financial_txn
76
103
  #cvv
@@ -83,7 +110,7 @@ class CreditCardAccount < ActiveRecord::Base
83
110
  credit_card_to_use = self.credit_card unless credit_card_to_use
84
111
 
85
112
  result = {:success => true}
86
- payment = Payment.find(:first, :order => 'created_at desc', :conditions => ["current_state = ? and success = ? and financial_txn_id = ?",'authorized', 1, financial_txn.id])
113
+ payment = Payment.where("current_state = ? and success = ? and financial_txn_id = ?",'authorized', 1, financial_txn.id).order('created_at desc').first
87
114
  #only capture this payment if it was authorized
88
115
  if !payment.nil? && payment.current_state.to_sym == :authorized
89
116
  gateway_options[:debug] = true
@@ -104,7 +131,7 @@ class CreditCardAccount < ActiveRecord::Base
104
131
  credit_card_to_use = self.credit_card unless credit_card_to_use
105
132
 
106
133
  result = {:success => true}
107
- payment = Payment.find(:first, :order => 'created_at desc', :conditions => ["current_state = ? and success = ? and financial_txn_id = ?",'authorized', 1, financial_txn.id])
134
+ payment = Payment.where("current_state = ? and success = ? and financial_txn_id = ?",'authorized', 1, financial_txn.id).order('created_at desc').first
108
135
  #only reverse this payment if it was authorized
109
136
  if !payment.nil? && payment.current_state.to_sym == :authorized
110
137
  gateway_options[:debug] = true
@@ -118,10 +145,6 @@ class CreditCardAccount < ActiveRecord::Base
118
145
  # implement a void transaction of a transaction
119
146
  end
120
147
 
121
- def refund
122
- # implement a refund on a card
123
- end
124
-
125
148
  #params
126
149
  #financial_txn
127
150
  #gateway_wrapper
@@ -134,7 +157,6 @@ class CreditCardAccount < ActiveRecord::Base
134
157
  credit_card_to_use = self.credit_card unless credit_card_to_use
135
158
  result = {:success => true}
136
159
 
137
- gateway_options[:debug] = true
138
160
  if money_amount == nil
139
161
  money_amount = financial_txn.money.amount
140
162
  end
@@ -1,3 +1,20 @@
1
+ ### Table Definition #####################################
2
+ # create_table :credit_card_account_party_roles do |t|
3
+ # t.column :credit_card_account_id, :integer
4
+ # t.column :role_type_id, :integer
5
+ # t.column :party_id, :integer
6
+ # t.column :credit_card_id, :integer
7
+ #
8
+ # t.timestamps
9
+ # end
10
+ #
11
+ # add_index :credit_card_account_party_roles, :credit_card_account_id
12
+ # add_index :credit_card_account_party_roles, :role_type_id
13
+ # add_index :credit_card_account_party_roles, :party_id
14
+ # add_index :credit_card_account_party_roles, :credit_card_id
15
+ #
16
+ ##########################################################
17
+
1
18
  class CreditCardAccountPartyRole < ActiveRecord::Base
2
19
  attr_protected :created_at, :updated_at
3
20
 
@@ -1,3 +1,27 @@
1
+ ### Table Definition #####################################
2
+ # create_table :credit_card_account_purposes do |t|
3
+ #
4
+ # t.column :parent_id, :integer
5
+ # t.column :lft, :integer
6
+ # t.column :rgt, :integer
7
+ #
8
+ # #custom columns go here
9
+ #
10
+ # t.column :description, :string
11
+ # t.column :comments, :string
12
+ #
13
+ # t.column :internal_identifier, :string
14
+ # t.column :external_identifier, :string
15
+ # t.column :external_id_source, :string
16
+ #
17
+ # t.timestamps
18
+ # end
19
+ #
20
+ # add_index :credit_card_account_purposes, :parent_id
21
+ # add_index :credit_card_account_purposes, :lft
22
+ # add_index :credit_card_account_purposes, :rgt
23
+ #########################################################
24
+
1
25
  class CreditCardAccountPurpose < ActiveRecord::Base
2
26
  attr_protected :created_at, :updated_at
3
27
 
@@ -1,4 +1,65 @@
1
1
  FinancialTxn.class_eval do
2
2
  has_many :payments
3
- has_many :payment_applications, :dependent => :destroy
3
+
4
+ def has_captured_payment?
5
+ has_payments? and self.payments.last.current_state == 'captured'
6
+ end
7
+
8
+ def has_pending_payment?
9
+ has_payments? and self.payments.last.current_state == 'pending'
10
+ end
11
+
12
+ def is_pending?
13
+ self.is_scheduled? || self.has_pending_payment?
14
+ end
15
+
16
+ def is_scheduled?
17
+ ((self.apply_date > Date.today) or (!self.has_payments?))
18
+ end
19
+
20
+ def has_payments?
21
+ !self.payments.empty?
22
+ end
23
+
24
+ def most_recent_payment
25
+ Payment.order('created_at DESC').where('financial_txn_id = ?', self.id).first
26
+ end
27
+
28
+ def refund(gateway_wrapper, gateway_options={})
29
+ begin
30
+ ActiveRecord::Base.transaction do
31
+ # make sure we have payments and they are captured
32
+ if has_payments? && has_captured_payment?
33
+ result = {success: true}
34
+
35
+ if txn_type.internal_identifier == 'credit_card_payment'
36
+ result = CreditCardAccount.new.refund(self, gateway_wrapper, gateway_options)
37
+
38
+ else
39
+ payment = most_recent_payment
40
+ payment.refund
41
+ payment.save
42
+
43
+ result[:message] = 'Payment Refunded'
44
+ end
45
+
46
+ # if the refund was a success un-apply the payments
47
+ if result[:success]
48
+ payment_applications.each do |payment_application|
49
+ payment_application.unapply_payment
50
+ end
51
+ end
52
+
53
+ result
54
+
55
+ end
56
+ end
57
+ rescue => ex
58
+ Rails.logger.error(ex.message)
59
+ Rails.logger.error(ex.backtrace.join("\n"))
60
+
61
+ {success: false, message: 'Could not refund'}
62
+ end
63
+ end
64
+
4
65
  end
@@ -1,3 +1,51 @@
1
+ # create_table :order_txns do |t|
2
+ # t.column :state_machine, :string
3
+ # t.column :description, :string
4
+ # t.column :order_txn_type_id, :integer
5
+ #
6
+ # # Multi-table inheritance info
7
+ # t.column :order_txn_record_id, :integer
8
+ # t.column :order_txn_record_type, :string
9
+ #
10
+ # # Contact Information
11
+ # t.column :email, :string
12
+ # t.column :phone_number, :string
13
+ #
14
+ # # Shipping Address
15
+ # t.column :ship_to_first_name, :string
16
+ # t.column :ship_to_last_name, :string
17
+ # t.column :ship_to_address_line_1, :string
18
+ # t.column :ship_to_address_line_2, :string
19
+ # t.column :ship_to_city, :string
20
+ # t.column :ship_to_state, :string
21
+ # t.column :ship_to_postal_code, :string
22
+ # t.column :ship_to_country, :string
23
+ #
24
+ # # Billing Address
25
+ # t.column :bill_to_first_name, :string
26
+ # t.column :bill_to_last_name, :string
27
+ # t.column :bill_to_address_line_1, :string
28
+ # t.column :bill_to_address_line_2, :string
29
+ # t.column :bill_to_city, :string
30
+ # t.column :bill_to_state, :string
31
+ # t.column :bill_to_postal_code, :string
32
+ # t.column :bill_to_country, :string
33
+ #
34
+ # # Private parts
35
+ # t.column :customer_ip, :string
36
+ # t.column :order_number, :integer
37
+ # t.column :status, :string
38
+ # t.column :error_message, :string
39
+ #
40
+ # t.timestamps
41
+ # end
42
+ #
43
+ # add_index :order_txns, :order_txn_type_id
44
+ # add_index :order_txns, [:order_txn_record_id, :order_txn_record_type], :name => 'order_txn_record_idx'
45
+ #
46
+ # add_index :order_txns, :order_txn_type_id
47
+ # add_index :order_txns, [:order_txn_record_id, :order_txn_record_type], :name => 'order_txn_record_idx'
48
+
1
49
  OrderTxn.class_eval do
2
50
  acts_as_priceable
3
51
  end
@@ -1,8 +1,8 @@
1
1
  Party.class_eval do
2
2
 
3
3
  #credit cards
4
- has_many :credit_card_account_party_roles, :dependent => :destroy
5
-
4
+ has_many :credit_card_account_party_roles, :dependent => :destroy
5
+
6
6
  # return primary credit card
7
7
  def primary_credit_card
8
8
  return get_credit_card('primary')
@@ -10,20 +10,33 @@ Party.class_eval do
10
10
 
11
11
  # return credit card by credit card account purpose using internal identifier
12
12
  def get_credit_card(internal_identifier)
13
+ credit_card = nil
14
+
13
15
  self.credit_card_account_party_roles.each do |ccapr|
14
16
  if ccapr.credit_card_account.credit_card_account_purpose.internal_identifier.eql?(internal_identifier)
15
- return ccapr.credit_card
17
+ credit_card = ccapr.credit_card
16
18
  end
17
- end
18
- return nil
19
+ end
20
+
21
+ credit_card
22
+ end
23
+
24
+ def credit_cards
25
+ credit_cards = []
26
+
27
+ self.credit_card_account_party_roles.each do |ccapr|
28
+ credit_cards << ccapr.credit_card
29
+ end
30
+
31
+ credit_cards
19
32
  end
20
33
 
21
34
  def credit_card_accounts
22
- self.accounts.where('biz_txn_acct_type = ?', 'CreditCardAccount').all.collect(&:account)
35
+ self.accounts.where('biz_txn_acct_type = ?', 'CreditCardAccount').all.collect(&:account)
23
36
  end
24
37
 
25
38
  def bank_accounts
26
- self.accounts.where('biz_txn_acct_type = ?', 'BankAccount').all.collect(&:account)
39
+ self.accounts.where('biz_txn_acct_type = ?', 'BankAccount').all.collect(&:account)
27
40
  end
28
41
 
29
42
  def payment_accounts
@@ -35,12 +48,12 @@ Party.class_eval do
35
48
  #displaying in CSR, website, etc.
36
49
  def payment_accounts_hash
37
50
  cc_results = credit_card_accounts.map do |cca|
38
- { id: cca.id,
39
- description: cca.credit_card.description,
40
- card_type: cca.credit_card.card_type,
41
- last_four: nil, #not stored yet
42
- exp_dt: "#{cca.credit_card.expiration_month}-#{cca.credit_card.expiration_year}",
43
- account_type: 'Credit Card'}
51
+ {id: cca.id,
52
+ description: cca.credit_card.description,
53
+ card_type: cca.credit_card.card_type,
54
+ last_four: nil, #not stored yet
55
+ exp_dt: "#{cca.credit_card.expiration_month}-#{cca.credit_card.expiration_year}",
56
+ account_type: 'Credit Card'}
44
57
  end
45
58
 
46
59
  ba_results = bank_accounts.map do |ba|