kaui 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/app/assets/config/kaui_manifest.js +2 -44
  4. data/app/assets/javascripts/application.js +12 -0
  5. data/app/assets/javascripts/kaui/kaui.js +7 -452
  6. data/app/assets/javascripts/kaui/kaui_override.js +441 -0
  7. data/app/assets/stylesheets/application.css +23 -0
  8. data/app/assets/stylesheets/kaui/account.css +34 -0
  9. data/app/assets/stylesheets/kaui/audit.css +19 -0
  10. data/app/assets/stylesheets/kaui/common.css +550 -0
  11. data/app/assets/stylesheets/kaui/datatable.css +71 -0
  12. data/app/assets/stylesheets/kaui/header.css +129 -0
  13. data/app/assets/stylesheets/kaui/home.css +72 -0
  14. data/app/assets/stylesheets/kaui/invoice.css +37 -0
  15. data/app/assets/stylesheets/kaui/kaui.css +152 -0
  16. data/app/assets/stylesheets/kaui/overdue.css +7 -0
  17. data/app/assets/stylesheets/kaui/payment.css +28 -0
  18. data/app/assets/stylesheets/kaui/subscription.css +15 -0
  19. data/app/assets/stylesheets/kaui/tags.css +137 -0
  20. data/app/assets/stylesheets/kaui/timeline.css +5 -0
  21. data/app/assets/stylesheets/kaui/tooltip.css +16 -0
  22. data/app/controllers/kaui/account_tags_controller.rb +1 -1
  23. data/app/controllers/kaui/admin_allowed_users_controller.rb +1 -1
  24. data/app/controllers/kaui/admin_tenants_controller.rb +3 -3
  25. data/app/controllers/kaui/bundle_tags_controller.rb +1 -1
  26. data/app/controllers/kaui/engine_controller_util.rb +1 -1
  27. data/app/controllers/kaui/home_controller.rb +21 -12
  28. data/app/controllers/kaui/invoice_tags_controller.rb +1 -1
  29. data/app/controllers/kaui/invoices_controller.rb +6 -1
  30. data/app/controllers/kaui/payment_methods_controller.rb +1 -1
  31. data/app/controllers/kaui/subscriptions_controller.rb +9 -8
  32. data/app/controllers/kaui/transactions_controller.rb +1 -1
  33. data/app/helpers/kaui/object_helper.rb +16 -1
  34. data/app/models/kaui/admin_tenant.rb +1 -1
  35. data/app/models/kaui/catalog.rb +2 -2
  36. data/app/models/kaui/invoice_payment.rb +1 -1
  37. data/app/models/kaui/overdue.rb +2 -2
  38. data/app/models/kaui/tag.rb +2 -2
  39. data/app/models/kaui/tag_definition.rb +1 -1
  40. data/app/views/kaui/accounts/_billing_info.html.erb +2 -4
  41. data/app/views/kaui/accounts/_form.html.erb +3 -3
  42. data/app/views/kaui/accounts/index.html.erb +0 -1
  43. data/app/views/kaui/admin_tenants/new_overdue_config.html.erb +5 -5
  44. data/app/views/kaui/home/_advanced_search_modal.html.erb +22 -1
  45. data/app/views/kaui/invoices/show.html.erb +2 -1
  46. data/app/views/kaui/layouts/kaui_header.html.erb +2 -18
  47. data/app/views/kaui/refunds/_form.html.erb +50 -2
  48. data/app/views/kaui/subscriptions/_cancel_by_date_modal.html.erb +1 -1
  49. data/app/views/kaui/subscriptions/_edit_form.html.erb +1 -1
  50. data/app/views/kaui/subscriptions/_form.html.erb +1 -1
  51. data/app/views/kaui/subscriptions/edit_bcd.erb +1 -1
  52. data/app/views/kaui/tag_definitions/_form.html.erb +1 -2
  53. data/config/routes.rb +1 -0
  54. data/lib/kaui/engine.rb +1 -4
  55. data/lib/kaui/version.rb +1 -1
  56. data/lib/kaui.rb +10 -10
  57. metadata +29 -130
  58. data/app/assets/javascripts/jquery.spin.js +0 -76
  59. data/app/assets/javascripts/kaui_application.js +0 -25
  60. data/app/assets/javascripts/spin.js +0 -76
  61. data/app/assets/stylesheets/bootstrap_and_overrides.scss +0 -240
  62. data/app/assets/stylesheets/kaui/account.scss +0 -52
  63. data/app/assets/stylesheets/kaui/audit.scss +0 -42
  64. data/app/assets/stylesheets/kaui/common.scss +0 -765
  65. data/app/assets/stylesheets/kaui/datatable.scss +0 -115
  66. data/app/assets/stylesheets/kaui/header.scss +0 -197
  67. data/app/assets/stylesheets/kaui/home.scss +0 -89
  68. data/app/assets/stylesheets/kaui/invoice.scss +0 -58
  69. data/app/assets/stylesheets/kaui/kaui.scss +0 -265
  70. data/app/assets/stylesheets/kaui/kaui_bootstrap.scss +0 -3
  71. data/app/assets/stylesheets/kaui/overdue.scss +0 -11
  72. data/app/assets/stylesheets/kaui/payment.scss +0 -43
  73. data/app/assets/stylesheets/kaui/subscription.scss +0 -27
  74. data/app/assets/stylesheets/kaui/tags.scss +0 -208
  75. data/app/assets/stylesheets/kaui/timeline.scss +0 -7
  76. data/app/assets/stylesheets/kaui/tooltip.scss +0 -15
  77. data/app/assets/stylesheets/kaui_application.css +0 -12
@@ -52,15 +52,23 @@ module Kaui
52
52
  end
53
53
 
54
54
  def invoice_search(search_query, search_by = nil, fast = 0, options = {})
55
- if search_by == 'ID'
55
+ case search_by
56
+ when 'ID'
56
57
  begin
57
58
  invoice = Kaui::Invoice.find_by_id(search_query, 'NONE', options)
58
59
  redirect_to account_invoice_path(invoice.account_id, invoice.invoice_id) and return
59
60
  rescue KillBillClient::API::NotFound => _e
60
61
  search_error("No invoice matches \"#{search_query}\"")
61
62
  end
62
- elsif search_by == 'EXTERNAL_KEY'
63
- unsupported_external_key_search('INVOICE')
63
+ when 'EXTERNAL_KEY'
64
+ unsupported_search_field('INVOICE', search_by)
65
+ when 'NUMBER'
66
+ begin
67
+ invoice = Kaui::Invoice.find_by_number(search_query, 'NONE', options)
68
+ redirect_to account_invoice_path(invoice.account_id, invoice.invoice_id) and return
69
+ rescue KillBillClient::API::NotFound, KillBillClient::API::BadRequest => _e
70
+ search_error("No invoice matches \"#{search_query}\"")
71
+ end
64
72
  else
65
73
  invoice = Kaui::Invoice.list_or_search(search_query, 0, 1, options).first
66
74
  if invoice.blank?
@@ -157,7 +165,7 @@ module Kaui
157
165
  search_error("No credit matches \"#{search_query}\"")
158
166
  end
159
167
  else
160
- unsupported_external_key_search('CREDIT')
168
+ unsupported_search_field('CREDIT', search_by)
161
169
  end
162
170
  end
163
171
 
@@ -170,7 +178,7 @@ module Kaui
170
178
  redirect_to custom_fields_path(q: search_query, fast:)
171
179
  end
172
180
  else
173
- unsupported_external_key_search('CUSTOM FIELD')
181
+ unsupported_search_field('CUSTOM FIELD', search_by)
174
182
  end
175
183
  end
176
184
 
@@ -183,7 +191,7 @@ module Kaui
183
191
  search_error("No invoice payment matches \"#{search_query}\"")
184
192
  end
185
193
  else
186
- unsupported_external_key_search('INVOICE PAYMENT')
194
+ unsupported_search_field('INVOICE PAYMENT', search_by)
187
195
  end
188
196
  end
189
197
 
@@ -196,7 +204,7 @@ module Kaui
196
204
  search_error("No subscription matches \"#{search_query}\"")
197
205
  end
198
206
  else
199
- unsupported_external_key_search('SUBSCRIPTION')
207
+ unsupported_search_field('SUBSCRIPTION', search_by)
200
208
  end
201
209
  end
202
210
 
@@ -209,7 +217,7 @@ module Kaui
209
217
  redirect_to tags_path(q: search_query, fast:)
210
218
  end
211
219
  else
212
- unsupported_external_key_search('TAG')
220
+ unsupported_search_field('TAG', search_by)
213
221
  end
214
222
  end
215
223
 
@@ -222,7 +230,7 @@ module Kaui
222
230
  search_error("No tag definition matches \"#{search_query}\"")
223
231
  end
224
232
  elsif search_by == 'EXTERNAL_KEY'
225
- unsupported_external_key_search('TAG DEFINITION')
233
+ unsupported_search_field('TAG DEFINITION', search_by)
226
234
  else
227
235
  tag_definition = Kaui::TagDefinition.find_by_name(search_query, 'NONE', options)
228
236
  if tag_definition.blank?
@@ -238,8 +246,9 @@ module Kaui
238
246
  end
239
247
  end
240
248
 
241
- def unsupported_external_key_search(object_type)
242
- search_error("\"#{object_type}\": Search by \"EXTERNAL KEY\" is not supported.")
249
+ def unsupported_search_field(object_type, object_field)
250
+ field_name = object_field.gsub('_', ' ')
251
+ search_error("\"#{object_type}\": Search by \"#{field_name}\" is not supported.")
243
252
  end
244
253
 
245
254
  def search_error(message)
@@ -267,7 +276,7 @@ module Kaui
267
276
  '0'
268
277
  end
269
278
 
270
- search_error("\"#{search_by}\" is not a valid search by value") if !search_by.blank? && !%w[ID EXTERNAL_KEY].include?(search_by)
279
+ search_error("\"#{search_by}\" is not a valid search by value") if !search_by.blank? && !search_by.in?(Kaui::ObjectHelper::ADVANCED_SEARCH_OBJECT_FIELDS)
271
280
 
272
281
  [object_type, search_for, search_by, fast]
273
282
  end
@@ -18,7 +18,7 @@ module Kaui
18
18
  invoice_id = params.require(:invoice_id)
19
19
 
20
20
  tags = []
21
- params.each do |tag, _tag_name|
21
+ params.each_key do |tag|
22
22
  tag_info = tag.split('_')
23
23
  next if (tag_info.size != 2) || (tag_info[0] != 'tag')
24
24
 
@@ -39,7 +39,7 @@ module Kaui
39
39
  end
40
40
  formatter = lambda do |invoice|
41
41
  row = [view_context.link_to(invoice.invoice_number, view_context.url_for(controller: :invoices, action: :show, account_id: invoice.account_id, id: invoice.invoice_id))]
42
- row += Kaui.invoice_search_columns.call(invoice, view_context)[1]
42
+ row += Kaui.invoice_search_columns.call(invoice, view_context, cached_options_for_klient)[1]
43
43
  row
44
44
  end
45
45
  else
@@ -147,6 +147,11 @@ module Kaui
147
147
  redirect_to account_invoice_path(invoice.account_id, invoice.invoice_id)
148
148
  end
149
149
 
150
+ def restful_show_by_number
151
+ invoice = Kaui::Invoice.find_by_number(params.require(:number), 'NONE', options_for_klient)
152
+ redirect_to account_invoice_path(invoice.account_id, invoice.invoice_id)
153
+ end
154
+
150
155
  def show_html
151
156
  render html: Kaui::Invoice.as_html(params.require(:id), options_for_klient).html_safe
152
157
  end
@@ -47,7 +47,7 @@ module Kaui
47
47
  }
48
48
 
49
49
  @plugin_properties = begin
50
- params[:plugin_properties].values.reject { |item| (item['value'].blank? || item['key'].blank?) }
50
+ params[:plugin_properties].values.reject { |item| item['value'].blank? || item['key'].blank? }
51
51
  rescue StandardError
52
52
  @plugin_properties = nil
53
53
  end
@@ -193,10 +193,11 @@ module Kaui
193
193
  def update_tags
194
194
  subscription_id = params.require(:id)
195
195
  subscription = Kaui::Subscription.find_by_id(subscription_id, options_for_klient)
196
-
197
196
  tags = []
198
- params.each do |tag|
199
- tag_info = tag.split('_')
197
+ params.each_key do |key|
198
+ next unless key.include? 'tag'
199
+
200
+ tag_info = key.split('_')
200
201
  next if (tag_info.size != 2) || (tag_info[0] != 'tag')
201
202
 
202
203
  tags << tag_info[1]
@@ -210,7 +211,7 @@ module Kaui
210
211
 
211
212
  def lookup_bundle_and_plan_details(subscription, base_product_name = nil)
212
213
  if subscription.product_category == 'ADD_ON'
213
- bundle = Kaui::Bundle.find_by_id(@subscription.bundle_id, options_for_klient)
214
+ bundle = Kaui::Bundle.find_by_id(subscription.bundle_id, options_for_klient)
214
215
  if base_product_name.blank?
215
216
  bundle.subscriptions.each do |sub|
216
217
  if sub.product_category == 'BASE'
@@ -222,17 +223,17 @@ module Kaui
222
223
  plans_details = Kaui::Catalog.available_addons(base_product_name, subscription.account_id, options_for_klient)
223
224
  else
224
225
  bundle = nil
225
- plans_details = catalog_plans(subscription.product_category == 'BASE' ? nil : subscription.product_category)
226
+ plans_details = catalog_plans(subscription.product_category == 'BASE' ? nil : subscription.product_category, subscription.account_id)
226
227
  end
227
228
  [bundle, plans_details]
228
229
  end
229
230
 
230
- def catalog_plans(product_category = nil)
231
- return Kaui::Catalog.available_base_plans(@subscription.account_id, options_for_klient) if product_category == 'BASE'
231
+ def catalog_plans(product_category = nil, account_id = nil)
232
+ return Kaui::Catalog.available_base_plans(account_id, options_for_klient) if product_category == 'BASE'
232
233
 
233
234
  options = options_for_klient
234
235
 
235
- catalog = Kaui::Catalog.get_tenant_catalog_json(DateTime.now.to_s, @subscription.account_id, options)
236
+ catalog = Kaui::Catalog.get_tenant_catalog_json(DateTime.now.to_s, account_id, options)
236
237
  return [] if catalog.blank?
237
238
 
238
239
  plans = []
@@ -26,7 +26,7 @@ module Kaui
26
26
  def create
27
27
  transaction = Kaui::Transaction.new(params[:transaction].delete_if { |_key, value| value.blank? })
28
28
 
29
- plugin_properties = params[:plugin_properties].values.reject { |item| (item['value'].blank? || item['key'].blank?) } unless params[:plugin_properties].blank?
29
+ plugin_properties = params[:plugin_properties].values.reject { |item| item['value'].blank? || item['key'].blank? } unless params[:plugin_properties].blank?
30
30
  unless plugin_properties.blank?
31
31
  plugin_properties.map! do |property|
32
32
  KillBillClient::Model::PluginPropertyAttributes.new(property)
@@ -2,6 +2,13 @@
2
2
 
3
3
  module Kaui
4
4
  module ObjectHelper
5
+ ADVANCED_SEARCH_OBJECT_FIELDS = %w[ID EXTERNAL_KEY NUMBER].freeze
6
+ ADVANCED_SEARCH_OBJECT_FIELDS_MAP = {
7
+ # ID is supported by all object types, hence not listed.
8
+ EXTERNAL_KEY: %w[ACCOUNT PAYMENT TRANSACTION BUNDLE],
9
+ NUMBER: %w[INVOICE]
10
+ }.freeze
11
+
5
12
  # Because we don't have access to the account_id, we use the restful_show routes
6
13
  def url_for_object(object_id, object_type)
7
14
  case object_type
@@ -27,7 +34,15 @@ module Kaui
27
34
  end
28
35
 
29
36
  def object_types_for_advanced_search
30
- %i[ACCOUNT BUNDLE INVOICE CREDIT CUSTOM_FIELD INVOICE_PAYMENT INVOICE PAYMENT SUBSCRIPTION TRANSACTION TAG TAG_DEFINITION]
37
+ %i[ACCOUNT BUNDLE INVOICE CREDIT CUSTOM_FIELD INVOICE_PAYMENT PAYMENT SUBSCRIPTION TRANSACTION TAG TAG_DEFINITION]
38
+ end
39
+
40
+ def object_fields_for_advanced_search
41
+ [' '] + ADVANCED_SEARCH_OBJECT_FIELDS
42
+ end
43
+
44
+ def advanced_search_object_fields_map
45
+ ADVANCED_SEARCH_OBJECT_FIELDS_MAP
31
46
  end
32
47
  end
33
48
  end
@@ -33,7 +33,7 @@ module Kaui
33
33
 
34
34
  raw_tenant_config.each_with_object({}) do |e, hsh|
35
35
  # Strip prefix '/PLUGIN_CONFIG_'
36
- plugin_name = e.key.gsub!(/PLUGIN_CONFIG_/, '')
36
+ plugin_name = e.key.gsub!('PLUGIN_CONFIG_', '')
37
37
 
38
38
  # Construct simple hash with one property (first value)
39
39
  hsh[plugin_name] = e.values[0]
@@ -35,8 +35,8 @@ module Kaui
35
35
  raise e
36
36
  end
37
37
 
38
- def get_catalog_json(latest, requested_date, options)
39
- catalogs = get_tenant_catalog_json(requested_date, nil, options)
38
+ def get_catalog_json(latest, requested_date, account_id, options)
39
+ catalogs = get_tenant_catalog_json(requested_date, account_id, options)
40
40
  return catalogs.length.positive? ? catalogs[catalogs.length - 1] : nil if latest
41
41
 
42
42
  # Order by latest
@@ -21,7 +21,7 @@ module Kaui
21
21
  result.send("#{attr}=", raw_payment.send(attr))
22
22
  end
23
23
  # Use Kaui::Transaction to benefit from additional fields (e.g next_retry_date)
24
- original_transactions = (result.transactions || [])
24
+ original_transactions = result.transactions || []
25
25
  result.transactions = []
26
26
  original_transactions.each do |transaction|
27
27
  new_transaction = Kaui::Transaction.new
@@ -19,7 +19,7 @@ module Kaui
19
19
  state.subscription_cancellation_policy = nil
20
20
  else
21
21
  state.is_disable_entitlement = true
22
- state.subscription_cancellation_policy = state_model['subscription_cancellation_policy'].blank? ? :NONE : state_model['subscription_cancellation_policy'].to_s.gsub!(/POLICY_/, '')
22
+ state.subscription_cancellation_policy = state_model['subscription_cancellation_policy'].blank? ? :NONE : state_model['subscription_cancellation_policy'].to_s.gsub!('POLICY_', '')
23
23
  end
24
24
 
25
25
  if state_model['condition']
@@ -60,7 +60,7 @@ module Kaui
60
60
  attr_accessor :subscription_cancellation
61
61
  end
62
62
  state.subscription_cancellation = if state.is_disable_entitlement
63
- state.subscription_cancellation_policy ? "POLICY_#{state.subscription_cancellation_policy}".to_sym : :NONE
63
+ state.subscription_cancellation_policy ? :"POLICY_#{state.subscription_cancellation_policy}" : :NONE
64
64
  else
65
65
  :NONE
66
66
  end
@@ -13,12 +13,12 @@ module Kaui
13
13
  class << self
14
14
  %i[account bundle subscription invoice].each do |model|
15
15
  define_method "all_for_#{model}" do |model_id, included_deleted, audit, options|
16
- instance = Kaui.const_get(model.to_s.camelize).new("#{model}_id".to_sym => model_id)
16
+ instance = Kaui.const_get(model.to_s.camelize).new("#{model}_id": model_id)
17
17
  instance.tags(included_deleted, audit, options)
18
18
  end
19
19
 
20
20
  define_method "set_for_#{model}" do |model_id, tags, user, reason, comment, options|
21
- instance = Kaui.const_get(model.to_s.camelize).new("#{model}_id".to_sym => model_id)
21
+ instance = Kaui.const_get(model.to_s.camelize).new("#{model}_id": model_id)
22
22
  instance.set_tags(tags, user, reason, comment, options)
23
23
  end
24
24
  end
@@ -25,7 +25,7 @@ module Kaui
25
25
 
26
26
  ALL_OBJECT_TYPES.each do |object_type|
27
27
  define_singleton_method "all_for_#{object_type.downcase}" do |options_for_klient|
28
- (all('NONE', options_for_klient).delete_if { |tag_definition| !tag_definition.applicable_object_types.include?(object_type) || tag_definition.is_control_tag }).sort
28
+ (all('NONE', options_for_klient).delete_if { |tag_definition| !tag_definition.applicable_object_types.include?(object_type) }).sort
29
29
  end
30
30
  end
31
31
 
@@ -110,7 +110,7 @@
110
110
  <% end %>
111
111
  </table>
112
112
 
113
- <% if can? :trigger, Kaui::Invoice %>
113
+ <% if (can? :trigger, Kaui::Invoice) || (can? :dry_run, Kaui::Invoice) %>
114
114
  <div style="padding-bottom: 50px;">
115
115
  <%= form_tag kaui_engine.trigger_invoice_path(params.to_h), :method => :post do %>
116
116
  <div class="form-group">
@@ -118,13 +118,11 @@
118
118
  <div class="col-sm-3">
119
119
  <input class="form-control" id="target_date" name="target_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true">
120
120
  </div>
121
- <% if can? :dry_run, Kaui::Invoice %>
122
121
  <div style="width: 14.5%; float: left; padding: 0;">
123
122
  <%= label_tag :dry_run do %>
124
- <%= check_box_tag :dry_run, '1', true %>&nbsp;<small>Dry-run</small>
123
+ <%= check_box_tag :dry_run, '1', true, :disabled => !can?(:trigger, Kaui::Invoice) %>&nbsp;<small>Dry-run</small>
125
124
  <% end %>
126
125
  </div>
127
- <% end %>
128
126
  <div class="col-xs-1" style="padding: 0;">
129
127
  <%= button_tag '<i class="fa fa-magic"></i>'.html_safe, :class => 'btn btn-xs' %>
130
128
  </div>
@@ -45,7 +45,7 @@
45
45
  <div class="form-group">
46
46
  <%= f.label :bill_cycle_day_local, 'Bill cycle day', :class => 'col-sm-3 control-label' %>
47
47
  <div class="col-sm-9">
48
- <%= f.text_field :bill_cycle_day_local, :class => 'form-control' %>
48
+ <%= f.number_field :bill_cycle_day_local, :class => 'form-control', :min => 0, max: 31 %>
49
49
  </div>
50
50
  </div>
51
51
  <div class="form-group">
@@ -111,13 +111,13 @@
111
111
  <div class="form-group">
112
112
  <%= f.label :country, 'Country', :class => 'col-sm-3 control-label' %>
113
113
  <div class="col-sm-9">
114
- <%= f.country_select :country, {:priority_countries => %w(US CA), :selected => @account.country}, :class => 'form-control' %>
114
+ <%= f.country_select :country, {:priority_countries => %w(US CA), :selected => @account.country, :sort_provided => false}, :class => 'form-control' %>
115
115
  </div>
116
116
  </div>
117
117
  <div class="form-group">
118
118
  <%= f.label :phone, 'Phone', :class => 'col-sm-3 control-label' %>
119
119
  <div class="col-sm-9">
120
- <%= f.text_field :phone, :class => 'form-control' %>
120
+ <%= f.number_field :phone, :class => 'form-control' %>
121
121
  </div>
122
122
  </div>
123
123
  <div class="form-group">
@@ -65,7 +65,6 @@ $(document).ready(function() {
65
65
  <!-- When we don't know the total number of pages, we need to hide the legend and next button manually -->
66
66
  <% if @max_nb_records.nil? %>
67
67
  $('#accounts-table').on('draw.dt', function() {
68
- $.noConflict();
69
68
  var noMoreData = table.column(0)
70
69
  .data()
71
70
  .length == 0;
@@ -38,11 +38,11 @@
38
38
  <td><%= state_form.select :is_block_changes, options_for_select([true, false ], state.is_block_changes), :class => 'form-control' %></td>
39
39
  <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>
40
40
  <%= state_form.fields_for 'condition' do |condition| %>
41
- <td><%= condition.number_field :time_since_earliest_unpaid_invoice_equals_or_exceeds, :value => state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds.number %></td>
42
- <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>
43
- <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>
44
- <td><%= condition.number_field :number_of_unpaid_invoices_equals_or_exceeds, :value => state.condition.number_of_unpaid_invoices_equals_or_exceeds %></td>
45
- <td><%= condition.number_field :total_unpaid_invoice_balance_equals_or_exceeds, :step => :any, :value => state.condition.total_unpaid_invoice_balance_equals_or_exceeds %></td>
41
+ <td><%= condition.number_field :time_since_earliest_unpaid_invoice_equals_or_exceeds, :value => state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds&.number %></td>
42
+ <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>
43
+ <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>
44
+ <td><%= condition.number_field :number_of_unpaid_invoices_equals_or_exceeds, :value => state.condition&.number_of_unpaid_invoices_equals_or_exceeds %></td>
45
+ <td><%= condition.number_field :total_unpaid_invoice_balance_equals_or_exceeds, :step => :any, :value => state.condition&.total_unpaid_invoice_balance_equals_or_exceeds %></td>
46
46
  <% end %>
47
47
  <% end %>
48
48
  <% end %>
@@ -23,7 +23,7 @@
23
23
  <div class="form-group">
24
24
  <%= label_tag :search_by, 'Search by', :class => 'col-sm-4 control-label' %>
25
25
  <div class="col-sm-8">
26
- <%= select_tag :search_by, options_for_select(['', 'ID', 'EXTERNAL_KEY'],''), :class => 'form-control' %>
26
+ <%= select_tag :search_by, options_for_select(object_fields_for_advanced_search,''), :class => 'form-control' %>
27
27
  </div>
28
28
  </div>
29
29
  <div class="form-group">
@@ -68,13 +68,34 @@
68
68
  $('#advancedQuery').val(query);
69
69
  }
70
70
 
71
+ const searchByFieldsMap = <%= advanced_search_object_fields_map.to_json.html_safe %>;
72
+ function refresh_search_by() {
73
+ var objectType = $('#object_type').val();
74
+
75
+ // Clears the selected field if it's not supported by the selected object type
76
+ var searchBy = $('#search_by').val();
77
+ if (searchByFieldsMap[searchBy] && !searchByFieldsMap[searchBy].includes(objectType)) {
78
+ $('#search_by').val(' ');
79
+ refresh_query();
80
+ }
81
+
82
+ // Updates search options to only show fields supported by the selected object type
83
+ for (field in searchByFieldsMap) {
84
+ var isSupported = searchByFieldsMap[field].includes(objectType);
85
+ var fieldOption = $(`#search_by > option[value=${field}]`);
86
+ isSupported ? fieldOption.show() : fieldOption.hide();
87
+ }
88
+ }
89
+
71
90
  $('#search_for').keyup(function(){ refresh_query(); });
72
91
  $('#search_for').change(function(){ refresh_query(); });
73
92
  $('#object_type').change(function(){ refresh_query(); });
93
+ $('#object_type').change(function(){ refresh_search_by(); });
74
94
  $('#search_by').change(function(){ refresh_query(); });
75
95
  $('#fast').change(function(){ refresh_query(); });
76
96
 
77
97
  refresh_query();
98
+ refresh_search_by();
78
99
 
79
100
  });
80
101
  <% end %>
@@ -4,8 +4,9 @@
4
4
 
5
5
  <h1>
6
6
  Invoice <%= @invoice.invoice_number %>
7
- <% unless @invoice.invoice_number.blank? %>
7
+ <% if !@invoice.invoice_number.blank? %>
8
8
  <%= Kaui.customer_invoice_link.call(@invoice, self) %>
9
+ <%= Kaui.additional_invoice_links.call(@invoice, self) %>
9
10
  <% end %>
10
11
  </h1>
11
12
 
@@ -4,8 +4,8 @@
4
4
  <meta name="viewport" content="width=device-width, initial-scale=1">
5
5
 
6
6
  <title>Kaui</title>
7
- <%= stylesheet_link_tag 'kaui_application', :media => 'all' %>
8
-
7
+ <%= stylesheet_link_tag 'application', :media => 'all' %>
8
+ <%= javascript_include_tag 'application' %>
9
9
 
10
10
  <%= csrf_meta_tags %>
11
11
 
@@ -14,21 +14,5 @@
14
14
  <!--[if lt IE 9]>
15
15
  <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
16
16
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
17
-
18
17
  <![endif]-->
19
-
20
- <%= javascript_include_tag "routes" %>
21
- <%= javascript_include_tag "jquery" %>
22
- <%= javascript_include_tag "jquery-ui" %>
23
- <%= javascript_include_tag "popper" %>
24
- <%= javascript_include_tag "spin" %>
25
- <%= javascript_include_tag "jquery.spin" %>
26
- <%= javascript_include_tag "bootstrap-sprockets" %>
27
- <%= javascript_include_tag "bootstrap-datepicker" %>
28
- <%= javascript_include_tag "dataTables/jquery.dataTables" %>
29
- <%= javascript_include_tag "dataTables/bootstrap/3/jquery.dataTables.bootstrap" %>
30
- <%= javascript_include_tag "mustache" %>
31
- <%= javascript_include_tag "bootstrap-datepicker" %>
32
- <%= javascript_include_tag "kaui/kaui" %>
33
-  
34
18
  </head>
@@ -23,6 +23,13 @@
23
23
  </div>
24
24
 
25
25
  <div id="invoiceItems" style="display:none">
26
+ <div class="form-group">
27
+ <label class="col-sm-2 control-label"></label>
28
+ <div class="col-sm-10">
29
+ <input type="checkbox" id="selectAll">
30
+ <%="Select All" %>
31
+ </div>
32
+ </div>
26
33
  <% @invoice.items.each_with_index do |ii, index| %>
27
34
  <% if ii.amount > 0 %>
28
35
  <div id=<%= "div_#{ii.invoice_item_id}" %> class="form-group">
@@ -31,7 +38,7 @@
31
38
  <% bundle_result = @bundles.find { |bundle| bundle.bundle_id == ii.bundle_id } %>
32
39
  <div class="col-sm-10">
33
40
  <input type="checkbox" id=<%= "cb_adj_#{ii.invoice_item_id}" %>>
34
- <%= "Item #{index + 1} : #{ii.description} #{"(bundle #{bundle_result.external_key})" unless bundle_result.nil?}" %>
41
+ <%= Kaui.refund_invoice_description.call(index, ii, bundle_result) %>
35
42
  <%= text_field_tag "adjustments[#{ii.invoice_item_id}]", index, :id => "tf_adj_#{ii.invoice_item_id}", :value => ii.amount, :class => 'form-control' %>
36
43
  </div>
37
44
  </div>
@@ -144,9 +151,23 @@
144
151
  }
145
152
  validateRefundAmount();
146
153
  };
154
+ /*
155
+ * Check status of all items check-box check/uncheck status for select all chec-kbox
156
+ */
157
+ var checkSelectAllCheckboxStatus = function(){
158
+ var checkedCheckBoxCount = 0;
159
+ var checkboxList = $('input').filter(function() { return this.id.match(/cb_adj_/) });
160
+ var checkboxListCount = checkboxList.length;
161
+ checkboxList.each(function() {
162
+ if ($(this).is(':checked')) {
163
+ checkedCheckBoxCount++;
164
+ }
165
+ });
166
+ $("#selectAll").prop('checked', checkedCheckBoxCount == checkboxListCount);
167
+ }
147
168
 
148
169
  /*
149
- * When clicking checkbox for each item, disable amount and recompute total refund amount
170
+ * When clicking checkbox for each item, disable amount, Changes SelectAll status and recompute total refund amount
150
171
  */
151
172
  var onClickInvoiceItemAdjustment = function(event) {
152
173
  var id = checkboxToTextId(this.id);
@@ -158,8 +179,30 @@
158
179
  }
159
180
  recomputeRefundAmountAndValidateAmount();
160
181
  validateInvoiceItemAmount(id);
182
+ checkSelectAllCheckboxStatus();
161
183
  };
162
184
 
185
+ /*
186
+ * When clicking select all checkbox - select each items, disable amount and recompute total refund amount
187
+ */
188
+ var onClickInvoiceItemsSelectAll = function(event){
189
+ var isChecked = $('#selectAll').prop('checked');
190
+ $('input').filter(function() { return this.id.match(/tf_adj_/) }).each(function() {
191
+ var textFieldId = this.id;
192
+ var textFieldIdElm = $("#" + textFieldId);
193
+ var checkboxId = textToCheckboxId(this.id);
194
+ if(checkboxId){
195
+ $("#" + checkboxId).prop('checked', isChecked);
196
+ textFieldIdElm.prop('readonly', isChecked);
197
+ if(!isChecked){
198
+ textFieldIdElm.attr('value', textFieldIdElm.attr('originalValue'));
199
+ }
200
+ validateInvoiceItemAmount(textFieldId);
201
+ }
202
+ });
203
+ recomputeRefundAmountAndValidateAmount();
204
+ }
205
+
163
206
  /*
164
207
  * When selecting Invoice Adjustment or No Adjustment, hide invoice items and recompute refund Amount
165
208
  */
@@ -213,6 +256,11 @@
213
256
  return this.id.match(/cb_adj_/);
214
257
  }).click(onClickInvoiceItemAdjustment);
215
258
 
259
+ /*
260
+ * Attach handler onClickInvoiceItemsSelectAll for selectall checkbox
261
+ */
262
+ $('#selectAll').click(onClickInvoiceItemsSelectAll);
263
+
216
264
  /*
217
265
  * Attach handler for all invoice item text areas so that:
218
266
  * - We disable posting form when pressing 'ENTER'
@@ -10,7 +10,7 @@
10
10
  <div class="form-group">
11
11
  <%= label_tag :requested_date, 'Date', :class => 'col-sm-2 control-label' %>
12
12
  <div class="col-sm-10">
13
- <%= text_field_tag :requested_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
13
+ <input class="form-control" value="<%=Date.parse(Time.now.to_s).to_s%>" name="requested_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true">
14
14
  </div>
15
15
  </div>
16
16
  <div class="form-group">
@@ -37,7 +37,7 @@
37
37
  <div class="form-group", id="form_requested_date" >
38
38
  <%= label_tag :requested_date, 'Change Date', :class => 'col-sm-3 control-label' %>
39
39
  <div class="col-sm-9">
40
- <%= text_field_tag :requested_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
40
+ <input class="form-control" value="<%=Date.parse(Time.now.to_s).to_s%>" name="requested_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true">
41
41
  </div>
42
42
  </div>
43
43
  <div class="form-group", id="form_policy">
@@ -59,7 +59,7 @@
59
59
  <div class="form-group" id="form_requested_date">
60
60
  <%= label_tag :requested_date, 'Date', :class => 'col-sm-2 control-label' %>
61
61
  <div class="col-sm-10">
62
- <%= text_field_tag :requested_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
62
+ <input class="form-control" value="<%=Date.parse(Time.now.to_s).to_s%>" name="requested_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true">
63
63
  </div>
64
64
  </div>
65
65
  <div class="form-group">
@@ -15,7 +15,7 @@
15
15
  <div class="form-group" , id="form_effective_from_date">
16
16
  <%= label_tag :effective_from_date, 'Effective Date', :class => 'col-sm-2 control-label' %>
17
17
  <div class="col-sm-10">
18
- <%= text_field_tag :effective_from_date, Date.parse(Time.now.to_s).to_s, :class => 'form-control date-picker' %>
18
+ <input class="form-control" value="<%=Date.parse(Time.now.to_s).to_s%>" id="effective_from_date" name="effective_from_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true">
19
19
  </div>
20
20
  </div>
21
21
  <div class="form-group">
@@ -10,8 +10,7 @@
10
10
  <div class="col-sm-10" id="object_types">
11
11
  <% (@tag_definition.applicable_object_types || [:account]).each_with_index do |object_type, index| %>
12
12
  <div id="object_type_line_<%= index %>">
13
- <%= f.select "applicable_object_types[#{index}]", object_types,
14
- {:selected => object_type, :id => "object_type_#{index}"}, :class => 'form-control tag-definition-select' %>
13
+ <%= select_tag "tag_definition[applicable_object_types][#{index}]", options_for_select(object_types), {:selected => object_type, :id => "object_type_#{index}", :class => 'form-control tag-definition-select'} %>
15
14
  <a class='btn btn-xs' href="javascript:void(0);" onclick="delete_object_type(this);" id="delete_object_type_<%= index %>" <%= "style='display: none;'".html_safe if index == 0 %>>
16
15
  <%= '<i class="fa fa-times"></i>'.html_safe %>
17
16
  </a>
data/config/routes.rb CHANGED
@@ -98,6 +98,7 @@ Kaui::Engine.routes.draw do
98
98
  scope '/invoices' do
99
99
  match '/pagination' => 'invoices#pagination', :via => :get, :as => 'invoices_pagination'
100
100
  match '/:id/show_html' => 'invoices#show_html', :via => :get, :as => 'show_html_invoice'
101
+ match '/:number' => 'invoices#restful_show_by_number', :via => :get, :constraints => { number: /\d+/ }
101
102
  match '/:id' => 'invoices#restful_show', :via => :get, :as => 'invoice'
102
103
  match '/commit' => 'invoices#commit_invoice', :via => :post, :as => 'commit_invoice'
103
104
  match '/void' => 'invoices#void_invoice', :via => :delete, :as => 'void_invoice'