killbill-avatax 0.0.1

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +39 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/javascripts/application.js +24 -0
  6. data/app/assets/javascripts/avatax/avatax.js +7 -0
  7. data/app/assets/stylesheets/application.css +19 -0
  8. data/app/assets/stylesheets/avatax/avatax.css +6 -0
  9. data/app/assets/stylesheets/bootstrap_and_overrides.css +17 -0
  10. data/app/controllers/avatax/configuration_controller.rb +142 -0
  11. data/app/controllers/avatax/engine_controller.rb +18 -0
  12. data/app/helpers/avatax/application_helper.rb +4 -0
  13. data/app/views/avatax/configuration/_exemptions_form.html.erb +20 -0
  14. data/app/views/avatax/configuration/_exemptions_table.html.erb +34 -0
  15. data/app/views/avatax/configuration/_plugin_form.html.erb +43 -0
  16. data/app/views/avatax/configuration/_products_form.html.erb +20 -0
  17. data/app/views/avatax/configuration/_products_table.html.erb +34 -0
  18. data/app/views/avatax/configuration/index.html.erb +30 -0
  19. data/app/views/avatax/configuration/plugin_configuration.html.erb +7 -0
  20. data/app/views/avatax/configuration/set_exemption.html.erb +10 -0
  21. data/app/views/avatax/configuration/set_tax_code.html.erb +10 -0
  22. data/app/views/avatax/layouts/avatax_application.html.erb +31 -0
  23. data/config/routes.rb +20 -0
  24. data/lib/avatax.rb +22 -0
  25. data/lib/avatax/client.rb +63 -0
  26. data/lib/avatax/engine.rb +19 -0
  27. data/lib/avatax/version.rb +3 -0
  28. data/lib/tasks/avatax_tasks.rake +4 -0
  29. data/test/avatax_test.rb +7 -0
  30. data/test/dummy/README.rdoc +28 -0
  31. data/test/dummy/Rakefile +6 -0
  32. data/test/dummy/app/controllers/application_controller.rb +5 -0
  33. data/test/dummy/app/helpers/application_helper.rb +2 -0
  34. data/test/dummy/bin/bundle +3 -0
  35. data/test/dummy/bin/rails +4 -0
  36. data/test/dummy/bin/rake +4 -0
  37. data/test/dummy/bin/setup +29 -0
  38. data/test/dummy/config.ru +4 -0
  39. data/test/dummy/config/application.rb +32 -0
  40. data/test/dummy/config/boot.rb +5 -0
  41. data/test/dummy/config/database.yml +23 -0
  42. data/test/dummy/config/environment.rb +5 -0
  43. data/test/dummy/config/environments/development.rb +41 -0
  44. data/test/dummy/config/environments/production.rb +79 -0
  45. data/test/dummy/config/environments/test.rb +42 -0
  46. data/test/dummy/config/initializers/assets.rb +11 -0
  47. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  48. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  49. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  50. data/test/dummy/config/initializers/inflections.rb +16 -0
  51. data/test/dummy/config/initializers/killbill_client.rb +3 -0
  52. data/test/dummy/config/initializers/mime_types.rb +4 -0
  53. data/test/dummy/config/initializers/session_store.rb +3 -0
  54. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  55. data/test/dummy/config/locales/en.yml +23 -0
  56. data/test/dummy/config/routes.rb +4 -0
  57. data/test/dummy/config/secrets.yml +22 -0
  58. data/test/integration/navigation_test.rb +8 -0
  59. data/test/test_helper.rb +21 -0
  60. metadata +411 -0
@@ -0,0 +1,20 @@
1
+ <%= form_tag do_set_tax_code_configuration_path, :class => 'form-horizontal' do %>
2
+ <div class="form-group">
3
+ <%= label_tag :product_name, 'Product name', :class => 'col-sm-2 control-label' %>
4
+
5
+ <div class="col-sm-10">
6
+ <%= select_tag :product_name, options_for_select(@products), :class => 'form-control' %>
7
+ </div>
8
+ </div>
9
+ <div class="form-group">
10
+ <%= label_tag :tax_code, 'Tax code', :class => 'col-sm-2 control-label' %>
11
+ <div class="col-sm-10">
12
+ <%= text_field_tag :tax_code, nil, :class => 'form-control' %>
13
+ </div>
14
+ </div>
15
+ <div class="form-group">
16
+ <div class="col-sm-offset-2 col-sm-10">
17
+ <%= submit_tag 'Save', :class => 'btn btn-default' %>
18
+ </div>
19
+ </div>
20
+ <% end %>
@@ -0,0 +1,34 @@
1
+ <table id="products-table" class="table table-condensed table-striped mobile-data">
2
+ <thead>
3
+ <tr>
4
+ <th>Product name</th>
5
+ <th>Tax code</th>
6
+ <th></th>
7
+ </tr>
8
+ </thead>
9
+ <tbody>
10
+ <% tax_codes.each do |tax_code| %>
11
+ <tr>
12
+ <td><%= tax_code[:productName] %></td>
13
+ <td><%= tax_code[:taxCode] %></td>
14
+ <td>
15
+ <%= link_to '<i class="fa fa-times"></i>'.html_safe, remove_tax_code_configuration_path(:product_name => tax_code[:productName]), :method => :delete %>
16
+ </td>
17
+ </tr>
18
+ <% end %>
19
+ </tbody>
20
+ </table>
21
+
22
+ <%= javascript_tag do %>
23
+ $(document).ready(function() {
24
+ $('#products-table').dataTable({
25
+ "dom": "t",
26
+ "paging": false,
27
+ "columns": [
28
+ null,
29
+ null,
30
+ { "orderable": false }
31
+ ]
32
+ });
33
+ });
34
+ <% end %>
@@ -0,0 +1,30 @@
1
+ <div class="search">
2
+
3
+ <div class="column-block">
4
+
5
+ <h1>Configured products
6
+ <%= link_to '&nbsp;<i class="fa fa-plus-square"></i>'.html_safe, set_tax_code_configuration_path %>
7
+ </h1>
8
+
9
+ <%= render :partial => 'avatax/configuration/products_table', :locals => {:tax_codes => @tax_codes} %>
10
+
11
+ </div>
12
+
13
+ <hr/>
14
+
15
+ <div class="column-block">
16
+
17
+ <h1>Exempt accounts
18
+ <%= link_to '&nbsp;<i class="fa fa-plus-square"></i>'.html_safe, set_exemption_configuration_path %>
19
+ </h1>
20
+
21
+ <%= render :partial => 'avatax/configuration/exemptions_table', :locals => {:exemptions => @exemptions} %>
22
+
23
+ </div>
24
+
25
+
26
+ <hr/>
27
+
28
+ <h1><%= link_to 'Plugin configuration', plugin_configuration_path %></h1>
29
+
30
+ </div>
@@ -0,0 +1,7 @@
1
+ <div class="column-block">
2
+
3
+ <h1>Plugin configuration</h1>
4
+
5
+ <%= render :partial => 'avatax/configuration/plugin_form' %>
6
+
7
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="register">
2
+ <div class="col-md-8 col-md-offset-2">
3
+
4
+ <div class="column-block">
5
+ <h1>Set exemption</h1>
6
+ <%= render 'exemptions_form' %>
7
+ </div>
8
+
9
+ </div>
10
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="register">
2
+ <div class="col-md-8 col-md-offset-2">
3
+
4
+ <div class="column-block">
5
+ <h1>Configure product</h1>
6
+ <%= render 'products_form' %>
7
+ </div>
8
+
9
+ </div>
10
+ </div>
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Avatax</title>
5
+ <%= yield :scripts %>
6
+ <%= stylesheet_link_tag 'application', :media => 'all' %>
7
+ <%= javascript_include_tag 'application' %>
8
+ <%= csrf_meta_tags %>
9
+ </head>
10
+ <div class="container-fluid">
11
+ <%- # :alert used by devise -%>
12
+ <% [:error, :alert].each do |key| %>
13
+ <% if flash[key] %>
14
+ <div class="row">
15
+ <div class="col-md-10 col-md-offset-2">
16
+ <div class="alert alert-error"><%= flash[key] %></div>
17
+ </div>
18
+ </div>
19
+ <% end %>
20
+ <% end %>
21
+ <% if flash[:notice] %>
22
+ <div class="row">
23
+ <div class="col-md-10 col-md-offset-2">
24
+ <div class="alert alert-info"><%= flash[:notice] %></div>
25
+ </div>
26
+ </div>
27
+ <% end %>
28
+ <%= yield %>
29
+ </div>
30
+ </body>
31
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,20 @@
1
+ Avatax::Engine.routes.draw do
2
+
3
+ root to: 'configuration#index'
4
+
5
+ resources :configuration, :only => [:index]
6
+
7
+ scope '/configuration' do
8
+ match '/tax_code' => 'configuration#set_tax_code', :via => :get, :as => 'set_tax_code_configuration'
9
+ match '/tax_code' => 'configuration#do_set_tax_code', :via => :post, :as => 'do_set_tax_code_configuration'
10
+ match '/tax_code' => 'configuration#remove_tax_code', :via => :delete, :as => 'remove_tax_code_configuration'
11
+
12
+ match '/exemption' => 'configuration#set_exemption', :via => :get, :as => 'set_exemption_configuration'
13
+ match '/exemption' => 'configuration#do_set_exemption', :via => :post, :as => 'do_set_exemption_configuration'
14
+ match '/exemption' => 'configuration#remove_exemption', :via => :delete, :as => 'remove_exemption_configuration'
15
+
16
+ match '/plugin' => 'configuration#plugin_configuration', :via => :get, :as => 'plugin_configuration'
17
+ match '/plugin' => 'configuration#update_plugin_configuration', :via => :post, :as => 'update_plugin_configuration'
18
+ end
19
+
20
+ end
data/lib/avatax.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'avatax/engine'
2
+
3
+ module Avatax
4
+
5
+ mattr_accessor :current_tenant_user
6
+ mattr_accessor :layout
7
+
8
+ self.current_tenant_user = lambda { |session, user|
9
+ {:username => 'admin',
10
+ :password => 'password',
11
+ :session_id => nil,
12
+ :api_key => KillBillClient.api_key,
13
+ :api_secret => KillBillClient.api_secret}
14
+ }
15
+
16
+ def self.config(&block)
17
+ {
18
+ :layout => layout || 'avatax/layouts/avatax_application',
19
+ }
20
+ end
21
+
22
+ end
@@ -0,0 +1,63 @@
1
+ module Killbill
2
+ module Avatax
3
+
4
+ class AvataxClient < KillBillClient::Model::Resource
5
+
6
+ KILLBILL_AVATAX_PREFIX = '/plugins/killbill-avatax'
7
+
8
+ class << self
9
+
10
+ def set_exemption(account_id, customer_usage_type, user, reason, comment, options = {})
11
+ exemptionCustomFieldName = 'customerUsageType'
12
+
13
+ account = KillBillClient::Model::Account.find_by_id(account_id, false, false, options)
14
+
15
+ # Remove existing exemption(s) first
16
+ account.custom_fields('NONE', options).each do |custom_field|
17
+ account.remove_custom_field(custom_field.custom_field_id, user, reason, comment, options) if custom_field.name == exemptionCustomFieldName
18
+ end
19
+
20
+ unless customer_usage_type.nil?
21
+ # Set the exemption
22
+ custom_field = KillBillClient::Model::CustomField.new
23
+ custom_field.name = exemptionCustomFieldName
24
+ custom_field.value = customer_usage_type
25
+ account.add_custom_field(custom_field, user, reason, comment, options)
26
+ end
27
+ end
28
+
29
+ def remove_exemption(account_id, user, reason, comment, options = {})
30
+ set_exemption(account_id, nil, user, reason, comment, options)
31
+ end
32
+
33
+ def get_tax_codes(options = {})
34
+ path = "#{KILLBILL_AVATAX_PREFIX}/taxCodes"
35
+ response = KillBillClient::API.get path, {}, options
36
+ JSON.parse(response.body).map(&:symbolize_keys)
37
+ end
38
+
39
+ def get_tax_code(product_name, options = {})
40
+ path = "#{KILLBILL_AVATAX_PREFIX}/taxCodes/#{product_name}"
41
+ response = KillBillClient::API.get path, {}, options
42
+ JSON.parse(response.body).symbolize_keys
43
+ end
44
+
45
+ def set_tax_code(product_name, tax_code, user, reason, comment, options = {})
46
+ body = {:productName => product_name, :taxCode => tax_code}.to_json
47
+
48
+ path = "#{KILLBILL_AVATAX_PREFIX}/taxCodes"
49
+ response = KillBillClient::API.post path, body, {}, options
50
+ response.body
51
+ end
52
+
53
+ def remove_tax_code(product_name, user, reason, comment, options= {})
54
+ path = "#{KILLBILL_AVATAX_PREFIX}/taxCodes/#{product_name}"
55
+ KillBillClient::API.delete path, nil, {}, options
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,19 @@
1
+ # Dependencies
2
+ #
3
+ # Sigh. Rails autoloads the gems specified in the Gemfile and nothing else.
4
+ # We need to explicitly require all of our dependencies listed in avatax.gemspec
5
+ #
6
+ # See also https://github.com/carlhuda/bundler/issues/49
7
+ require 'jquery-rails'
8
+ require 'jquery-datatables-rails'
9
+ require 'bootstrap-datepicker-rails'
10
+ require 'd3_rails'
11
+ require 'momentjs-rails'
12
+ require 'spinjs-rails'
13
+ require 'killbill_client'
14
+
15
+ module Avatax
16
+ class Engine < ::Rails::Engine
17
+ isolate_namespace Avatax
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Avatax
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :avatax do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class AvataxTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, Avatax
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ # path to your application root.
5
+ APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
6
+
7
+ Dir.chdir APP_ROOT do
8
+ # This script is a starting point to setup your application.
9
+ # Add necessary setup steps to this file:
10
+
11
+ puts "== Installing dependencies =="
12
+ system "gem install bundler --conservative"
13
+ system "bundle check || bundle install"
14
+
15
+ # puts "\n== Copying sample files =="
16
+ # unless File.exist?("config/database.yml")
17
+ # system "cp config/database.yml.sample config/database.yml"
18
+ # end
19
+
20
+ puts "\n== Preparing database =="
21
+ system "bin/rake db:setup"
22
+
23
+ puts "\n== Removing old logs and tempfiles =="
24
+ system "rm -f log/*"
25
+ system "rm -rf tmp/cache"
26
+
27
+ puts "\n== Restarting application server =="
28
+ system "touch tmp/restart.txt"
29
+ end
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Rails.application
@@ -0,0 +1,32 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ Bundler.require(*Rails.groups)
6
+ require "avatax"
7
+
8
+ require "jquery-rails"
9
+ require "twitter-bootstrap-rails"
10
+ require "d3_rails"
11
+
12
+ require "js-routes"
13
+
14
+ module Dummy
15
+ class Application < Rails::Application
16
+ # Settings in config/environments/* take precedence over those specified here.
17
+ # Application configuration should go into files in config/initializers
18
+ # -- all .rb files in that directory are automatically loaded.
19
+
20
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
21
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
22
+ # config.time_zone = 'Central Time (US & Canada)'
23
+
24
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
25
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
26
+ # config.i18n.default_locale = :de
27
+
28
+ # Do not swallow errors in after_commit/after_rollback callbacks.
29
+ config.active_record.raise_in_transactional_callbacks = true
30
+ end
31
+ end
32
+