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
@@ -7,7 +7,7 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
7
7
  end
8
8
 
9
9
  def upload_overdue_config(overdue_config_xml, user = nil, reason = nil, comment = nil, options = {})
10
- KillBillClient::Model::Overdue.upload_tenant_overdue_config(overdue_config_xml, user, reason, comment, options)
10
+ KillBillClient::Model::Overdue.upload_tenant_overdue_config_xml(overdue_config_xml, user, reason, comment, options)
11
11
  end
12
12
 
13
13
  def upload_invoice_template(invoice_template, is_manual_pay, delete_if_exists, user = nil, reason = nil, comment = nil, options = {})
@@ -25,5 +25,99 @@ class Kaui::AdminTenant < KillBillClient::Model::Tenant
25
25
  def upload_tenant_plugin_config(plugin_name, plugin_config, user = nil, reason = nil, comment = nil, options = {})
26
26
  KillBillClient::Model::Tenant.upload_tenant_plugin_config(plugin_name, plugin_config, user, reason, comment, options)
27
27
  end
28
+
29
+ def get_plugin_repository
30
+ require 'open-uri'
31
+ require 'yaml'
32
+
33
+ source = URI.parse('https://raw.githubusercontent.com/killbill/killbill-cloud/master/kpm/lib/kpm/plugins_directory.yml').read
34
+ YAML.load(source)
35
+ end
36
+
37
+ def get_oss_plugin_info(plugin_directory)
38
+
39
+
40
+ # Serialize the plugin state for the view:
41
+ # plugin_name#plugin_type:prop1,prop2,prop3;plugin_name#plugin_type:prop1,prop2,prop3;...
42
+ #
43
+ plugin_config = plugin_directory.inject({}) do |hsh, (k,v)|
44
+ hsh["#{k}##{v[:type]}"] = v[:require] || []
45
+ hsh
46
+ end
47
+ plugin_config.map { |e,v| "#{e}:#{v.join(",")}" }.join(";")
48
+ end
49
+
50
+ def get_tenant_plugin_config(plugin_directory, options)
51
+
52
+ require 'yaml'
53
+
54
+ raw_tenant_config = KillBillClient::Model::Tenant::search_tenant_config("PLUGIN_CONFIG_", options)
55
+
56
+ tenant_config = raw_tenant_config.inject({}) do |hsh, e|
57
+
58
+ # Strip prefix '/PLUGIN_CONFIG_'
59
+ killbill_key = e.key.gsub!(/PLUGIN_CONFIG_/, '')
60
+
61
+ # Extract killbill key for oss plugins based on convention 'killbill-KEY'
62
+ plugin_key = killbill_key.gsub(/killbill-/, '') if killbill_key.start_with?('killbill-')
63
+ # If such key exists, lookup in plugin directory
64
+ plugin_repo_entry = plugin_directory[plugin_key.to_sym] unless plugin_key.nil?
65
+ # Extract plugin_type based on plugin_directory entry if exists
66
+ plugin_type = plugin_repo_entry.nil? ? :unknown : plugin_repo_entry[:type].to_sym
67
+
68
+ # Deserialize config based on type
69
+ if plugin_type == :ruby
70
+ yml = YAML.load(e.values[0])
71
+ # Hash of properties
72
+ hsh[plugin_key] = yml[plugin_key.to_sym]
73
+ elsif plugin_type == :java
74
+ # Construct hash of properties based on java properties (k1=v1\nk2=v2\n...)
75
+ hsh[plugin_key] = e.values[0].split("\n").inject({}) do |h, p0|
76
+ k, v = p0.split('=');
77
+ h[k] = v;
78
+ h
79
+ end
80
+ else
81
+ # Construct simple hash with one property :raw_config
82
+ hsh[killbill_key] = {:raw_config => e.values[0]}
83
+ end
84
+ hsh
85
+ end
86
+
87
+ # Serialize the whole thing a as string of the form:
88
+ # plugin_key1::key1=value1,key2=value2,..;plugin_key2::...
89
+ tenant_config.map do |plugin_key, props|
90
+ serialized_props = props.inject("") do |s, (k, v)|
91
+ e="#{k.to_s}=#{v.to_s}";
92
+ s == "" ? s="#{e}" : s="#{s},#{e}";
93
+ s
94
+ end
95
+ "#{plugin_key}::#{serialized_props}"
96
+ end.join(";")
97
+
98
+ end
99
+
100
+
101
+ def format_plugin_config(plugin_name, plugin_type, props)
102
+ return nil unless props.present?
103
+ if plugin_type == 'ruby'
104
+ require 'yaml'
105
+ hsh = {}
106
+ hsh[plugin_name.to_sym] = {}
107
+ props.each do |k,v|
108
+ hsh[plugin_name.to_sym][k.to_sym] = v.to_sym
109
+ end
110
+ hsh[plugin_name.to_sym]
111
+ hsh.to_yaml
112
+ elsif plugin_type == 'java'
113
+ res = ""
114
+ props.each do |k, v|
115
+ res = "#{res}#{k.to_s}=#{v.to_s}\n"
116
+ end
117
+ res
118
+ else
119
+ props['raw_config']
120
+ end
121
+ end
28
122
  end
29
- end
123
+ end
@@ -7,7 +7,7 @@ class Kaui::Bundle < KillBillClient::Model::Bundle
7
7
  end
8
8
 
9
9
  # Return the active one
10
- find_by_external_key(bundle_id_or_key, options)
10
+ find_by_external_key(bundle_id_or_key, false, options)
11
11
  end
12
12
 
13
13
  def self.list_or_search(search_key = nil, offset = 0, limit = 10, options = {})
@@ -1,2 +1,140 @@
1
1
  class Kaui::Catalog < KillBillClient::Model::Catalog
2
+
3
+ class << self
4
+
5
+ def get_catalog_json(latest, options)
6
+
7
+ catalogs = KillBillClient::Model::Catalog.get_tenant_catalog('json', nil, options)
8
+ return catalogs.length > 0 ? catalogs[catalogs.length - 1] : nil if latest
9
+
10
+ # Order by latest
11
+ result = []
12
+ catalogs.sort! { |l, r| r.effective_date <=> l.effective_date }
13
+
14
+ catalogs.each_with_index do |current_catalog, idx|
15
+ result << {:version => idx,
16
+ :version_date => current_catalog.effective_date,
17
+ :currencies => current_catalog.currencies,
18
+ :plans => build_existing_simple_plans(current_catalog)}
19
+ end
20
+ result
21
+ end
22
+
23
+ def build_ao_mapping(catalog)
24
+ tmp = {}
25
+ catalog.products.each do |p|
26
+ p.available.each do |ap|
27
+ if !tmp.has_key?(ap)
28
+ tmp[ap] = []
29
+ end
30
+ tmp[ap] << p.name
31
+ end
32
+ end unless catalog.nil?
33
+ tmp.map { |e,v| "#{e}:#{v.join(",")}" }.join(";")
34
+ end
35
+
36
+
37
+ def get_catalog_xml(options)
38
+
39
+ catalog_xml = KillBillClient::Model::Catalog.get_tenant_catalog('xml', nil, options)
40
+
41
+ parsed_catalog = parse_catalog_xml(catalog_xml)
42
+
43
+ result = []
44
+ parsed_catalog.keys.each_with_index do |version_date, i|
45
+ entry = {}
46
+ entry[:version] = i
47
+ entry[:version_date] = version_date
48
+ entry[:xml] = parsed_catalog[version_date]
49
+ result << entry
50
+ end
51
+ result
52
+ end
53
+
54
+ private
55
+
56
+ def build_existing_simple_plans(catalog)
57
+
58
+ tmp = catalog.products.map do |p|
59
+ p.plans.each do |plan|
60
+ class << plan
61
+ attr_accessor :product_name
62
+ attr_accessor :product_category
63
+ end
64
+ plan.product_name = p.name
65
+ plan.product_category = p.type
66
+ end
67
+ end.flatten!
68
+
69
+ selected = tmp.select { |p| p.phases.length.to_i <= 2 && p.phases[p.phases.length - 1].type == "EVERGREEN" }
70
+
71
+ currencies = catalog.currencies
72
+
73
+ result = []
74
+ selected.each do |plan|
75
+ has_trial = plan.phases[0].type == 'TRIAL'
76
+
77
+ simple_plan = KillBillClient::Model::SimplePlanAttributes.new
78
+
79
+ # Embellish SimplePlanAttributes to contain a map currency -> amount (required in the view)
80
+ class << simple_plan
81
+ attr_accessor :prices
82
+ end
83
+ simple_plan.prices = plan.phases[-1].prices.inject({}) { |r, e| r[e.currency] = e.value; r }
84
+
85
+ simple_plan.plan_id = plan.name
86
+ simple_plan.product_name = plan.product_name
87
+ simple_plan.product_category = plan.product_category
88
+ simple_plan.currency = currencies[0]
89
+ simple_plan.amount = simple_plan.prices[currencies[0]]
90
+ simple_plan.billing_period = plan.billing_period
91
+ simple_plan.trial_length = has_trial ? plan.phases[0].duration.number : 0
92
+ simple_plan.trial_time_unit = has_trial ? plan.phases[0].duration.unit : "N/A"
93
+
94
+ result << simple_plan
95
+ end
96
+ result
97
+ end
98
+
99
+ def parse_catalog_xml(input_xml)
100
+
101
+ require 'nokogiri'
102
+
103
+ doc = Nokogiri::XML(input_xml)
104
+ doc_versions = doc.xpath("//version")
105
+
106
+ doc_versions.inject({}) do |hsh, v|
107
+
108
+ # Replace node 'version' with 'catalog' and add the attributes
109
+ v.name = 'catalog'
110
+ v['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance"
111
+ v['xsi:noNamespaceSchemaLocation'] = "CatalogSchema.xsd"
112
+ # Extract version
113
+ version = v.search("effectiveDate").text
114
+
115
+ # Add entry
116
+ hsh[version] = '<?xml version="1.0" encoding="utf-8"?>' + format_xml(v.to_s)
117
+ hsh
118
+ end
119
+ end
120
+
121
+
122
+ def format_xml(unformatted_xml)
123
+
124
+ require "rexml/document"
125
+
126
+ # Start by removing all spaces before using rexml
127
+ unformatted_xml.gsub!(/>\s+</, "><")
128
+
129
+ result = ""
130
+ pdoc = REXML::Document.new(unformatted_xml)
131
+ formatter = REXML::Formatters::Pretty.new(4)
132
+ formatter.compact = true
133
+ formatter.write(pdoc, result)
134
+ result
135
+ end
136
+ end
137
+
138
+
139
+
2
140
  end
@@ -5,17 +5,51 @@ class Kaui::InvoicePayment < KillBillClient::Model::InvoicePayment
5
5
  SAMPLE_REASON_CODES = ['600 - Alt payment method',
6
6
  '699 - OTHER']
7
7
 
8
- def self.build_from_raw_payment(raw_payment)
9
- result = Kaui::InvoicePayment.new
10
- KillBillClient::Model::InvoicePaymentAttributes.instance_variable_get('@json_attributes').each do |attr|
11
- result.send("#{attr}=", raw_payment.send(attr))
8
+ class << self
9
+
10
+ def build_from_raw_payment(raw_payment)
11
+
12
+ return nil if raw_payment.nil?
13
+
14
+ result = Kaui::InvoicePayment.new
15
+ KillBillClient::Model::InvoicePaymentAttributes.instance_variable_get('@json_attributes').each do |attr|
16
+ result.send("#{attr}=", raw_payment.send(attr))
17
+ end
18
+ # Use Kaui::Transaction to benefit from additional fields (e.g next_retry_date)
19
+ original_transactions = (result.transactions || [])
20
+ result.transactions = []
21
+ original_transactions.each do |transaction|
22
+ new_transaction = Kaui::Transaction.new
23
+ KillBillClient::Model::PaymentTransactionAttributes.instance_variable_get('@json_attributes').each do |attr|
24
+ new_transaction.send("#{attr}=", transaction.send(attr))
25
+ end
26
+ result.transactions << new_transaction
27
+ end
28
+ result.build_transactions_next_retry_date!
29
+ result
12
30
  end
13
- result
31
+
14
32
  end
15
33
 
16
34
  [:auth, :captured, :purchased, :refunded, :credited].each do |type|
17
35
  define_method "#{type}_amount_to_money" do
18
36
  Kaui::Base.to_money(send("#{type}_amount"), currency)
19
37
  end
38
+
39
+
40
+ # For each payment transaction, compute next_retry date by joining with payment attempts
41
+ def build_transactions_next_retry_date!
42
+ (transactions || []).each do |transaction|
43
+ # Filter attempts matching that transaction and SCHEDULED for retry
44
+ transaction.next_retry_date = (payment_attempts || []).select do |attempt|
45
+ ((attempt.transaction_id && attempt.transaction_id == transaction.transaction_id) ||
46
+ (attempt.transaction_external_key && attempt.transaction_external_key == transaction.transaction_external_key)) &&
47
+ attempt.state_name == 'SCHEDULED'
48
+ end.map do |attempt|
49
+ attempt.effective_date
50
+ end.first
51
+ end
52
+ end
53
+
20
54
  end
21
55
  end
@@ -0,0 +1,85 @@
1
+ class Kaui::Overdue < KillBillClient::Model::Overdue
2
+
3
+ class << self
4
+
5
+
6
+ def from_overdue_form_model(view_form_model)
7
+ result = KillBillClient::Model::Overdue.new
8
+ result.initial_reevaluation_interval = nil # TODO
9
+ result.overdue_states = []
10
+ view_form_model["states"].each do |state_model|
11
+
12
+ state = KillBillClient::Model::OverdueStateConfig.new
13
+ state.name = state_model["name"]
14
+ state.auto_reevaluation_interval_days = nil
15
+ state.external_message = state_model["external_message"]
16
+ state.is_clear_state = state_model["is_clear_state"].nil? ? false : state_model["is_clear_state"]
17
+ state.block_changes = state_model["block_changes"]
18
+ if state_model["subscription_cancellation_policy"] == :NONE.to_s
19
+ state.disable_entitlement = false
20
+ state.subscription_cancellation_policy = nil
21
+ else
22
+ state.disable_entitlement = true
23
+ state.subscription_cancellation_policy = state_model["subscription_cancellation_policy"].blank? ? :NONE : state_model["subscription_cancellation_policy"].to_s.gsub!(/POLICY_/, '')
24
+ end
25
+
26
+ if state_model["condition"]
27
+ state.condition = KillBillClient::Model::OverdueCondition.new
28
+ if state_model["condition"]["time_since_earliest_unpaid_invoice_equals_or_exceeds"]
29
+ state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds = KillBillClient::Model::DurationAttributes.new
30
+ state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds.unit = "DAYS"
31
+ state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds.number = state_model["condition"]["time_since_earliest_unpaid_invoice_equals_or_exceeds"]
32
+ end
33
+ state.condition.control_tag_inclusion = format_tag_condition(state_model["condition"]["control_tag_inclusion"])
34
+ state.condition.control_tag_exclusion = format_tag_condition(state_model["condition"]["control_tag_exclusion"])
35
+ end
36
+
37
+ result.overdue_states << state
38
+ end
39
+ # We reversed them to display on the form , so we have to reverse them back before uploading new config
40
+ result.overdue_states.reverse!
41
+
42
+ result
43
+ end
44
+
45
+ def get_overdue_json(options)
46
+ result = KillBillClient::Model::Overdue.get_tenant_overdue_config('json', options)
47
+ class << result
48
+ attr_accessor :has_states
49
+ end
50
+ result.has_states = result.overdue_states.size > 0 && result.overdue_states[0].is_clear_state
51
+
52
+ result.overdue_states.each do |state|
53
+ class << state
54
+ attr_accessor :subscription_cancellation
55
+ end
56
+ if state.disable_entitlement
57
+ state.subscription_cancellation = state.subscription_cancellation_policy ? "POLICY_#{state.subscription_cancellation_policy}".to_sym : :NONE
58
+ else
59
+ state.subscription_cancellation = :NONE
60
+ end
61
+ if state.condition.nil?
62
+ state.condition = KillBillClient::Model::OverdueCondition.new
63
+ state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds = KillBillClient::Model::DurationAttributes.new
64
+ state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds.unit = "DAYS"
65
+ state.condition.time_since_earliest_unpaid_invoice_equals_or_exceeds.number = 0
66
+ state.condition.control_tag_inclusion = :NONE
67
+ state.condition.control_tag_exclusion = :NONE
68
+ end
69
+ end
70
+ result
71
+ end
72
+
73
+ def format_tag_condition(control_tag)
74
+ if control_tag.blank? || control_tag == :NONE.to_s
75
+ return nil
76
+ else
77
+ return control_tag
78
+ end
79
+ end
80
+
81
+
82
+ end
83
+
84
+ end
85
+
@@ -0,0 +1,4 @@
1
+ class Kaui::SimplePlan < KillBillClient::Model::SimplePlanAttributes
2
+ end
3
+
4
+
@@ -1,5 +1,7 @@
1
1
  class Kaui::Transaction < KillBillClient::Model::Transaction
2
2
 
3
+ attr_accessor :next_retry_date
4
+
3
5
  def create(account_id = nil, payment_method_id = nil, user = nil, reason = nil, comment = nil, options = {})
4
6
  if transaction_type == 'AUTHORIZE'
5
7
  auth(account_id, payment_method_id, user, reason, comment, options)
@@ -204,7 +204,8 @@
204
204
  }
205
205
 
206
206
  eventsOrder = ["START_ENTITLEMENT", "START_BILLING", "PAUSE_ENTITLEMENT", "PAUSE_BILLING", "RESUME_ENTITLEMENT",
207
- "RESUME_BILLING", "PHASE", "CHANGE", "STOP_ENTITLEMENT", "STOP_BILLING", "INVOICE", "PAYMENT"];
207
+ "RESUME_BILLING", "PHASE", "CHANGE", "STOP_ENTITLEMENT", "STOP_BILLING", "INVOICE", "AUTHORIZE", "PURCHASE", "CAPTURE",
208
+ "CREDIT", "REFUND", "VOID", "CHARGEBACK"];
208
209
 
209
210
  jQuery.fn.dataTableExt.oSort['timeline-event-asc'] = function(e1,e2) {
210
211
  var x = eventsOrder.indexOf(e1);
@@ -8,28 +8,26 @@
8
8
 
9
9
  <% if can?(:trigger, Kaui::Payment) || can?(:credit, Kaui::Account) || can?(:charge, Kaui::Account) %>
10
10
  <div class="tag-bar tag-bar-breathe">
11
-
12
- <div class="tag-select" onclick="void(0)">
13
- <span><i class="fa fa-money"></i><i class="fa fa-caret-down"></i></span>
14
-
15
- <div class="tag-select-box">
16
- <!-- Payment, Credit then Charge. Same ordering as in the billing timeline -->
17
- <% if can?(:trigger, Kaui::Payment) && @account.account_balance.present? && @account.account_balance > 0 %>
18
- <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Pay all invoices'.html_safe,
19
- kaui_engine.pay_all_invoices_account_path(@account.account_id),
20
- :method => :post %>
21
- <% end %>
22
- <% if can? :credit, Kaui::Account %>
23
- <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Add credit'.html_safe,
24
- kaui_engine.new_account_credit_path(@account.account_id, :currency => @account.currency) %>
25
- <% end %>
26
- <% if can? :charge, Kaui::Account %>
27
- <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Create charge'.html_safe,
28
- kaui_engine.new_account_charge_path(@account.account_id, :currency => @account.currency) %>
29
- <% end %>
11
+ <div class="toggler">
12
+ <div class="toggle">
13
+ <div class="actions">
14
+ <!-- Payment, Credit then Charge. Same ordering as in the billing timeline -->
15
+ <% if can?(:trigger, Kaui::Payment) && @account.account_balance.present? && @account.account_balance > 0 %>
16
+ <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Pay all invoices'.html_safe,
17
+ kaui_engine.pay_all_invoices_account_path(@account.account_id),
18
+ :method => :post %>
19
+ <% end %>
20
+ <% if can? :credit, Kaui::Account %>
21
+ <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Add credit'.html_safe,
22
+ kaui_engine.new_account_credit_path(@account.account_id, :currency => @account.currency) %>
23
+ <% end %>
24
+ <% if can? :charge, Kaui::Account %>
25
+ <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Create charge'.html_safe,
26
+ kaui_engine.new_account_charge_path(@account.account_id, :currency => @account.currency) %>
27
+ <% end %>
28
+ </div>
30
29
  </div>
31
30
  </div>
32
-
33
31
  </div>
34
32
  <% end %>
35
33
 
@@ -2,26 +2,21 @@
2
2
 
3
3
  <div class="column-block">
4
4
 
5
- <h1>Payment Methods</h1>
6
-
7
- <div class="info-wrapper">
8
-
5
+ <h1>Payment Methods
9
6
  <% if can? :create, Kaui::PaymentMethod %>
10
- <div class="tag-bar">
11
-
12
- <div class="tag-select" onclick="void(0)">
13
- <span><i class="fa fa-credit-card"></i><i class="fa fa-caret-down"></i></span>
14
-
15
- <div class="tag-select-box">
16
- <%= link_to '<i class="fa fa-plus-square"></i>&nbsp;Add payment method'.html_safe, kaui_engine.new_payment_method_path(:account_id => @account.account_id) %>
17
- </div>
18
- </div>
19
- </div>
7
+ <%= link_to '<i class="fa fa-plus-square"></i>'.html_safe,
8
+ kaui_engine.new_payment_method_path(:account_id => @account.account_id),
9
+ :class => 'btn btn-xs' %>
20
10
  <% end %>
11
+ </h1>
12
+
13
+ <% unless @payment_methods.empty? %>
14
+ <div class="info-wrapper">
21
15
 
22
- <%= render :partial => 'kaui/payment_methods/payment_methods_table', :locals => {:account => @account, :payment_methods => @payment_methods} %>
16
+ <%= render :partial => 'kaui/payment_methods/payment_methods_table', :locals => {:account => @account, :payment_methods => @payment_methods} %>
23
17
 
24
- </div>
18
+ </div>
19
+ <% end %>
25
20
 
26
21
  </div>
27
22
 
@@ -0,0 +1,24 @@
1
+ <% if can? :config_upload, Kaui::AdminTenant %>
2
+ <div class="tab-pane fade" id="CatalogTranslation">
3
+ <%= form_tag({:action => :upload_catalog_translation}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
4
+ <%= hidden_field_tag(:id, @tenant.id) %>
5
+
6
+ <div class="form-group">
7
+ <div class="col-sm-10">
8
+ <%= file_field_tag 'catalog_translation', :class => 'form-control' %>
9
+ </div>
10
+ </div>
11
+ <div class="form-group">
12
+ <%= label_tag :translation_locale, 'Locale', :class => 'col-sm-2 control-label' %>
13
+ <div class="col-sm-10">
14
+ <%= text_field_tag :translation_locale, nil, :class => 'form-control' %>
15
+ </div>
16
+ </div>
17
+ <div class="form-group">
18
+ <div class="col-sm-10">
19
+ <%= submit_tag 'Upload', :class => 'btn btn-default' %>
20
+ </div>
21
+ </div>
22
+ <% end %>
23
+ </div>
24
+ <% end %>
@@ -0,0 +1,28 @@
1
+ <% if can? :config_upload, Kaui::AdminTenant %>
2
+ <div class="tab-pane fade" id="InvoiceTemplate">
3
+ <%= form_tag({:action => :upload_invoice_template}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
4
+ <%= hidden_field_tag(:id, @tenant.id) %>
5
+
6
+ <div class="form-group">
7
+ <div class="col-sm-10">
8
+ <%= file_field_tag 'invoice_template', :class => 'form-control' %>
9
+ </div>
10
+ </div>
11
+ <div class="form-group">
12
+ <div class="col-sm-10">
13
+ <div class="checkbox">
14
+ <label>
15
+ <%= check_box_tag :manual_pay %>
16
+ <span>Manual Pay</span>
17
+ </label>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ <div class="form-group">
22
+ <div class="col-sm-offset-2 col-sm-10">
23
+ <%= submit_tag 'Upload', :class => 'btn btn-default' %>
24
+ </div>
25
+ </div>
26
+ <% end %>
27
+ </div>
28
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <% if can? :config_upload, Kaui::AdminTenant %>
2
+ <div class="tab-pane fade" id="InvoiceTranslation">
3
+ <%= form_tag({:action => :upload_invoice_translation}, :method => 'post', :multipart => true, :class => 'form-horizontal') do %>
4
+ <%= hidden_field_tag(:id, @tenant.id) %>
5
+
6
+ <div class="form-group">
7
+ <div class="col-sm-10">
8
+ <%= file_field_tag 'invoice_translation', :class => 'form-control' %>
9
+ </div>
10
+ </div>
11
+ <div class="form-group">
12
+ <%= label_tag :translation_locale, 'Locale', :class => 'col-sm-2 control-label' %>
13
+ <div class="col-sm-10">
14
+ <%= text_field_tag :translation_locale, nil, :class => 'form-control' %>
15
+ </div>
16
+ </div>
17
+ <div class="form-group">
18
+ <div class="col-sm-10">
19
+ <%= submit_tag 'Upload', :class => 'btn btn-default' %>
20
+ </div>
21
+ </div>
22
+ <% end %>
23
+ </div>
24
+ <% end %>