spree_exactor 1.1.1.112920126
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Gemfile.lock +231 -0
- data/README.md +21 -0
- data/app/assets/javascripts/admin/exactor_settings.js +2 -0
- data/app/assets/javascripts/admin/spree_exactor.js +1 -0
- data/app/assets/javascripts/store/spree_exactor.js +1 -0
- data/app/assets/stylesheets/admin/spree_exactor.css +3 -0
- data/app/assets/stylesheets/exactor_settings.css +4 -0
- data/app/assets/stylesheets/store/spree_exactor.css +3 -0
- data/app/controllers/spree/admin/exactor_settings_controller.rb +34 -0
- data/app/helpers/exactor_api_objects.rb +387 -0
- data/app/helpers/exactor_api_service.rb +96 -0
- data/app/helpers/spree_exactor_connector.rb +380 -0
- data/app/models/spree/adjustment_decorator.rb +41 -0
- data/app/models/spree/calculator/exactor_tax_calculator.rb +87 -0
- data/app/models/spree/exactor_setting.rb +140 -0
- data/app/models/spree/line_item_decorator.rb +31 -0
- data/app/models/spree/order_decorator.rb +126 -0
- data/app/models/spree/payment_decorator.rb +15 -0
- data/app/models/spree/tax_category_decorator.rb +31 -0
- data/app/models/spree/tax_rate_decorator.rb +46 -0
- data/app/models/spree/user_decorator.rb +7 -0
- data/app/models/spree/zone_decorator.rb +31 -0
- data/app/overrides/spree_exactor_overrides.rb +27 -0
- data/app/views/spree/admin/exactor_settings/show.html.erb +113 -0
- data/config/locales/en.yml +10 -0
- data/config/routes.rb +6 -0
- data/db/migrate/20120624223025_create_exactor_settings.rb +20 -0
- data/db/migrate/20120627130223_add_exactor_info_to_order.rb +8 -0
- data/db/migrate/20120705103207_add_exactor_indicator_to_tax_rates.rb +5 -0
- data/db/migrate/20120713152512_modify_dependent_entities.rb +6 -0
- data/db/migrate/20120813124740_extend_user.rb +5 -0
- data/db/migrate/20120815104739_add_exactor_tor_inline_tax.rb +5 -0
- data/lib/generators/spree_exactor/install/install_generator.rb +80 -0
- data/lib/generators/spree_exactor/uninstall/uninstall_generator.rb +24 -0
- data/lib/spree_exactor/engine.rb +25 -0
- data/lib/spree_exactor.rb +2 -0
- data/spree_exactor.gemspec +66 -0
- metadata +197 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
module Spree
|
2
|
+
TaxCategory.class_eval do
|
3
|
+
attr_accessible :is_exactor_default
|
4
|
+
before_update :validate_for_exactor_default
|
5
|
+
|
6
|
+
private
|
7
|
+
def self.create_tax_category_entity
|
8
|
+
taxCategory = TaxCategory.new(:name => "Exactor Tax Category", :description => "Default Exactor Category",
|
9
|
+
:is_default => false, :is_exactor_default => true)
|
10
|
+
taxCategory.save()
|
11
|
+
return taxCategory
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find_or_create_exactor_tax_category()
|
15
|
+
taxCat = TaxCategory.where(:is_exactor_default => true)
|
16
|
+
if taxCat.empty?
|
17
|
+
taxCat = create_tax_category_entity()
|
18
|
+
else
|
19
|
+
taxCat = taxCat.first
|
20
|
+
end
|
21
|
+
return taxCat
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate_for_exactor_default
|
25
|
+
if is_exactor_default? and changed_attributes.keys().include?('deleted_at')
|
26
|
+
raise Exception, "Cannot delete default Exactor Tax Category until Exactor plug-in is uninstalled"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Spree
|
2
|
+
TaxRate.class_eval do
|
3
|
+
attr_accessible :is_exactor_default
|
4
|
+
before_destroy :validate_for_exactor_default
|
5
|
+
before_save :validate_on_update
|
6
|
+
|
7
|
+
def self.match(order)
|
8
|
+
|
9
|
+
return [] if order.shipping_method.nil? and order.shipments.empty?
|
10
|
+
all.select { |rate| rate.is_exactor_default?}
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def self.create_tax_rate_entity
|
15
|
+
taxCat = TaxCategory.find_or_create_exactor_tax_category()
|
16
|
+
taxZone = Zone.find_or_create_exactor_zone()
|
17
|
+
taxRate = TaxRate.new(:amount=>0, :tax_category_id=>taxCat.id, :zone_id=>taxZone.id, :included_in_price => false)
|
18
|
+
TaxRate.update_all({:is_exactor_default=>false})
|
19
|
+
taxRate.is_exactor_default= true
|
20
|
+
taxRate.calculator_type= "Spree::Calculator::ExactorTaxCalculator"
|
21
|
+
taxRate.save()
|
22
|
+
return taxRate
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.find_or_create_exactor_tax_rate
|
26
|
+
exactorTaxRate = TaxRate.where(:is_exactor_default=>true)
|
27
|
+
if exactorTaxRate.empty?
|
28
|
+
exactorTaxRate = create_tax_rate_entity()
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_for_exactor_default
|
33
|
+
if is_exactor_default?
|
34
|
+
raise Exception, "Cannot update default Exactor Tax Rate until Exactor plug-in is uninstalled"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_on_update
|
39
|
+
if is_exactor_default? and !changed_attributes.keys().include?('is_exactor_default')
|
40
|
+
errors[:base] << "Cannot delete default Exactor Tax Rate until Exactor plug-in is uninstalled"
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Spree
|
2
|
+
Zone.class_eval do
|
3
|
+
attr_accessible :is_exactor_default
|
4
|
+
before_destroy :validate_for_exactor_default
|
5
|
+
|
6
|
+
private
|
7
|
+
def self.create_zone_entity
|
8
|
+
zone = Zone.new(:name => "Exactor Tax Zone", :description=> "Default Exactor Zone",
|
9
|
+
:is_exactor_default=>true)
|
10
|
+
zone.save()
|
11
|
+
return zone
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find_or_create_exactor_zone()
|
15
|
+
taxZone = Zone.where(:is_exactor_default=>true)
|
16
|
+
if taxZone.empty?
|
17
|
+
taxZone = create_zone_entity()
|
18
|
+
else
|
19
|
+
taxZone = taxZone.first
|
20
|
+
end
|
21
|
+
return taxZone
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate_for_exactor_default
|
25
|
+
if is_exactor_default?
|
26
|
+
raise Exception, "Cannot delete default Exactor Tax Zone until Exactor plug-in is uninstalled"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => "spree/admin/configurations/index",
|
2
|
+
:name => "exactor_settings_admin",
|
3
|
+
:insert_bottom => "[data-hook='admin_configurations_menu']",
|
4
|
+
:text => "<tr>
|
5
|
+
<td><%= link_to t(:exactor_settings), admin_exactor_settings_path %></td>
|
6
|
+
<td><%= t('Exactor settings page') %></td>
|
7
|
+
</tr>",
|
8
|
+
:disabled => false)
|
9
|
+
Deface::Override.new(:virtual_path => "spree/admin/shared/_configuration_menu",
|
10
|
+
:name => "exactor_settings_admin_sidebar",
|
11
|
+
:insert_bottom => "[data-hook='admin_configurations_sidebar_menu']",
|
12
|
+
:text => "<%= configurations_sidebar_menu_item t(:exactor_settings), admin_exactor_settings_path %>",
|
13
|
+
:disabled => false)
|
14
|
+
Deface::Override.new(:virtual_path => "spree/admin/orders/_form",
|
15
|
+
:name => "exactor_is_edit",
|
16
|
+
:insert_bottom => "[data-hook='admin_order_form_line_items_headers']",
|
17
|
+
:text => '<input type="hidden" id="order_exactor_is_edit" name="order[exactor_is_edit]" value="true" /> ',
|
18
|
+
:disabled => false)
|
19
|
+
Deface::Override.new(:virtual_path => "spree/admin/users/_form",
|
20
|
+
:name => "exactor_exemption_id",
|
21
|
+
:insert_bottom => "[data-hook='admin_user_form_fields']",
|
22
|
+
:text => '<%= f.field_container :exactor_exemption_id do %>
|
23
|
+
<%= f.label :exactor_exemption_id, "Exactor Exemption ID" %><br />
|
24
|
+
<%= f.text_field :exactor_exemption_id %>
|
25
|
+
<%= f.error_message_on :exactor_exemption_id %>
|
26
|
+
<% end %>',
|
27
|
+
:disabled => false)
|
@@ -0,0 +1,113 @@
|
|
1
|
+
<%= render :partial => 'spree/admin/shared/configuration_menu' %>
|
2
|
+
<div><h1 style="float:left">Exactor settings</h1>
|
3
|
+
<span style="float:right;display: inline;
|
4
|
+
color: #666;
|
5
|
+
margin-top: 10px;
|
6
|
+
font-size: 8pt;">Exactor Plug-in Version: <%= SpreeExactorConnector::SpreeExactorConnector::PLUGIN_VERSION %></span></div>
|
7
|
+
<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @setting } %>
|
8
|
+
<% action = @setting.id.nil? ? "create":"update" %>
|
9
|
+
<%= form_for @setting, :url => { :action => action , :id =>@setting.id } do |f| %>
|
10
|
+
<table class="index">
|
11
|
+
<thead>
|
12
|
+
<tr>
|
13
|
+
<th colspan="8">
|
14
|
+
<span>Exactor Account Settings</span>
|
15
|
+
<%if @setting.id.nil? %>
|
16
|
+
<span style="margin-left: 15px;font-weight: normal;">
|
17
|
+
<a href="https://merchant.exactor.com/account/signup/application" target="_blank">Click Here</a>
|
18
|
+
to sign up for an Exactor Account
|
19
|
+
</span>
|
20
|
+
<%end%>
|
21
|
+
</th>
|
22
|
+
</tr>
|
23
|
+
</thead>
|
24
|
+
<tbody>
|
25
|
+
<tr>
|
26
|
+
<td class="lbl-col"><%=f.label :user_id, "User ID" %></td>
|
27
|
+
<td class="val-col" colspan="3"> <%= f.text_field :user_id %></td>
|
28
|
+
<td class="lbl-col"> <%=f.label :merchant_id, "Account #" %></td>
|
29
|
+
<td class="val-col" colspan="3"> <%= f.text_field :merchant_id %></td>
|
30
|
+
</tr>
|
31
|
+
</tbody>
|
32
|
+
</table>
|
33
|
+
|
34
|
+
<table class="index">
|
35
|
+
<thead>
|
36
|
+
<tr>
|
37
|
+
<th colspan="8">Processing Options</th>
|
38
|
+
</tr>
|
39
|
+
</thead>
|
40
|
+
<tbody>
|
41
|
+
<tr>
|
42
|
+
<td class="lbl-col"><%=f.label :ship_effective_date, "Effective Date" %></td>
|
43
|
+
<td class="val-col" colspan="3"> <%= f.date_select :effective_date %></td>
|
44
|
+
<td class="lbl-col"><%=f.label :shipping_include_handling, "Do shipping charges include handling?" %></td>
|
45
|
+
<td class="val-col" colspan="3"> <%= f.check_box :shipping_include_handling %></td>
|
46
|
+
</tr>
|
47
|
+
<tr>
|
48
|
+
<td class="lbl-col"><%=f.label :commit_option, "Commit Options" %></td>
|
49
|
+
<td class="val-col" colspan="3"> <%= f.collection_select :commit_option, f.object.all_commit_options, :id, :name, {} %></td>
|
50
|
+
<td class="lbl-col"> <%=f.label :sku_source, "SKU Source" %></td>
|
51
|
+
<td class="val-col" colspan="3"> <%= f.collection_select :sku_source, f.object.all_sku_sources, :id, :name, {} %></td>
|
52
|
+
</tr>
|
53
|
+
</tbody>
|
54
|
+
</table>
|
55
|
+
|
56
|
+
|
57
|
+
<table class="index">
|
58
|
+
<thead>
|
59
|
+
<tr>
|
60
|
+
<th colspan="8">Ship From Information</th>
|
61
|
+
</tr>
|
62
|
+
</thead>
|
63
|
+
<tbody>
|
64
|
+
<tr > <!-- Full name-->
|
65
|
+
<td class="lbl-col"><%=f.label :ship_from_name, "Full Name" %></td>
|
66
|
+
<td class="val-col" colspan="3"><%= f.text_field :ship_from_name %></td>
|
67
|
+
</tr>
|
68
|
+
<tr > <!-- Street1, Street2-->
|
69
|
+
<td class="lbl-col"><%=f.label :ship_from_street1, "Street 1" %> </td>
|
70
|
+
<td class="val-col" colspan="3"><%= f.text_field :ship_from_street1 %></td>
|
71
|
+
<td class="lbl-col"><%=f.label :ship_from_street2, "Street 2" %></td>
|
72
|
+
<td class="val-col" colspan="3"><%= f.text_field :ship_from_street2 %></td>
|
73
|
+
</tr>
|
74
|
+
<tr> <!-- City, ZIP-->
|
75
|
+
<td class="lbl-col"> <%=f.label :ship_from_city, "City" %></td>
|
76
|
+
<td class="val-col" colspan="3"><%= f.text_field :ship_from_city %></td>
|
77
|
+
<td class="lbl-col"><%=f.label :ship_from_zip, "Postal Code" %></td>
|
78
|
+
<td class="val-col" colspan="3"><%= f.text_field :ship_from_zip %></td>
|
79
|
+
</tr>
|
80
|
+
<tr> <!-- Country, State-->
|
81
|
+
<td class="lbl-col">
|
82
|
+
<%=f.label :state_id, "State" %>
|
83
|
+
</td>
|
84
|
+
<td class="val-col" colspan="3">
|
85
|
+
<span id="sstate">
|
86
|
+
<%= f.text_field :state_name, :style => "width:150px; display: #{f.object.country.states.empty? ? 'block' : 'none' };", :disabled => !f.object.country.states.empty? %>
|
87
|
+
<%= f.collection_select :state_id, f.object.country.states.sort, :id, :name, {:include_blank => true}, {:style => "width:150px; display: #{f.object.country.states.empty? ? 'none' : 'block' };", :disabled => f.object.country.states.empty?} %>
|
88
|
+
</span>
|
89
|
+
</td>
|
90
|
+
<td class="lbl-col">
|
91
|
+
<%=f.label :country_id, "Country" %>
|
92
|
+
</td>
|
93
|
+
<td class="val-col" colspan="3">
|
94
|
+
<span id="scountry">
|
95
|
+
<%= f.collection_select :country_id, Spree::Country.all, :id, :name, {}, {:style => 'width: 150px;'} %>
|
96
|
+
</span>
|
97
|
+
</td>
|
98
|
+
</tr>
|
99
|
+
</tbody>
|
100
|
+
</table>
|
101
|
+
|
102
|
+
<%= f.submit "Save Exactor Settings" %>
|
103
|
+
<% end %>
|
104
|
+
|
105
|
+
|
106
|
+
<% content_for :head do %>
|
107
|
+
<%= javascript_include_tag '/states' %>
|
108
|
+
<script type="text/javascript">
|
109
|
+
$(document).ready(function(){
|
110
|
+
$('span#scountry select').change(function() { update_state('s'); });
|
111
|
+
});
|
112
|
+
</script>
|
113
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
2
|
+
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
|
+
|
4
|
+
en:
|
5
|
+
hello: "Hello world"
|
6
|
+
exactor_settings_updated: "Exactor settings have been successfully updated"
|
7
|
+
exactor_settings_created: "Exactor settings have been successfully created"
|
8
|
+
|
9
|
+
|
10
|
+
|
data/config/routes.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateExactorSettings < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spree_exactor_settings do |t|
|
4
|
+
t.string :merchant_id
|
5
|
+
t.string :user_id
|
6
|
+
t.string :ship_from_name
|
7
|
+
t.string :ship_from_street1
|
8
|
+
t.string :ship_from_street2
|
9
|
+
t.string :ship_from_city
|
10
|
+
t.integer :state_id
|
11
|
+
t.string :state_name
|
12
|
+
t.string :ship_from_zip
|
13
|
+
t.integer :country_id
|
14
|
+
t.date :effective_date
|
15
|
+
t.string :sku_source
|
16
|
+
t.string :commit_option
|
17
|
+
t.boolean :shipping_include_handling
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class AddExactorInfoToOrder < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :spree_orders, :exactor_invoice_transaction, :string
|
4
|
+
add_column :spree_orders, :exactor_commit_transaction, :string
|
5
|
+
add_column :spree_orders, :exactor_order_hash_sum, :string
|
6
|
+
add_column :spree_orders, :exactor_is_edit, :string
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module SpreeExactor
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
|
7
|
+
argument :_plugin_version, :type => :string, :required => true, :desc => "Exactor Spree Plug-in version"
|
8
|
+
argument :_environment, :type => :string, :required => false, :desc => "Spree environment type (development, production)", :default=>""
|
9
|
+
|
10
|
+
def install
|
11
|
+
supported_versions '1.1.1.112920126'=>['1.1.1','1.1.2','1.1.3']
|
12
|
+
unless @supported_versions.include? _plugin_version
|
13
|
+
puts "Unknown plug-in version. Try any of those: "+ @supported_versions.keys.to_s
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
spree_versions = @supported_versions.values_at(_plugin_version)[0]
|
17
|
+
answer=ask("ATTENTION! This plug-in supports only these versions of Spree: "+spree_versions.to_s+" Is your version of Spree listed there? [Y/n] \n")
|
18
|
+
if (answer.downcase=='n')
|
19
|
+
puts "Sorry, this installer cannot be used for other versions of Spree."
|
20
|
+
exit(0)
|
21
|
+
end
|
22
|
+
puts "Removing all previous Exactor dependencies (if exist)... "
|
23
|
+
gsub_file "Gemfile", /^\s*gem\s* "spree_exactor"\s*,\s*.{5,17}$/, ""
|
24
|
+
puts " * Done"
|
25
|
+
puts "Adding Exactor plugin of version "+_plugin_version+" to your gem file..."
|
26
|
+
append_file "Gemfile", "\n", :force => true
|
27
|
+
gem 'spree_exactor', _plugin_version
|
28
|
+
puts " * Done"
|
29
|
+
puts "Executing bundle update..."
|
30
|
+
run 'bundle update'
|
31
|
+
puts " * Done"
|
32
|
+
|
33
|
+
puts "Performing resource migrations..."
|
34
|
+
add_javascripts
|
35
|
+
add_stylesheets
|
36
|
+
puts " * Done"
|
37
|
+
|
38
|
+
puts "Performing database migrations..."
|
39
|
+
add_migrations
|
40
|
+
run_migrations _environment
|
41
|
+
puts " * Done"
|
42
|
+
end
|
43
|
+
|
44
|
+
def supported_versions(versions={})
|
45
|
+
@supported_versions=versions
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
def add_javascripts
|
52
|
+
# append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_exactor\n"
|
53
|
+
# append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_exactor\n"
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_stylesheets
|
57
|
+
# inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_exactor\n", :before => /\*\//, :verbose => true
|
58
|
+
# inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_exactor\n", :before => /\*\//, :verbose => true
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_migrations
|
62
|
+
run "bundle exec rake railties:install:migrations FROM=spree_exactor"
|
63
|
+
end
|
64
|
+
|
65
|
+
def run_migrations(env='')
|
66
|
+
if (env.strip.empty?)
|
67
|
+
puts 'Running migrations with environment set in config/environment'
|
68
|
+
run "bundle exec rake --require='./config/environment' db:migrate"
|
69
|
+
else
|
70
|
+
puts "Running migrations with forced environment '#{env.strip}' "
|
71
|
+
run "bundle exec rake db:migrate RAILS_ENV='#{env.strip}'"
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module SpreeExactor
|
4
|
+
module Generators
|
5
|
+
class UninstallGenerator < Rails::Generators::Base
|
6
|
+
|
7
|
+
argument :_plugin_version, :type => :string, :required => true, :desc => "Exactor Spree Plug-in version"
|
8
|
+
|
9
|
+
def uninstall
|
10
|
+
puts "Removing all previous Exactor dependencies (if exist)... "
|
11
|
+
gsub_file "Gemfile", /^\s*gem\s* "spree_exactor"\s*,\s*.{5,17}$/, ""
|
12
|
+
puts " * Done"
|
13
|
+
puts "Executing bundle update..."
|
14
|
+
run 'bundle update'
|
15
|
+
puts " * Done"
|
16
|
+
puts "Removing spree_exactor-"+_plugin_version
|
17
|
+
run 'gem uninstall spree_exactor -v '+_plugin_version
|
18
|
+
puts " * Done"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|