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,48 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class GlobalExpressGuaranteed < 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
+ "AD"=>64,
8
+ "CD"=>1056,
9
+ "AE"=>1120, "AF"=>1120, "AG"=>1120, "AI"=>1120, "AL"=>1120, "AM"=>1120, "AN"=>1120, "AO"=>1120, "AR"=>1120, "AT"=>1120, "AU"=>1120,
10
+ "AW"=>1120, "AZ"=>1120, "BA"=>1120, "BB"=>1120, "BD"=>1120, "BE"=>1120, "BF"=>1120, "BG"=>1120, "BH"=>1120, "BI"=>1120, "BJ"=>1120,
11
+ "BM"=>1120, "BN"=>1120, "BR"=>1120, "BS"=>1120, "BT"=>1120, "BW"=>1120, "BY"=>1120, "BZ"=>1120, "CA"=>1120, "CG"=>1120, "CH"=>1120,
12
+ "CI"=>1120, "CL"=>1120, "CM"=>1120, "CN"=>1120, "CO"=>1120, "CR"=>1120, "CV"=>1120, "CY"=>1120, "CZ"=>1120, "DE"=>1120, "DJ"=>1120,
13
+ "DK"=>1120, "DM"=>1120, "DO"=>1120, "DZ"=>1120, "EC"=>1120, "EE"=>1120, "EG"=>1120, "ER"=>1120, "ES"=>1120, "ET"=>1120, "FI"=>1120,
14
+ "FJ"=>1120, "FO"=>1120, "FR"=>1120, "GA"=>1120, "GB"=>1120, "GD"=>1120, "GE"=>1120, "GF"=>1120, "GH"=>1120, "GI"=>1120, "GL"=>1120,
15
+ "GM"=>1120, "GN"=>1120, "GP"=>1120, "GR"=>1120, "GT"=>1120, "GY"=>1120, "HK"=>1120, "HN"=>1120, "HR"=>1120, "HT"=>1120, "HU"=>1120,
16
+ "ID"=>1120, "IE"=>1120, "IL"=>1120, "IN"=>1120, "IQ"=>1120, "IS"=>1120, "IT"=>1120, "JM"=>1120, "JO"=>1120, "JP"=>1120, "KE"=>1120,
17
+ "KG"=>1120, "KH"=>1120, "KM"=>1120, "KN"=>1120, "KR"=>1120, "KW"=>1120, "KY"=>1120, "KZ"=>1120, "LA"=>1120, "LB"=>1120, "LC"=>1120,
18
+ "LI"=>1120, "LK"=>1120, "LR"=>1120, "LS"=>1120, "LT"=>1120, "LU"=>1120, "LV"=>1120, "LY"=>1120, "MA"=>1120, "MD"=>1120, "ME"=>1120,
19
+ "MG"=>1120, "MK"=>1120, "ML"=>1120, "MN"=>1120, "MO"=>1120, "MP"=>1120, "MQ"=>1120, "MR"=>1120, "MS"=>1120, "MT"=>1120, "MU"=>1120,
20
+ "MV"=>1120, "MW"=>1120, "MX"=>1120, "MY"=>1120, "MZ"=>1120, "NA"=>1120, "NC"=>1120, "NE"=>1120, "NG"=>1120, "NI"=>1120, "NL"=>1120,
21
+ "NO"=>1120, "NP"=>1120, "NZ"=>1120, "OM"=>1120, "PA"=>1120, "PE"=>1120, "PF"=>1120, "PG"=>1120, "PH"=>1120, "PK"=>1120, "PL"=>1120,
22
+ "PT"=>1120, "PY"=>1120, "QA"=>1120, "RE"=>1120, "RO"=>1120, "RS"=>1120, "RU"=>1120, "RW"=>1120, "SA"=>1120, "SC"=>1120, "SE"=>1120,
23
+ "SG"=>1120, "SI"=>1120, "SK"=>1120, "SM"=>1120, "SN"=>1120, "SR"=>1120, "SV"=>1120, "SZ"=>1120, "TC"=>1120, "TD"=>1120, "TG"=>1120,
24
+ "TH"=>1120, "TN"=>1120, "TO"=>1120, "TR"=>1120, "TT"=>1120, "TW"=>1120, "TZ"=>1120, "UA"=>1120, "UG"=>1120, "UY"=>1120, "UZ"=>1120,
25
+ "VA"=>1120, "VC"=>1120, "VE"=>1120, "VG"=>1120, "VN"=>1120, "VU"=>1120, "WF"=>1120, "YE"=>1120, "ZA"=>1120, "ZM"=>1120, "ZW"=>1120
26
+ }
27
+
28
+ def self.geo_group
29
+ :international
30
+ end
31
+
32
+ def self.service_code
33
+ "#{SERVICE_CODE_PREFIX[geo_group]}:4" #Global Express Guaranteed
34
+ end
35
+
36
+ def self.description
37
+ I18n.t("usps.global_express_guaranteed")
38
+ end
39
+
40
+ protected
41
+ # weight limit in ounces or zero (if there is no limit)
42
+ def max_weight_for_country(country)
43
+ return WEIGHT_LIMITS[country.iso]
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class MediaMail < 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]}:6" #Media Mail®
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.media_mail")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMail < 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]}:1" #Priority Mail {0}™
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.priority_mail")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailFlatRateEnvelope < 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]}:16" #Priority Mail {0}™ Flat Rate Envelope
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.priority_mail_flat_rate_envelope")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,49 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailInternational < 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
+ "AI"=>352, "AG"=>352, "BS"=>352, "MM"=>352, "GQ"=>352, "JM"=>352, "PN"=>352,
8
+ "VC"=>352, "AL"=>704, "DZ"=>704, "AO"=>704, "AR"=>704, "AM"=>704, "AW"=>704, "BH"=>704, "BD"=>704, "BB"=>704, "BZ"=>704,
9
+ "BM"=>704, "BA"=>704, "VG"=>704, "BN"=>704, "CV"=>704, "KY"=>704, "TD"=>704, "CL"=>704, "KM"=>704, "CG"=>704, "DJ"=>704,
10
+ "DM"=>704, "DO"=>704, "SV"=>704, "ER"=>704, "FJ"=>704, "GA"=>704, "GE"=>704, "GI"=>704, "GR"=>704, "GD"=>704, "GT"=>704,
11
+ "GY"=>704, "HN"=>704, "HU"=>704, "IN"=>704, "ID"=>704, "IR"=>704, "IQ"=>704, "IL"=>704, "KZ"=>704, "KI"=>704, "KR"=>704,
12
+ "KG"=>704, "LA"=>704, "LS"=>704, "LR"=>704, "LY"=>704, "MG"=>704, "MR"=>704, "MU"=>704, "MX"=>704, "MS"=>704, "NA"=>704,
13
+ "NR"=>704, "NP"=>704, "NL"=>704, "AN"=>704, "OM"=>704, "PG"=>704, "PH"=>704, "PL"=>704, "RU"=>704, "KN"=>704, "SH"=>704,
14
+ "LC"=>704, "ST"=>704, "SB"=>704, "ES"=>704, "SD"=>704, "SR"=>704, "SZ"=>704, "TW"=>704, "TO"=>704, "TT"=>704, "TM"=>704,
15
+ "TC"=>704, "VU"=>704, "VA"=>704, "WS"=>704, "ZW"=>704, "HT"=>880, "TV"=>880, "AF"=>1056, "AD"=>1056, "AU"=>1056, "AT"=>1056,
16
+ "BY"=>1056, "BE"=>1056, "BJ"=>1056, "BT"=>1056, "BW"=>1056, "BR"=>1056, "BF"=>1056, "BI"=>1056, "CA"=>1056, "KH"=>1056, "CM"=>1056,
17
+ "CF"=>1056, "CN"=>1056, "CO"=>1056, "CD"=>1056, "CR"=>1056, "CI"=>1056, "HR"=>1056, "DK"=>1056, "EC"=>1056, "EG"=>1056, "ET"=>1056,
18
+ "FR"=>1056, "GF"=>1056, "PF"=>1056, "GM"=>1056, "GH"=>1056, "GB"=>1056, "MP"=>1056, "GL"=>1056, "GP"=>1056, "GN"=>1056, "GW"=>1056,
19
+ "HK"=>1056, "IE"=>1056, "IT"=>1056, "JP"=>1056, "JO"=>1056, "KW"=>1056, "LB"=>1056, "LI"=>1056, "LU"=>1056, "MW"=>1056, "MY"=>1056,
20
+ "MV"=>1056, "ML"=>1056, "MT"=>1056, "MQ"=>1056, "MN"=>1056, "MA"=>1056, "MZ"=>1056, "NC"=>1056, "NZ"=>1056, "NI"=>1056, "NG"=>1056,
21
+ "NO"=>1056, "PY"=>1056, "PT"=>1056, "RE"=>1056, "RW"=>1056, "PM"=>1056, "SM"=>1056, "SA"=>1056, "SN"=>1056, "SL"=>1056, "SG"=>1056,
22
+ "SK"=>1056, "SI"=>1056, "ZA"=>1056, "LK"=>1056, "SE"=>1056, "CH"=>1056, "TJ"=>1056, "TZ"=>1056, "TH"=>1056, "TN"=>1056, "TR"=>1056,
23
+ "UG"=>1056, "UA"=>1056, "UY"=>1056, "VE"=>1056, "WF"=>1056, "YE"=>1056, "ZM"=>1056, "AZ"=>1120, "BG"=>1120, "CY"=>1120, "CZ"=>1120,
24
+ "EE"=>1120, "FO"=>1120, "FI"=>1120, "DE"=>1120, "IS"=>1120, "KE"=>1120, "LV"=>1120, "LT"=>1120, "MO"=>1120, "MK"=>1120, "MD"=>1120,
25
+ "ME"=>1120, "NE"=>1120, "PK"=>1120, "PA"=>1120, "PE"=>1120, "QA"=>1120, "RO"=>1120, "RS"=>1120, "SC"=>1120, "SY"=>1120, "TG"=>1120,
26
+ "AE"=>1120, "UZ"=>1120, "VN"=>1120
27
+ }
28
+
29
+ def self.geo_group
30
+ :international
31
+ end
32
+
33
+ def self.service_code
34
+ "#{SERVICE_CODE_PREFIX[geo_group]}:2" #Priority Mail International®
35
+ end
36
+
37
+ def self.description
38
+ I18n.t("usps.priority_mail_international")
39
+ end
40
+
41
+ protected
42
+ # weight limit in ounces or zero (if there is no limit)
43
+ def max_weight_for_country(country)
44
+ return WEIGHT_LIMITS[country.iso]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailInternationalLargeFlatRateBox < 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
+ AVAILABLE_COUNTRIES = [
7
+ "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AR", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE",
8
+ "BF", "BG", "BH", "BI", "BJ", "BM", "BN", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CF", "CG", "CH",
9
+ "CI", "CL", "CM", "CN", "CO", "CR", "CV", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG",
10
+ "ER", "ES", "ET", "FI", "FJ", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP",
11
+ "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IR", "IS", "IT",
12
+ "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK",
13
+ "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MD", "ME", "MG", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR",
14
+ "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ",
15
+ "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PT", "PY", "QA", "RE", "RO", "RS", "RU", "RW",
16
+ "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SY", "SZ", "TC",
17
+ "TD", "TG", "TH", "TJ", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UY", "UZ", "VA", "VC",
18
+ "VE", "VG", "VN", "VU", "WF", "WS", "YE", "ZA", "ZM", "ZW"
19
+ ]
20
+
21
+ def self.geo_group
22
+ :international
23
+ end
24
+
25
+ def self.service_code
26
+ "#{SERVICE_CODE_PREFIX[geo_group]}:11" #Priority Mail International® Large Flat Rate Box
27
+ end
28
+
29
+ def self.description
30
+ I18n.t("usps.priority_mail_international_large_flat_rate_box")
31
+ end
32
+
33
+ protected
34
+ # weight limit in ounces http://pe.usps.com/text/imm/immc2_011.htm
35
+ def max_weight_for_country(country)
36
+ # https://www.usps.com/ship/priority-mail-international-flat.htm?
37
+ return 320 if AVAILABLE_COUNTRIES.include? country.iso # 20lbs
38
+ nil # ex. AC, BO, CU, FK, KP, SO
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailInternationalMediumFlatRateBox < 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
+ AVAILABLE_COUNTRIES = [
7
+ "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AR", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE",
8
+ "BF", "BG", "BH", "BI", "BJ", "BM", "BN", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CF", "CG", "CH",
9
+ "CI", "CL", "CM", "CN", "CO", "CR", "CV", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG",
10
+ "ER", "ES", "ET", "FI", "FJ", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP",
11
+ "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IR", "IS", "IT",
12
+ "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK",
13
+ "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MD", "ME", "MG", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR",
14
+ "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ",
15
+ "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PT", "PY", "QA", "RE", "RO", "RS", "RU", "RW",
16
+ "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SY", "SZ", "TC",
17
+ "TD", "TG", "TH", "TJ", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UY", "UZ", "VA", "VC",
18
+ "VE", "VG", "VN", "VU", "WF", "WS", "YE", "ZA", "ZM", "ZW"
19
+ ]
20
+
21
+ def self.geo_group
22
+ :international
23
+ end
24
+
25
+ def self.service_code
26
+ "#{SERVICE_CODE_PREFIX[geo_group]}:9" #Priority Mail International® Medium Flat Rate Box
27
+ end
28
+
29
+ def self.description
30
+ I18n.t("usps.priority_mail_international_medium_flat_rate_box")
31
+ end
32
+
33
+ protected
34
+ # weight limit in ounces http://pe.usps.com/text/imm/immc2_011.htm
35
+ def max_weight_for_country(country)
36
+ # https://www.usps.com/ship/priority-mail-international-flat.htm?
37
+ return 320 if AVAILABLE_COUNTRIES.include? country.iso # 20lbs
38
+ nil # ex. AC, BO, CU, FK, KP, SO
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailInternationalSmallFlatRateBox < 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
+ AVAILABLE_COUNTRIES = [
7
+ "AC", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AR", "AT", "AU", "AW", "AZ", "BA", "BB", "BD",
8
+ "BE", "BF", "BG", "BH", "BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CF",
9
+ "CG", "CH", "CI", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ",
10
+ "EC", "EE", "EG", "ER", "ES", "ET", "FI", "FJ", "FK", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GH", "GI",
11
+ "GL", "GM", "GN", "GP", "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN",
12
+ "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA",
13
+ "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MD", "ME", "MG", "MK", "ML", "MM", "MN",
14
+ "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NG", "NI", "NL",
15
+ "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PT", "PY", "QA", "RE",
16
+ "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SK", "SL", "SM", "SN", "SR", "ST",
17
+ "SV", "SY", "SZ", "TC", "TD", "TG", "TH", "TJ", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG",
18
+ "UY", "UZ", "VA", "VC", "VE", "VG", "VN", "VU", "WF", "WS", "YE", "ZA", "ZM", "ZW"
19
+ ]
20
+
21
+ def self.geo_group
22
+ :international
23
+ end
24
+
25
+ def self.service_code
26
+ "#{SERVICE_CODE_PREFIX[geo_group]}:16" #Priority Mail International® Small Flat Rate Box**
27
+ end
28
+
29
+ def self.description
30
+ I18n.t("usps.priority_mail_international_small_flat_rate_box")
31
+ end
32
+
33
+ protected
34
+ # weight limit in ounces http://pe.usps.com/text/imm/immc2_011.htm
35
+ def max_weight_for_country(country)
36
+ # https://www.usps.com/ship/priority-mail-international-flat.htm?
37
+ return 64 if AVAILABLE_COUNTRIES.include? country.iso # 4lbs
38
+ nil # ex. North Korea, Somalia, etc.
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailLargeFlatRateBox < 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]}:22" #Priority Mail {0}™ Large Flat Rate Box
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.priority_mail_large_flat_rate_box")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailMediumFlatRateBox < 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]}:17" #Priority Mail {0}™ Medium Flat Rate Box
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.priority_mail_medium_flat_rate_box")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class PriorityMailSmallFlatRateBox < 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]}:28" #Priority Mail {0}™ Small Flat Rate Box
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.priority_mail_small_flat_rate_box")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Calculator::Shipping
3
+ module Usps
4
+ class StandardPost < 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]}:4" #Standard Post
11
+ end
12
+
13
+ def self.description
14
+ I18n.t("usps.standard_post")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ module Stock
3
+ ContentItem.class_eval do
4
+ delegate :has_product_packages?, to: :variant, prefix: true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ # Add product packages relation
2
+ Spree::LineItem.class_eval do
3
+ has_many :product_packages, :through => :product
4
+ end
@@ -0,0 +1,114 @@
1
+ module Spree
2
+ class PackageBuilder
3
+ attr_accessor :max_weight
4
+
5
+ def process(solidus_package, max_weight)
6
+ # We compute and set the max_weight once, at the beginning of the process
7
+ @max_weight = max_weight
8
+ to_packages(solidus_package)
9
+ end
10
+
11
+ private
12
+
13
+ # Configuration
14
+ def units
15
+ Spree::ActiveShipping::Config[:units].to_sym
16
+ end
17
+
18
+ def multiplier
19
+ Spree::ActiveShipping::Config[:unit_multiplier]
20
+ end
21
+
22
+ def default_weight
23
+ Spree::ActiveShipping::Config[:default_weight]
24
+ end
25
+
26
+ def convert_package_to_weights_array(product_with_product_packages)
27
+ weights = product_with_product_packages.map do |content_item|
28
+ item_weight = content_item.weight
29
+ item_weight = default_weight if item_weight <= 0
30
+ item_weight *= multiplier
31
+
32
+ if (item_weight > max_weight) && max_weight > 0
33
+ raise Spree::ShippingError, "#{I18n.t(:shipping_error)}: The maximum per package weight for the selected service from the selected country is #{max_weight} ounces."
34
+ end
35
+
36
+ item_weight
37
+ end
38
+
39
+ weights.compact
40
+ end
41
+
42
+ # Used for calculating Dimensional Weight pricing.
43
+ # Override in your own extensions to compute package dimensions,
44
+ # or just leave this alone to keep the default behavior.
45
+ # Sample output: [9, 6, 3]
46
+ def convert_package_to_dimensions_array(_package)
47
+ []
48
+ end
49
+
50
+ def convert_package_to_item_packages_array(product_with_no_product_packages)
51
+ packages = []
52
+
53
+ product_with_no_product_packages.each do |content_item|
54
+ variant = content_item.variant
55
+ quantity = content_item.quantity
56
+ product = variant.product
57
+
58
+ product.product_packages.each do |product_package|
59
+ if product_package.weight.to_f <= max_weight || max_weight == 0
60
+ quantity.times do
61
+ packages << product_package
62
+ end
63
+ else
64
+ raise Spree::ShippingError, "#{I18n.t(:shipping_error)}: The maximum per package weight for the selected service from the selected country is #{max_weight} ounces."
65
+ end
66
+ end
67
+ end
68
+
69
+ packages
70
+ end
71
+
72
+ # Generates an array of Package objects based on the quantities and weights of the variants in the line items
73
+ def to_packages(solidus_package)
74
+ active_shipping_packages = []
75
+
76
+ product_with_product_packages = []
77
+ product_with_no_product_packages = []
78
+ # Product with no associated product packages will be combined in packages based on weight
79
+ # Product with associated product packages will be added individually based on their attributes
80
+ solidus_package.contents.each do |content_item|
81
+ if content_item.variant_has_product_packages?
82
+ product_with_product_packages << content_item
83
+ else
84
+ product_with_no_product_packages << content_item
85
+ end
86
+ end
87
+
88
+ weights = convert_package_to_weights_array(product_with_no_product_packages)
89
+ dimensions = convert_package_to_dimensions_array(solidus_package)
90
+ item_specific_packages = convert_package_to_item_packages_array(product_with_product_packages)
91
+
92
+ if max_weight <= 0
93
+ active_shipping_packages << ::ActiveShipping::Package.new(weights.sum, dimensions, units: units) unless weights.empty?
94
+ else
95
+ package_weight = 0
96
+ weights.each do |content_weight|
97
+ if package_weight + content_weight <= max_weight
98
+ package_weight += content_weight
99
+ else
100
+ active_shipping_packages << ::ActiveShipping::Package.new(package_weight, dimensions, units: units)
101
+ package_weight = content_weight
102
+ end
103
+ end
104
+ active_shipping_packages << ::ActiveShipping::Package.new(package_weight, dimensions, units: units) if package_weight > 0
105
+ end
106
+
107
+ item_specific_packages.each do |product_package|
108
+ active_shipping_packages << ::ActiveShipping::Package.new(product_package.weight * multiplier, [product_package.length, product_package.width, product_package.height], units: units)
109
+ end
110
+
111
+ active_shipping_packages
112
+ end
113
+ end
114
+ end