solidus_core 1.1.4 → 1.2.0.beta1

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 (296) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/logo/solidus_logo.png +0 -0
  3. data/app/helpers/spree/base_helper.rb +2 -3
  4. data/app/models/concerns/spree/adjustment_source.rb +1 -1
  5. data/app/models/concerns/spree/default_price.rb +3 -1
  6. data/app/models/concerns/spree/named_type.rb +1 -1
  7. data/app/models/concerns/spree/user_methods.rb +10 -0
  8. data/app/models/spree/adjustment.rb +1 -1
  9. data/app/models/spree/adjustment_reason.rb +2 -4
  10. data/app/models/spree/app_configuration.rb +36 -0
  11. data/app/models/spree/base.rb +10 -1
  12. data/app/models/spree/calculator/tiered_percent.rb +2 -1
  13. data/app/models/spree/classification.rb +1 -1
  14. data/app/models/spree/country.rb +3 -3
  15. data/app/models/spree/credit_card.rb +2 -2
  16. data/app/models/spree/customer_return.rb +3 -4
  17. data/app/models/spree/inventory_unit.rb +13 -24
  18. data/app/models/spree/item_adjustments.rb +5 -5
  19. data/app/models/spree/line_item.rb +6 -15
  20. data/app/models/spree/log_entry.rb +1 -1
  21. data/app/models/spree/option_type.rb +4 -2
  22. data/app/models/spree/option_type_prototype.rb +6 -0
  23. data/app/models/spree/option_value.rb +1 -1
  24. data/app/models/spree/order.rb +18 -63
  25. data/app/models/spree/order/checkout.rb +4 -2
  26. data/app/models/spree/order_cancellations.rb +52 -1
  27. data/app/models/spree/order_contents.rb +1 -1
  28. data/app/models/spree/order_merger.rb +143 -0
  29. data/app/models/spree/order_shipping.rb +3 -3
  30. data/app/models/spree/order_update_attributes.rb +42 -0
  31. data/app/models/spree/order_updater.rb +1 -1
  32. data/app/models/spree/payment.rb +16 -10
  33. data/app/models/spree/payment_create.rb +68 -0
  34. data/app/models/spree/payment_method.rb +0 -1
  35. data/app/models/spree/preference.rb +1 -1
  36. data/app/models/spree/price.rb +1 -8
  37. data/app/models/spree/product.rb +9 -44
  38. data/app/models/spree/product/scopes.rb +9 -7
  39. data/app/models/spree/promotion/rules/nth_order.rb +1 -1
  40. data/app/models/spree/promotion/rules/taxon.rb +2 -1
  41. data/app/models/spree/promotion_chooser.rb +1 -0
  42. data/app/models/spree/promotion_code.rb +1 -1
  43. data/app/models/spree/promotion_rule_taxon.rb +6 -0
  44. data/app/models/spree/property.rb +2 -1
  45. data/app/models/spree/property_prototype.rb +6 -0
  46. data/app/models/spree/prototype.rb +6 -2
  47. data/app/models/spree/reimbursement.rb +10 -0
  48. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  49. data/app/models/spree/return_reason.rb +1 -7
  50. data/app/models/spree/role_user.rb +3 -5
  51. data/app/models/spree/shipment.rb +6 -11
  52. data/app/models/spree/shipping_method.rb +1 -7
  53. data/app/models/spree/shipping_rate.rb +3 -14
  54. data/app/models/spree/stock/coordinator.rb +48 -4
  55. data/app/models/spree/stock/estimator.rb +3 -6
  56. data/app/models/spree/stock/packer.rb +18 -2
  57. data/app/models/spree/stock/shipping_rate_selector.rb +16 -0
  58. data/app/models/spree/stock/shipping_rate_sorter.rb +16 -0
  59. data/app/models/spree/stock_item.rb +19 -15
  60. data/app/models/spree/stock_location.rb +2 -12
  61. data/app/models/spree/stock_transfer.rb +3 -3
  62. data/app/models/spree/store_credit.rb +2 -2
  63. data/app/models/spree/tax_category.rb +3 -2
  64. data/app/models/spree/tax_rate.rb +7 -14
  65. data/app/models/spree/taxon.rb +4 -1
  66. data/app/models/spree/taxonomy.rb +1 -1
  67. data/app/models/spree/transfer_item.rb +2 -2
  68. data/app/models/spree/unit_cancel.rb +2 -0
  69. data/app/models/spree/variant.rb +9 -14
  70. data/app/models/spree/zone.rb +6 -0
  71. data/app/models/spree/zone_member.rb +1 -4
  72. data/app/views/spree/order_mailer/cancel_email.text.erb +0 -0
  73. data/config/locales/en.yml +7 -5
  74. data/db/default/spree/countries.rb +1 -1
  75. data/db/default/spree/zones.rb +5 -11
  76. data/db/migrate/20130213191427_create_default_stock.rb +1 -1
  77. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +1 -1
  78. data/db/migrate/20140309033438_create_store_from_preferences.rb +5 -2
  79. data/db/migrate/20141009204607_add_store_id_to_orders.rb +6 -2
  80. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +5 -0
  81. data/db/migrate/20141217215630_update_product_slug_index.rb +6 -0
  82. data/db/migrate/20150225205344_move_promotion_code_to_promotion_code_value.rb +2 -2
  83. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +10 -0
  84. data/db/migrate/20151117063249_convert_habtm_to_hmt_for_properties_prototypes.rb +17 -0
  85. data/db/migrate/20151124062500_convert_habtm_to_hmt_for_option_type_prototypes.rb +17 -0
  86. data/db/migrate/20151126063028_convert_habtm_to_hmt_for_taxons_promotion_rules.rb +15 -0
  87. data/db/migrate/20151219020209_add_stock_item_unique_index.rb +9 -0
  88. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  89. data/lib/generators/spree/dummy/templates/rails/database.yml +1 -1
  90. data/lib/generators/spree/install/templates/config/initializers/spree.rb +25 -1
  91. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +3 -0
  92. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +3 -0
  93. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +3 -0
  94. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +3 -0
  95. data/lib/spree/core/controller_helpers/common.rb +1 -1
  96. data/lib/spree/core/controller_helpers/order.rb +1 -1
  97. data/lib/spree/core/controller_helpers/payment_parameters.rb +104 -5
  98. data/lib/spree/core/engine.rb +3 -2
  99. data/lib/spree/core/stock_configuration.rb +11 -0
  100. data/lib/spree/core/unreturned_item_charger.rb +4 -4
  101. data/lib/spree/core/version.rb +9 -1
  102. data/lib/spree/permission_sets/restricted_stock_transfer_management.rb +15 -24
  103. data/lib/spree/permitted_attributes.rb +3 -1
  104. data/lib/spree/testing_support/capybara_ext.rb +14 -40
  105. data/lib/spree/testing_support/factories.rb +0 -15
  106. data/lib/spree/testing_support/factories/address_factory.rb +3 -0
  107. data/lib/spree/testing_support/factories/adjustment_factory.rb +9 -1
  108. data/lib/spree/testing_support/factories/carton_factory.rb +4 -1
  109. data/lib/spree/testing_support/factories/customer_return_factory.rb +4 -0
  110. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +5 -0
  111. data/lib/spree/testing_support/factories/line_item_factory.rb +3 -0
  112. data/lib/spree/testing_support/factories/option_type_factory.rb +6 -0
  113. data/lib/spree/testing_support/factories/{options_factory.rb → option_value_factory.rb} +0 -5
  114. data/lib/spree/testing_support/factories/order_factory.rb +13 -3
  115. data/lib/spree/testing_support/factories/order_promotion_factory.rb +3 -0
  116. data/lib/spree/testing_support/factories/payment_factory.rb +13 -5
  117. data/lib/spree/testing_support/factories/price_factory.rb +2 -0
  118. data/lib/spree/testing_support/factories/product_factory.rb +7 -1
  119. data/lib/spree/testing_support/factories/product_option_type_factory.rb +3 -0
  120. data/lib/spree/testing_support/factories/product_property_factory.rb +3 -0
  121. data/lib/spree/testing_support/factories/promotion_code_factory.rb +3 -0
  122. data/lib/spree/testing_support/factories/promotion_factory.rb +3 -0
  123. data/lib/spree/testing_support/factories/prototype_factory.rb +2 -0
  124. data/lib/spree/testing_support/factories/refund_factory.rb +10 -5
  125. data/lib/spree/testing_support/factories/refund_reason_factory.rb +5 -0
  126. data/lib/spree/testing_support/factories/reimbursement_factory.rb +2 -0
  127. data/lib/spree/testing_support/factories/return_authorization_factory.rb +4 -4
  128. data/lib/spree/testing_support/factories/return_item_factory.rb +4 -0
  129. data/lib/spree/testing_support/factories/return_reason_factory.rb +5 -0
  130. data/lib/spree/testing_support/factories/shipment_factory.rb +6 -1
  131. data/lib/spree/testing_support/factories/shipping_method_factory.rb +22 -10
  132. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +9 -0
  133. data/lib/spree/testing_support/factories/state_factory.rb +2 -0
  134. data/lib/spree/testing_support/factories/stock_item_factory.rb +4 -1
  135. data/lib/spree/testing_support/factories/stock_location_factory.rb +8 -0
  136. data/lib/spree/testing_support/factories/stock_movement_factory.rb +2 -0
  137. data/lib/spree/testing_support/factories/{stock_factory.rb → stock_package_factory.rb} +5 -10
  138. data/lib/spree/testing_support/factories/stock_packer_factory.rb +13 -0
  139. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +2 -2
  140. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +4 -1
  141. data/lib/spree/testing_support/factories/store_credit_factory.rb +10 -6
  142. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -0
  143. data/lib/spree/testing_support/factories/tax_rate_factory.rb +4 -0
  144. data/lib/spree/testing_support/factories/taxon_factory.rb +2 -0
  145. data/lib/spree/testing_support/factories/user_factory.rb +6 -2
  146. data/lib/spree/testing_support/factories/variant_factory.rb +5 -0
  147. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +3 -0
  148. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +4 -0
  149. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +3 -0
  150. data/lib/spree/testing_support/factories/zone_factory.rb +6 -0
  151. data/lib/spree/testing_support/sequences.rb +9 -0
  152. data/lib/tasks/exchanges.rake +4 -3
  153. data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +2 -2
  154. data/solidus_core.gemspec +4 -5
  155. data/spec/helpers/base_helper_spec.rb +6 -6
  156. data/spec/helpers/order_helper_spec.rb +1 -1
  157. data/spec/helpers/products_helper_spec.rb +2 -2
  158. data/spec/helpers/taxons_helper_spec.rb +1 -1
  159. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +107 -7
  160. data/spec/lib/spree/core/importer/order_spec.rb +1 -1
  161. data/spec/lib/spree/core/stock_configuration_spec.rb +16 -0
  162. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +24 -0
  163. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +18 -0
  164. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +12 -0
  165. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +42 -0
  166. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +12 -0
  167. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +12 -0
  168. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +12 -0
  169. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +28 -0
  170. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +12 -0
  171. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +12 -0
  172. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +12 -0
  173. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +12 -0
  174. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +12 -0
  175. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +49 -0
  176. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +12 -0
  177. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +24 -0
  178. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +30 -0
  179. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +12 -0
  180. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +30 -0
  181. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +12 -0
  182. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +12 -0
  183. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +12 -0
  184. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +12 -0
  185. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +30 -0
  186. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +12 -0
  187. data/spec/lib/spree/core/testing_support/factories/prototype_factory_spec.rb +12 -0
  188. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +12 -0
  189. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +12 -0
  190. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +12 -0
  191. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +12 -0
  192. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +12 -0
  193. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +18 -0
  194. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +12 -0
  195. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +18 -0
  196. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +12 -0
  197. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +12 -0
  198. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +28 -0
  199. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +12 -0
  200. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +12 -0
  201. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +12 -0
  202. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +24 -0
  203. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +12 -0
  204. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +26 -0
  205. data/spec/lib/spree/core/testing_support/factories/stock_packer_factory_spec.rb +16 -0
  206. data/spec/lib/spree/core/testing_support/factories/stock_transfer_factory_spec.rb +12 -0
  207. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +12 -0
  208. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +42 -0
  209. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +12 -0
  210. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +18 -0
  211. data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +12 -0
  212. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +12 -0
  213. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +12 -0
  214. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +12 -0
  215. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +12 -0
  216. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +12 -0
  217. data/spec/lib/spree/core/testing_support/factories/tracker_factory_spec.rb +12 -0
  218. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +22 -0
  219. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +36 -0
  220. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +12 -0
  221. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +12 -0
  222. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +12 -0
  223. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +18 -0
  224. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +1 -1
  225. data/spec/lib/spree/core/version_spec.rb +17 -0
  226. data/spec/lib/spree/money_spec.rb +1 -1
  227. data/spec/mailers/carton_mailer_spec.rb +1 -1
  228. data/spec/mailers/order_mailer_spec.rb +1 -1
  229. data/spec/mailers/reimbursement_mailer_spec.rb +1 -3
  230. data/spec/mailers/test_mailer_spec.rb +1 -3
  231. data/spec/models/spree/address_spec.rb +4 -4
  232. data/spec/models/spree/adjustment_reason_spec.rb +1 -3
  233. data/spec/models/spree/app_configuration_spec.rb +4 -0
  234. data/spec/models/spree/calculator/price_sack_spec.rb +3 -3
  235. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +3 -3
  236. data/spec/models/spree/calculator/tiered_percent_spec.rb +86 -10
  237. data/spec/models/spree/carton_spec.rb +3 -1
  238. data/spec/models/spree/classification_spec.rb +3 -3
  239. data/spec/models/spree/credit_card_spec.rb +16 -16
  240. data/spec/models/spree/customer_return_spec.rb +1 -1
  241. data/spec/models/spree/gateway/bogus_simple.rb +1 -1
  242. data/spec/models/spree/inventory_unit_spec.rb +3 -3
  243. data/spec/models/spree/item_adjustments_spec.rb +1 -1
  244. data/spec/models/spree/line_item_spec.rb +2 -2
  245. data/spec/models/spree/option_type_spec.rb +2 -2
  246. data/spec/models/spree/option_value_spec.rb +2 -2
  247. data/spec/models/spree/order/callbacks_spec.rb +1 -1
  248. data/spec/models/spree/order/checkout_spec.rb +16 -11
  249. data/spec/models/spree/order/payment_spec.rb +24 -22
  250. data/spec/models/spree/order/state_machine_spec.rb +1 -1
  251. data/spec/models/spree/order/validations_spec.rb +1 -1
  252. data/spec/models/spree/order_cancellations_spec.rb +63 -0
  253. data/spec/models/spree/order_contents_spec.rb +1 -1
  254. data/spec/models/spree/order_merger_spec.rb +133 -0
  255. data/spec/models/spree/order_spec.rb +39 -159
  256. data/spec/models/spree/order_update_attributes_spec.rb +82 -0
  257. data/spec/models/spree/order_updater_spec.rb +6 -4
  258. data/spec/models/spree/payment_create_spec.rb +131 -0
  259. data/spec/models/spree/payment_spec.rb +130 -48
  260. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +91 -33
  261. data/spec/models/spree/product_filter_spec.rb +3 -3
  262. data/spec/models/spree/product_spec.rb +80 -26
  263. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +1 -1
  264. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +2 -2
  265. data/spec/models/spree/promotion/rules/nth_order_spec.rb +1 -1
  266. data/spec/models/spree/promotion/rules/user_spec.rb +2 -2
  267. data/spec/models/spree/promotion_handler/coupon_spec.rb +2 -2
  268. data/spec/models/spree/promotion_spec.rb +18 -18
  269. data/spec/models/spree/reimbursement_spec.rb +22 -0
  270. data/spec/models/spree/return_item_spec.rb +2 -2
  271. data/spec/models/spree/shipment_spec.rb +28 -12
  272. data/spec/models/spree/shipping_method_spec.rb +2 -2
  273. data/spec/models/spree/shipping_rate_spec.rb +3 -3
  274. data/spec/models/spree/stock/coordinator_spec.rb +5 -0
  275. data/spec/models/spree/stock/estimator_spec.rb +35 -1
  276. data/spec/models/spree/stock/package_spec.rb +1 -1
  277. data/spec/models/spree/stock/packer_spec.rb +2 -3
  278. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +16 -0
  279. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +16 -0
  280. data/spec/models/spree/stock_item_spec.rb +5 -7
  281. data/spec/models/spree/stock_location_spec.rb +5 -9
  282. data/spec/models/spree/stock_transfer_spec.rb +33 -13
  283. data/spec/models/spree/store_credit_event_spec.rb +1 -1
  284. data/spec/models/spree/store_credit_spec.rb +1 -1
  285. data/spec/models/spree/tax_rate_spec.rb +381 -120
  286. data/spec/models/spree/taxon_spec.rb +3 -3
  287. data/spec/models/spree/transfer_item_spec.rb +4 -4
  288. data/spec/models/spree/unit_cancel_spec.rb +1 -1
  289. data/spec/models/spree/variant_spec.rb +3 -3
  290. data/spec/models/spree/zone_spec.rb +35 -1
  291. data/spec/support/concerns/working_factories.rb +9 -0
  292. data/vendor/assets/javascripts/jquery-migrate-1.0.0.js +498 -0
  293. data/vendor/assets/javascripts/jquery.payment.js +231 -80
  294. metadata +103 -27
  295. data/app/models/spree/order/currency_updater.rb +0 -40
  296. data/spec/models/spree/order/currency_updater_spec.rb +0 -32
@@ -1,7 +1,11 @@
1
1
  module Spree
2
2
  class Prototype < Spree::Base
3
- has_and_belongs_to_many :properties, join_table: :spree_properties_prototypes
4
- has_and_belongs_to_many :option_types, join_table: :spree_option_types_prototypes
3
+
4
+ has_many :property_prototypes
5
+ has_many :properties, through: :property_prototypes
6
+
7
+ has_many :option_type_prototypes
8
+ has_many :option_types, through: :option_type_prototypes
5
9
 
6
10
  has_many :prototype_taxons, dependent: :destroy
7
11
  has_many :taxons, through: :prototype_taxons
@@ -136,6 +136,16 @@ module Spree
136
136
  return_items.all?(&:exchange_processed?)
137
137
  end
138
138
 
139
+ # Accepts all return items, saves the reimbursement, and performs the reimbursement
140
+ #
141
+ # @api public
142
+ # @return [void]
143
+ def return_all
144
+ return_items.each(&:accept!)
145
+ save!
146
+ perform!
147
+ end
148
+
139
149
  private
140
150
 
141
151
  def generate_number
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class ReturnItem::EligibilityValidator::TimeSincePurchase < Spree::ReturnItem::EligibilityValidator::BaseValidator
3
3
  def eligible_for_return?
4
- if (@return_item.inventory_unit.order.completed_at + Spree::Config[:return_eligibility_number_of_days].days) > Time.now
4
+ if (@return_item.inventory_unit.order.completed_at + Spree::Config[:return_eligibility_number_of_days].days) > Time.current
5
5
  return true
6
6
  else
7
7
  add_error(:number_of_days, Spree.t('return_item_time_period_ineligible'))
@@ -5,14 +5,8 @@ module Spree
5
5
  has_many :return_authorizations
6
6
 
7
7
  def self.reasons_for_return_items(return_items)
8
- reasons = Spree::ReturnReason.active
9
8
  # Only allow an inactive reason if it's already associated to a return item
10
- return_items.each do |return_item|
11
- if return_item.return_reason && !return_item.return_reason.active?
12
- reasons << return_item.return_reason
13
- end
14
- end
15
- reasons
9
+ active | return_items.map(&:return_reason).compact
16
10
  end
17
11
  end
18
12
  end
@@ -4,14 +4,12 @@ module Spree
4
4
  belongs_to :role, class_name: "Spree::Role"
5
5
  belongs_to :user, class_name: Spree::UserClassHandle.new
6
6
 
7
- after_save :generate_admin_api_key
7
+ after_create :auto_generate_spree_api_key
8
8
 
9
9
  private
10
10
 
11
- def generate_admin_api_key
12
- if role.admin? && user.respond_to?(:spree_api_key) && !user.spree_api_key
13
- user.generate_spree_api_key!
14
- end
11
+ def auto_generate_spree_api_key
12
+ user.try!(:auto_generate_spree_api_key)
15
13
  end
16
14
  end
17
15
  end
@@ -1,5 +1,3 @@
1
- require 'ostruct'
2
-
3
1
  module Spree
4
2
  class Shipment < Spree::Base
5
3
  belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments
@@ -35,6 +33,7 @@ module Spree
35
33
  scope :with_state, ->(*s) { where(state: s) }
36
34
  # sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
37
35
  scope :reverse_chronological, -> { order('coalesce(spree_shipments.shipped_at, spree_shipments.created_at) desc', id: :desc) }
36
+ scope :by_store, ->(store) { joins(:order).merge(Spree::Order.by_store(store)) }
38
37
 
39
38
  # shipment state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
40
39
  state_machine initial: :pending, use_transactions: false do
@@ -163,10 +162,6 @@ module Spree
163
162
  inventory_units.includes(:line_item).map(&:line_item).uniq
164
163
  end
165
164
 
166
- def line_items
167
- inventory_units.includes(:line_item).map(&:line_item).uniq
168
- end
169
-
170
165
  def ready_or_pending?
171
166
  self.ready? || self.pending?
172
167
  end
@@ -178,7 +173,7 @@ module Spree
178
173
  # StockEstimator.new assigment below will replace the current shipping_method
179
174
  original_shipping_method_id = shipping_method.try!(:id)
180
175
 
181
- new_rates = Stock::Estimator.new(order).shipping_rates(to_package)
176
+ new_rates = Spree::Config.stock.estimator_class.new(order).shipping_rates(to_package)
182
177
 
183
178
  # If one of the new rates matches the previously selected shipping
184
179
  # method, select that instead of the default provided by the estimator.
@@ -243,7 +238,7 @@ module Spree
243
238
 
244
239
  def shipped=(value)
245
240
  return unless value == '1' && shipped_at.nil?
246
- self.shipped_at = Time.now
241
+ self.shipped_at = Time.current
247
242
  end
248
243
 
249
244
  def shipping_method
@@ -282,7 +277,7 @@ module Spree
282
277
  self.update_columns(
283
278
  cost: selected_shipping_rate.cost,
284
279
  adjustment_total: adjustments.additional.map(&:update!).compact.sum,
285
- updated_at: Time.now,
280
+ updated_at: Time.current,
286
281
  )
287
282
  end
288
283
  end
@@ -304,7 +299,7 @@ module Spree
304
299
  # (via Order#paid?) affects the shipment state (YAY)
305
300
  self.update_columns(
306
301
  state: determine_state(order),
307
- updated_at: Time.now
302
+ updated_at: Time.current
308
303
  )
309
304
 
310
305
  # And then it's time to update shipment states and finally persist
@@ -325,7 +320,7 @@ module Spree
325
320
  new_state = determine_state(order)
326
321
  update_columns(
327
322
  state: new_state,
328
- updated_at: Time.now,
323
+ updated_at: Time.current,
329
324
  )
330
325
  after_ship if new_state == 'shipped' and old_state != 'shipped'
331
326
  end
@@ -4,8 +4,6 @@ module Spree
4
4
  include Spree::CalculatedAdjustments
5
5
  DISPLAY = [:both, :front_end, :back_end]
6
6
 
7
- default_scope -> { where(deleted_at: nil) }
8
-
9
7
  has_many :shipping_method_categories, :dependent => :destroy
10
8
  has_many :shipping_categories, through: :shipping_method_categories
11
9
  has_many :shipping_rates, inverse_of: :shipping_method
@@ -15,7 +13,7 @@ module Spree
15
13
  has_many :shipping_method_zones
16
14
  has_many :zones, through: :shipping_method_zones
17
15
 
18
- belongs_to :tax_category, :class_name => 'Spree::TaxCategory'
16
+ belongs_to :tax_category, -> { with_deleted }, :class_name => 'Spree::TaxCategory'
19
17
 
20
18
  validates :name, presence: true
21
19
 
@@ -42,10 +40,6 @@ module Spree
42
40
  self.display_on != "back_end"
43
41
  end
44
42
 
45
- def tax_category
46
- Spree::TaxCategory.unscoped { super }
47
- end
48
-
49
43
  private
50
44
  def compute_amount(calculable)
51
45
  self.calculator.compute(calculable)
@@ -1,11 +1,12 @@
1
1
  module Spree
2
2
  class ShippingRate < Spree::Base
3
3
  belongs_to :shipment, class_name: 'Spree::Shipment'
4
- belongs_to :shipping_method, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
5
- belongs_to :tax_rate, class_name: 'Spree::TaxRate'
4
+ belongs_to :shipping_method, -> { with_deleted }, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
5
+ belongs_to :tax_rate, -> { with_deleted }, class_name: 'Spree::TaxRate'
6
6
 
7
7
  delegate :order, :currency, to: :shipment
8
8
  delegate :name, to: :shipping_method
9
+ delegate :code, to: :shipping_method, prefix: true
9
10
 
10
11
  def display_base_price
11
12
  Spree::Money.new(cost, currency: currency)
@@ -41,17 +42,5 @@ module Spree
41
42
  def display_tax_amount(tax_amount)
42
43
  Spree::Money.new(tax_amount, currency: currency)
43
44
  end
44
-
45
- def shipping_method
46
- Spree::ShippingMethod.unscoped { super }
47
- end
48
-
49
- def shipping_method_code
50
- shipping_method.code
51
- end
52
-
53
- def tax_rate
54
- Spree::TaxRate.unscoped { super }
55
- end
56
45
  end
57
46
  end
@@ -55,9 +55,8 @@ module Spree
55
55
  #
56
56
  # Returns an array of Package instances
57
57
  def build_packages(packages = Array.new)
58
- StockLocation.active.each do |stock_location|
59
- units_for_location = unallocated_inventory_units.select { |unit| stock_location.stock_item(unit.variant) }
60
- next unless units_for_location.any?
58
+ stock_location_variant_ids.each do |stock_location, variant_ids|
59
+ units_for_location = unallocated_inventory_units.select { |unit| variant_ids.include?(unit.variant_id) }
61
60
  packer = build_packer(stock_location, units_for_location)
62
61
  packages += packer.packages
63
62
  end
@@ -66,17 +65,62 @@ module Spree
66
65
 
67
66
  private
68
67
 
68
+ # This finds the variants we're looking for in each active stock location.
69
+ # It returns a hash like:
70
+ # {
71
+ # <stock location> => <set of variant ids>,
72
+ # <stock location> => <set of variant ids>,
73
+ # ...,
74
+ # }
75
+ # This is done in an awkward way for performance reasons. It uses two
76
+ # queries that are kept as performant as possible, and only loads the
77
+ # minimum required ActiveRecord objects.
78
+ def stock_location_variant_ids
79
+ # associate the variant ids we're interested in with stock location ids
80
+ location_variant_ids = StockItem.
81
+ where(variant_id: unallocated_variant_ids).
82
+ joins(:stock_location).
83
+ merge(StockLocation.active).
84
+ pluck(:stock_location_id, :variant_id)
85
+
86
+ # load activerecord objects for the stock location ids and turn them
87
+ # into a lookup hash like:
88
+ # {
89
+ # <stock location id> => <stock location>,
90
+ # ...,
91
+ # }
92
+ location_lookup = StockLocation.
93
+ where(id: location_variant_ids.map(&:first).uniq).
94
+ map { |l| [l.id, l] }.
95
+ to_h
96
+
97
+ # build the final lookup hash of
98
+ # {<stock location> => <set of variant ids>, ...}
99
+ # using the previous results
100
+ hash = location_variant_ids.each_with_object({}) do |(location_id, variant_id), hash|
101
+ location = location_lookup[location_id]
102
+ hash[location] ||= Set.new
103
+ hash[location] << variant_id
104
+ end
105
+
106
+ hash
107
+ end
108
+
69
109
  def unallocated_inventory_units
70
110
  inventory_units - @preallocated_inventory_units
71
111
  end
72
112
 
113
+ def unallocated_variant_ids
114
+ unallocated_inventory_units.map(&:variant_id).uniq
115
+ end
116
+
73
117
  def prioritize_packages(packages)
74
118
  prioritizer = Prioritizer.new(inventory_units, packages)
75
119
  prioritizer.prioritized_packages
76
120
  end
77
121
 
78
122
  def estimate_packages(packages)
79
- estimator = Estimator.new(order)
123
+ estimator = Spree::Config.stock.estimator_class.new(order)
80
124
  packages.each do |package|
81
125
  package.shipping_rates = estimator.shipping_rates(package)
82
126
  end
@@ -20,20 +20,17 @@ module Spree
20
20
  rates = calculate_shipping_rates(package)
21
21
  rates.select! { |rate| rate.shipping_method.frontend? } if frontend_only
22
22
  choose_default_shipping_rate(rates)
23
- sort_shipping_rates(rates)
23
+ Spree::Config.shipping_rate_sorter_class.new(rates).sort
24
24
  end
25
25
 
26
26
  private
27
27
  def choose_default_shipping_rate(shipping_rates)
28
28
  unless shipping_rates.empty?
29
- shipping_rates.min_by(&:cost).selected = true
29
+ default_shipping_rate = Spree::Config.shipping_rate_selector_class.new(shipping_rates).find_default
30
+ default_shipping_rate.selected = true
30
31
  end
31
32
  end
32
33
 
33
- def sort_shipping_rates(shipping_rates)
34
- shipping_rates.sort_by!(&:cost)
35
- end
36
-
37
34
  def calculate_shipping_rates(package)
38
35
  shipping_methods(package).map do |shipping_method|
39
36
  cost = shipping_method.calculator.compute(package)
@@ -22,9 +22,10 @@ module Spree
22
22
  inventory_units.group_by(&:variant).each do |variant, variant_inventory_units|
23
23
  units = variant_inventory_units.clone
24
24
  if variant.should_track_inventory?
25
- next unless stock_location.stock_item(variant)
25
+ stock_item = stock_item_for(variant.id)
26
+ next unless stock_item
26
27
 
27
- on_hand, backordered = stock_location.fill_status(variant, units.count)
28
+ on_hand, backordered = stock_item.fill_status(units.count)
28
29
  raise Spree::Order::InsufficientStock unless on_hand > 0 || backordered > 0
29
30
  package.add_multiple units.slice!(0, on_hand), :on_hand if on_hand > 0
30
31
  package.add_multiple units.slice!(0, backordered), :backordered if backordered > 0
@@ -37,6 +38,21 @@ module Spree
37
38
  end
38
39
 
39
40
  private
41
+
42
+ def stock_item_for(variant_id)
43
+ stock_item_lookup[variant_id]
44
+ end
45
+
46
+ # Returns a lookup table in the form of:
47
+ # {<variant_id> => <stock_item>, ...}
48
+ def stock_item_lookup
49
+ @stock_item_lookup ||= Spree::StockItem.
50
+ where(variant_id: inventory_units.map(&:variant_id).uniq).
51
+ where(stock_location_id: stock_location.id).
52
+ map { |stock_item| [stock_item.variant_id, stock_item] }.
53
+ to_h # there is only one stock item per variant in a stock location
54
+ end
55
+
40
56
  def build_splitter
41
57
  splitter = nil
42
58
  splitters.reverse.each do |klass|
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module Stock
3
+ class ShippingRateSelector
4
+
5
+ attr_reader :shipping_rates
6
+
7
+ def initialize(shipping_rates)
8
+ @shipping_rates = shipping_rates
9
+ end
10
+
11
+ def find_default
12
+ shipping_rates.min_by(&:cost)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module Stock
3
+ class ShippingRateSorter
4
+
5
+ attr_reader :shipping_rates
6
+
7
+ def initialize(shipping_rates)
8
+ @shipping_rates = shipping_rates
9
+ end
10
+
11
+ def sort
12
+ shipping_rates.sort_by(&:cost)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -3,15 +3,18 @@ module Spree
3
3
  acts_as_paranoid
4
4
 
5
5
  belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :stock_items
6
- belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :stock_items
6
+ belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant', inverse_of: :stock_items
7
7
  has_many :stock_movements, inverse_of: :stock_item
8
8
 
9
- validates_presence_of :stock_location, :variant
10
- validates_uniqueness_of :variant_id, scope: [:stock_location_id, :deleted_at]
9
+ validates :stock_location, :variant, presence: true
10
+ validates :variant_id, uniqueness: { scope: [:stock_location_id, :deleted_at] }, allow_blank: true, unless: :deleted_at
11
11
  validates :count_on_hand, numericality: { greater_than_or_equal_to: 0 }, if: :verify_count_on_hand?
12
12
 
13
13
  delegate :weight, :should_track_inventory?, to: :variant
14
14
 
15
+ # @return [String] the name of this stock item's variant
16
+ delegate :name, to: :variant, prefix: true
17
+
15
18
  after_save :conditional_variant_touch, if: :changed?
16
19
  after_touch { variant.touch }
17
20
 
@@ -23,11 +26,6 @@ module Spree
23
26
  Spree::InventoryUnit.backordered_for_stock_item(self)
24
27
  end
25
28
 
26
- # @return [String] the name of this stock item's variant
27
- def variant_name
28
- variant.name
29
- end
30
-
31
29
  # Adjusts the count on hand by a given value.
32
30
  #
33
31
  # @note This will cause backorders to be processed.
@@ -63,13 +61,6 @@ module Spree
63
61
  self.in_stock? || self.backorderable?
64
62
  end
65
63
 
66
- # @note This returns the variant regardless of whether it was soft
67
- # deleted.
68
- # @return [Spree::Variant] this stock item's variant.
69
- def variant
70
- Spree::Variant.unscoped { super }
71
- end
72
-
73
64
  # Sets the count on hand to zero if it not already zero.
74
65
  #
75
66
  # @note This processes backorders if the count on hand is not zero.
@@ -77,6 +68,19 @@ module Spree
77
68
  self.set_count_on_hand(0) if count_on_hand > 0
78
69
  end
79
70
 
71
+ def fill_status(quantity)
72
+ if count_on_hand >= quantity
73
+ on_hand = quantity
74
+ backordered = 0
75
+ else
76
+ on_hand = count_on_hand
77
+ on_hand = 0 if on_hand < 0
78
+ backordered = backorderable? ? (quantity - on_hand) : 0
79
+ end
80
+
81
+ [on_hand, backordered]
82
+ end
83
+
80
84
  private
81
85
  def verify_count_on_hand?
82
86
  count_on_hand_changed? && !backorderable? && (count_on_hand < count_on_hand_was) && (count_on_hand < 0)