kaui 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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