kaui 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/stylesheets/kaui/subscription.less +4 -0
  4. data/app/assets/stylesheets/kaui/tags.less +1 -1
  5. data/app/controllers/kaui/account_children_controller.rb +2 -2
  6. data/app/controllers/kaui/account_tags_controller.rb +3 -2
  7. data/app/controllers/kaui/accounts_controller.rb +9 -5
  8. data/app/controllers/kaui/admin_tenants_controller.rb +0 -10
  9. data/app/controllers/kaui/bundle_tags_controller.rb +3 -2
  10. data/app/controllers/kaui/bundles_controller.rb +13 -9
  11. data/app/controllers/kaui/chargebacks_controller.rb +6 -4
  12. data/app/controllers/kaui/invoices_controller.rb +9 -6
  13. data/app/controllers/kaui/payments_controller.rb +8 -5
  14. data/app/controllers/kaui/refunds_controller.rb +5 -3
  15. data/app/controllers/kaui/subscriptions_controller.rb +34 -7
  16. data/app/helpers/kaui/subscription_helper.rb +22 -4
  17. data/app/models/kaui/admin_tenant.rb +6 -5
  18. data/app/models/kaui/base.rb +2 -2
  19. data/app/views/kaui/admin_tenants/_form_plugin_config.erb +25 -16
  20. data/app/views/kaui/invoices/show.html.erb +6 -1
  21. data/app/views/kaui/subscriptions/_edit_form.html.erb +15 -9
  22. data/app/views/kaui/subscriptions/_form.html.erb +6 -0
  23. data/app/views/kaui/subscriptions/_subscriptions_table.html.erb +5 -0
  24. data/lib/kaui/version.rb +1 -1
  25. data/test/functional/kaui/bundle_tags_controller_test.rb +0 -11
  26. data/test/functional/kaui/subscriptions_controller_test.rb +28 -7
  27. data/test/unit/kaui/admin_tenant_test.rb +25 -5
  28. data/test/unit/kaui/base_test.rb +6 -1
  29. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94aaf4133d5cfa9e2663a9062bc32f19ce52ce04
4
- data.tar.gz: 13e3b70e78c58ae04b5ab35a802f6ea91305ddc3
3
+ metadata.gz: b872df3f942d9f2a4e5efc1f1fd93ebb8e37e956
4
+ data.tar.gz: f25ca3f933403dea99fd1c776330ec7966c190c4
5
5
  SHA512:
6
- metadata.gz: 6c5067d3e078ac77718213af8085ef89d8707ac8dbf062b71f481816de5efb059dad264d109f3e3b4dec7bdc5b00eaeab2ca8e9e5848d0fa64c8b57ca4196405
7
- data.tar.gz: fbc13854e23b80c7f9553f197911ac16fc642c20072574ff3c02de05fdcb927645adee97a4dca9c74dfd31e9c86ed2d889438c244b06f01d18db3fe10f132d57
6
+ metadata.gz: 65ae3a7873e00c75ff89a88b0b44fc9bbd8c02f5e68ced24a4f1eb9a696dbfe9b6c0522d360afc2dde9af93fff0c04f8acb9c717a4e6f8a8b6ba18febda005aa
7
+ data.tar.gz: 7e1f005312d0697fb899dee663e7d89af286b2e22242c4ee66488dc2e92d0a873883a67ca7ba158916e6366fa7c462b2f05cac4762ff3af0883593d0d262647c
data/README.md CHANGED
@@ -11,7 +11,7 @@ Kill Bill compatibility
11
11
  | 0.14.y | 0.16.z |
12
12
  | 0.15.y | 0.18.z (Rails 4) |
13
13
  | 0.16.y | 0.18.z (Rails 5) |
14
- | 1.x.y | 0.19.z |
14
+ | 1.x.y | 0.20.z |
15
15
 
16
16
  Dependencies
17
17
  ------------
@@ -17,4 +17,8 @@ table tr.expired {
17
17
  }
18
18
  }
19
19
  }
20
+ }
21
+
22
+ .price-override-popover {
23
+ cursor: pointer;
20
24
  }
@@ -60,7 +60,7 @@
60
60
  padding: 0 15px;
61
61
  font-size: 12px;
62
62
  color: #999999;
63
- overflow: hidden;
63
+ overflow: auto;
64
64
  width: auto;
65
65
  border-bottom: 0;
66
66
  display: inline-block;
@@ -16,9 +16,9 @@ class Kaui::AccountChildrenController < Kaui::EngineController
16
16
  # It will fetch all the children. It use the paginate to fetch all children as permitting for future exchange
17
17
  # when killbill account/{account_id}/children endpoint includes offset and limit parameters.
18
18
  def pagination
19
-
19
+ cached_options_for_klient = options_for_klient
20
20
  searcher = lambda do |parent_account_id, offset, limit|
21
- Kaui::Account.find_children(parent_account_id, true, true, 'NONE', options_for_klient)
21
+ Kaui::Account.find_children(parent_account_id, true, true, 'NONE', cached_options_for_klient)
22
22
  end
23
23
 
24
24
  data_extractor = lambda do |account_child, column|
@@ -24,8 +24,9 @@ class Kaui::AccountTagsController < Kaui::EngineController
24
24
  def edit
25
25
  @account_id = params.require(:account_id)
26
26
 
27
- fetch_tag_names = promise { (Kaui::Tag.all_for_account(@account_id, false, 'NONE', options_for_klient).map { |tag| tag.tag_definition_name }).sort }
28
- fetch_available_tags = promise { Kaui::TagDefinition.all_for_account(options_for_klient) }
27
+ cached_options_for_klient = options_for_klient
28
+ fetch_tag_names = promise { (Kaui::Tag.all_for_account(@account_id, false, 'NONE', cached_options_for_klient).map { |tag| tag.tag_definition_name }).sort }
29
+ fetch_available_tags = promise { Kaui::TagDefinition.all_for_account(cached_options_for_klient) }
29
30
 
30
31
  @tag_names = wait(fetch_tag_names)
31
32
  @available_tags = wait(fetch_available_tags)
@@ -21,8 +21,9 @@ class Kaui::AccountsController < Kaui::EngineController
21
21
  end
22
22
 
23
23
  def pagination
24
+ cached_options_for_klient = options_for_klient
24
25
  searcher = lambda do |search_key, offset, limit|
25
- Kaui::Account.list_or_search(search_key, offset, limit, options_for_klient)
26
+ Kaui::Account.list_or_search(search_key, offset, limit, cached_options_for_klient)
26
27
  end
27
28
 
28
29
  data_extractor = lambda do |account, column|
@@ -255,10 +256,12 @@ class Kaui::AccountsController < Kaui::EngineController
255
256
 
256
257
  raise('Account id and account parent id cannot be equal.') if @account.account_id == @account.parent_account_id
257
258
 
259
+ cached_options_for_klient = options_for_klient
260
+
258
261
  # check if parent id is valid
259
- Kaui::Account.find_by_id(@account.parent_account_id,false,false,options_for_klient)
262
+ Kaui::Account.find_by_id(@account.parent_account_id, false, false, cached_options_for_klient)
260
263
 
261
- @account.update(false, current_user.kb_username, params[:reason], params[:comment], options_for_klient)
264
+ @account.update(false, current_user.kb_username, params[:reason], params[:comment], cached_options_for_klient)
262
265
 
263
266
  redirect_to account_path(@account.account_id), :notice => 'Account successfully updated'
264
267
  rescue => e
@@ -272,13 +275,14 @@ class Kaui::AccountsController < Kaui::EngineController
272
275
 
273
276
  def unlink_to_parent
274
277
  account_id = params.require(:account_id)
278
+ cached_options_for_klient = options_for_klient
275
279
 
276
280
  # search for the account and remove the parent account id
277
281
  # check if parent id is valid
278
- account = Kaui::Account.find_by_id(account_id,false,false,options_for_klient)
282
+ account = Kaui::Account.find_by_id(account_id, false, false, cached_options_for_klient)
279
283
  account.is_payment_delegated_to_parent = false
280
284
  account.parent_account_id = nil
281
- account.update(true, current_user.kb_username, params[:reason], params[:comment], options_for_klient)
285
+ account.update(true, current_user.kb_username, params[:reason], params[:comment], cached_options_for_klient)
282
286
 
283
287
  redirect_to account_path(@account.account_id), :notice => 'Account successfully updated'
284
288
  rescue => e
@@ -121,8 +121,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
121
121
  end
122
122
 
123
123
  def new_catalog
124
-
125
-
126
124
  @tenant = safely_find_tenant_by_id(params[:id])
127
125
 
128
126
  options = tenant_options_for_client
@@ -147,7 +145,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
147
145
  end
148
146
 
149
147
  def delete_catalog
150
-
151
148
  tenant = safely_find_tenant_by_id(params[:id])
152
149
 
153
150
  options = tenant_options_for_client
@@ -191,9 +188,7 @@ class Kaui::AdminTenantsController < Kaui::EngineController
191
188
  @simple_plan.plan_id = params[:plan_id]
192
189
  end
193
190
 
194
-
195
191
  def create_simple_plan
196
-
197
192
  current_tenant = safely_find_tenant_by_id(params[:id])
198
193
 
199
194
  options = tenant_options_for_client
@@ -221,7 +216,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
221
216
  end
222
217
 
223
218
  def modify_overdue_config
224
-
225
219
  current_tenant = safely_find_tenant_by_id(params[:id])
226
220
 
227
221
  options = tenant_options_for_client
@@ -236,7 +230,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
236
230
  redirect_to admin_tenant_path(current_tenant.id), :notice => 'Overdue config was successfully added '
237
231
  end
238
232
 
239
-
240
233
  def upload_overdue_config
241
234
  current_tenant = safely_find_tenant_by_id(params[:id])
242
235
 
@@ -252,7 +245,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
252
245
  redirect_to admin_tenant_path(current_tenant.id), :notice => 'Overdue config was successfully uploaded'
253
246
  end
254
247
 
255
-
256
248
  def upload_invoice_template
257
249
  current_tenant = safely_find_tenant_by_id(params[:id])
258
250
 
@@ -449,7 +441,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
449
441
 
450
442
  private
451
443
 
452
-
453
444
  def safely_find_tenant_by_id(tenant_id)
454
445
  tenant = Kaui::Tenant.find_by_id(tenant_id)
455
446
  raise ActiveRecord::RecordNotFound.new('Could not find tenant ' + tenant_id) unless retrieve_tenants_for_current_user.include?(tenant.kb_tenant_id)
@@ -470,7 +461,6 @@ class Kaui::AdminTenantsController < Kaui::EngineController
470
461
  end
471
462
 
472
463
  def set_tenant_if_nil(tenant)
473
-
474
464
  if session[:kb_tenant_id].nil?
475
465
  session[:kb_tenant_id] = tenant.kb_tenant_id
476
466
  session[:kb_tenant_name] = tenant.name
@@ -3,8 +3,9 @@ class Kaui::BundleTagsController < Kaui::EngineController
3
3
  def edit
4
4
  @bundle_id = params.require(:bundle_id)
5
5
 
6
- fetch_tag_names = promise { (Kaui::Tag.all_for_bundle(@bundle_id, false, 'NONE', options_for_klient).map { |tag| tag.tag_definition_name }).sort }
7
- fetch_available_tags = promise { Kaui::TagDefinition.all_for_bundle(options_for_klient) }
6
+ cached_options_for_klient = options_for_klient
7
+ fetch_tag_names = promise { (Kaui::Tag.all_for_bundle(@bundle_id, false, 'NONE', cached_options_for_klient).map { |tag| tag.tag_definition_name }).sort }
8
+ fetch_available_tags = promise { Kaui::TagDefinition.all_for_bundle(cached_options_for_klient) }
8
9
 
9
10
  @tag_names = wait(fetch_tag_names)
10
11
  @available_tags = wait(fetch_available_tags)
@@ -1,25 +1,27 @@
1
1
  class Kaui::BundlesController < Kaui::EngineController
2
2
 
3
3
  def index
4
- fetch_bundles = promise { @account.bundles(options_for_klient) }
4
+ cached_options_for_klient = options_for_klient
5
+
6
+ fetch_bundles = promise { @account.bundles(cached_options_for_klient) }
5
7
  fetch_bundle_tags = promise {
6
- all_bundle_tags = @account.all_tags(:BUNDLE, false, 'NONE', options_for_klient)
8
+ all_bundle_tags = @account.all_tags(:BUNDLE, false, 'NONE', cached_options_for_klient)
7
9
  all_bundle_tags.inject({}) {|hsh, entry| (hsh[entry.object_id] ||= []) << entry; hsh}
8
10
  }
9
11
  fetch_subscription_tags = promise {
10
- all_subscription_tags = @account.all_tags(:SUBSCRIPTION, false, 'NONE', options_for_klient)
12
+ all_subscription_tags = @account.all_tags(:SUBSCRIPTION, false, 'NONE', cached_options_for_klient)
11
13
  all_subscription_tags.inject({}) {|hsh, entry| (hsh[entry.object_id] ||= []) << entry; hsh}
12
14
  }
13
15
  fetch_bundle_fields = promise {
14
- all_bundle_fields = @account.all_custom_fields(:BUNDLE, 'NONE', options_for_klient)
16
+ all_bundle_fields = @account.all_custom_fields(:BUNDLE, 'NONE', cached_options_for_klient)
15
17
  all_bundle_fields.inject({}) {|hsh, entry| (hsh[entry.object_id] ||= []) << entry; hsh}
16
18
  }
17
19
  fetch_subscription_fields = promise {
18
- all_subscription_fields = @account.all_custom_fields(:SUBSCRIPTION, 'NONE', options_for_klient)
20
+ all_subscription_fields = @account.all_custom_fields(:SUBSCRIPTION, 'NONE', cached_options_for_klient)
19
21
  all_subscription_fields.inject({}) {|hsh, entry| (hsh[entry.object_id] ||= []) << entry; hsh}
20
22
  }
21
- fetch_available_tags = promise { Kaui::TagDefinition.all_for_bundle(options_for_klient) }
22
- fetch_available_subscription_tags = promise { Kaui::TagDefinition.all_for_subscription(options_for_klient) }
23
+ fetch_available_tags = promise { Kaui::TagDefinition.all_for_bundle(cached_options_for_klient) }
24
+ fetch_available_subscription_tags = promise { Kaui::TagDefinition.all_for_subscription(cached_options_for_klient) }
23
25
 
24
26
  @bundles = wait(fetch_bundles)
25
27
  @tags_per_bundle = wait(fetch_bundle_tags)
@@ -44,10 +46,12 @@ class Kaui::BundlesController < Kaui::EngineController
44
46
  end
45
47
 
46
48
  def do_transfer
47
- new_account = Kaui::Account::find_by_id_or_key(params.require(:new_account_key), false, false, options_for_klient)
49
+ cached_options_for_klient = options_for_klient
50
+
51
+ new_account = Kaui::Account::find_by_id_or_key(params.require(:new_account_key), false, false, cached_options_for_klient)
48
52
 
49
53
  bundle = Kaui::Bundle::new(:bundle_id => params.require(:id), :account_id => new_account.account_id)
50
- bundle.transfer(nil, params[:billing_policy], current_user.kb_username, params[:reason], params[:comment], options_for_klient)
54
+ bundle.transfer(nil, params[:billing_policy], current_user.kb_username, params[:reason], params[:comment], cached_options_for_klient)
51
55
 
52
56
  redirect_to kaui_engine.account_bundles_path(new_account.account_id), :notice => 'Bundle was successfully transferred'
53
57
  end
@@ -8,11 +8,13 @@ class Kaui::ChargebacksController < Kaui::EngineController
8
8
  end
9
9
 
10
10
  def create
11
+ cached_options_for_klient = options_for_klient
12
+
11
13
  @chargeback = Kaui::Chargeback.new(params.require(:chargeback))
12
14
  should_cancel_subs = (params[:cancel_all_subs] == '1')
13
15
 
14
16
  begin
15
- payment = @chargeback.chargeback(current_user.kb_username, params[:reason], params[:comment], options_for_klient)
17
+ payment = @chargeback.chargeback(current_user.kb_username, params[:reason], params[:comment], cached_options_for_klient)
16
18
  rescue => e
17
19
  flash.now[:error] = "Error while creating a new chargeback: #{as_string(e)}"
18
20
  render :action => :new and return
@@ -21,15 +23,15 @@ class Kaui::ChargebacksController < Kaui::EngineController
21
23
  # Cancel all subscriptions on the account, if required
22
24
  if should_cancel_subs
23
25
  begin
24
- account = Kaui::Account.find_by_id(payment.account_id, false, false, options_for_klient)
25
- account.bundles(options_for_klient).each do |bundle|
26
+ account = Kaui::Account.find_by_id(payment.account_id, false, false, cached_options_for_klient)
27
+ account.bundles(cached_options_for_klient).each do |bundle|
26
28
  bundle.subscriptions.each do |subscription|
27
29
  # Already cancelled?
28
30
  next unless subscription.billing_end_date.blank?
29
31
 
30
32
  # Cancel the entitlement immediately but use the default billing policy
31
33
  entitlement = Kaui::Subscription.new(:subscription_id => subscription.subscription_id)
32
- entitlement.cancel_entitlement_immediately(current_user.kb_username, params[:reason], params[:comment], options_for_klient)
34
+ entitlement.cancel_entitlement_immediately(current_user.kb_username, params[:reason], params[:comment], cached_options_for_klient)
33
35
  end
34
36
  end
35
37
  rescue => e
@@ -11,12 +11,14 @@ class Kaui::InvoicesController < Kaui::EngineController
11
11
  end
12
12
 
13
13
  def pagination
14
+ cached_options_for_klient = options_for_klient
15
+
14
16
  searcher = lambda do |search_key, offset, limit|
15
- account = Kaui::Account::find_by_id_or_key(search_key, false, false, options_for_klient) rescue nil
17
+ account = Kaui::Account::find_by_id_or_key(search_key, false, false, cached_options_for_klient) rescue nil
16
18
  if account.nil?
17
- Kaui::Invoice.list_or_search(search_key, offset, limit, options_for_klient)
19
+ Kaui::Invoice.list_or_search(search_key, offset, limit, cached_options_for_klient)
18
20
  else
19
- account.invoices(true, options_for_klient).map! { |invoice| Kaui::Invoice.build_from_raw_invoice(invoice) }
21
+ account.invoices(true, cached_options_for_klient).map! { |invoice| Kaui::Invoice.build_from_raw_invoice(invoice) }
20
22
  end
21
23
  end
22
24
 
@@ -81,12 +83,13 @@ class Kaui::InvoicesController < Kaui::EngineController
81
83
  end
82
84
 
83
85
  def show_html
84
- render :plain => Kaui::Invoice.as_html(params.require(:id), options_for_klient)
86
+ render :html => Kaui::Invoice.as_html(params.require(:id), options_for_klient).html_safe
85
87
  end
86
88
 
87
89
  def commit_invoice
88
- invoice = KillBillClient::Model::Invoice.find_by_id(params.require(:id), false, 'NONE', options_for_klient)
89
- invoice.commit(current_user.kb_username, params[:reason], params[:comment], options_for_klient)
90
+ cached_options_for_klient = options_for_klient
91
+ invoice = KillBillClient::Model::Invoice.find_by_id(params.require(:id), false, 'NONE', cached_options_for_klient)
92
+ invoice.commit(current_user.kb_username, params[:reason], params[:comment], cached_options_for_klient)
90
93
  redirect_to account_invoice_path(invoice.account_id, invoice.invoice_id), :notice => 'Invoice successfully committed'
91
94
  end
92
95
  end
@@ -73,8 +73,9 @@ class Kaui::PaymentsController < Kaui::EngineController
73
73
  end
74
74
 
75
75
  def new
76
- fetch_invoice = promise { Kaui::Invoice.find_by_id(params.require(:invoice_id), true, 'NONE', options_for_klient) }
77
- fetch_payment_methods = promise { Kaui::PaymentMethod.find_all_by_account_id(params.require(:account_id), false, options_for_klient) }
76
+ cached_options_for_klient = options_for_klient
77
+ fetch_invoice = promise { Kaui::Invoice.find_by_id(params.require(:invoice_id), true, 'NONE', cached_options_for_klient) }
78
+ fetch_payment_methods = promise { Kaui::PaymentMethod.find_all_by_account_id(params.require(:account_id), false, cached_options_for_klient) }
78
79
 
79
80
  @invoice = wait(fetch_invoice)
80
81
  @payment_methods = wait(fetch_payment_methods)
@@ -91,15 +92,17 @@ class Kaui::PaymentsController < Kaui::EngineController
91
92
  end
92
93
 
93
94
  def show
94
- invoice_payment = Kaui::InvoicePayment.find_safely_by_id(params.require(:id), options_for_klient)
95
+ cached_options_for_klient = options_for_klient
96
+
97
+ invoice_payment = Kaui::InvoicePayment.find_safely_by_id(params.require(:id), cached_options_for_klient)
95
98
  @payment = Kaui::InvoicePayment.build_from_raw_payment(invoice_payment)
96
99
 
97
100
  fetch_payment_fields = promise {
98
101
  direct_payment = Kaui::Payment.new(:payment_id => @payment.payment_id)
99
- direct_payment.custom_fields('NONE', options_for_klient).sort { |cf_a, cf_b| cf_a.name.downcase <=> cf_b.name.downcase }
102
+ direct_payment.custom_fields('NONE', cached_options_for_klient).sort { |cf_a, cf_b| cf_a.name.downcase <=> cf_b.name.downcase }
100
103
  }
101
104
  # The payment method may have been deleted
102
- fetch_payment_method = promise { Kaui::PaymentMethod.find_safely_by_id(@payment.payment_method_id, options_for_klient) }
105
+ fetch_payment_method = promise { Kaui::PaymentMethod.find_safely_by_id(@payment.payment_method_id, cached_options_for_klient) }
103
106
 
104
107
  @custom_fields = wait(fetch_payment_fields)
105
108
  @payment_method = wait(fetch_payment_method)
@@ -1,9 +1,11 @@
1
1
  class Kaui::RefundsController < Kaui::EngineController
2
2
 
3
3
  def new
4
- fetch_invoice = promise { Kaui::Invoice.find_by_id(params.require(:invoice_id), true, 'NONE', options_for_klient) }
5
- fetch_payment = promise { Kaui::InvoicePayment::find_by_id(params.require(:payment_id), false, false, options_for_klient) }
6
- fetch_bundles = promise { @account.bundles(options_for_klient) }
4
+ cached_options_for_klient = options_for_klient
5
+
6
+ fetch_invoice = promise { Kaui::Invoice.find_by_id(params.require(:invoice_id), true, 'NONE', cached_options_for_klient) }
7
+ fetch_payment = promise { Kaui::InvoicePayment::find_by_id(params.require(:payment_id), false, false, cached_options_for_klient) }
8
+ fetch_bundles = promise { @account.bundles(cached_options_for_klient) }
7
9
 
8
10
  @invoice = wait(fetch_invoice)
9
11
  @payment = wait(fetch_payment)
@@ -33,6 +33,13 @@ class Kaui::SubscriptionsController < Kaui::EngineController
33
33
  @subscription.plan_name = plan_name
34
34
  requested_date = params[:type_change] == "DATE" ? params[:requested_date].presence : nil
35
35
 
36
+ # price override?
37
+ override_fixed_price = plan_details.phases.first.prices.blank? rescue false
38
+ override_recurring_price = !override_fixed_price
39
+ phase_type = @bundle.nil? ? plan_details.phases.first.type : @bundle.subscriptions.first.phase_type
40
+ overrides = price_overrides(phase_type, override_fixed_price, override_recurring_price)
41
+ @subscription.price_overrides = overrides unless overrides.blank?
42
+
36
43
  # un-set product_category since is not needed if plan name exist
37
44
  @subscription.product_category = nil
38
45
  @subscription = @subscription.create(current_user.kb_username, params[:reason], params[:comment], requested_date, false, options_for_klient)
@@ -49,13 +56,9 @@ class Kaui::SubscriptionsController < Kaui::EngineController
49
56
  _, plans_details = lookup_bundle_and_plan_details(@subscription)
50
57
  # Use a Set to deal with multiple pricelists
51
58
  @plans = Set.new.merge(plans_details.map { |p| p.plan })
52
-
53
- @current_plan = "#{@subscription.product_name} #{@subscription.billing_period}".humanize
54
- @current_plan += " (price list #{@subscription.price_list})" if @subscription.price_list != 'DEFAULT'
55
59
  end
56
60
 
57
61
  def update
58
-
59
62
  plan_name = params.require(:plan_name)
60
63
 
61
64
  requested_date = params[:type_change] == "DATE" ? params[:requested_date].presence : nil
@@ -65,9 +68,16 @@ class Kaui::SubscriptionsController < Kaui::EngineController
65
68
 
66
69
  subscription = Kaui::Subscription.find_by_id(params.require(:id), options_for_klient)
67
70
 
68
- subscription.change_plan({
69
- :planName => plan_name
70
- },
71
+ input = { :planName => plan_name }
72
+
73
+ # price override?
74
+ current_plan = subscription.prices.select { |price| price['phaseType'] == subscription.phase_type }
75
+ override_fixed_price = current_plan.last['recurringPrice'].nil?
76
+ override_recurring_price = !override_fixed_price
77
+ overrides = price_overrides(subscription.phase_type, override_fixed_price, override_recurring_price)
78
+ input[:priceOverrides] = overrides unless overrides.blank?
79
+
80
+ subscription.change_plan(input,
71
81
  current_user.kb_username,
72
82
  params[:reason],
73
83
  params[:comment],
@@ -78,6 +88,8 @@ class Kaui::SubscriptionsController < Kaui::EngineController
78
88
  options_for_klient)
79
89
 
80
90
  redirect_to kaui_engine.account_bundles_path(subscription.account_id), :notice => 'Subscription plan successfully changed'
91
+ rescue => e
92
+ redirect_to edit_subscription_path(params.require(:id)), :flash => { :error => "Error while changing subscription: #{as_string(e)}" }
81
93
  end
82
94
 
83
95
  def destroy
@@ -206,4 +218,19 @@ class Kaui::SubscriptionsController < Kaui::EngineController
206
218
 
207
219
  end
208
220
  end
221
+
222
+ def price_overrides(phase_type, override_fixed_price = true, override_recurring_price = false)
223
+ return nil if params[:price_override].blank?
224
+
225
+ price_override = params[:price_override]
226
+ overrides = []
227
+ override = KillBillClient::Model::PhasePriceAttributes.new
228
+ override.phase_type = phase_type
229
+ override.fixed_price = price_override if override_fixed_price
230
+ override.recurring_price = price_override if override_recurring_price
231
+
232
+ overrides << override
233
+
234
+ overrides
235
+ end
209
236
  end
@@ -62,15 +62,33 @@ module Kaui
62
62
 
63
63
  if humanized_billing_period.nil?
64
64
  if humanized_price_list.nil?
65
- humanized_product_name
65
+ humanized_product_name = humanized_product_name + humanized_price_override(sub, '', '(', ')')
66
66
  else
67
- humanized_product_name+ ' (' + humanized_price_list.downcase + ')'
67
+ humanized_product_name = humanized_product_name + ' (' + humanized_price_list.downcase + humanized_price_override(sub) + ')'
68
68
  end
69
69
  else
70
70
  if humanized_price_list.nil?
71
- humanized_product_name + ' (' + humanized_billing_period.downcase + ')'
71
+ humanized_product_name = humanized_product_name + ' (' + humanized_billing_period.downcase + humanized_price_override(sub) + ')'
72
72
  else
73
- humanized_product_name+ ' (' + humanized_billing_period.downcase + ', ' + humanized_price_list.downcase + ')'
73
+ humanized_product_name = humanized_product_name + ' (' + humanized_billing_period.downcase + ', ' + humanized_price_list.downcase + humanized_price_override(sub) + ')'
74
+ end
75
+ end
76
+
77
+ humanized_product_name.html_safe
78
+ end
79
+
80
+ def humanized_price_override(sub, separation = ', ', open_bracket = '', close_bracket = '')
81
+ if sub.plan_name.scan(/ *-\d+$/).empty?
82
+ ''
83
+ else
84
+ current_plan = sub.prices.select { |price| price['phaseType'] == sub.phase_type && price['planName'] == sub.plan_name }
85
+ price_override = current_plan.last['fixedPrice'] || current_plan.last['recurringPrice']
86
+
87
+ if price_override.blank?
88
+ ''
89
+ else
90
+ span = "<span data-toggle=\"popover\" class=\"price-override-popover\" data-content=\"#{price_override}\"><b>price override</b></span>"
91
+ "#{open_bracket}#{separation}#{span}#{close_bracket}"
74
92
  end
75
93
  end
76
94
  end
@@ -75,6 +75,7 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
75
75
  else
76
76
  hsh[plugin_key] = yml[plugin_key.to_sym]
77
77
  end
78
+ hsh[plugin_key][:_raw] = e.values[0]
78
79
  elsif is_an_official_plugin && is_kv?(e.values[0])
79
80
  # Construct hash of properties based on java properties (k1=v1\nk2=v2\n...)
80
81
  hsh[plugin_key] = e.values[0].split("\n").inject({}) do |h, p0|
@@ -82,9 +83,10 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
82
83
  h[k] = v;
83
84
  h
84
85
  end
86
+ hsh[plugin_key][:_raw] = e.values[0]
85
87
  else
86
88
  # Construct simple hash with one property :raw_config
87
- hsh[killbill_key] = {:raw_config => e.values[0]}
89
+ hsh[killbill_key] = {:raw_config => e.values[0], :_raw => e.values[0]}
88
90
  end
89
91
  hsh
90
92
  end
@@ -99,21 +101,20 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
99
101
  end
100
102
  "#{plugin_key}::#{serialized_props}"
101
103
  end.join(";")
102
-
103
104
  end
104
105
 
105
-
106
106
  def format_plugin_config(plugin_key, plugin_type, props)
107
107
  return nil unless props.present?
108
+ return props['raw_config'].gsub(/\r\n?/, "\n") if props['raw_config']
109
+
108
110
  if plugin_type == 'ruby'
109
111
  require 'yaml'
110
112
  props = reformat_plugin_config(plugin_type, props)
111
113
  hsh = {}
112
114
  hsh[plugin_key.to_sym] = {}
113
115
  props.each do |k,v|
114
- hsh[plugin_key.to_sym][k.to_sym] = v.to_sym
116
+ hsh[plugin_key.to_sym][k.to_sym] = v
115
117
  end
116
- hsh[plugin_key.to_sym]
117
118
  hsh.to_yaml
118
119
  elsif plugin_type == 'java'
119
120
  props = reformat_plugin_config(plugin_type, props)
@@ -2,9 +2,9 @@ class Kaui::Base
2
2
 
3
3
  def self.to_money(amount, currency)
4
4
  begin
5
- return Money.new(amount.to_f * 100, currency)
5
+ return Money.from_amount(amount.to_f, currency)
6
6
  rescue => _
7
7
  end if currency.present?
8
- Money.new(amount.to_f * 100, 'USD')
8
+ Money.from_amount(amount.to_f, 'USD')
9
9
  end
10
10
  end
@@ -112,12 +112,12 @@
112
112
  if ($("#toggle_raw").prop("checked")) {
113
113
  var raw = [];
114
114
  raw.push({ is_raw_config: true, property: "raw_config", property_label: "Raw Config", value: ''});
115
- for ( var i = 0; i < plugin_key_values.length ; i++ ) {
116
- raw[0].value += plugin_key_values[i].property + '=' + plugin_key_values[i].value;
117
- if (i < plugin_key_values.length - 1) {
118
- raw[0].value += "\n";
119
- }
120
- }
115
+
116
+ var plugin_name = $('#entered_plugin_name').val();
117
+ var plugin_key = $("#plugin_key").val();
118
+ var existing_props = get_tenant_plugin_properties(plugin_key, plugin_name);
119
+ raw[0].value = existing_props['_raw'];
120
+
121
121
  render_plugin_key_values(raw, plugin_key_values);
122
122
  } else {
123
123
  render_plugin_key_values(plugin_key_values, plugin_key_values);
@@ -135,6 +135,7 @@
135
135
  $("#plugin_type").val(selectedOption[0].dataset['pluginType']);
136
136
  $('#plugin_config_properties').attr('plugin_name', '');
137
137
  $('#plugin_config_properties_header').hide();
138
+ $("#toggle_raw").prop('checked', false);
138
139
  add_properties_for_plugin(plugin_key, plugin_name);
139
140
  }
140
141
  });
@@ -168,7 +169,7 @@
168
169
 
169
170
  function get_existing_tenant_plugin_properties(entered_plugin_name) {
170
171
  var tenant_plugin_properties = $('#entered_plugin_name').attr('tenant_plugin_config');
171
- var res = {}
172
+ var res = {};
172
173
  if (tenant_plugin_properties != undefined) {
173
174
  $.each(tenant_plugin_properties.split(';'), function(idx, el) {
174
175
  var el_parts = el.split('::');
@@ -180,7 +181,7 @@
180
181
  } else {
181
182
  $.map(el_props.split('|'), function(el) {
182
183
  var parts = el.split('=');
183
- res[parts[0]] = parts[1];
184
+ res[parts[0]] = parts.slice(1).join('=');
184
185
  });
185
186
  }
186
187
  return false;
@@ -215,6 +216,18 @@
215
216
  return res;
216
217
  }
217
218
 
219
+ function get_tenant_plugin_properties(plugin_key, plugin_name) {
220
+ /* Retrieve existing plugin properties for this tenant */
221
+ var existing_props = get_existing_tenant_plugin_properties(plugin_key);
222
+
223
+ // try by plugin name for proprietary plugins
224
+ if (isBlank(existing_props)) {
225
+ existing_props = get_existing_tenant_plugin_properties(plugin_name);
226
+ }
227
+
228
+ return existing_props;
229
+ }
230
+
218
231
  function add_properties_for_plugin(plugin_key, plugin_name) {
219
232
  var plugin_info = get_selected_plugin_info(plugin_key);
220
233
 
@@ -229,13 +242,7 @@
229
242
  return;
230
243
  }
231
244
 
232
- /* Retrieve existing plugin properties for this tenant */
233
- var existing_props = get_existing_tenant_plugin_properties(plugin_key);
234
-
235
- // try by plugin name for proprietary plugins
236
- if (isBlank(existing_props)) {
237
- existing_props = get_existing_tenant_plugin_properties(plugin_name);
238
- }
245
+ var existing_props = get_tenant_plugin_properties(plugin_key, plugin_name);
239
246
 
240
247
  var type = plugin_info['type'];
241
248
  var props = plugin_info['props']
@@ -285,7 +292,9 @@
285
292
  var plugin_props_with_values = [];
286
293
 
287
294
  $.each(merged_props_with_values, function(p, v) {
288
- plugin_props_with_values.push({ property_label: format_label(p), property: p, value: v, is_raw_config: p == 'raw_config'});
295
+ if (p != '_raw') {
296
+ plugin_props_with_values.push({ property_label: format_label(p), property: p, value: v, is_raw_config: p == 'raw_config'});
297
+ }
289
298
  });
290
299
 
291
300
  render_plugin_key_values(plugin_props_with_values, plugin_props_with_values);
@@ -2,7 +2,12 @@
2
2
 
3
3
  <div class="column-block">
4
4
 
5
- <h1>Invoice <%= @invoice.invoice_number %></h1>
5
+ <h1>
6
+ Invoice <%= @invoice.invoice_number %>
7
+ <% unless @invoice.invoice_number.blank? %>
8
+ <%= link_to 'View customer invoice html', kaui_engine.show_html_invoice_path(@invoice.invoice_id), :class => 'btn', :target => '_blank' %>
9
+ <% end %>
10
+ </h1>
6
11
 
7
12
  <% dry_run = @invoice.invoice_number.blank? %>
8
13
  <% if dry_run %>
@@ -1,13 +1,19 @@
1
1
  <%= form_for @subscription, :url => subscription_path(@subscription.subscription_id), :html => {:method => :put, :class => 'form-horizontal'} do |f| %>
2
2
  <div class="form-group">
3
- <%= label_tag :plan_name, 'New plan', :class => 'col-sm-2 control-label' %>
4
- <div class="col-sm-10">
5
- <%= select_tag :plan_name, options_for_select(@plans), :class => 'form-control' %>
3
+ <%= label_tag :plan_name, 'New plan', :class => 'col-sm-3 control-label' %>
4
+ <div class="col-sm-9">
5
+ <%= select_tag :plan_name, options_for_select(@plans, @subscription.plan_name.gsub(/ *-\d+$/, '')), :class => 'form-control' %>
6
6
  </div>
7
7
  </div>
8
8
 
9
9
  <div class="form-group">
10
- <div class="col-sm-offset-2 col-sm-10">
10
+ <%= label_tag :price_override, 'Price Override', :class => 'col-sm-3 control-label' %>
11
+ <div class="col-sm-9">
12
+ <%= number_field_tag :price_override, nil, :class => 'form-control' %>
13
+ </div>
14
+ </div>
15
+ <div class="form-group">
16
+ <div class="col-sm-offset-3 col-sm-9">
11
17
  <div class="radio">
12
18
  <%= label_tag :type_change do %>
13
19
  <%= radio_button_tag :type_change, 'DEFAULT', :checked => true %>
@@ -29,20 +35,20 @@
29
35
  </div>
30
36
  </div>
31
37
  <div class="form-group", id="form_requested_date" >
32
- <%= label_tag :requested_date, 'Change Date', :class => 'col-sm-2 control-label' %>
33
- <div class="col-sm-10">
38
+ <%= label_tag :requested_date, 'Change Date', :class => 'col-sm-3 control-label' %>
39
+ <div class="col-sm-9">
34
40
  <%= text_field_tag :requested_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
35
41
  </div>
36
42
  </div>
37
43
  <div class="form-group", id="form_policy">
38
- <%= label_tag :policy, 'Policy', :class => 'col-sm-2 control-label' %>
39
- <div class="col-sm-10">
44
+ <%= label_tag :policy, 'Policy', :class => 'col-sm-3 control-label' %>
45
+ <div class="col-sm-9">
40
46
  <%= select_tag :policy, options_for_select(['', 'IMMEDIATE', 'END_OF_TERM']), :class => 'form-control' %>
41
47
  <p class="help-block">Leave blank for default</p>
42
48
  </div>
43
49
  </div>
44
50
  <div class="form-group">
45
- <div class="col-sm-offset-2 col-sm-10">
51
+ <div class="col-sm-offset-3 col-sm-9">
46
52
  <%= submit_tag 'Save', :class => 'btn btn-default' %>
47
53
  </div>
48
54
  </div>
@@ -22,6 +22,12 @@
22
22
  <%= select_tag :plan_name, options_for_select(@plans), :class => 'form-control' %>
23
23
  </div>
24
24
  </div>
25
+ <div class="form-group">
26
+ <%= label_tag :price_override, 'Price Override', :class => 'col-sm-2 control-label' %>
27
+ <div class="col-sm-10">
28
+ <%= number_field_tag :price_override, nil, :class => 'form-control' %>
29
+ </div>
30
+ </div>
25
31
  <div class="form-group">
26
32
  <div class="col-sm-offset-2 col-sm-10">
27
33
  <div class="radio">
@@ -105,5 +105,10 @@
105
105
  { "orderable": false }
106
106
  ]
107
107
  });
108
+
109
+ $(".price-override-popover").popover({
110
+ container: 'body',
111
+ trigger: 'hover'
112
+ });
108
113
  });
109
114
  <% end %>
@@ -1,3 +1,3 @@
1
1
  module Kaui
2
- VERSION = '1.3.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -20,15 +20,4 @@ class Kaui::BundleTagsControllerTest < Kaui::FunctionalTestHelper
20
20
  assert_not_nil assigns(:tag_names)
21
21
  assert_not_nil assigns(:available_tags)
22
22
  end
23
-
24
- test 'should update tags' do
25
- post :update,
26
- :account_id => @account.account_id,
27
- :bundle_id => @bundle.bundle_id,
28
- :'tag_00000000-0000-0000-0000-000000000001' => 'AUTO_PAY_OFF',
29
- :'tag_00000000-0000-0000-0000-000000000005' => 'MANUAL_PAY',
30
- :'tag_00000000-0000-0000-0000-000000000003' => 'OVERDUE_ENFORCEMENT_OFF'
31
- assert_redirected_to account_bundles_path(@account.account_id)
32
- assert_equal 'Bundle tags successfully set', flash[:notice]
33
- end
34
23
  end
@@ -82,22 +82,21 @@ class Kaui::SubscriptionsControllerTest < Kaui::FunctionalTestHelper
82
82
  assert_response 200
83
83
  assert_not_nil assigns(:subscription)
84
84
  assert_not_nil assigns(:plans)
85
- assert_not_nil assigns(:current_plan)
86
85
  end
87
86
 
88
87
  test 'should handle errors during update' do
89
88
  post :update, :id => @bundle.subscriptions.first.subscription_id
90
- assert_redirected_to home_path
91
- assert_equal 'Required parameter missing: plan_name', flash[:error]
89
+ assert_redirected_to edit_subscription_path(@bundle.subscriptions.first.subscription_id)
90
+ assert_equal 'Error while changing subscription: param is missing or the value is empty: plan_name', flash[:error]
92
91
 
93
92
  subscription_id = SecureRandom.uuid.to_s
94
93
  post :update, :id => subscription_id, :plan_name => 'super-monthly'
95
- assert_redirected_to home_path
96
- assert_equal "Error while communicating with the Kill Bill server: Error 404: Object id=#{subscription_id} type=SUBSCRIPTION doesn't exist!", flash[:error]
94
+ assert_redirected_to edit_subscription_path(subscription_id)
95
+ assert_equal "Error while changing subscription: Error 404: Object id=#{subscription_id} type=SUBSCRIPTION doesn't exist!", flash[:error]
97
96
 
98
97
  post :update, :id => @bundle.subscriptions.first.subscription_id, :plan_name => 'not-exists'
99
- assert_redirected_to home_path
100
- assert_equal "Error while communicating with the Kill Bill server: Error 400: Could not find a plan matching spec: (plan: 'not-exists', product: 'undefined', billing period: 'undefined', pricelist 'undefined')", flash[:error]
98
+ assert_redirected_to edit_subscription_path(@bundle.subscriptions.first.subscription_id)
99
+ assert_equal "Error while changing subscription: Error 400: Could not find a plan matching spec: (plan: 'not-exists', product: 'undefined', billing period: 'undefined', pricelist 'undefined')", flash[:error]
101
100
  end
102
101
 
103
102
  test 'should update' do
@@ -170,4 +169,26 @@ class Kaui::SubscriptionsControllerTest < Kaui::FunctionalTestHelper
170
169
  assert_equal JSON[@response.body]['is_found'], true
171
170
  end
172
171
 
172
+ test 'should update with price override' do
173
+ post :update,
174
+ :id => @bundle.subscriptions.first.subscription_id,
175
+ :plan_name => 'super-monthly',
176
+ :price_override => 500
177
+ assert_redirected_to account_bundles_path(@bundle.subscriptions.first.account_id)
178
+ assert_equal 'Subscription plan successfully changed', flash[:notice]
179
+ end
180
+
181
+ test 'should create with price override' do
182
+ post :create,
183
+ :subscription => {
184
+ :account_id => @account.account_id,
185
+ :external_key => SecureRandom.uuid,
186
+ },
187
+ :price_override => 500,
188
+ :plan_name => 'standard-monthly'
189
+
190
+ assert_redirected_to account_bundles_path(@account.account_id)
191
+ assert_equal 'Subscription was successfully created', flash[:notice]
192
+ end
193
+
173
194
  end
@@ -14,6 +14,30 @@ class Kaui::AdminTenantTest < ActiveSupport::TestCase
14
14
  {"plugin_key":"payu-latam","plugin_name":"killbill-payu-latam","plugin_type":"ruby","installed":false},{"plugin_key":"payment-test","plugin_name":"killbill-payment-test","plugin_type":"ruby","installed":false},
15
15
  {"plugin_key":"securenet","plugin_name":"killbill-securenet","plugin_type":"ruby","installed":false},{"plugin_key":"stripe","plugin_name":"killbill-stripe","plugin_type":"ruby","installed":false},{"plugin_key":"zendesk","plugin_name":"killbill-zendesk","plugin_type":"ruby","installed":false}]'
16
16
 
17
+ test 'should not reformat raw config before upload' do
18
+ props = {"raw_config" => ":paypal_express:\r\n :signature: \"THISISAREALLYLONGSIGNATGURESTRING123\"\r\n :login: \"username-facilitator_domain.com\"\r\n :password: \"SUPERSECRETPW\""}
19
+ formatted = Kaui::AdminTenant.format_plugin_config('paypal_express', 'ruby', props)
20
+ expected=<<-EOS.chomp
21
+ :paypal_express:
22
+ :signature: "THISISAREALLYLONGSIGNATGURESTRING123"
23
+ :login: "username-facilitator_domain.com"
24
+ :password: "SUPERSECRETPW"
25
+ EOS
26
+ assert_equal expected, formatted
27
+ end
28
+
29
+ test 'should reformat ruby config before upload' do
30
+ props = {"login"=>"ljskf9\"0sdf'34%", "password"=>"lskdj\"f-12;sdf'[5%"}
31
+ formatted = Kaui::AdminTenant.format_plugin_config('securenet', 'ruby', props)
32
+ expected=<<-EOS
33
+ ---
34
+ :securenet:
35
+ :login: ljskf9"0sdf'34%
36
+ :password: lskdj"f-12;sdf'[5%
37
+ EOS
38
+ assert_equal expected, formatted
39
+ end
40
+
17
41
  test 'can split camel dash underscore space strings' do
18
42
  adminTenantController = Kaui::AdminTenantsController.new
19
43
 
@@ -36,7 +60,6 @@ class Kaui::AdminTenantTest < ActiveSupport::TestCase
36
60
  string = 'this-IsA string_to-split'
37
61
  splitted = adminTenantController.send(:split_camel_dash_underscore_space, string)
38
62
  assert_split(splitted)
39
-
40
63
  end
41
64
 
42
65
  test 'can do a fuzzy match of a plugin to suggest a plugin' do
@@ -71,7 +94,6 @@ class Kaui::AdminTenantTest < ActiveSupport::TestCase
71
94
  found_plugin, weights = adminTenantController.send(:fuzzy_match, plugin_name, plugins_info)
72
95
  assert_equal weights.size, 0
73
96
  assert_equal found_plugin[:plugin_name], 'killbill-avatax'
74
-
75
97
  end
76
98
 
77
99
  test 'should fetch proprietary plugin config' do
@@ -84,13 +106,12 @@ class Kaui::AdminTenantTest < ActiveSupport::TestCase
84
106
  plugin_config = 'key=value'
85
107
  Kaui::AdminTenant.upload_tenant_plugin_config(plugin_name, plugin_config, options[:username], nil, nil, options)
86
108
 
87
-
88
109
  plugins_config = Kaui::AdminTenant.get_tenant_plugin_config({}, options)
89
110
  assert_not_nil(plugins_config)
90
111
 
91
112
  plugin_info = plugins_config.split('::')
92
113
  assert_equal plugin_name, plugin_info[0]
93
- assert_equal plugin_config, plugin_info[1].gsub('raw_config=','')
114
+ assert_equal 'key=value|_raw=key=value', plugin_info[1].gsub('raw_config=','')
94
115
  end
95
116
 
96
117
  test 'should fetch plugin config' do
@@ -109,7 +130,6 @@ class Kaui::AdminTenantTest < ActiveSupport::TestCase
109
130
  plugin_config = Kaui::AdminTenant.format_plugin_config(plugin_key, 'ruby', plugin_properties)
110
131
  Kaui::AdminTenant.upload_tenant_plugin_config(plugin_name, plugin_config, options[:username], nil, nil, options)
111
132
 
112
-
113
133
  plugins_config = Kaui::AdminTenant.get_tenant_plugin_config({ :paypal_express => { 'type' => 'ruby',
114
134
  'artifact_id' => 'paypal-express-plugin'} }, options)
115
135
  assert_not_nil(plugins_config)
@@ -4,11 +4,16 @@ class Kaui::BaseTest < ActiveSupport::TestCase
4
4
 
5
5
  test 'can convert to money' do
6
6
  # Happy path
7
- %w(GBP MXN BRL EUR AUD USD CAD JPY).each do |currency|
7
+ %w(GBP MXN BRL EUR AUD USD CAD).each do |currency|
8
8
  money = Kaui::Base.to_money(12.42, currency)
9
9
  assert_equal 1242, money.cents
10
10
  assert_equal currency, money.currency.iso_code
11
11
  end
12
+ %w(JPY KRW).each do |currency|
13
+ money = Kaui::Base.to_money(12, currency)
14
+ assert_equal 12, money.cents
15
+ assert_equal currency, money.currency.iso_code
16
+ end
12
17
 
13
18
  # Edge cases
14
19
  bad_money = Kaui::Base.to_money(12.42, 'blahblah')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kaui
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Killbill core team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-09 00:00:00.000000000 Z
11
+ date: 2018-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails