solidus_active_shipping 1.0.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 (155) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +1 -0
  4. data/.simplecov +5 -0
  5. data/.travis.yml +21 -0
  6. data/Gemfile +18 -0
  7. data/README.md +192 -0
  8. data/Rakefile +21 -0
  9. data/app/assets/javascripts/admin/product_packages/edit.js.coffee +4 -0
  10. data/app/assets/javascripts/admin/product_packages/index.js.coffee +28 -0
  11. data/app/assets/javascripts/admin/product_packages/new.js.coffee +7 -0
  12. data/app/assets/javascripts/spree/backend/solidus_active_shipping.js +0 -0
  13. data/app/assets/javascripts/spree/frontend/solidus_active_shipping.js +0 -0
  14. data/app/assets/stylesheets/spree/backend/solidus_active_shipping.css +0 -0
  15. data/app/assets/stylesheets/spree/frontend/solidus_active_shipping.css +0 -0
  16. data/app/controllers/spree/admin/active_shipping_settings_controller.rb +27 -0
  17. data/app/controllers/spree/admin/product_packages_controller.rb +17 -0
  18. data/app/controllers/spree/admin/products_controller_decorator.rb +12 -0
  19. data/app/controllers/spree/checkout_controller_decorator.rb +11 -0
  20. data/app/controllers/spree/orders_controller_decorator.rb +11 -0
  21. data/app/models/spree/calculator/shipping/active_shipping/base.rb +208 -0
  22. data/app/models/spree/calculator/shipping/canada_post/base.rb +17 -0
  23. data/app/models/spree/calculator/shipping/canada_post/expedited.rb +11 -0
  24. data/app/models/spree/calculator/shipping/canada_post/parcel_surface.rb +11 -0
  25. data/app/models/spree/calculator/shipping/canada_post/priority_worldwide_intl.rb +12 -0
  26. data/app/models/spree/calculator/shipping/canada_post/regular.rb +11 -0
  27. data/app/models/spree/calculator/shipping/canada_post/small_packets_air.rb +11 -0
  28. data/app/models/spree/calculator/shipping/canada_post/small_packets_surface.rb +11 -0
  29. data/app/models/spree/calculator/shipping/canada_post/xpresspost.rb +11 -0
  30. data/app/models/spree/calculator/shipping/canada_post/xpresspost_international.rb +11 -0
  31. data/app/models/spree/calculator/shipping/fedex/base.rb +21 -0
  32. data/app/models/spree/calculator/shipping/fedex/express_saver.rb +13 -0
  33. data/app/models/spree/calculator/shipping/fedex/first_overnight.rb +13 -0
  34. data/app/models/spree/calculator/shipping/fedex/ground.rb +13 -0
  35. data/app/models/spree/calculator/shipping/fedex/ground_home_delivery.rb +13 -0
  36. data/app/models/spree/calculator/shipping/fedex/international_economy.rb +13 -0
  37. data/app/models/spree/calculator/shipping/fedex/international_economy_freight.rb +13 -0
  38. data/app/models/spree/calculator/shipping/fedex/international_first.rb +13 -0
  39. data/app/models/spree/calculator/shipping/fedex/international_ground.rb +13 -0
  40. data/app/models/spree/calculator/shipping/fedex/international_priority.rb +13 -0
  41. data/app/models/spree/calculator/shipping/fedex/international_priority_freight.rb +13 -0
  42. data/app/models/spree/calculator/shipping/fedex/international_priority_saturday_delivery.rb +13 -0
  43. data/app/models/spree/calculator/shipping/fedex/one_day_freight.rb +13 -0
  44. data/app/models/spree/calculator/shipping/fedex/one_day_freight_saturday_delivery.rb +13 -0
  45. data/app/models/spree/calculator/shipping/fedex/priority_overnight.rb +13 -0
  46. data/app/models/spree/calculator/shipping/fedex/priority_overnight_saturday_delivery.rb +11 -0
  47. data/app/models/spree/calculator/shipping/fedex/saver.rb +11 -0
  48. data/app/models/spree/calculator/shipping/fedex/standard_overnight.rb +11 -0
  49. data/app/models/spree/calculator/shipping/fedex/three_day_freight.rb +11 -0
  50. data/app/models/spree/calculator/shipping/fedex/three_day_freight_saturday_delivery.rb +11 -0
  51. data/app/models/spree/calculator/shipping/fedex/two_day.rb +11 -0
  52. data/app/models/spree/calculator/shipping/fedex/two_day_freight.rb +11 -0
  53. data/app/models/spree/calculator/shipping/fedex/two_day_freight_saturday_delivery.rb +11 -0
  54. data/app/models/spree/calculator/shipping/fedex/two_day_saturday_delivery.rb +11 -0
  55. data/app/models/spree/calculator/shipping/ups/base.rb +30 -0
  56. data/app/models/spree/calculator/shipping/ups/express.rb +11 -0
  57. data/app/models/spree/calculator/shipping/ups/ground.rb +11 -0
  58. data/app/models/spree/calculator/shipping/ups/next_day_air.rb +11 -0
  59. data/app/models/spree/calculator/shipping/ups/next_day_air_early_am.rb +11 -0
  60. data/app/models/spree/calculator/shipping/ups/next_day_air_saver.rb +11 -0
  61. data/app/models/spree/calculator/shipping/ups/saver.rb +11 -0
  62. data/app/models/spree/calculator/shipping/ups/second_day_air.rb +11 -0
  63. data/app/models/spree/calculator/shipping/ups/standard.rb +11 -0
  64. data/app/models/spree/calculator/shipping/ups/three_day_select.rb +11 -0
  65. data/app/models/spree/calculator/shipping/ups/worldwide_expedited.rb +11 -0
  66. data/app/models/spree/calculator/shipping/usps/base.rb +84 -0
  67. data/app/models/spree/calculator/shipping/usps/express_mail.rb +19 -0
  68. data/app/models/spree/calculator/shipping/usps/express_mail_international.rb +46 -0
  69. data/app/models/spree/calculator/shipping/usps/first_class_mail_international.rb +31 -0
  70. data/app/models/spree/calculator/shipping/usps/first_class_mail_international_large_envelope.rb +31 -0
  71. data/app/models/spree/calculator/shipping/usps/first_class_mail_parcel.rb +28 -0
  72. data/app/models/spree/calculator/shipping/usps/first_class_package_international.rb +49 -0
  73. data/app/models/spree/calculator/shipping/usps/global_express_guaranteed.rb +48 -0
  74. data/app/models/spree/calculator/shipping/usps/media_mail.rb +19 -0
  75. data/app/models/spree/calculator/shipping/usps/priority_mail.rb +19 -0
  76. data/app/models/spree/calculator/shipping/usps/priority_mail_flat_rate_envelope.rb +19 -0
  77. data/app/models/spree/calculator/shipping/usps/priority_mail_international.rb +49 -0
  78. data/app/models/spree/calculator/shipping/usps/priority_mail_international_large_flat_rate_box.rb +43 -0
  79. data/app/models/spree/calculator/shipping/usps/priority_mail_international_medium_flat_rate_box.rb +43 -0
  80. data/app/models/spree/calculator/shipping/usps/priority_mail_international_small_flat_rate_box.rb +43 -0
  81. data/app/models/spree/calculator/shipping/usps/priority_mail_large_flat_rate_box.rb +19 -0
  82. data/app/models/spree/calculator/shipping/usps/priority_mail_medium_flat_rate_box.rb +19 -0
  83. data/app/models/spree/calculator/shipping/usps/priority_mail_small_flat_rate_box.rb +19 -0
  84. data/app/models/spree/calculator/shipping/usps/standard_post.rb +19 -0
  85. data/app/models/spree/content_item_decorator.rb +7 -0
  86. data/app/models/spree/line_item_decorator.rb +4 -0
  87. data/app/models/spree/package_builder.rb +114 -0
  88. data/app/models/spree/product_decorator.rb +10 -0
  89. data/app/models/spree/product_package.rb +10 -0
  90. data/app/models/spree/stock_location_decorator.rb +10 -0
  91. data/app/models/spree/variant_decorator.rb +3 -0
  92. data/app/overrides/spree/admin/shared/_configuration_menu/add_active_shipping_settings_tab.html.erb.deface +3 -0
  93. data/app/overrides/spree/admin/shared/_product_tabs/add_product_packages_tab.html.erb.deface +7 -0
  94. data/app/views/spree/admin/active_shipping_settings/edit.html.erb +92 -0
  95. data/app/views/spree/admin/product_packages/_form.html.erb +24 -0
  96. data/app/views/spree/admin/product_packages/edit.html.erb +15 -0
  97. data/app/views/spree/admin/product_packages/index.html.erb +46 -0
  98. data/app/views/spree/admin/product_packages/new.html.erb +15 -0
  99. data/config/locales/en.yml +93 -0
  100. data/config/locales/fr.yml +12 -0
  101. data/config/routes.rb +9 -0
  102. data/db/migrate/20130107030221_create_product_packages.rb +12 -0
  103. data/lib/solidus_active_shipping.rb +3 -0
  104. data/lib/solidus_active_shipping/engine.rb +44 -0
  105. data/lib/spree/active_shipping_configuration.rb +24 -0
  106. data/lib/spree/shipping_error.rb +3 -0
  107. data/solidus_active_shipping.gemspec +33 -0
  108. data/spec/cassettes/Checkout/with_valid_shipping_address/does_not_break_the_per-item_shipping_method_calculator.yml +134 -0
  109. data/spec/cassettes/FedEx_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Fedex_Ground/1_1_1_1.yml +48 -0
  110. data/spec/cassettes/FedEx_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Fedex_InternationalEconomy/1_1_2_1.yml +48 -0
  111. data/spec/cassettes/FedEx_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Fedex_InternationalFirst/1_1_3_1.yml +48 -0
  112. data/spec/cassettes/FedEx_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Fedex_InternationalPriority/1_1_4_1.yml +48 -0
  113. data/spec/cassettes/FedEx_calculators/with_US_origin_address/Spree_Calculator_Shipping_Fedex_ExpressSaver/1_2_5_1.yml +48 -0
  114. data/spec/cassettes/FedEx_calculators/with_US_origin_address/Spree_Calculator_Shipping_Fedex_FirstOvernight/1_2_1_1.yml +48 -0
  115. data/spec/cassettes/FedEx_calculators/with_US_origin_address/Spree_Calculator_Shipping_Fedex_GroundHomeDelivery/1_2_6_1.yml +48 -0
  116. data/spec/cassettes/FedEx_calculators/with_US_origin_address/Spree_Calculator_Shipping_Fedex_PriorityOvernight/1_2_2_1.yml +48 -0
  117. data/spec/cassettes/FedEx_calculators/with_US_origin_address/Spree_Calculator_Shipping_Fedex_StandardOvernight/1_2_3_1.yml +48 -0
  118. data/spec/cassettes/FedEx_calculators/with_US_origin_address/Spree_Calculator_Shipping_Fedex_TwoDay/1_2_4_1.yml +48 -0
  119. data/spec/cassettes/UPS_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Ups_Express/1_1_1_1.yml +103 -0
  120. data/spec/cassettes/UPS_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Ups_Saver/1_1_3_1.yml +103 -0
  121. data/spec/cassettes/UPS_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Ups_Standard/1_1_4_1.yml +103 -0
  122. data/spec/cassettes/UPS_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Ups_ThreeDaySelect/1_1_5_1.yml +103 -0
  123. data/spec/cassettes/UPS_calculators/with_Canadian_origin_address/Spree_Calculator_Shipping_Ups_WorldwideExpedited/1_1_2_1.yml +103 -0
  124. data/spec/cassettes/UPS_calculators/with_US_origin_address/Spree_Calculator_Shipping_Ups_Ground/1_2_1_1.yml +103 -0
  125. data/spec/cassettes/UPS_calculators/with_US_origin_address/Spree_Calculator_Shipping_Ups_NextDayAir/1_2_2_1.yml +103 -0
  126. data/spec/cassettes/UPS_calculators/with_US_origin_address/Spree_Calculator_Shipping_Ups_NextDayAirEarlyAm/1_2_3_1.yml +103 -0
  127. data/spec/cassettes/UPS_calculators/with_US_origin_address/Spree_Calculator_Shipping_Ups_NextDayAirSaver/1_2_4_1.yml +103 -0
  128. data/spec/cassettes/UPS_calculators/with_US_origin_address/Spree_Calculator_Shipping_Ups_SecondDayAir/1_2_5_1.yml +103 -0
  129. data/spec/controllers/admin/active_shipping_settings_controller_spec.rb +38 -0
  130. data/spec/controllers/admin/product_packages_controller_spec.rb +36 -0
  131. data/spec/factories/order_factory_override.rb +46 -0
  132. data/spec/factories/product_package_factory.rb +9 -0
  133. data/spec/factories/state_factory_override.rb +28 -0
  134. data/spec/features/checkout_spec.rb +37 -0
  135. data/spec/fixtures/normal_rates_request.xml +2 -0
  136. data/spec/integrations/calculators/fedex_spec.rb +56 -0
  137. data/spec/integrations/calculators/ups_spec.rb +56 -0
  138. data/spec/lib/spree/active_shipping/bogus_carrier.rb +18 -0
  139. data/spec/lib/spree/calculator/shipping/bogus_calculator.rb +17 -0
  140. data/spec/models/active_shipping_calculator_spec.rb +182 -0
  141. data/spec/models/carriers/usps_calculator_spec.rb +72 -0
  142. data/spec/models/package_builder_spec.rb +173 -0
  143. data/spec/spec.opts +6 -0
  144. data/spec/spec_helper.rb +80 -0
  145. data/spec/support/capybara.rb +24 -0
  146. data/spec/support/checkout_helper.rb +12 -0
  147. data/spec/support/feature_helper.rb +7 -0
  148. data/spec/support/package_helper.rb +9 -0
  149. data/spec/support/shared_contexts/checkout_setup.rb +12 -0
  150. data/spec/support/shared_contexts/package_setup.rb +34 -0
  151. data/spec/support/shared_contexts/shipping_carriers/fedex.rb +15 -0
  152. data/spec/support/shared_contexts/shipping_carriers/ups.rb +14 -0
  153. data/spec/support/shared_contexts/stock_location_setup.rb +26 -0
  154. data/spec/support/web_fixtures.rb +6 -0
  155. metadata +444 -0
@@ -0,0 +1,10 @@
1
+ # Add product packages relation
2
+ Spree::Product.class_eval do
3
+ has_many :product_packages, dependent: :destroy
4
+
5
+ accepts_nested_attributes_for :product_packages, allow_destroy: true, reject_if: ->(pp) { pp[:weight].blank? || Integer(pp[:weight]) < 1 }
6
+
7
+ def has_product_packages?
8
+ product_packages.any?
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ class ProductPackage < ActiveRecord::Base
3
+ belongs_to :product
4
+
5
+ validates :length, :width, :height, :weight,
6
+ :numericality => { :only_integer => true,
7
+ :message => Spree.t('validation.must_be_int'),
8
+ :greater_than => 0 }
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ Spree::StockLocation.class_eval do
2
+ validates_presence_of :address1, :city, :zipcode, :country_id
3
+ validate :state_id_or_state_name_is_present
4
+
5
+ def state_id_or_state_name_is_present
6
+ if state_id.nil? && state_name.nil?
7
+ errors.add(:state_name, "can't be blank")
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ Spree::Variant.class_eval do
2
+ delegate :has_product_packages?, to: :product
3
+ end
@@ -0,0 +1,3 @@
1
+ <!-- insert_bottom "[data-hook='admin_configurations_sidebar_menu'], #admin_configurations_sidebar_menu[data-hook]" -->
2
+
3
+ <%= configurations_sidebar_menu_item Spree.t(:active_shipping_settings), edit_admin_active_shipping_settings_path %>
@@ -0,0 +1,7 @@
1
+ <!-- insert_bottom "[data-hook='admin_product_tabs']" -->
2
+
3
+ <% if can? :update, @product.product_packages.build %>
4
+ <li<%== ' class=\"active\"' if current == 'Product Packages' %>>
5
+ <%= link_to_with_icon 'cube', Spree.t(:product_packages), admin_product_product_packages_url(@product) %>
6
+ </li>
7
+ <% end %>
@@ -0,0 +1,92 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+
3
+ <% content_for :page_title do %>
4
+ <%= Spree.t(:active_shipping_settings) %>
5
+ <% end %>
6
+
7
+ <%= form_tag admin_active_shipping_settings_path, :method => :put do |form| %>
8
+ <div id="preferences" data-hook>
9
+ <fieldset class="general no-border-top">
10
+ <div class="row">
11
+ <div class="alpha six columns">
12
+ <fieldset class="security no-border-bottom">
13
+ <legend align="center"><%= Spree.t(:ups_settings)%></legend>
14
+ <% @preferences_UPS.each do |key|
15
+ type = @config.preference_type(key) %>
16
+ <div class="field">
17
+ <%= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean %>
18
+ <%= preference_field_tag(key, @config[key], :type => type) %>
19
+ <%= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean %>
20
+ </div>
21
+ <% end %>
22
+ </fieldset>
23
+ </div>
24
+ <div class="omega six columns">
25
+ <fieldset class="currency no-border-bottom">
26
+ <legend align="center"><%= Spree.t(:fedex_settings)%></legend>
27
+ <% @preferences_FedEx.each do |key|
28
+ type = @config.preference_type(key) %>
29
+ <div class="field">
30
+ <%= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean %>
31
+ <%= preference_field_tag(key, @config[key], :type => type) %>
32
+ <%= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean %>
33
+ </div>
34
+ <% end %>
35
+ </fieldset>
36
+ </div>
37
+ </div>
38
+
39
+ <div class="row">
40
+ <div class="alpha six columns">
41
+ <fieldset class="security no-border-bottom">
42
+ <legend align="center"><%= Spree.t(:usps_settings)%></legend>
43
+ <% @preferences_USPS.each do |key|
44
+ type = @config.preference_type(key) %>
45
+ <div class="field">
46
+ <%= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean %>
47
+ <%= preference_field_tag(key, @config[key], :type => type) %>
48
+ <%= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean %>
49
+ </div>
50
+ <% end %>
51
+ </fieldset>
52
+ </div>
53
+ <div class="omega six columns">
54
+ <fieldset class="currency no-border-bottom">
55
+ <legend align="center"><%= Spree.t(:canada_post_settings)%></legend>
56
+ <% @preferences_CanadaPost.each do |key|
57
+ type = @config.preference_type(key) %>
58
+ <div class="field">
59
+ <%= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean %>
60
+ <%= preference_field_tag(key, @config[key], :type => type) %>
61
+ <%= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean %>
62
+ </div>
63
+ <% end %>
64
+ </fieldset>
65
+ </div>
66
+ </div>
67
+
68
+ <div class="row">
69
+ <div class="alpha six columns">
70
+ <fieldset class="currency no-border-bottom">
71
+ <legend align="center"><%= Spree.t(:general_settings)%></legend>
72
+ <% @preferences_GeneralSettings.each do |key|
73
+ type = @config.preference_type(key) %>
74
+ <div class="field">
75
+ <%= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean %>
76
+ <%= preference_field_tag(key, @config[key], :type => type) %>
77
+ <%= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean %>
78
+ </div>
79
+ <% end %>
80
+ </fieldset>
81
+ </div>
82
+ </div>
83
+
84
+ <div class="form-buttons filter-actions actions" data-hook="buttons">
85
+ <%= button Spree.t(:update), 'icon-refresh' %>
86
+ <span class="or"><%= Spree.t(:or) %></span>
87
+ <%= link_to_with_icon 'icon-remove', Spree.t(:cancel), edit_admin_active_shipping_settings_url, :class => 'button' %>
88
+ </div>
89
+
90
+ </fieldset>
91
+ </div>
92
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <div data-hook="admin_product_package_form_fields">
2
+ <div class="six columns alpha">
3
+ <div data-hook="length" class="field">
4
+ <%= f.label Spree.t(:length) %><br>
5
+ <%= f.text_field :length %>
6
+ </div>
7
+ <div data-hook="width" class="field">
8
+ <%= f.label Spree.t(:width) %><br>
9
+ <%= f.text_field :width %>
10
+ </div>
11
+ </div>
12
+ <div class="six columns omega">
13
+ <div data-hook="height" class="field">
14
+ <%= f.label Spree.t(:height) %><br>
15
+ <%= f.text_field :height %>
16
+ </div>
17
+ <div data-hook="weight" class="field">
18
+ <%= f.label Spree.t(:weight) %><br>
19
+ <%= f.text_field :weight %>
20
+ </div>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="clear"></div>
@@ -0,0 +1,15 @@
1
+ <%= form_for [:admin, @product, @product_package], :html => { :multipart => true } do |f| %>
2
+ <fieldset data-hook="edit_product_package">
3
+ <legend align="center"><%= Spree.t(:edit_package) %></legend>
4
+
5
+ <%= render :partial => 'form', :locals => { :f => f } %>
6
+
7
+ <div class="form-buttons filter-actions actions" data-hook="buttons">
8
+ <%= button Spree.t(:update), 'icon-refresh' %>
9
+ <span class="or"><%= t(:or) %></span>
10
+ <%= link_to_with_icon 'icon-remove', Spree.t(:cancel), admin_product_product_packages_url(@product), :id => 'cancel_link', :class => 'button' %>
11
+ </div>
12
+ </fieldset>
13
+ <% end %>
14
+
15
+ <%= javascript_include_tag 'admin/product_packages/edit.js' %>
@@ -0,0 +1,46 @@
1
+ <% content_for :page_actions do %>
2
+ <li><%= link_to_with_icon('icon-plus', Spree.t(:new_package), new_admin_product_product_package_url(@product), :id => 'new_product_package_link', :class => 'button') %></li>
3
+ <% end %>
4
+
5
+ <% content_for :head do %>
6
+ <%= javascript_include_tag 'admin/product_packages/index.js' %>
7
+ <% end %>
8
+
9
+ <%# This partial was remove in solidus 1.2 but that is also when Spree.solidus_version was added %>
10
+ <%= render :partial => 'spree/admin/shared/product_sub_menu' if !Spree.respond_to?(:solidus_version) %>
11
+ <%= render :partial => 'spree/admin/shared/product_tabs', :locals => { :current => 'Product Packages' } %>
12
+
13
+ <div id="product_packages" data-hook></div>
14
+
15
+ <% unless @product.reload.product_packages.any? %>
16
+ <div class="no-objects-found">
17
+ <%= Spree.t(:no_packages_found) %>.
18
+ </div>
19
+ <% else %>
20
+ <table class="index">
21
+ <thead data-hook="option_header">
22
+ <tr data-hook="product_packages_header">
23
+ <th><%= Spree.t(:length) %></th>
24
+ <th><%= Spree.t(:width) %></th>
25
+ <th><%= Spree.t(:height) %></th>
26
+ <th><%= Spree.t(:weight) %></th>
27
+ <th class="actions"></th>
28
+ </tr>
29
+ </thead>
30
+ <tbody id="product_packages" data-hook>
31
+ <% @product.product_packages.each do |package| %>
32
+ <tr id="<%= dom_id(package) %>" data-hook="product_package_row">
33
+ <td><%= package.length %></td>
34
+ <td><%= package.width %></td>
35
+ <td><%= package.height %></td>
36
+ <td><%= package.weight %></td>
37
+ <td class="actions">
38
+ <%= link_to_with_icon 'icon-edit', Spree.t(:edit), edit_admin_product_product_package_url(@product, package), :class => "edit", :no_text => true, :data => {:action => 'edit'} %>
39
+ &nbsp;
40
+ <%= link_to_delete package, { :url => admin_product_product_package_url(@product, package), :no_text => true }%>
41
+ </td>
42
+ </tr>
43
+ <% end %>
44
+ </tbody>
45
+ </table>
46
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <%= form_for [:admin, @product, @product_package], :html => { :multipart => true } do |f| %>
2
+ <fieldset data-hook="new_product_package">
3
+ <legend align="center"><%= Spree.t(:new_package) %></legend>
4
+
5
+ <%= render :partial => 'form', :locals => { :f => f } %>
6
+
7
+ <div class="form-buttons filter-actions actions" data-hook="buttons">
8
+ <%= button Spree.t(:update), 'icon-refresh' %>
9
+ <span class="or"><%= t(:or) %></span>
10
+ <%= link_to_with_icon 'icon-remove', Spree.t(:cancel), admin_product_product_packages_url(@product), :id => 'cancel_link', :class => 'button' %>
11
+ </div>
12
+ </fieldset>
13
+ <% end %>
14
+
15
+ <%= javascript_include_tag 'admin/product_packages/new.js' %>
@@ -0,0 +1,93 @@
1
+ ---
2
+ en:
3
+ fedex:
4
+ express_saver: "FedEx Express Saver"
5
+ first_overnight: "FedEx First Overnight"
6
+ ground: "FedEx Ground"
7
+ ground_home_delivery: "FedEx Ground Home Delivery"
8
+ intl_economy: "FedEx International Economy"
9
+ intl_economy_freight: "FedEx International Economy Freight"
10
+ intl_first: "FedEx International First"
11
+ intl_ground: "FedEx International Ground"
12
+ intl_priority: "FedEx International Priority"
13
+ intl_priority_freight: "FedEx International Priority Freight"
14
+ intl_priority_saturday_delivery: "FedEx International Priority Saturday Delivery"
15
+ one_day_freight: "FedEx 1 Day Freight"
16
+ one_day_freight_saturday_delivery: "FedEx 1 Day Freight Saturday Delivery"
17
+ priority_overnight: "FedEx Priority Overnight"
18
+ priority_overnight_saturday_delivery: "FedEx Priority Overnight Saturday Delivery"
19
+ saver: "FedEx Saver"
20
+ standard_overnight: "FedEx Standard Overnight"
21
+ three_day_freight: "FedEx 3 Day Freight"
22
+ three_day_freight_saturday_delivery: "FedEx 3 Day Freight Saturday Delivery"
23
+ two_day: "FedEx 2 Day"
24
+ two_day_freight: "FedEx 2 Day Freight"
25
+ two_day_freight_saturday_delivery: "FedEx 2 Day Freight Saturday Delivery"
26
+ two_day_saturday_delivery: "FedEx 2 Day Saturday Delivery"
27
+ ups:
28
+ ground: "UPS Ground"
29
+ next_day_air: "UPS Next Day Air"
30
+ next_day_air_early_am: "UPS Next Day Air Early A.M."
31
+ next_day_air_saver: "UPS Next Day Air Saver"
32
+ saver: "UPS Saver"
33
+ second_day_air: "UPS Second Day Air"
34
+ three_day_select: "UPS Three-Day Select"
35
+ worldwide_expedited: "UPS Worldwide Expedited"
36
+ standard: "UPS Standard"
37
+ express: "UPS Express"
38
+ usps:
39
+ express_mail: "USPS Priority Mail Express"
40
+ express_mail_international: "USPS Priority Mail Express International"
41
+ first_class_mail_international: "USPS First-Class Mail International Letter"
42
+ first_class_mail_international_large_envelope: "USPS First-Class Mail International Large Envelope"
43
+ first_class_package_international: "USPS First-Class Package International Service"
44
+ first_class_mail_parcel: "USPS First-Class Mail Parcel"
45
+ media_mail: "USPS Media Mail Parcel"
46
+ standard_post: "USPS Standard Post"
47
+ priority_mail: "USPS Priority Mail"
48
+ priority_mail_small_flat_rate_box: "USPS Priority Mail Small Flat Rate Box"
49
+ priority_mail_medium_flat_rate_box: "USPS Priority Mail Medium Flat Rate Box"
50
+ priority_mail_large_flat_rate_box: "USPS Priority Mail Large Flat Rate Box"
51
+ priority_mail_flat_rate_envelope: "USPS Priority Mail Flat Rate Envelope"
52
+ priority_mail_international: "USPS Priority Mail International"
53
+ priority_mail_international_small_flat_rate_box: "USPS Priority Mail International Small Flat Rate Box"
54
+ priority_mail_international_medium_flat_rate_box: "USPS Priority Mail International Medium Flat Rate Box"
55
+ priority_mail_international_large_flat_rate_box: "USPS Priority Mail International Large Flat Rate Box"
56
+ global_express_guaranteed: "USPS Global Express Guaranteed (GXG)"
57
+ canada_post:
58
+ regular: "Canada Post Regular"
59
+ expedited: "Canada Post Expedited"
60
+ xpresspost: "Canada Post Xpresspost"
61
+ priority_worldwide_intl: "Canada Post Priority Worldwide INTL"
62
+ xpresspost_international: "Canada Post XPressPost International"
63
+ small_packets_air: "Canada Post Small Packets Air"
64
+ parcel_surface: "Canada Post Parcel Surface"
65
+ small_packets_surface: "Canada Post Small Packets Surface"
66
+ shipping_error: "Shipping Error"
67
+ spree:
68
+ product_packages: "Product Packages"
69
+ add_product_packages: "Add Product Packages"
70
+ length: "Length"
71
+ new_package: "New Package"
72
+ edit_package: "Edit Package"
73
+ active_shipping_settings: "Active Shipping Settings"
74
+ ups_settings: "UPS Settings"
75
+ fedex_settings: "FedEx Settings"
76
+ usps_settings: "USPS Settings"
77
+ canada_post_settings: "Canada Post Settings"
78
+ origin_address_settings: "Origin Address Settings"
79
+ ups_login: 'UPS Login'
80
+ ups_password: 'UPS Password'
81
+ ups_key: 'UPS Key'
82
+ shipper_number: 'Shipper Number'
83
+ fedex_login: 'Fedex Login'
84
+ fedex_password: 'Fedex Password'
85
+ fedex_account: 'Fedex Account'
86
+ fedex_key: 'Fedex Key'
87
+ usps_login: 'USPS Login'
88
+ canada_post_login: 'Canada Post Login'
89
+ units: 'Units'
90
+ unit_multiplier: 'Unit Multiplier'
91
+ default_weight: 'Default Weight'
92
+ handling_fee: 'Handling Fee'
93
+ max_weight_per_package: 'Max Weight Per Package'
@@ -0,0 +1,12 @@
1
+ ---
2
+ fr:
3
+ canada_post:
4
+ regular: "Postes Canada Colis standard"
5
+ expedited: "Postes Canada Colis accélérés"
6
+ xpresspost: "Postes Canada Xpresspost"
7
+ priority_worldwide_intl: "Postes Canada Priorité Mondial INTL"
8
+ xpresspost_international: "Postes Canada XPressPost International"
9
+ small_packets_air: "Postes Canada Petits Colis - Air"
10
+ parcel_surface: "Postes Canada Colis Postaux - Surface"
11
+ small_packets_surface: "Postes Canada Petits Colis - Surface"
12
+ shipping_error: "Erreur de livraison"
@@ -0,0 +1,9 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ namespace :admin do
3
+ resource :active_shipping_settings, :only => ['show', 'update', 'edit']
4
+
5
+ resources :products, :only => [] do
6
+ resources :product_packages
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ class CreateProductPackages < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_product_packages do |t|
4
+ t.integer "product_id", :null => false
5
+ t.integer "length", :default => 0, :null => false
6
+ t.integer "width", :default => 0, :null => false
7
+ t.integer "height", :default => 0, :null => false
8
+ t.integer "weight", :default => 0, :null => false
9
+ t.timestamps :null => false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ require 'spree/core'
2
+ require 'active_shipping'
3
+ require 'solidus_active_shipping/engine'
@@ -0,0 +1,44 @@
1
+ module Spree::ActiveShipping
2
+ end
3
+ module SolidusActiveShipping
4
+ class Engine < Rails::Engine
5
+
6
+ initializer "spree.active_shipping.preferences", :before => :load_config_initializers do |app|
7
+ Spree::ActiveShipping::Config = Spree::ActiveShippingConfiguration.new
8
+ end
9
+
10
+ def self.activate
11
+ Dir[File.join(File.dirname(__FILE__), "../../app/models/spree/calculator/**/base.rb")].sort.each do |c|
12
+ Rails.env.production? ? require(c) : load(c)
13
+ end
14
+
15
+ Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c|
16
+ Rails.configuration.cache_classes ? require(c) : load(c)
17
+ end
18
+ end
19
+
20
+ config.autoload_paths += %W(#{config.root}/lib)
21
+ config.to_prepare &method(:activate).to_proc
22
+
23
+ initializer "solidus_active_shipping.register.calculators", after: "spree.register.calculators" do |app|
24
+ if app.config.spree.calculators.shipping_methods
25
+ classes = Dir.chdir File.join(File.dirname(__FILE__), "../../app/models") do
26
+ Dir["spree/calculator/**/*.rb"].reject {|path| path =~ /base.rb$/ }.map do |path|
27
+ path.gsub('.rb', '').camelize.constantize
28
+ end
29
+ end
30
+
31
+ app.config.spree.calculators.shipping_methods.concat classes
32
+ end
33
+ end
34
+
35
+ # sets the manifests / assets to be precompiled, even when initialize_on_precompile is false
36
+ initializer "spree.assets.precompile", :group => :all do |app|
37
+ app.config.assets.precompile += %w[
38
+ admin/product_packages/new.js
39
+ admin/product_packages/edit.js
40
+ admin/product_packages/index.js
41
+ ]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,24 @@
1
+ class Spree::ActiveShippingConfiguration < Spree::Preferences::Configuration
2
+
3
+ preference :ups_login, :string, :default => "aunt_judy"
4
+ preference :ups_password, :string, :default => "secret"
5
+ preference :ups_key, :string, :default => "developer_key"
6
+ preference :shipper_number, :string, :default => nil
7
+
8
+ preference :fedex_login, :string, :default => "meter_no"
9
+ preference :fedex_password, :string, :default => "special_sha1_looking_thing_sent_via_email"
10
+ preference :fedex_account, :string, :default => "account_no"
11
+ preference :fedex_key, :string, :default => "authorization_key"
12
+
13
+ preference :usps_login, :string, :default => "aunt_judy"
14
+
15
+ preference :canada_post_login, :string, :default => "canada_post_login"
16
+
17
+ preference :units, :string, :default => "imperial"
18
+ preference :unit_multiplier, :decimal, :default => 16 # 16 oz./lb - assumes variant weights are in lbs
19
+ preference :default_weight, :integer, :default => 0 # 16 oz./lb - assumes variant weights are in lbs
20
+ preference :handling_fee, :integer
21
+ preference :max_weight_per_package, :integer, :default => 0 # 0 means no limit
22
+
23
+ preference :test_mode, :boolean, :default => false
24
+ end