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,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Fedex
4
+ class TwoDaySaturdayDelivery < Spree::Calculator::Shipping::Fedex::Base
5
+ def self.description
6
+ I18n.t("fedex.two_day_saturday_delivery")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ require_dependency 'spree/calculator'
2
+
3
+ module Spree
4
+ module Calculator::Shipping
5
+ module Ups
6
+ class Base < Spree::Calculator::Shipping::ActiveShipping::Base
7
+ def carrier
8
+ carrier_details = {
9
+ :login => Spree::ActiveShipping::Config[:ups_login],
10
+ :password => Spree::ActiveShipping::Config[:ups_password],
11
+ :key => Spree::ActiveShipping::Config[:ups_key],
12
+ :test => Spree::ActiveShipping::Config[:test_mode]
13
+ }
14
+
15
+ if shipper_number = Spree::ActiveShipping::Config[:shipper_number]
16
+ carrier_details.merge!(:origin_account => shipper_number)
17
+ end
18
+
19
+ ::ActiveShipping::UPS.new(carrier_details)
20
+ end
21
+
22
+ protected
23
+ # weight limit in ounces http://www.ups.com/content/us/en/resources/prepare/oversize.html
24
+ def max_weight_for_country(country)
25
+ 2400 # 150 lbs
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class Express < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.express")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class Ground < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.ground")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class NextDayAir < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.next_day_air")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class NextDayAirEarlyAm < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.next_day_air_early_am")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class NextDayAirSaver < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.next_day_air_saver")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class Saver < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.saver")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class SecondDayAir < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.second_day_air")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class Standard < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.standard")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class ThreeDaySelect < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.three_day_select")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Ups
4
+ class WorldwideExpedited < Spree::Calculator::Shipping::Ups::Base
5
+ def self.description
6
+ I18n.t("ups.worldwide_expedited")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,84 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class Base < Spree::Calculator::Shipping::ActiveShipping::Base
5
+
6
+ SERVICE_CODE_PREFIX ||= {
7
+ :international => 'intl',
8
+ :domestic => 'dom'
9
+ }
10
+
11
+ def compute_package(package)
12
+ order = package.order
13
+ stock_location = package.stock_location
14
+ max_weight = get_max_weight(package)
15
+
16
+ origin = build_location(stock_location)
17
+ destination = build_location(order.ship_address)
18
+
19
+ rates_result = retrieve_rates_from_cache(package, origin, destination, max_weight)
20
+
21
+ return nil if rates_result.kind_of?(Spree::ShippingError)
22
+ return nil if rates_result.empty?
23
+ rate = rates_result[self.class.service_code]
24
+
25
+ return nil unless rate
26
+ rate = rate.to_f + (Spree::ActiveShipping::Config[:handling_fee].to_f || 0.0)
27
+
28
+ # divide by 100 since active_shipping rates are expressed as cents
29
+ return rate/100.0
30
+ end
31
+
32
+ def carrier
33
+ carrier_details = {
34
+ :login => Spree::ActiveShipping::Config[:usps_login],
35
+ :test => Spree::ActiveShipping::Config[:test_mode]
36
+ }
37
+
38
+ ::ActiveShipping::USPS.new(carrier_details)
39
+ end
40
+
41
+ private
42
+
43
+ def retrieve_rates(origin, destination, shipment_packages)
44
+ begin
45
+ response = carrier.find_rates(origin, destination, shipment_packages)
46
+ # turn this beastly array into a nice little hash
47
+ service_code_prefix_key = response.params.keys.first == 'IntlRateV2Response' ? :international : :domestic
48
+ rates = response.rates.collect do |rate|
49
+ service_code = "#{SERVICE_CODE_PREFIX[service_code_prefix_key]}:#{rate.service_code}"
50
+ [service_code, rate.price]
51
+ end
52
+ rate_hash = Hash[*rates.flatten]
53
+ return rate_hash
54
+ rescue ::ActiveShipping::Error => e
55
+ if [::ActiveShipping::ResponseError].include?(e.class) && e.response.is_a?(::ActiveShipping::Response)
56
+ params = e.response.params
57
+ if params.has_key?("Response") && params["Response"].has_key?("Error") && params["Response"]["Error"].has_key?("ErrorDescription")
58
+ message = params["Response"]["Error"]["ErrorDescription"]
59
+ # Canada Post specific error message
60
+ elsif params.has_key?("eparcel") && params["eparcel"].has_key?("error") && params["eparcel"]["error"].has_key?("statusMessage")
61
+ message = e.response.params["eparcel"]["error"]["statusMessage"]
62
+ else
63
+ message = e.message
64
+ end
65
+ else
66
+ message = e.message
67
+ end
68
+
69
+ error = Spree::ShippingError.new("#{I18n.t(:shipping_error)}: #{message}")
70
+ Rails.cache.write @cache_key, error #write error to cache to prevent constant re-lookups
71
+ raise error
72
+ end
73
+
74
+ end
75
+
76
+ protected
77
+ # weight limit in ounces or zero (if there is no limit)
78
+ def max_weight_for_country(country)
79
+ 1120 # 70 lbs
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class ExpressMail < Spree::Calculator::Shipping::Usps::Base
5
+ def self.geo_group
6
+ :domestic
7
+ end
8
+
9
+ def self.service_code
10
+ "#{SERVICE_CODE_PREFIX[geo_group]}:3" #Priority Mail Express {0}™
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.express_mail")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,46 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class ExpressMailInternational < Spree::Calculator::Shipping::Usps::Base
5
+ # http://pe.usps.com/text/imm/ab_001.htm .. http://pe.usps.com/text/imm/tz_028.htm
6
+ WEIGHT_LIMITS = {
7
+ "AL"=>1056, "DZ"=>704, "AD"=>1056, "AO"=>704, "AI"=>880, "AR"=>704, "AM"=>704, "AW"=>704, "AU"=>704, "AT"=>1056, "AZ"=>1120,
8
+ "BS"=>352, "BH"=>704, "BD"=>704, "BB"=>1056, "BY"=>704, "BE"=>1056, "BZ"=>1056, "BJ"=>1056, "BM"=>704, "BT"=>1056, "BO"=>1056,
9
+ "BA"=>1056, "BW"=>1056, "BR"=>1056, "BN"=>1056, "BG"=>1056, "BF"=>1120, "BI"=>1056, "KH"=>1056, "CM"=>704, "CA"=>1056, "CV"=>1056,
10
+ "KY"=>704, "CF"=>1056, "TD"=>1056, "CL"=>1056, "CN"=>1056, "CO"=>704, "CD"=>1056, "CG"=>1056, "CR"=>1056, "CI"=>1056, "HR"=>1056,
11
+ "CY"=>1120, "CZ"=>1120, "DK"=>1056, "DJ"=>704, "DM"=>704, "DO"=>1056, "EC"=>1056, "EG"=>704, "SV"=>1056, "GQ"=>704, "ER"=>1056,
12
+ "EE"=>1056, "ET"=>1056, "FO"=>704, "FJ"=>1056, "FI"=>1056, "FR"=>1056, "GF"=>1056, "PF"=>1056, "GA"=>1056, "GE"=>1056, "DE"=>1056,
13
+ "GH"=>1056, "GB"=>1056, "GR"=>1056, "GD"=>1056, "GP"=>1056, "GT"=>1056, "GN"=>704, "GW"=>704, "GY"=>1056, "HT"=>1056, "HN"=>704,
14
+ "HK"=>1056, "HU"=>1056, "IS"=>1056, "IN"=>1120, "ID"=>1056, "IQ"=>704, "IE"=>1056, "IL"=>704, "IT"=>1056, "JM"=>1056, "JP"=>1056,
15
+ "JO"=>1056, "KZ"=>1056, "KE"=>1120, "KR"=>1056, "KW"=>1056, "KG"=>1056, "LA"=>1056, "LV"=>1056, "LS"=>1056, "LR"=>704, "LI"=>1056,
16
+ "LT"=>1120, "LU"=>1056, "MO"=>1120, "MK"=>1056, "MG"=>1056, "MW"=>704, "MY"=>1056, "MV"=>1056, "ML"=>1056, "MT"=>704, "MQ"=>1056,
17
+ "MR"=>1056, "MU"=>1056, "MX"=>704, "MD"=>1120, "MN"=>1056, "MA"=>68, "MZ"=>1056, "NA"=>352, "NR"=>704, "NP"=>69, "NL"=>1056,
18
+ "AN"=>1056, "NC"=>1056, "NZ"=>1056, "NI"=>880, "NE"=>1120, "NG"=>1056, "NO"=>1056, "OM"=>1056, "PK"=>1056, "PA"=>1056, "PG"=>880,
19
+ "PY"=>880, "PE"=>1120, "PH"=>704, "PL"=>704, "PT"=>1056, "QA"=>1056, "RO"=>1120, "RU"=>1120, "RW"=>1056, "KN"=>1056, "LC"=>704,
20
+ "VC"=>704, "SM"=>1056, "SA"=>1056, "SN"=>1056, "RS"=>1056, "SC"=>1056, "SL"=>1056, "SG"=>1056, "SK"=>1056, "SI"=>1056, "SB"=>1056,
21
+ "ZA"=>1056, "ES"=>1056, "LK"=>1056, "SD"=>1056, "SZ"=>1056, "SE"=>1056, "CH"=>1056, "SY"=>704, "TW"=>33, "TJ"=>1056, "TZ"=>1056,
22
+ "TH"=>1056, "TG"=>1056, "TO"=>1056, "TT"=>1056, "TN"=>1056, "TR"=>1056, "TM"=>1056, "TC"=>1056, "UG"=>1056, "UA"=>704, "AE"=>1120,
23
+ "UY"=>704, "UZ"=>1056, "VU"=>880, "VA"=>1056, "VE"=>1056, "VN"=>1056, "WS"=>704, "YE"=>1056, "ZM"=>1056, "ZW"=>704
24
+ }
25
+
26
+ def self.geo_group
27
+ :international
28
+ end
29
+
30
+ def self.service_code
31
+ "#{SERVICE_CODE_PREFIX[geo_group]}:1" #Priority Mail Express International™
32
+ end
33
+
34
+ def self.description
35
+ I18n.t("usps.express_mail_international")
36
+ end
37
+
38
+ protected
39
+ # weight limit in ounces or zero (if there is no limit)
40
+ def max_weight_for_country(country)
41
+ return WEIGHT_LIMITS[country.iso]
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class FirstClassMailInternational < Spree::Calculator::Shipping::Usps::Base
5
+ WEIGHT_LIMITS = { "US" => 3.5 }
6
+
7
+ def self.geo_group
8
+ :international
9
+ end
10
+
11
+ def self.service_code
12
+ "#{SERVICE_CODE_PREFIX[geo_group]}:13" #First-Class Mail® International Letter
13
+ end
14
+
15
+ def self.description
16
+ I18n.t("usps.first_class_mail_international")
17
+ end
18
+
19
+
20
+ protected
21
+ def max_weight_for_country(country)
22
+ # if weight in ounces > 3.5, then First Class Mail International is not available for the order
23
+ # https://www.usps.com/ship/first-class-international.htm
24
+ return WEIGHT_LIMITS[country.iso]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class FirstClassMailInternationalLargeEnvelope < Spree::Calculator::Shipping::Usps::Base
5
+ WEIGHT_LIMITS = { "US" => 64 }
6
+
7
+ def self.geo_group
8
+ :international
9
+ end
10
+
11
+ def self.service_code
12
+ "#{SERVICE_CODE_PREFIX[geo_group]}:14" #First-Class Mail® International Large Envelope
13
+ end
14
+
15
+ def self.description
16
+ I18n.t("usps.first_class_mail_international_large_envelope")
17
+ end
18
+
19
+ protected
20
+ # weight limit in ounces or zero (if there is no limit)
21
+ def max_weight_for_country(country)
22
+ # if weight in ounces > 64, then First Class Mail International Large Envelope is not available for the order
23
+ # https://www.usps.com/ship/first-class-package-international-service.htm?
24
+ return WEIGHT_LIMITS[country.iso]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class FirstClassMailParcel < Spree::Calculator::Shipping::Usps::Base
5
+ WEIGHT_LIMITS = { "US" => 13 }
6
+
7
+ def self.geo_group
8
+ :domestic
9
+ end
10
+
11
+ def self.service_code
12
+ "#{SERVICE_CODE_PREFIX[geo_group]}:0" #First-Class Mail® Parcel
13
+ end
14
+
15
+ def self.description
16
+ I18n.t("usps.first_class_mail_parcel")
17
+ end
18
+
19
+ protected
20
+ def max_weight_for_country(country)
21
+ #if weight in ounces > 13, then First Class Mail is not available for the order
22
+ # https://www.usps.com/ship/first-class-international.htm
23
+ return WEIGHT_LIMITS[country.iso]
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,49 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class FirstClassPackageInternational < Spree::Calculator::Shipping::Usps::Base
5
+ def self.geo_group
6
+ :international
7
+ end
8
+
9
+ def self.service_code
10
+ "#{SERVICE_CODE_PREFIX[geo_group]}:15" # First-Class Package International Service™
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.first_class_package_international")
15
+ end
16
+
17
+ protected
18
+ # weight limit in ounces or zero (if there is no limit)
19
+ def max_weight_for_country(country)
20
+ 64 # See limit of 4 pounds below.
21
+ end
22
+
23
+ # SAMPLE API RESPONSE
24
+ # Pulled 21-Nov-2013
25
+ #{
26
+ #"ID": "15",
27
+ #"Pounds": "0",
28
+ #"Ounces": "11",
29
+ #"MailType": "Package",
30
+ #"Container": "RECTANGULAR",
31
+ #"Size": "REGULAR",
32
+ #"Width": "0.01",
33
+ #"Length": "0.01",
34
+ #"Height": "0.01",
35
+ #"Girth": "0.01",
36
+ #"Country": "SPAIN",
37
+ #"Postage": "14.90",
38
+ #"ExtraServices": null,
39
+ #"ValueOfContents": "0.00",
40
+ #"InsComment": "SERVICE",
41
+ #"SvcCommitments": "Varies by destination",
42
+ #"SvcDescription": "First-Class Package International Service&lt;sup&gt;&#8482;&lt;/sup&gt;**",
43
+ #"MaxDimensions": "Other than rolls: Max. length 24\", max length, height and depth (thickness) combined 36\"<br>Rolls: Max. length 36\". Max length and twice the diameter combined 42\"",
44
+ #"MaxWeight": "4"
45
+ #}
46
+ end
47
+ end
48
+ end
49
+ end