kaui 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/kaui/kaui.js +118 -11
- data/app/assets/stylesheets/kaui/common.less +91 -6
- data/app/assets/stylesheets/kaui/payment.less +1 -0
- data/app/controllers/kaui/account_children_controller.rb +1 -4
- data/app/controllers/kaui/accounts_controller.rb +4 -7
- data/app/controllers/kaui/admin_allowed_users_controller.rb +24 -7
- data/app/controllers/kaui/admin_tenants_controller.rb +59 -20
- data/app/controllers/kaui/audit_logs_controller.rb +3 -2
- data/app/controllers/kaui/charges_controller.rb +1 -1
- data/app/controllers/kaui/credits_controller.rb +1 -1
- data/app/controllers/kaui/home_controller.rb +273 -10
- data/app/controllers/kaui/invoice_items_controller.rb +1 -1
- data/app/controllers/kaui/invoices_controller.rb +3 -3
- data/app/controllers/kaui/payments_controller.rb +5 -3
- data/app/controllers/kaui/refunds_controller.rb +2 -2
- data/app/controllers/kaui/subscriptions_controller.rb +2 -1
- data/app/helpers/kaui/object_helper.rb +4 -0
- data/app/helpers/kaui/plugin_helper.rb +36 -20
- data/app/helpers/kaui/uuid_helper.rb +9 -0
- data/app/models/kaui/admin.rb +3 -1
- data/app/models/kaui/admin_tenant.rb +58 -10
- data/app/models/kaui/allowed_user.rb +1 -0
- data/app/models/kaui/catalog.rb +2 -2
- data/app/models/kaui/credit.rb +0 -2
- data/app/models/kaui/overdue.rb +5 -5
- data/app/views/kaui/account_children/index.html.erb +3 -3
- data/app/views/kaui/accounts/_account_info.html.erb +45 -91
- data/app/views/kaui/accounts/_billing_info.html.erb +12 -8
- data/app/views/kaui/accounts/_parent.html.erb +1 -1
- data/app/views/kaui/accounts/_payment_methods.html.erb +1 -1
- data/app/views/kaui/accounts/_personal_info.html.erb +74 -0
- data/app/views/kaui/accounts/index.html.erb +4 -4
- data/app/views/kaui/accounts/show.html.erb +9 -3
- data/app/views/kaui/admin_allowed_users/_form.html.erb +38 -10
- data/app/views/kaui/admin_tenants/_form_plugin_config.erb +82 -17
- data/app/views/kaui/admin_tenants/_show_catalog_simple.erb +11 -3
- data/app/views/kaui/admin_tenants/_show_overdue.erb +4 -4
- data/app/views/kaui/admin_tenants/_tenant_details.html.erb +7 -1
- data/app/views/kaui/admin_tenants/new_overdue_config.html.erb +1 -1
- data/app/views/kaui/audit_logs/_show_history_modal.html.erb +1 -1
- data/app/views/kaui/audit_logs/index.html.erb +4 -0
- data/app/views/kaui/home/_advanced_search_modal.html.erb +80 -0
- data/app/views/kaui/home/index.html.erb +18 -5
- data/app/views/kaui/invoices/show.html.erb +7 -1
- data/app/views/kaui/layouts/kaui_flash.html.erb +14 -3
- data/app/views/kaui/layouts/kaui_navbar.html.erb +11 -9
- data/app/views/kaui/payments/_form.html.erb +8 -10
- data/app/views/kaui/payments/_payment_table.html.erb +40 -37
- data/app/views/kaui/payments/index.html.erb +1 -0
- data/app/views/kaui/payments/show.html.erb +5 -7
- data/app/views/kaui/queues/index.html.erb +22 -4
- data/app/views/kaui/subscriptions/_subscriptions_table.html.erb +1 -1
- data/app/views/kaui/tag_definitions/index.html.erb +1 -1
- data/config/routes.rb +2 -0
- data/lib/kaui/version.rb +1 -1
- data/test/functional/kaui/accounts_controller_test.rb +35 -0
- data/test/functional/kaui/admin_allowed_users_controller_test.rb +55 -2
- data/test/functional/kaui/admin_tenants_controller_test.rb +67 -6
- data/test/functional/kaui/home_controller_test.rb +389 -15
- data/test/functional/kaui/subscriptions_controller_test.rb +1 -1
- data/test/killbill_test_helper.rb +2 -2
- data/test/unit/helpers/kaui/uuid_helper_test.rb +16 -0
- data/test/unit/kaui/admin_tenant_test.rb +49 -0
- metadata +6 -4
- data/test/unit/kaui/uuid_helper_test.rb +0 -10
@@ -6,5 +6,14 @@ module Kaui
|
|
6
6
|
split = uuid.split('-')
|
7
7
|
split[0] + '-...-' + split[4]
|
8
8
|
end
|
9
|
+
|
10
|
+
def object_id_popover(object_id, placement = 'right', title = nil)
|
11
|
+
content_tag(:span, truncate_uuid(object_id),
|
12
|
+
id: "#{object_id}-popover", class: 'object-id-popover', title: title,
|
13
|
+
data: {
|
14
|
+
id: object_id,
|
15
|
+
placement: placement,
|
16
|
+
} )
|
17
|
+
end
|
9
18
|
end
|
10
19
|
end
|
data/app/models/kaui/admin.rb
CHANGED
@@ -63,19 +63,23 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
|
|
63
63
|
|
64
64
|
# Extract killbill key for oss plugins based on convention 'killbill-KEY'
|
65
65
|
plugin_key = killbill_key.gsub(/killbill-/, '') if killbill_key.start_with?('killbill-')
|
66
|
+
|
66
67
|
# hack:: rewrite key, to allow the ui to find the right configuration inputs
|
67
|
-
plugin_key = rewrite_plugin_key(plugin_key)
|
68
|
-
# If such key exists, lookup in plugin directory
|
69
|
-
|
70
|
-
#
|
71
|
-
|
72
|
-
|
73
|
-
# Deserialize config based on type
|
74
|
-
if plugin_type == :ruby
|
68
|
+
plugin_key = rewrite_plugin_key(plugin_key) unless plugin_key.nil?
|
69
|
+
# If such key exists, lookup in plugin directory to see if is an official plugin
|
70
|
+
is_an_official_plugin = !plugin_key.nil? && !plugin_directory[plugin_key.to_sym].blank?
|
71
|
+
# Deserialize config based on string possible format, if exist in the official repository
|
72
|
+
if is_an_official_plugin && is_yaml?(e.values[0])
|
75
73
|
yml = YAML.load(e.values[0])
|
76
74
|
# Hash of properties
|
77
|
-
|
78
|
-
|
75
|
+
# is plugin key part of the yaml?
|
76
|
+
if yml[plugin_key.to_sym].blank?
|
77
|
+
# if not set it as raw
|
78
|
+
hsh[plugin_key] = {:raw_config => e.values[0]}
|
79
|
+
else
|
80
|
+
hsh[plugin_key] = yml[plugin_key.to_sym]
|
81
|
+
end
|
82
|
+
elsif is_an_official_plugin && is_kv?(e.values[0])
|
79
83
|
# Construct hash of properties based on java properties (k1=v1\nk2=v2\n...)
|
80
84
|
hsh[plugin_key] = e.values[0].split("\n").inject({}) do |h, p0|
|
81
85
|
k, v = p0.split('=');
|
@@ -107,6 +111,7 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
|
|
107
111
|
return nil unless props.present?
|
108
112
|
if plugin_type == 'ruby'
|
109
113
|
require 'yaml'
|
114
|
+
props = reformat_plugin_config(plugin_type, props)
|
110
115
|
hsh = {}
|
111
116
|
hsh[plugin_key.to_sym] = {}
|
112
117
|
props.each do |k,v|
|
@@ -115,6 +120,7 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
|
|
115
120
|
hsh[plugin_key.to_sym]
|
116
121
|
hsh.to_yaml
|
117
122
|
elsif plugin_type == 'java'
|
123
|
+
props = reformat_plugin_config(plugin_type, props)
|
118
124
|
res = ""
|
119
125
|
props.each do |k, v|
|
120
126
|
res = "#{res}#{k.to_s}=#{v.to_s}\n"
|
@@ -125,6 +131,20 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
|
|
125
131
|
end
|
126
132
|
end
|
127
133
|
|
134
|
+
def reformat_plugin_config(plugin_type, props)
|
135
|
+
unless props['raw_config'].blank?
|
136
|
+
new_props = {}
|
137
|
+
props['raw_config'].split("\n").each do |p|
|
138
|
+
line = p.split('=')
|
139
|
+
new_props[line[0]] = line[1].blank? ? '' : line[1].delete("\r")
|
140
|
+
end
|
141
|
+
|
142
|
+
return new_props
|
143
|
+
end
|
144
|
+
|
145
|
+
props
|
146
|
+
end
|
147
|
+
|
128
148
|
# hack when the plugin name after killbill is not the same as the plugin key, this mainly affects ruby plugin configuration,
|
129
149
|
# as it use the key to retrieve the configuration.
|
130
150
|
def rewrite_plugin_key(plugin_key)
|
@@ -132,9 +152,37 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
|
|
132
152
|
'paypal_express'
|
133
153
|
elsif plugin_key.start_with?('firstdata')
|
134
154
|
'firstdata_e4'
|
155
|
+
elsif plugin_key.start_with?('bridge')
|
156
|
+
'payment_bridge'
|
157
|
+
elsif plugin_key.start_with?('payu-latam')
|
158
|
+
'payu_latam'
|
135
159
|
else
|
136
160
|
"#{plugin_key}"
|
137
161
|
end
|
138
162
|
end
|
163
|
+
|
164
|
+
# checks if string could be parse as yaml
|
165
|
+
def is_yaml?(candidate_string)
|
166
|
+
is_yaml = false
|
167
|
+
return is_yaml if candidate_string.blank?
|
168
|
+
|
169
|
+
begin
|
170
|
+
is_yaml = !!YAML::load(candidate_string)
|
171
|
+
is_yaml = is_yaml && YAML.load(candidate_string).instance_of?(Hash)
|
172
|
+
rescue
|
173
|
+
is_yaml = false
|
174
|
+
end
|
175
|
+
|
176
|
+
is_yaml
|
177
|
+
end
|
178
|
+
|
179
|
+
# checks if string could be parse as key value pair
|
180
|
+
def is_kv?(candidate_string)
|
181
|
+
return false if candidate_string.blank? || is_yaml?(candidate_string)
|
182
|
+
lines = candidate_string.split("\n")
|
183
|
+
return false if lines.blank?
|
184
|
+
|
185
|
+
lines.all? { |kv| kv.split('=').count >= 1 }
|
186
|
+
end
|
139
187
|
end
|
140
188
|
end
|
data/app/models/kaui/catalog.rb
CHANGED
@@ -6,7 +6,7 @@ class Kaui::Catalog < KillBillClient::Model::Catalog
|
|
6
6
|
|
7
7
|
def get_catalog_json(latest, requested_date, options)
|
8
8
|
|
9
|
-
catalogs = KillBillClient::Model::Catalog.
|
9
|
+
catalogs = KillBillClient::Model::Catalog.get_tenant_catalog_json(requested_date, options)
|
10
10
|
return catalogs.length > 0 ? catalogs[catalogs.length - 1] : nil if latest
|
11
11
|
|
12
12
|
# Order by latest
|
@@ -38,7 +38,7 @@ class Kaui::Catalog < KillBillClient::Model::Catalog
|
|
38
38
|
|
39
39
|
def get_catalog_xml(requested_date, options)
|
40
40
|
|
41
|
-
catalog_xml = KillBillClient::Model::Catalog.
|
41
|
+
catalog_xml = KillBillClient::Model::Catalog.get_tenant_catalog_xml(requested_date, options)
|
42
42
|
|
43
43
|
parsed_catalog = parse_catalog_xml(catalog_xml)
|
44
44
|
|
data/app/models/kaui/credit.rb
CHANGED
data/app/models/kaui/overdue.rb
CHANGED
@@ -14,12 +14,12 @@ class Kaui::Overdue < KillBillClient::Model::Overdue
|
|
14
14
|
state.auto_reevaluation_interval_days = nil
|
15
15
|
state.external_message = state_model["external_message"]
|
16
16
|
state.is_clear_state = state_model["is_clear_state"].nil? ? false : state_model["is_clear_state"]
|
17
|
-
state.
|
17
|
+
state.is_block_changes = state_model["is_block_changes"]
|
18
18
|
if state_model["subscription_cancellation_policy"] == :NONE.to_s
|
19
|
-
state.
|
19
|
+
state.is_disable_entitlement = false
|
20
20
|
state.subscription_cancellation_policy = nil
|
21
21
|
else
|
22
|
-
state.
|
22
|
+
state.is_disable_entitlement = true
|
23
23
|
state.subscription_cancellation_policy = state_model["subscription_cancellation_policy"].blank? ? :NONE : state_model["subscription_cancellation_policy"].to_s.gsub!(/POLICY_/, '')
|
24
24
|
end
|
25
25
|
|
@@ -45,7 +45,7 @@ class Kaui::Overdue < KillBillClient::Model::Overdue
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def get_overdue_json(options)
|
48
|
-
result = KillBillClient::Model::Overdue.
|
48
|
+
result = KillBillClient::Model::Overdue.get_tenant_overdue_config_json(options)
|
49
49
|
class << result
|
50
50
|
attr_accessor :has_states
|
51
51
|
end
|
@@ -55,7 +55,7 @@ class Kaui::Overdue < KillBillClient::Model::Overdue
|
|
55
55
|
class << state
|
56
56
|
attr_accessor :subscription_cancellation
|
57
57
|
end
|
58
|
-
if state.
|
58
|
+
if state.is_disable_entitlement
|
59
59
|
state.subscription_cancellation = state.subscription_cancellation_policy ? "POLICY_#{state.subscription_cancellation_policy}".to_sym : :NONE
|
60
60
|
else
|
61
61
|
state.subscription_cancellation = :NONE
|
@@ -7,12 +7,9 @@
|
|
7
7
|
<table id="account-children-table" class="table table-condensed mobile-data">
|
8
8
|
<thead>
|
9
9
|
<tr>
|
10
|
-
<th>Name</th>
|
11
10
|
<th>ID</th>
|
12
11
|
<th>External key</th>
|
13
12
|
<th>Balance</th>
|
14
|
-
<th>City</th>
|
15
|
-
<th>Country</th>
|
16
13
|
</tr>
|
17
14
|
</thead>
|
18
15
|
<tbody>
|
@@ -41,6 +38,9 @@ $(document).ready(function() {
|
|
41
38
|
"infoCallback": function( settings, start, end, max, total, pre ) {
|
42
39
|
|
43
40
|
return pre.replace('TOTAL',settings.json.data.length);
|
41
|
+
},
|
42
|
+
drawCallback: function() {
|
43
|
+
setObjectIdPopover();
|
44
44
|
}
|
45
45
|
});
|
46
46
|
});
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<div class="col-md-12">
|
1
|
+
<div class="col-md-6 col-xs-12">
|
2
2
|
|
3
3
|
<div class="column-block">
|
4
4
|
|
@@ -39,106 +39,60 @@
|
|
39
39
|
|
40
40
|
<div class="tag-bar tag-bar-breathe">
|
41
41
|
|
42
|
-
|
43
|
-
<
|
42
|
+
<% unless @available_tags.blank? %>
|
43
|
+
<div class="tag-select" onclick="void(0)">
|
44
|
+
<span><i class="fa fa-tag"></i><i class="fa fa-caret-down"></i></span>
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
<div class="tag-select-box">
|
47
|
+
<strong>Tag As:</strong>
|
48
|
+
<%= render :partial => 'kaui/account_tags/form_bar',
|
49
|
+
:locals => {:account_id => @account.account_id,
|
50
|
+
:tag_names => @tags.map { |tag| tag.tag_definition_name },
|
51
|
+
:available_tags => @available_tags} %>
|
52
|
+
</div>
|
51
53
|
</div>
|
52
|
-
|
54
|
+
<% end %>
|
53
55
|
|
54
56
|
<%= render :partial => 'kaui/custom_fields/list_bar',
|
55
57
|
:locals => {:custom_fields => @custom_fields} %>
|
56
58
|
</div>
|
57
59
|
|
58
60
|
<div class="row">
|
59
|
-
<div class="col-
|
61
|
+
<div class="col-sm-12">
|
60
62
|
<div class="fix-position">
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
<th>
|
76
|
-
<td><%= @account.
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
</tr>
|
94
|
-
<%= render :partial => 'parent',
|
95
|
-
:locals => {:account_parent => @account_parent} %>
|
96
|
-
</table>
|
97
|
-
</div>
|
63
|
+
<table class="transparent">
|
64
|
+
<tr>
|
65
|
+
<th>ID</th>
|
66
|
+
<td><%= @account.account_id %></td>
|
67
|
+
</tr>
|
68
|
+
<tr>
|
69
|
+
<th>External Key</th>
|
70
|
+
<td><%= @account.external_key %></td>
|
71
|
+
</tr>
|
72
|
+
<tr>
|
73
|
+
<th>Currency</th>
|
74
|
+
<td><%= @account.currency %></td>
|
75
|
+
</tr>
|
76
|
+
<tr>
|
77
|
+
<th>Timezone</th>
|
78
|
+
<td><%= @account.time_zone %></td>
|
79
|
+
</tr>
|
80
|
+
<tr>
|
81
|
+
<th>Locale</th>
|
82
|
+
<td><%= @account.locale %></td>
|
83
|
+
</tr>
|
84
|
+
<tr>
|
85
|
+
<th>Notes</th>
|
86
|
+
<% if @account.notes %>
|
87
|
+
<td><textarea rows="3" class="form-control" readonly="true"><%= @account.notes %></textarea></td>
|
88
|
+
<% else %>
|
89
|
+
<td>N/A</td>
|
90
|
+
<% end %>
|
91
|
+
</tr>
|
92
|
+
<%= render :partial => 'parent',
|
93
|
+
:locals => {:account_parent => @account_parent} %>
|
94
|
+
</table>
|
98
95
|
</div>
|
99
|
-
<div class="col-md-5 col-md-offset-1">
|
100
|
-
<div class="fix-position">
|
101
|
-
<table class="transparent">
|
102
|
-
<tr>
|
103
|
-
<th>Address1</th>
|
104
|
-
<td><%= @account.address1 %></td>
|
105
|
-
</tr>
|
106
|
-
<tr>
|
107
|
-
<th>Address2</th>
|
108
|
-
<td><%= @account.address2 %></td>
|
109
|
-
</tr>
|
110
|
-
<tr>
|
111
|
-
<th>City</th>
|
112
|
-
<td><%= @account.city %></td>
|
113
|
-
</tr>
|
114
|
-
<tr>
|
115
|
-
<th>State</th>
|
116
|
-
<td><%= @account.state %></td>
|
117
|
-
</tr>
|
118
|
-
<tr>
|
119
|
-
<th>Country</th>
|
120
|
-
<td><%= @account.country %></td>
|
121
|
-
</tr>
|
122
|
-
<tr>
|
123
|
-
<th>Postal Code</th>
|
124
|
-
<td><%= @account.postal_code %></td>
|
125
|
-
</tr>
|
126
|
-
<tr>
|
127
|
-
<th>Phone</th>
|
128
|
-
<td><%= @account.phone %></td>
|
129
|
-
</tr>
|
130
|
-
<tr>
|
131
|
-
<th>Company</th>
|
132
|
-
<td><%= @account.company %></td>
|
133
|
-
</tr>
|
134
|
-
<tr>
|
135
|
-
<th>Primary email</th>
|
136
|
-
<td><%= @account.email %></td>
|
137
|
-
</tr>
|
138
|
-
<%= render :partial => 'kaui/account_emails/account_emails_table',
|
139
|
-
:locals => {:account_emails => @account_emails} %>
|
140
|
-
</table>
|
141
|
-
</div>
|
142
96
|
</div>
|
143
97
|
</div>
|
144
98
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<div class="col-md-6">
|
1
|
+
<div class="col-md-6 col-xs-12">
|
2
2
|
|
3
3
|
<div class="column-block">
|
4
4
|
|
@@ -32,6 +32,7 @@
|
|
32
32
|
<% end %>
|
33
33
|
|
34
34
|
<div class="row">
|
35
|
+
<div class="col-sm-12">
|
35
36
|
<div class="fix-position">
|
36
37
|
<table class="transparent" <%= billing_info_margin.html_safe %>>
|
37
38
|
<tr>
|
@@ -63,7 +64,7 @@
|
|
63
64
|
<td>
|
64
65
|
<% if @overdue_state.nil? %>
|
65
66
|
<span class='label'>N/A</span>
|
66
|
-
<% elsif @overdue_state.
|
67
|
+
<% elsif @overdue_state.is_clear_state %>
|
67
68
|
<span class='label label-success'>Good</span>
|
68
69
|
<% else %>
|
69
70
|
<span class='label label-danger'><%= @overdue_state.name %></span>
|
@@ -73,7 +74,7 @@
|
|
73
74
|
<tr>
|
74
75
|
<th>Bill cycle day</th>
|
75
76
|
<td>
|
76
|
-
<% if @account.bill_cycle_day_local %>
|
77
|
+
<% if @account.bill_cycle_day_local > 0 %>
|
77
78
|
<span class='label'><%= @account.bill_cycle_day_local %> (user timezone)</span>
|
78
79
|
<% else %>
|
79
80
|
<span class='label'>N/A</span>
|
@@ -113,11 +114,13 @@
|
|
113
114
|
<div class="col-sm-3">
|
114
115
|
<input class="form-control" name="target_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true">
|
115
116
|
</div>
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
117
|
+
<% if can? :dry_run, Kaui::Invoice %>
|
118
|
+
<div style="width: 14.5%; float: left; padding: 0;">
|
119
|
+
<%= label_tag :dry_run do %>
|
120
|
+
<%= check_box_tag :dry_run, '1', true %> <small>Dry-run</small>
|
121
|
+
<% end %>
|
122
|
+
</div>
|
123
|
+
<% end %>
|
121
124
|
<div class="col-xs-1" style="padding: 0;">
|
122
125
|
<%= button_tag '<i class="fa fa-magic"></i>'.html_safe, :class => 'btn btn-xs' %>
|
123
126
|
</div>
|
@@ -126,6 +129,7 @@
|
|
126
129
|
</div>
|
127
130
|
<% end %>
|
128
131
|
</div>
|
132
|
+
</div>
|
129
133
|
</div>
|
130
134
|
|
131
135
|
</div>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<th>Parent</th>
|
3
3
|
<td>
|
4
4
|
<% if account_parent.present? %>
|
5
|
-
<%= link_to account_parent.
|
5
|
+
<%= link_to account_parent.account_id, kaui_engine.account_path(@account.parent_account_id) %>
|
6
6
|
<% if can? :update, Kaui::Account %>
|
7
7
|
<%= link_to ' <i class="fa fa-times"></i>'.html_safe, kaui_engine.unlink_to_parent_path(@account.account_id), :method => :delete %>
|
8
8
|
<% end %>
|