kaui 0.14.2 → 0.15.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/Gemfile +1 -1
  4. data/README.md +23 -6
  5. data/app/assets/javascripts/application.js +1 -0
  6. data/app/assets/stylesheets/application.css +1 -0
  7. data/app/assets/stylesheets/kaui/header.less +11 -4
  8. data/app/controllers/kaui/accounts_controller.rb +1 -1
  9. data/app/controllers/kaui/admin_tenants_controller.rb +113 -18
  10. data/app/controllers/kaui/bundles_controller.rb +0 -2
  11. data/app/controllers/kaui/chargebacks_controller.rb +1 -1
  12. data/app/controllers/kaui/charges_controller.rb +1 -1
  13. data/app/controllers/kaui/engine_controller.rb +5 -2
  14. data/app/controllers/kaui/invoices_controller.rb +1 -1
  15. data/app/controllers/kaui/payment_methods_controller.rb +1 -1
  16. data/app/controllers/kaui/payments_controller.rb +20 -2
  17. data/app/controllers/kaui/refunds_controller.rb +1 -1
  18. data/app/controllers/kaui/subscriptions_controller.rb +8 -13
  19. data/app/helpers/kaui/account_helper.rb +9 -0
  20. data/app/helpers/kaui/subscription_helper.rb +47 -21
  21. data/app/models/kaui/admin_tenant.rb +96 -2
  22. data/app/models/kaui/bundle.rb +1 -1
  23. data/app/models/kaui/catalog.rb +138 -0
  24. data/app/models/kaui/invoice_payment.rb +39 -5
  25. data/app/models/kaui/overdue.rb +85 -0
  26. data/app/models/kaui/simple_plan.rb +4 -0
  27. data/app/models/kaui/transaction.rb +2 -0
  28. data/app/views/kaui/account_timelines/show.html.erb +2 -1
  29. data/app/views/kaui/accounts/_billing_info.html.erb +18 -20
  30. data/app/views/kaui/accounts/_payment_methods.html.erb +11 -16
  31. data/app/views/kaui/admin_tenants/_form_catalog_translation.erb +24 -0
  32. data/app/views/kaui/admin_tenants/_form_invoice_template.erb +28 -0
  33. data/app/views/kaui/admin_tenants/_form_invoice_translation.erb +24 -0
  34. data/app/views/kaui/admin_tenants/_form_plugin_config.erb +199 -0
  35. data/app/views/kaui/admin_tenants/_show_catalog.erb +25 -0
  36. data/app/views/kaui/admin_tenants/_show_catalog_simple.erb +96 -0
  37. data/app/views/kaui/admin_tenants/_show_catalog_xml.erb +44 -0
  38. data/app/views/kaui/admin_tenants/_show_overdue.erb +89 -0
  39. data/app/views/kaui/admin_tenants/new_catalog.html.erb +176 -0
  40. data/app/views/kaui/admin_tenants/new_overdue_config.html.erb +138 -0
  41. data/app/views/kaui/admin_tenants/new_plan_currency.html.erb +34 -0
  42. data/app/views/kaui/admin_tenants/show.html.erb +20 -127
  43. data/app/views/kaui/bundles/index.html.erb +1 -1
  44. data/app/views/kaui/invoice_items/_edit_form.html.erb +1 -0
  45. data/app/views/kaui/layouts/kaui_account_navbar.html.erb +2 -0
  46. data/app/views/kaui/payments/_payment_table.html.erb +16 -5
  47. data/app/views/kaui/refunds/_form.html.erb +4 -5
  48. data/app/views/kaui/subscriptions/_edit_form.html.erb +48 -1
  49. data/app/views/kaui/subscriptions/_form.html.erb +36 -0
  50. data/app/views/kaui/subscriptions/_subscriptions_table.html.erb +12 -9
  51. data/config/routes.rb +8 -0
  52. data/db/ddl.sql +5 -2
  53. data/kaui.gemspec +3 -2
  54. data/lib/kaui/engine.rb +1 -0
  55. data/lib/kaui/version.rb +1 -1
  56. data/test/dummy/config/environments/development.rb +1 -1
  57. data/test/dummy/db/schema.rb +5 -5
  58. data/test/functional/kaui/account_emails_controller_test.rb +2 -2
  59. data/test/functional/kaui/accounts_controller_test.rb +4 -4
  60. data/test/functional/kaui/admin_tenants_controller_test.rb +5 -1
  61. data/test/functional/kaui/bundle_tags_controller_test.rb +1 -1
  62. data/test/functional/kaui/bundles_controller_test.rb +4 -4
  63. data/test/functional/kaui/chargebacks_controller_test.rb +2 -2
  64. data/test/functional/kaui/charges_controller_test.rb +2 -2
  65. data/test/functional/kaui/credits_controller_test.rb +2 -2
  66. data/test/functional/kaui/invoice_items_controller_test.rb +6 -4
  67. data/test/functional/kaui/invoices_controller_test.rb +2 -2
  68. data/test/functional/kaui/payments_controller_test.rb +4 -0
  69. data/test/functional/kaui/refunds_controller_test.rb +2 -2
  70. data/test/functional/kaui/subscriptions_controller_test.rb +6 -6
  71. data/test/killbill_test_helper.rb +7 -7
  72. metadata +47 -8
  73. data/db/migrate/20130812155313_devise_create_kaui_users.rb +0 -12
  74. data/db/migrate/20150109214021_create_kaui_tenants.rb +0 -12
  75. data/db/migrate/20150112232813_create_kaui_allowed_users.rb +0 -19
@@ -0,0 +1,138 @@
1
+ <div id="overdue_config_simple">
2
+
3
+ <div>
4
+ <h1>Overdue Configuration
5
+ <a class='btn btn-xs' href="javascript:void(0);" onclick="switch_overdue_xml_config();">Enable Advanced Configuration
6
+ (Upload XML)</a>
7
+ </h1>
8
+ </div>
9
+
10
+ <%= form_for @overdue, :url => {:action => :modify_overdue_config}, :html => {:class => 'form-horizontal'} do |f| %>
11
+
12
+ <a class='btn btn-xs' href="javascript:void(0);" onclick="overdue_new_state();" id="new_state"><%= '<i class="fa fa-plus-square"></i>'.html_safe + " new overdue states" %></a>
13
+
14
+ <table id="existing-overdue-config-for-tenants" class="table table-condensed">
15
+ <thead>
16
+ <tr>
17
+ <th>Name</th>
18
+ <th>External Message</th>
19
+ <th>Block Subscription Changes</th>
20
+ <th>Subscription Cancellation</th>
21
+ <th>Days since earliest unpaid invoice</th>
22
+ <th>Tag inclusion</th>
23
+ <th>Tag exclusion</th>
24
+ <th></th>
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ <%= f.hidden_field_tag(:id, @tenant.id) %>
29
+
30
+ <% @overdue.overdue_states.reverse.each_with_index do |state, idx| %>
31
+ <tr class="overdue_state_<%= state %>" id="tr_state_<%= idx %>">
32
+ <%= f.fields_for 'states[]', state do |state_form| %>
33
+ <td><%= state_form.text_field :name %></td>
34
+ <td><%= state_form.text_field :external_message %></td>
35
+ <td><%= state_form.select :block_changes, options_for_select([true, false ], state.block_changes), :class => 'form-control' %></td>
36
+ <td><%= state_form.select :subscription_cancellation_policy, options_for_select([:NONE, :POLICY_NONE, :POLICY_IMMEDIATE, :POLICY_END_OF_TERM], state.subscription_cancellation), :class => 'form-control' %></td>
37
+ <%= state_form.fields_for 'condition' do |condition| %>
38
+ <td><%= condition.text_field :time_since_earliest_unpaid_invoice_equals_or_exceeds, :value => state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds.number %></td>
39
+ <td><%= condition.select :control_tag_inclusion, options_for_select([:NONE, :AUTO_PAY_OFF, :AUTO_INVOICING_OFF, :OVERDUE_ENFORCEMENT_OFF, :MANUAL_PAY, :TEST, :PARTNER], state.condition.control_tag_inclusion), :class => 'form-control' %></td>
40
+ <td><%= condition.select :control_tag_exclusion, options_for_select([:NONE, :AUTO_PAY_OFF, :AUTO_INVOICING_OFF, :OVERDUE_ENFORCEMENT_OFF, :MANUAL_PAY, :TEST, :PARTNER], state.condition.control_tag_exclusion), :class => 'form-control'%></td>
41
+ <% end %>
42
+ <% end %>
43
+ <td><a class='btn btn-xs' href="javascript:void(0);" onclick="overdue_delete_state(this);" id="delete_state_<%= idx %>"><%= '<i class="fa fa-times"></i>'.html_safe %></a></td>
44
+ </tr>
45
+ <% end %>
46
+ </tbody>
47
+ </table>
48
+ <div class="form-group">
49
+ <div class="col-sm-offset-3 col-sm-9">
50
+ <%= submit_tag 'Save', :class => 'btn btn-default' %>
51
+ </div>
52
+ </div>
53
+ <% end %>
54
+ </div>
55
+
56
+
57
+ <div id="overdue_config_xml">
58
+ <hr/>
59
+ <h1>Upload Overdue XML Config
60
+ <a class='btn btn-xs' href="javascript:void(0);" onclick="switch_overdue_basic_config();">Enable Simple View</a>
61
+ </h1>
62
+ <% if can? :config_upload, Kaui::AdminTenant %>
63
+ <%= form_tag({:action => :upload_overdue_config}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
64
+ <%= hidden_field_tag(:id, @tenant.id) %>
65
+
66
+ <div class="form-group">
67
+ <div class="col-sm-10">
68
+ <%= file_field_tag 'overdue', :class => 'form-control' %>
69
+ </div>
70
+ </div>
71
+ <div class="form-group">
72
+ <div class="col-sm-10">
73
+ <%= submit_tag 'Upload', :class => 'btn btn-default' %>
74
+ </div>
75
+ </div>
76
+ <% end %>
77
+ <% else %>
78
+ You don't have the permission to upload the XML config
79
+ <% end %>
80
+ </div>
81
+
82
+
83
+ <%= javascript_tag do %>
84
+
85
+
86
+ function switch_overdue_xml_config() {
87
+ $('#overdue_config_simple').hide();
88
+ $('#overdue_config_xml').show();
89
+ }
90
+
91
+ function switch_overdue_basic_config() {
92
+ $('#overdue_config_xml').hide();
93
+ $('#overdue_config_simple').show();
94
+ }
95
+
96
+
97
+ function overdue_new_state() {
98
+ /* Compute max index value to assign new rows with unsued index */
99
+ var max_idx = $.map($('[id^=delete_state_]'), function(e, i) {
100
+ return e.id.split("delete_state_")[1] }
101
+ ).sort(function(a, b) {
102
+ return b - a
103
+ })[0];
104
+
105
+ /* Clone existing row and reset id based on max_idx */
106
+ var row = $('#existing-overdue-config-for-tenants tbody>tr:last').clone(true);
107
+ var row_idx = (parseInt(max_idx) + 1).toString();
108
+ row.attr('id', "tr_state_" + row_idx);
109
+ row.children("td:last").children('a').attr('id', "delete_state_" + row_idx);
110
+
111
+ /* Attach rom into dom */
112
+ row.insertAfter('#existing-overdue-config-for-tenants tbody>tr:last');
113
+
114
+ /* Also reset the disabled state */
115
+ $('#' + row.attr('id') + ' :input').each( function() {
116
+ $(this).prop('disabled', false); }
117
+ );
118
+
119
+ /* The cloned version may need to be displayed */
120
+ row.show();
121
+ }
122
+
123
+ function overdue_delete_state(obj) {
124
+ var idx = obj.id.split("delete_state_")[1];
125
+ /* Disable the entry in the form */
126
+ $("#tr_state_" + idx + " :input").each( function() {
127
+ $(this).prop('disabled', true); }
128
+ );
129
+ /* Hide the table row */
130
+ $("#tr_state_" + idx).hide();
131
+ };
132
+
133
+ $(document).ready(function() {
134
+ switch_overdue_basic_config();
135
+ });
136
+
137
+
138
+ <% end %>
@@ -0,0 +1,34 @@
1
+ <div id="catalog_simple">
2
+
3
+ <div>
4
+ <h1>Catalog (Add Plan Currency)
5
+ </h1>
6
+ </div>
7
+ <%= form_for @simple_plan, :url => {:action => :create_simple_plan}, :html => {:class => 'form-horizontal'} do |f| %>
8
+
9
+ <%= f.hidden_field_tag(:id, @tenant.id) %>
10
+ <div class="form-group">
11
+ <%= f.label :plan_id, 'Plan ID', :class => 'col-sm-3 control-label' %>
12
+ <div class="col-sm-4">
13
+ <%= f.text_field :plan_id, :class => 'form-control' %>
14
+ </div>
15
+ </div>
16
+ <div class="form-group">
17
+ <%= f.label :amount, 'Amount', :class => 'col-sm-3 control-label' %>
18
+ <div class="col-sm-4">
19
+ <%= f.text_field :amount, :class => 'form-control' %>
20
+ </div>
21
+ </div>
22
+ <div class="form-group">
23
+ <%= f.label :currency, 'Currency', :class => 'col-sm-3 control-label' %>
24
+ <div class="col-sm-4">
25
+ <%= f.select :currency, currencies, {:selected => 'USD'}, :class => 'form-control' %>
26
+ </div>
27
+ </div>
28
+ <div class="form-group">
29
+ <div class="col-sm-offset-3 col-sm-9">
30
+ <%= submit_tag 'Save', :class => 'btn btn-default' %>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ </div>
@@ -61,133 +61,26 @@
61
61
  <% end %>
62
62
  <% end %>
63
63
 
64
- <% if can? :config_upload, Kaui::AdminTenant %>
65
- <h3>Tenant operations</h3>
66
-
67
- <%= form_tag({:action => :upload_catalog}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
68
- <%= hidden_field_tag(:id, @tenant.id) %>
69
-
70
- <div class="form-group">
71
- <%= label_tag :catalog, 'Catalog', :class => 'col-sm-2 control-label' %>
72
- <div class="col-sm-10">
73
- <%= file_field_tag 'catalog', :class => 'form-control' %>
74
- </div>
75
- </div>
76
- <div class="form-group">
77
- <div class="col-sm-offset-2 col-sm-10">
78
- <%= submit_tag 'Upload', :class => 'btn btn-default' %>
79
- </div>
80
- </div>
81
- <% end %>
82
- <hr/>
83
- <%= form_tag({:action => :upload_overdue_config}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
84
- <%= hidden_field_tag(:id, @tenant.id) %>
85
-
86
- <div class="form-group">
87
- <%= label_tag :overdue, 'Overdue Config', :class => 'col-sm-2 control-label' %>
88
- <div class="col-sm-10">
89
- <%= file_field_tag 'overdue', :class => 'form-control' %>
90
- </div>
91
- </div>
92
- <div class="form-group">
93
- <div class="col-sm-offset-2 col-sm-10">
94
- <%= submit_tag 'Upload', :class => 'btn btn-default' %>
95
- </div>
96
- </div>
97
- <% end %>
98
- <hr/>
99
- <%= form_tag({:action => :upload_invoice_template}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
100
- <%= hidden_field_tag(:id, @tenant.id) %>
101
-
102
- <div class="form-group">
103
- <%= label_tag :invoice_template, 'Invoice template', :class => 'col-sm-2 control-label' %>
104
- <div class="col-sm-10">
105
- <%= file_field_tag 'invoice_template', :class => 'form-control' %>
106
- </div>
107
- </div>
108
- <div class="form-group">
109
- <div class="col-sm-offset-2 col-sm-10">
110
- <div class="checkbox">
111
- <label>
112
- <%= check_box_tag :manual_pay %>
113
- <span>Manual Pay</span>
114
- </label>
115
- </div>
116
- </div>
117
- </div>
118
- <div class="form-group">
119
- <div class="col-sm-offset-2 col-sm-10">
120
- <%= submit_tag 'Upload', :class => 'btn btn-default' %>
121
- </div>
122
- </div>
123
- <% end %>
124
- <hr/>
125
- <%= form_tag({:action => :upload_invoice_translation}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
126
- <%= hidden_field_tag(:id, @tenant.id) %>
127
-
128
- <div class="form-group">
129
- <%= label_tag :invoice_translation, 'Invoice translation', :class => 'col-sm-2 control-label' %>
130
- <div class="col-sm-10">
131
- <%= file_field_tag 'invoice_translation', :class => 'form-control' %>
132
- </div>
133
- </div>
134
- <div class="form-group">
135
- <%= label_tag :translation_locale, 'Locale', :class => 'col-sm-2 control-label' %>
136
- <div class="col-sm-10">
137
- <%= text_field_tag :translation_locale, nil, :class => 'form-control' %>
138
- </div>
139
- </div>
140
- <div class="form-group">
141
- <div class="col-sm-offset-2 col-sm-10">
142
- <%= submit_tag 'Upload', :class => 'btn btn-default' %>
143
- </div>
144
- </div>
145
- <% end %>
146
- <hr/>
147
- <%= form_tag({:action => :upload_catalog_translation}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
148
- <%= hidden_field_tag(:id, @tenant.id) %>
149
-
150
- <div class="form-group">
151
- <%= label_tag :catalog_translation, 'Catalog translation', :class => 'col-sm-2 control-label' %>
152
- <div class="col-sm-10">
153
- <%= file_field_tag 'catalog_translation', :class => 'form-control' %>
154
- </div>
155
- </div>
156
- <div class="form-group">
157
- <%= label_tag :translation_locale, 'Locale', :class => 'col-sm-2 control-label' %>
158
- <div class="col-sm-10">
159
- <%= text_field_tag :translation_locale, nil, :class => 'form-control' %>
160
- </div>
161
- </div>
162
- <div class="form-group">
163
- <div class="col-sm-offset-2 col-sm-10">
164
- <%= submit_tag 'Upload', :class => 'btn btn-default' %>
165
- </div>
166
- </div>
167
- <% end %>
168
- <hr/>
169
- <%= form_tag({:action => :upload_plugin_config}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
170
- <%= hidden_field_tag(:id, @tenant.id) %>
171
-
172
- <div class="form-group">
173
- <%= label_tag :plugin_config, 'Plugin config', :class => 'col-sm-2 control-label' %>
174
- <div class="col-sm-10">
175
- <%= file_field_tag 'plugin_config', :class => 'form-control' %>
176
- </div>
177
- </div>
178
- <div class="form-group">
179
- <%= label_tag :plugin_name, 'Plugin name', :class => 'col-sm-2 control-label' %>
180
- <div class="col-sm-10">
181
- <%= text_field_tag :plugin_name, nil, :class => 'form-control' %>
182
- </div>
183
- </div>
184
- <div class="form-group">
185
- <div class="col-sm-offset-2 col-sm-10">
186
- <%= submit_tag 'Upload', :class => 'btn btn-default' %>
187
- </div>
188
- </div>
189
- <% end %>
190
- <% end %>
64
+ <div class="container">
65
+ <ul class="nav nav-tabs">
66
+ <li class="nav active"><a href="#CatalogShow" data-toggle="tab">Catalog Show</a></li>
67
+ <li class="nav"><a href="#OverdueShow" data-toggle="tab">Overdue Show</a></li>
68
+ <li class="nav"><a href="#InvoiceTemplate" data-toggle="tab">Invoice Template</a></li>
69
+ <li class="nav"><a href="#InvoiceTranslation" data-toggle="tab">Invoice Translation</a></li>
70
+ <li class="nav"><a href="#CatalogTranslation" data-toggle="tab">Catalog Translation</a></li>
71
+ <li class="nav"><a href="#PluginConfig" data-toggle="tab">Plugin Config</a></li>
72
+ </ul>
73
+
74
+ <!-- Tab panes -->
75
+ <div class="tab-content">
76
+ <%= render :partial => 'show_catalog' %>
77
+ <%= render :partial => 'show_overdue' %>
78
+ <%= render :partial => 'form_invoice_template' %>
79
+ <%= render :partial => 'form_invoice_translation' %>
80
+ <%= render :partial => 'form_catalog_translation' %>
81
+ <%= render :partial => 'form_plugin_config' %>
82
+ </div>
83
+ </div>
191
84
 
192
85
  <%= javascript_tag do %>
193
86
  $(document).ready(function() {
@@ -43,7 +43,7 @@
43
43
  </div>
44
44
  </div>
45
45
 
46
- <% if !is_cancelled?(@base_subscription[bundle.bundle_id]) && (can?(:create, Kaui::Subscription) || can?(:transfer, Kaui::Subscription)) %>
46
+ <% if !is_subscription_cancelled?(@base_subscription[bundle.bundle_id]) && (can?(:create, Kaui::Subscription) || can?(:transfer, Kaui::Subscription)) %>
47
47
  <div class="tag-select" onclick="void(0)">
48
48
  <span><i class="fa fa-gift"></i><i class="fa fa-caret-down"></i></span>
49
49
 
@@ -2,6 +2,7 @@
2
2
  <%= f.hidden_field :invoice_id %>
3
3
  <%= f.hidden_field :invoice_item_id %>
4
4
  <%= f.hidden_field :account_id %>
5
+ <%= f.hidden_field :currency %>
5
6
 
6
7
  <div class="form-group">
7
8
  <%= f.label :amount, 'Item amount', :class => 'col-sm-2 control-label' %>
@@ -1,6 +1,8 @@
1
1
  <div class="title-nav-area">
2
2
 
3
3
  <div class="container">
4
+ <p><%= pretty_account_identifier %></p>
5
+
4
6
  <%= link_to 'Account', kaui_engine.account_path(params[:account_id]), :class => (params[:controller].ends_with?('accounts') ? 'current' : 'non-current') %>
5
7
  <%= link_to 'Subscriptions', kaui_engine.account_bundles_path(params[:account_id]), :class => (params[:controller].ends_with?('bundles') ? 'current' : 'non-current') %>
6
8
  <%= link_to 'Invoices', kaui_engine.account_invoices_path(params[:account_id]), :class => (params[:controller].ends_with?('invoices') ? 'current' : 'non-current') %>
@@ -93,11 +93,22 @@
93
93
  <td><%= transaction.gateway_error_code %></td>
94
94
  <td><%= transaction.gateway_error_msg %></td>
95
95
  <td>
96
- <span
97
- <% if transaction.status != 'SUCCESS' %>class='alert-danger'
98
- <% else %>class='alert-success' <% end %>>
99
- <%= transaction.status %>
100
- </span>
96
+ <ul style="list-style: none">
97
+ <li>
98
+ <span <% if transaction.status != 'SUCCESS' %>class='alert-danger'<% else %>class='alert-success' <% end %>>
99
+ <%= transaction.status %>
100
+ </span>
101
+ </li>
102
+ <% if transaction.next_retry_date %>
103
+ <li>
104
+ Scheduled retry:
105
+ <%= format_date(transaction.next_retry_date) %>
106
+ <% if can? :trigger, Kaui::Payment %>
107
+ <%= link_to '<i class="fa fa-times"></i>'.html_safe, kaui_engine.payment_cancel_scheduled_payment_path(payment.payment_id, :account_id => payment.account_id, :transaction_external_key => transaction.transaction_external_key), :method => :delete %>
108
+ <% end %>
109
+ </li>
110
+ <% end %>
111
+ </ul>
101
112
  </td>
102
113
  </tr>
103
114
  <% end %>
@@ -98,10 +98,10 @@
98
98
  if (Number($("#refund_amount").attr('value')) > <%= @payment.purchased_amount %> ||
99
99
  Number($("#refund_amount").attr('value')) <= 0) {
100
100
  setClassForElement("#div_refund_amount", "form-group error");
101
- $("#submit").prop('disabled', true);
101
+ $('#new_kill_bill_client_model_invoice_item :submit').prop('disabled', true);
102
102
  } else {
103
103
  setClassForElement("#div_refund_amount", "form-group");
104
- $("#submit").prop('disabled', false);
104
+ $('#new_kill_bill_client_model_invoice_item :submit').prop('disabled', false);
105
105
  }
106
106
  };
107
107
 
@@ -109,6 +109,7 @@
109
109
  * Disabled unwanted invoice item at the time we submit the form
110
110
  */
111
111
  var disableNonCheckedInvoiceItem = function() {
112
+
112
113
  $('input').filter(function() {
113
114
  return this.id.match(/cb_adj_/);
114
115
  }).each(function() {
@@ -196,15 +197,13 @@
196
197
  * If doing invoice Item adjustment, disable entries that were not selected, so the controllers does not
197
198
  * get them
198
199
  */
199
- $("#submit").click(disableNonCheckedInvoiceItem);
200
+ $('#new_kill_bill_client_model_invoice_item :submit').mousedown(disableNonCheckedInvoiceItem);
200
201
 
201
202
  /*
202
203
  * Adjustment type handlers
203
204
  */
204
205
  $("#adjustment_type_noInvoiceAdjustment")
205
206
  .click(onClickWithInvoiceOrNoAdjustment);
206
- $("#adjustment_type_invoiceAdjustment")
207
- .click(onClickWithInvoiceOrNoAdjustment);
208
207
  $("#adjustment_type_invoiceItemAdjustment")
209
208
  .click(onClickWithInvoiceItemAdjustment);
210
209
 
@@ -5,13 +5,36 @@
5
5
  <%= select_tag :plan_name, options_for_select(@plans), :class => 'form-control' %>
6
6
  </div>
7
7
  </div>
8
+
8
9
  <div class="form-group">
10
+ <div class="col-sm-offset-2 col-sm-10">
11
+ <div class="radio">
12
+ <%= label_tag :type_change do %>
13
+ <%= radio_button_tag :type_change, 'IMM', :checked => true %>
14
+ Immediate Change
15
+ <% end %>
16
+ </div>
17
+ <div class="radio">
18
+ <%= label_tag :type_change do %>
19
+ <%= radio_button_tag :type_change, 'POLICY' %>
20
+ Specify Policy
21
+ <% end %>
22
+ </div>
23
+ <div class="radio">
24
+ <%= label_tag :type_change do %>
25
+ <%= radio_button_tag :type_change, 'DATE' %>
26
+ Specify a date
27
+ <% end %>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <div class="form-group", id="form_requested_date" >
9
32
  <%= label_tag :requested_date, 'Change Date', :class => 'col-sm-2 control-label' %>
10
33
  <div class="col-sm-10">
11
34
  <%= text_field_tag :requested_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
12
35
  </div>
13
36
  </div>
14
- <div class="form-group">
37
+ <div class="form-group", id="form_policy">
15
38
  <%= label_tag :policy, 'Policy', :class => 'col-sm-2 control-label' %>
16
39
  <div class="col-sm-10">
17
40
  <%= select_tag :policy, options_for_select(['', 'IMMEDIATE', 'END_OF_TERM']), :class => 'form-control' %>
@@ -24,3 +47,27 @@
24
47
  </div>
25
48
  </div>
26
49
  <% end %>
50
+
51
+ <%= javascript_tag do %>
52
+
53
+ function onTypeChange() {
54
+ var value = $("input[type=radio]:checked").val();
55
+ if (value == "IMM") {
56
+ $("#form_requested_date").hide();
57
+ $("#form_policy").hide();
58
+ } else if (value == "POLICY") {
59
+ $("#form_requested_date").hide();
60
+ $("#form_policy").show();
61
+ } else if (value == "DATE") {
62
+ $("#form_policy").hide();
63
+ $("#form_requested_date").show();
64
+ }
65
+ }
66
+
67
+ $(document).ready(function() {
68
+ onTypeChange();
69
+ $( "input[type=radio]").on("click", function() {
70
+ onTypeChange();
71
+ });
72
+ });
73
+ <% end %>
@@ -26,6 +26,22 @@
26
26
  </div>
27
27
  <% end %>
28
28
  <div class="form-group">
29
+ <div class="col-sm-offset-2 col-sm-10">
30
+ <div class="radio">
31
+ <%= label_tag :type_change do %>
32
+ <%= radio_button_tag :type_change, 'IMM', :checked => true %>
33
+ Immediate Creation
34
+ <% end %>
35
+ </div>
36
+ <div class="radio">
37
+ <%= label_tag :type_change do %>
38
+ <%= radio_button_tag :type_change, 'DATE' %>
39
+ Specify a date
40
+ <% end %>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div class="form-group" id="form_requested_date">
29
45
  <%= label_tag :requested_date, 'Date', :class => 'col-sm-2 control-label' %>
30
46
  <div class="col-sm-10">
31
47
  <%= text_field_tag :requested_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
@@ -37,3 +53,23 @@
37
53
  </div>
38
54
  </div>
39
55
  <% end %>
56
+
57
+
58
+ <%= javascript_tag do %>
59
+
60
+ function onTypeChange() {
61
+ var value = $("input[type=radio]:checked").val();
62
+ if (value == "IMM") {
63
+ $("#form_requested_date").hide();
64
+ } else if (value == "DATE") {
65
+ $("#form_requested_date").show();
66
+ }
67
+ }
68
+
69
+ $(document).ready(function() {
70
+ onTypeChange();
71
+ $( "input[type=radio]").on("click", function() {
72
+ onTypeChange();
73
+ });
74
+ });
75
+ <% end %>
@@ -3,6 +3,7 @@
3
3
  <tr>
4
4
  <th>Product category</th>
5
5
  <th>Product name</th>
6
+ <th>Phase type</th>
6
7
  <th>Start date</th>
7
8
  <th>Charged through date</th>
8
9
  <th>Notes</th>
@@ -11,16 +12,17 @@
11
12
  </thead>
12
13
  <tbody>
13
14
  <% (bundle.subscriptions || []).each do |sub| %>
14
- <tr class="<%= is_cancelled?(sub) ? 'expired' : 'non-expired' %>">
15
- <td><%= humanized_product_category(sub) %></td>
16
- <td><%= humanized_full_product_name(sub) %></td>
17
- <td><%= humanized_start_date(sub, account) %></td>
18
- <td><%= humanized_charged_through_date(sub, account) %></td>
19
- <td><%= humanized_cancelled_date(sub, account) %></td>
15
+ <tr class="<%= is_subscription_cancelled?(sub) ? 'expired' : 'non-expired' %>">
16
+ <td><%= humanized_subscription_product_category(sub) %></td>
17
+ <td><%= humanized_subscription_full_product_name(sub) %></td>
18
+ <td><%= humanized_subscription_phase_type(sub) %></td>
19
+ <td><%= humanized_subscription_start_date(sub, account) %></td>
20
+ <td><%= humanized_subscription_charged_through_date(sub, account) %></td>
21
+ <td><%= humanized_subscription_cancelled_date(sub, account) %></td>
20
22
  <td class="text-center">
21
- <% if is_future_cancelled?(sub) %>
23
+ <% if is_subscription_future_cancelled?(sub) %>
22
24
  <%= link_to 'Reinstate', kaui_engine.reinstate_subscription_path(:id => sub.subscription_id), :method => :put, :class => 'btn btn-xs' %>
23
- <% elsif !is_cancelled?(sub) %>
25
+ <% elsif !is_subscription_cancelled?(sub) %>
24
26
  <% if can? :change_plan, Kaui::Subscription %>
25
27
  <%= link_to 'Change', kaui_engine.edit_subscription_path(sub.subscription_id), :class => 'btn btn-xs' %>
26
28
  <% end %>
@@ -50,13 +52,14 @@
50
52
  $('#subscriptions_<%= bundle.bundle_id %>').dataTable({
51
53
  "dom": "t",
52
54
  "paging": false,
53
- "order": [[ 2, "asc" ]],
55
+ "order": [[ 3, "asc" ]],
54
56
  "columns": [
55
57
  null,
56
58
  null,
57
59
  null,
58
60
  null,
59
61
  null,
62
+ null,
60
63
  { "orderable": false }
61
64
  ]
62
65
  });
data/config/routes.rb CHANGED
@@ -75,6 +75,7 @@ Kaui::Engine.routes.draw do
75
75
  scope '/payments' do
76
76
  match '/pagination' => 'payments#pagination', :via => :get, :as => 'payments_pagination'
77
77
  match '/:id' => 'payments#restful_show', :via => :get, :as => 'payment'
78
+ match '/:id/cancel_scheduled_payment' => 'payments#cancel_scheduled_payment', :via => :delete, :as => 'payment_cancel_scheduled_payment'
78
79
  end
79
80
 
80
81
  scope '/bundles' do
@@ -117,7 +118,14 @@ Kaui::Engine.routes.draw do
117
118
 
118
119
  resources :admin_tenants, :only => [ :index, :new, :create, :show ]
119
120
  scope '/admin_tenants' do
121
+ match '/:id/new_catalog' => 'admin_tenants#new_catalog', :via => :get, :as => 'admin_tenant_new_catalog'
122
+ match '/:id/new_plan_currency' => 'admin_tenants#new_plan_currency', :via => :get, :as => 'admin_tenant_new_plan_currency'
123
+ match '/:id/new_overdue_config' => 'admin_tenants#new_overdue_config', :via => :get, :as => 'admin_tenant_new_overdue_config'
120
124
  match '/upload_catalog' => 'admin_tenants#upload_catalog', :via => :post, :as => 'admin_tenant_upload_catalog'
125
+ match '/display_catalog_xml' => 'admin_tenants#display_catalog_xml', :via => :post, :as => 'admin_tenant_display_catalog_xml'
126
+ match '/display_overdue_xml' => 'admin_tenants#display_overdue_xml', :via => :post, :as => 'admin_tenant_display_overdue_xml'
127
+ match '/create_simple_plan' => 'admin_tenants#create_simple_plan', :via => :post, :as => 'admin_tenant_create_simple_plan'
128
+ match '/modify_overdue_config' => 'admin_tenants#modify_overdue_config', :via => :post, :as => 'admin_tenant_modify_overdue_config'
121
129
  match '/upload_overdue_config' => 'admin_tenants#upload_overdue_config', :via => :post, :as => 'admin_tenant_upload_overdue_config'
122
130
  match '/upload_invoice_template' => 'admin_tenants#upload_invoice_template', :via => :post, :as => 'admin_tenant_upload_invoice_template'
123
131
  match '/upload_invoice_translation' => 'admin_tenants#upload_invoice_translation', :via => :post, :as => 'admin_tenant_upload_invoice_translation'
data/db/ddl.sql CHANGED
@@ -10,13 +10,16 @@ CREATE TABLE `kaui_users` (
10
10
 
11
11
  CREATE TABLE `kaui_tenants` (
12
12
  `id` int(11) NOT NULL AUTO_INCREMENT,
13
- `name` varchar(255) DEFAULT NULL,
13
+ `name` varchar(255) NOT NULL,
14
14
  `kb_tenant_id` varchar(255) DEFAULT NULL,
15
15
  `api_key` varchar(255) DEFAULT NULL,
16
16
  `encrypted_api_secret` varchar(255) DEFAULT NULL,
17
17
  `created_at` datetime NOT NULL,
18
18
  `updated_at` datetime NOT NULL,
19
- PRIMARY KEY (`id`)
19
+ PRIMARY KEY (`id`),
20
+ UNIQUE KEY `kaui_tenants_kb_name` (`name`),
21
+ UNIQUE KEY `kaui_tenants_kb_tenant_id` (`kb_tenant_id`),
22
+ UNIQUE KEY `kaui_tenants_kb_api_key` (`api_key`)
20
23
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
21
24
 
22
25
  CREATE TABLE `kaui_allowed_users` (
data/kaui.gemspec CHANGED
@@ -29,10 +29,11 @@ Gem::Specification.new do |s|
29
29
 
30
30
  s.add_dependency 'js-routes', '~> 1.1'
31
31
  s.add_dependency 'jquery-rails', '~> 3.0.4'
32
+ s.add_dependency 'jquery-ui-rails', '~> 5.0.5'
32
33
  s.add_dependency 'jquery-datatables-rails', '~> 3.3.0'
33
34
  s.add_dependency 'money-rails', '~> 1.3.0'
34
35
  s.add_dependency 'd3_rails', '~> 3.2.8'
35
- s.add_dependency 'killbill-client', '~> 0.22'
36
+ s.add_dependency 'killbill-client', '~> 1.0'
36
37
  s.add_dependency 'twitter-bootstrap-rails', '~> 3.2.0'
37
38
  s.add_dependency 'bootstrap-datepicker-rails', '~> 1.4.0'
38
39
  s.add_dependency 'devise', '~> 3.4.1'
@@ -42,7 +43,7 @@ Gem::Specification.new do |s|
42
43
  s.add_dependency 'sass-rails', '~> 5.0.2'
43
44
  s.add_dependency 'less-rails', '~> 2.7.0'
44
45
  s.add_dependency 'concurrent-ruby', '~> 1.0.0.pre1'
45
-
46
+ s.add_dependency 'sprockets-rails', '2.3.3'
46
47
  s.add_development_dependency 'fakeweb', '~> 1.3'
47
48
  s.add_development_dependency 'multi_json', '~> 1.11'
48
49
  s.add_development_dependency 'rake', '>= 0.8.7'