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