solidus_active_shipping 1.0.0

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