spree_core 4.3.0.rc1 → 4.4.0.rc1

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 (537) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/option_values/find_available.rb +9 -1
  3. data/app/finders/spree/products/find.rb +27 -3
  4. data/app/finders/spree/taxons/find.rb +22 -6
  5. data/app/helpers/spree/base_helper.rb +8 -10
  6. data/app/helpers/spree/currency_helper.rb +1 -1
  7. data/app/helpers/spree/products_helper.rb +1 -15
  8. data/app/jobs/spree/base_job.rb +4 -0
  9. data/app/jobs/spree/stock_locations/stock_items/create_job.rb +13 -0
  10. data/app/models/concerns/spree/default_price.rb +1 -1
  11. data/app/models/concerns/spree/display_money.rb +8 -2
  12. data/app/models/concerns/spree/image_methods.rb +24 -0
  13. data/app/models/concerns/spree/memoized_data.rb +1 -1
  14. data/app/models/concerns/spree/metadata.rb +10 -0
  15. data/app/models/concerns/spree/multi_store_resource.rb +1 -1
  16. data/app/models/concerns/spree/named_type.rb +1 -1
  17. data/app/models/concerns/spree/number_identifier.rb +18 -0
  18. data/app/models/concerns/spree/product_scopes.rb +64 -22
  19. data/app/models/concerns/spree/single_store_resource.rb +10 -0
  20. data/app/models/concerns/spree/unique_name.rb +10 -0
  21. data/app/models/concerns/spree/user_methods.rb +18 -8
  22. data/app/models/concerns/spree/user_reporting.rb +35 -10
  23. data/app/models/concerns/spree/user_roles.rb +43 -0
  24. data/app/models/spree/ability.rb +11 -3
  25. data/app/models/spree/address.rb +4 -2
  26. data/app/models/spree/adjustment.rb +1 -0
  27. data/app/models/spree/app_configuration.rb +21 -24
  28. data/app/models/spree/asset.rb +1 -0
  29. data/app/models/spree/base.rb +14 -0
  30. data/app/models/spree/calculator/flat_rate.rb +1 -1
  31. data/app/models/spree/calculator/flexi_rate.rb +1 -1
  32. data/app/models/spree/calculator/price_sack.rb +1 -1
  33. data/app/models/spree/calculator/shipping/digital_delivery.rb +22 -0
  34. data/app/models/spree/calculator/shipping/flat_rate.rb +1 -1
  35. data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -1
  36. data/app/models/spree/calculator/shipping/per_item.rb +1 -1
  37. data/app/models/spree/calculator/shipping/price_sack.rb +1 -1
  38. data/app/models/spree/calculator.rb +1 -1
  39. data/app/models/spree/cms/sections/featured_article.rb +0 -7
  40. data/app/models/spree/cms/sections/hero_image.rb +0 -9
  41. data/app/models/spree/cms/sections/image_gallery.rb +2 -2
  42. data/app/models/spree/cms/sections/side_by_side_images.rb +2 -2
  43. data/app/models/spree/cms_page.rb +3 -3
  44. data/app/models/spree/cms_section.rb +13 -1
  45. data/app/models/spree/country.rb +4 -2
  46. data/app/models/spree/credit_card.rb +10 -0
  47. data/app/models/spree/customer_return.rb +3 -1
  48. data/app/models/spree/digital.rb +15 -0
  49. data/app/models/spree/digital_link.rb +50 -0
  50. data/app/models/spree/gateway/bogus.rb +10 -4
  51. data/app/models/spree/image/configuration/active_storage.rb +2 -19
  52. data/app/models/spree/image.rb +5 -24
  53. data/app/models/spree/legacy_user.rb +1 -0
  54. data/app/models/spree/line_item.rb +11 -3
  55. data/app/models/spree/option_type.rb +4 -4
  56. data/app/models/spree/option_value.rb +2 -0
  57. data/app/models/spree/order/checkout.rb +7 -1
  58. data/app/models/spree/order/digital.rb +33 -0
  59. data/app/models/spree/order.rb +34 -22
  60. data/app/models/spree/order_inventory.rb +1 -1
  61. data/app/models/spree/order_promotion.rb +1 -1
  62. data/app/models/spree/payment/processing.rb +1 -0
  63. data/app/models/spree/payment.rb +25 -4
  64. data/app/models/spree/payment_method.rb +15 -1
  65. data/app/models/spree/preference.rb +2 -1
  66. data/app/models/spree/preferences/configuration.rb +2 -2
  67. data/app/models/spree/preferences/store.rb +1 -1
  68. data/app/models/spree/price.rb +1 -1
  69. data/app/models/spree/product.rb +28 -25
  70. data/app/models/spree/promotion/rules/product.rb +1 -1
  71. data/app/models/spree/promotion.rb +3 -1
  72. data/app/models/spree/promotion_action.rb +1 -1
  73. data/app/models/spree/property.rb +2 -1
  74. data/app/models/spree/prototype.rb +2 -0
  75. data/app/models/spree/refund.rb +2 -0
  76. data/app/models/spree/reimbursement.rb +1 -1
  77. data/app/models/spree/return_authorization.rb +3 -2
  78. data/app/models/spree/return_item.rb +1 -1
  79. data/app/models/spree/role.rb +2 -2
  80. data/app/models/spree/shipment.rb +4 -30
  81. data/app/models/spree/shipping_category.rb +1 -1
  82. data/app/models/spree/shipping_method.rb +2 -0
  83. data/app/models/spree/state.rb +1 -1
  84. data/app/models/spree/stock/quantifier.rb +1 -1
  85. data/app/models/spree/stock/splitter/digital.rb +35 -0
  86. data/app/models/spree/stock_item.rb +2 -2
  87. data/app/models/spree/stock_location.rb +15 -28
  88. data/app/models/spree/stock_movement.rb +3 -0
  89. data/app/models/spree/stock_transfer.rb +3 -6
  90. data/app/models/spree/store.rb +43 -10
  91. data/app/models/spree/store_credit.rb +5 -1
  92. data/app/models/spree/store_credit_category.rb +2 -0
  93. data/app/models/spree/store_credit_event.rb +2 -7
  94. data/app/models/spree/store_credit_type.rb +2 -0
  95. data/app/models/spree/tax_category.rb +3 -1
  96. data/app/models/spree/tax_rate.rb +3 -1
  97. data/app/models/spree/taxon.rb +12 -0
  98. data/app/models/spree/taxon_image/configuration/active_storage.rb +2 -12
  99. data/app/models/spree/taxon_image.rb +1 -0
  100. data/app/models/spree/taxonomy.rb +7 -0
  101. data/app/models/spree/variant.rb +29 -13
  102. data/app/models/spree/wished_item.rb +29 -0
  103. data/app/models/spree/wishlist.rb +35 -0
  104. data/app/models/spree/zone.rb +8 -6
  105. data/app/presenters/spree/filters/options_presenter.rb +20 -0
  106. data/app/presenters/spree/filters/property_presenter.rb +20 -0
  107. data/app/services/spree/account/addresses/create.rb +1 -17
  108. data/app/services/spree/account/addresses/update.rb +1 -22
  109. data/app/services/spree/addresses/create.rb +24 -0
  110. data/app/services/spree/addresses/helper.rb +41 -0
  111. data/app/services/spree/addresses/update.rb +27 -0
  112. data/app/services/spree/cart/add_item.rb +4 -2
  113. data/app/services/spree/cart/associate.rb +16 -0
  114. data/app/services/spree/cart/change_currency.rb +27 -0
  115. data/app/services/spree/cart/create.rb +4 -2
  116. data/app/services/spree/cart/update.rb +2 -2
  117. data/app/services/spree/checkout/add_store_credit.rb +4 -1
  118. data/app/services/spree/checkout/select_shipping_method.rb +49 -0
  119. data/app/services/spree/checkout/update.rb +3 -10
  120. data/app/services/spree/line_items/create.rb +20 -0
  121. data/app/services/spree/line_items/destroy.rb +18 -0
  122. data/app/services/spree/line_items/helper.rb +11 -0
  123. data/app/services/spree/line_items/update.rb +17 -0
  124. data/app/services/spree/orders/approve.rb +18 -0
  125. data/app/services/spree/orders/cancel.rb +18 -0
  126. data/app/services/spree/payments/create.rb +66 -0
  127. data/app/services/spree/seeds/all.rb +26 -0
  128. data/app/services/spree/seeds/countries.rb +50 -0
  129. data/app/services/spree/seeds/default_reimbursement_types.rb +12 -0
  130. data/app/services/spree/seeds/roles.rb +11 -0
  131. data/app/services/spree/seeds/shipping_categories.rb +12 -0
  132. data/app/services/spree/seeds/states.rb +72 -0
  133. data/app/services/spree/seeds/stock_locations.rb +18 -0
  134. data/app/services/spree/seeds/store_credit_categories.rb +12 -0
  135. data/app/services/spree/seeds/stores.rb +31 -0
  136. data/app/services/spree/seeds/zones.rb +39 -0
  137. data/app/services/spree/shipments/add_item.rb +32 -0
  138. data/app/services/spree/shipments/change_state.rb +14 -0
  139. data/app/services/spree/shipments/create.rb +48 -0
  140. data/app/services/spree/shipments/helper.rb +23 -0
  141. data/app/services/spree/shipments/remove_item.rb +55 -0
  142. data/app/services/spree/shipments/update.rb +40 -0
  143. data/app/services/spree/stock_locations/stock_items/create.rb +31 -0
  144. data/app/services/spree/wallet/create_payment_source.rb +26 -0
  145. data/app/sorters/spree/base_sorter.rb +23 -11
  146. data/app/sorters/spree/products/sort.rb +23 -7
  147. data/app/validators/spree/url_validator.rb +23 -0
  148. data/brakeman.ignore +20 -0
  149. data/config/initializers/active_storage.rb +0 -6
  150. data/config/locales/en.yml +24 -168
  151. data/db/migrate/20210914000000_spree_four_three.rb +1205 -0
  152. data/db/migrate/20210915064321_add_metadata_to_spree_orders.rb +13 -0
  153. data/db/migrate/20210915064322_add_metadata_to_spree_products.rb +13 -0
  154. data/db/migrate/20210915064323_add_metadata_to_spree_variants.rb +13 -0
  155. data/db/migrate/20210915064324_add_metadata_to_spree_line_items.rb +13 -0
  156. data/db/migrate/20210915064325_add_metadata_to_spree_shipments.rb +13 -0
  157. data/db/migrate/20210915064326_add_metadata_to_spree_payments.rb +13 -0
  158. data/db/migrate/20210915064327_add_metadata_to_spree_taxons_and_taxonomies.rb +18 -0
  159. data/db/migrate/20210915064328_add_metadata_to_spree_stock_transfers.rb +13 -0
  160. data/db/migrate/20210915064329_add_metadata_to_spree_multiple_tables.rb +30 -0
  161. data/db/migrate/20210920090344_add_deleted_at_to_spree_stores.rb +8 -0
  162. data/db/migrate/20210921070812_rename_column_access_hash_to_token.rb +8 -0
  163. data/db/migrate/20210921070813_create_spree_wishlists.rb +18 -0
  164. data/db/migrate/20210921070814_create_spree_wished_products.rb +16 -0
  165. data/db/migrate/20210921070815_rename_spree_wished_products_to_spree_wished_items.rb +5 -0
  166. data/db/migrate/20210921090344_add_unique_stock_item_stock_location_variant_deleted_at_index.rb +5 -0
  167. data/db/migrate/20210929090344_create_stock_item_stock_location_id_variant_id_coalesce_deleted_at_unique_index.rb +32 -0
  168. data/db/migrate/20210929091444_create_spree_digital_links.rb +13 -0
  169. data/db/migrate/20210929093238_create_spree_digitals.rb +9 -0
  170. data/db/migrate/20210930143043_rename_secret_to_token_on_spree_digital_links.rb +5 -0
  171. data/db/migrate/20210930155649_add_settings_to_spree_stores.rb +11 -0
  172. data/db/seeds.rb +1 -5
  173. data/lib/generators/spree/dummy/dummy_generator.rb +2 -2
  174. data/lib/generators/spree/dummy/templates/rails/database.yml +20 -18
  175. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  176. data/{app/models/spree → lib/spree/core}/app_dependencies.rb +34 -4
  177. data/lib/spree/core/controller_helpers/auth.rb +4 -4
  178. data/lib/spree/core/controller_helpers/common.rb +15 -1
  179. data/lib/spree/core/controller_helpers/currency.rb +1 -1
  180. data/lib/spree/core/controller_helpers/store.rb +14 -0
  181. data/lib/spree/{dependencies_helper.rb → core/dependencies_helper.rb} +0 -0
  182. data/lib/spree/core/engine.rb +10 -4
  183. data/lib/spree/core/importer/product.rb +1 -1
  184. data/lib/spree/core/number_generator.rb +0 -2
  185. data/lib/spree/core/version.rb +1 -1
  186. data/lib/spree/core.rb +21 -13
  187. data/lib/spree/money.rb +2 -2
  188. data/lib/spree/permitted_attributes.rb +38 -13
  189. data/lib/spree/testing_support/authorization_helpers.rb +3 -1
  190. data/lib/spree/testing_support/capybara_config.rb +14 -19
  191. data/lib/spree/testing_support/capybara_ext.rb +1 -6
  192. data/lib/spree/testing_support/common_rake.rb +22 -4
  193. data/lib/spree/testing_support/factories/asset_factory.rb +15 -0
  194. data/lib/spree/testing_support/factories/cms_section_factory.rb +2 -2
  195. data/lib/spree/testing_support/factories/digital_factory.rb +10 -0
  196. data/lib/spree/testing_support/factories/digital_link_factory.rb +6 -0
  197. data/lib/spree/testing_support/factories/log_entry_factory.rb +6 -0
  198. data/lib/spree/testing_support/factories/order_factory.rb +4 -1
  199. data/lib/spree/testing_support/factories/payment_capture_event_factory.rb +6 -0
  200. data/lib/spree/testing_support/factories/payment_factory.rb +3 -3
  201. data/lib/spree/testing_support/factories/product_factory.rb +6 -0
  202. data/lib/spree/testing_support/factories/promotion_action_factory.rb +5 -0
  203. data/lib/spree/testing_support/factories/reimbursement_credit_factory.rb +7 -0
  204. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +7 -0
  205. data/lib/spree/testing_support/factories/state_change_factory.rb +8 -0
  206. data/lib/spree/testing_support/factories/stock_item_factory.rb +7 -0
  207. data/lib/spree/testing_support/factories/stock_location_factory.rb +1 -1
  208. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +9 -0
  209. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  210. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +5 -0
  211. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -0
  212. data/lib/spree/testing_support/factories/user_factory.rb +2 -0
  213. data/lib/spree/testing_support/factories/wished_variant_factory.rb +6 -0
  214. data/lib/spree/testing_support/factories/wishlist_factory.rb +18 -0
  215. data/lib/spree/testing_support/jobs.rb +9 -0
  216. data/lib/spree/testing_support/locale_helpers.rb +1 -1
  217. data/lib/spree/testing_support/rspec_retry_config.rb +5 -0
  218. data/lib/tasks/core.rake +4 -4
  219. data/spree_core.gemspec +3 -2
  220. metadata +109 -325
  221. data/app/services/spree/account/addresses/helper.rb +0 -43
  222. data/app/services/spree/build_localized_redirect_url.rb +0 -101
  223. data/app/views/spree/shared/_purchased_items_table.text.erb +0 -25
  224. data/db/default/spree/countries.rb +0 -24
  225. data/db/default/spree/default_reimbursement_type.rb +0 -1
  226. data/db/default/spree/roles.rb +0 -2
  227. data/db/default/spree/states.rb +0 -49
  228. data/db/default/spree/store_credit_categories.rb +0 -1
  229. data/db/default/spree/stores.rb +0 -21
  230. data/db/default/spree/zones.rb +0 -29
  231. data/db/migrate/20120831092320_spree_one_two.rb +0 -481
  232. data/db/migrate/20120831092359_spree_promo_one_two.rb +0 -45
  233. data/db/migrate/20120905145253_add_tax_rate_label.rb +0 -5
  234. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +0 -5
  235. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +0 -8
  236. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +0 -5
  237. data/db/migrate/20121010142909_add_states_required_to_countries.rb +0 -5
  238. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +0 -6
  239. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +0 -11
  240. data/db/migrate/20121031162139_split_prices_from_variants.rb +0 -31
  241. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +0 -9
  242. data/db/migrate/20121107184631_add_currency_to_line_items.rb +0 -5
  243. data/db/migrate/20121107194006_add_currency_to_orders.rb +0 -5
  244. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +0 -5
  245. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +0 -5
  246. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +0 -5
  247. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +0 -5
  248. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +0 -6
  249. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +0 -9
  250. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +0 -6
  251. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +0 -5
  252. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +0 -9
  253. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +0 -5
  254. data/db/migrate/20130211190146_create_spree_stock_items.rb +0 -14
  255. data/db/migrate/20130211191120_create_spree_stock_locations.rb +0 -11
  256. data/db/migrate/20130213191427_create_default_stock.rb +0 -33
  257. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +0 -5
  258. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +0 -5
  259. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +0 -5
  260. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +0 -6
  261. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +0 -6
  262. data/db/migrate/20130228210442_create_shipping_method_zone.rb +0 -21
  263. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +0 -5
  264. data/db/migrate/20130301162924_create_shipping_method_categories.rb +0 -13
  265. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +0 -5
  266. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +0 -24
  267. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +0 -7
  268. data/db/migrate/20130305143310_create_stock_movements.rb +0 -12
  269. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +0 -22
  270. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +0 -5
  271. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +0 -5
  272. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +0 -5
  273. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +0 -8
  274. data/db/migrate/20130319062004_change_orders_total_precision.rb +0 -8
  275. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +0 -7
  276. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +0 -7
  277. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +0 -7
  278. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +0 -7
  279. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +0 -15
  280. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +0 -9
  281. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +0 -5
  282. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +0 -15
  283. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +0 -9
  284. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +0 -14
  285. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +0 -5
  286. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +0 -13
  287. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +0 -5
  288. data/db/migrate/20130417120035_update_adjustment_states.rb +0 -16
  289. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +0 -15
  290. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +0 -14
  291. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +0 -5
  292. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +0 -5
  293. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +0 -23
  294. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +0 -5
  295. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +0 -5
  296. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +0 -5
  297. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +0 -5
  298. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +0 -5
  299. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +0 -9
  300. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +0 -9
  301. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +0 -6
  302. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +0 -5
  303. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +0 -7
  304. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +0 -5
  305. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +0 -6
  306. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +0 -5
  307. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +0 -6
  308. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +0 -5
  309. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +0 -5
  310. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +0 -5
  311. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +0 -10
  312. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +0 -12
  313. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +0 -8
  314. data/db/migrate/20130807024301_upgrade_adjustments.rb +0 -46
  315. data/db/migrate/20130807024302_rename_adjustment_fields.rb +0 -20
  316. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +0 -5
  317. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +0 -5
  318. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +0 -5
  319. data/db/migrate/20130813140619_expand_order_number_size.rb +0 -9
  320. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +0 -5
  321. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +0 -5
  322. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +0 -5
  323. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +0 -16
  324. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +0 -8
  325. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +0 -15
  326. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +0 -19
  327. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +0 -5
  328. data/db/migrate/20130909115621_change_states_required_for_countries.rb +0 -9
  329. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +0 -5
  330. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +0 -5
  331. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +0 -7
  332. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +0 -16
  333. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +0 -5
  334. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +0 -6
  335. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +0 -5
  336. data/db/migrate/20131118043959_add_included_to_adjustments.rb +0 -5
  337. data/db/migrate/20131118050234_rename_tax_total_fields.rb +0 -11
  338. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +0 -21
  339. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +0 -5
  340. data/db/migrate/20131127001002_add_position_to_classifications.rb +0 -5
  341. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +0 -8
  342. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +0 -24
  343. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +0 -5
  344. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +0 -8
  345. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +0 -5
  346. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +0 -5
  347. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +0 -6
  348. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +0 -5
  349. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +0 -6
  350. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +0 -5
  351. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +0 -5
  352. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +0 -12
  353. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +0 -5
  354. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +0 -11
  355. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +0 -5
  356. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +0 -5
  357. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +0 -6
  358. data/db/migrate/20140213184916_add_more_indexes.rb +0 -13
  359. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +0 -5
  360. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +0 -8
  361. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +0 -13
  362. data/db/migrate/20140309023735_migrate_old_preferences.rb +0 -27
  363. data/db/migrate/20140309024355_create_spree_stores.rb +0 -25
  364. data/db/migrate/20140309033438_create_store_from_preferences.rb +0 -42
  365. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +0 -6
  366. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +0 -8
  367. data/db/migrate/20140331100557_add_additional_store_fields.rb +0 -8
  368. data/db/migrate/20140410141842_add_many_missing_indexes.rb +0 -18
  369. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +0 -66
  370. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +0 -5
  371. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +0 -8
  372. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +0 -5
  373. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +0 -29
  374. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +0 -10
  375. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +0 -6
  376. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +0 -6
  377. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +0 -5
  378. data/db/migrate/20140625214618_create_spree_refunds.rb +0 -12
  379. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +0 -12
  380. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +0 -5
  381. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +0 -10
  382. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +0 -55
  383. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +0 -7
  384. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +0 -5
  385. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +0 -28
  386. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +0 -14
  387. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +0 -5
  388. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +0 -11
  389. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +0 -9
  390. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +0 -6
  391. data/db/migrate/20140717155155_create_default_refund_reason.rb +0 -9
  392. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +0 -7
  393. data/db/migrate/20140718133010_create_spree_customer_returns.rb +0 -9
  394. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +0 -6
  395. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +0 -15
  396. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +0 -5
  397. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +0 -13
  398. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +0 -15
  399. data/db/migrate/20140725131539_create_spree_reimbursements.rb +0 -21
  400. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +0 -5
  401. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +0 -7
  402. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +0 -5
  403. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +0 -20
  404. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +0 -10
  405. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +0 -5
  406. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +0 -9
  407. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +0 -10
  408. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +0 -7
  409. data/db/migrate/20140911173301_add_kind_to_zone.rb +0 -11
  410. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +0 -5
  411. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +0 -6
  412. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +0 -5
  413. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +0 -6
  414. data/db/migrate/20141009204607_add_store_id_to_orders.rb +0 -8
  415. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +0 -8
  416. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +0 -5
  417. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +0 -8
  418. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +0 -13
  419. data/db/migrate/20141105213646_update_classifications_positions.rb +0 -9
  420. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +0 -5
  421. data/db/migrate/20141215232040_remove_token_permissions_table.rb +0 -6
  422. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +0 -5
  423. data/db/migrate/20141217215630_update_product_slug_index.rb +0 -6
  424. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +0 -5
  425. data/db/migrate/20150118210639_create_spree_store_credits.rb +0 -24
  426. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +0 -8
  427. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +0 -17
  428. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +0 -10
  429. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +0 -6
  430. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +0 -5
  431. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +0 -5
  432. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +0 -8
  433. data/db/migrate/20150128060325_remove_spree_configurations.rb +0 -16
  434. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +0 -13
  435. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +0 -13
  436. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +0 -67
  437. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +0 -18
  438. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +0 -14
  439. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -70
  440. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +0 -5
  441. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +0 -6
  442. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +0 -16
  443. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +0 -19
  444. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +0 -12
  445. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +0 -6
  446. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +0 -12
  447. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +0 -18
  448. data/db/migrate/20150727191614_spree_store_credit_types.rb +0 -11
  449. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +0 -68
  450. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +0 -13
  451. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +0 -16
  452. data/db/migrate/20160219165458_add_indexes.rb +0 -14
  453. data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +0 -10
  454. data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +0 -7
  455. data/db/migrate/20161014145148_add_created_at_to_variant.rb +0 -8
  456. data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +0 -6
  457. data/db/migrate/20161125065505_add_quantity_to_inventory_units.rb +0 -5
  458. data/db/migrate/20170119122701_add_original_return_item_id_to_spree_inventory_units.rb +0 -29
  459. data/db/migrate/20170315152755_add_unique_index_on_number_to_spree_orders.rb +0 -16
  460. data/db/migrate/20170316154338_add_unique_index_on_number_to_spree_stock_transfer.rb +0 -16
  461. data/db/migrate/20170316205511_add_unique_index_on_number_to_spree_shipment.rb +0 -16
  462. data/db/migrate/20170320134043_add_unique_index_on_number_to_spree_payments.rb +0 -17
  463. data/db/migrate/20170320142750_add_unique_index_on_number_to_spree_return_authorizations.rb +0 -16
  464. data/db/migrate/20170320145040_add_unique_index_on_number_to_spree_customer_returns.rb +0 -16
  465. data/db/migrate/20170320145518_add_unique_index_on_number_to_spree_reimbursements.rb +0 -16
  466. data/db/migrate/20170323151450_add_missing_unique_indexes_for_unique_attributes.rb +0 -37
  467. data/db/migrate/20170329110859_add_index_on_stock_location_to_spree_customer_returns.rb +0 -5
  468. data/db/migrate/20170329113917_add_index_on_prototype_to_spree_option_type_prototype.rb +0 -19
  469. data/db/migrate/20170330082155_add_indexes_to_spree_option_value_variant.rb +0 -19
  470. data/db/migrate/20170330132215_add_index_on_promotion_id_to_order_promotions.rb +0 -5
  471. data/db/migrate/20170331101758_add_indexes_for_property_prototype.rb +0 -20
  472. data/db/migrate/20170331103334_add_index_for_prototype_id_to_prototype_taxons.rb +0 -5
  473. data/db/migrate/20170331110454_add_indexes_to_refunds.rb +0 -6
  474. data/db/migrate/20170331111757_add_indexes_to_reimbursement_credits.rb +0 -6
  475. data/db/migrate/20170331115246_add_indexes_to_return_authorizations.rb +0 -6
  476. data/db/migrate/20170331120125_add_indexes_to_return_items.rb +0 -11
  477. data/db/migrate/20170331121725_add_index_to_role_users.rb +0 -18
  478. data/db/migrate/20170331123625_add_index_to_shipping_method_categories.rb +0 -5
  479. data/db/migrate/20170331123832_add_index_to_shipping_method_zones.rb +0 -20
  480. data/db/migrate/20170331124251_add_index_to_spree_shipping_rates.rb +0 -6
  481. data/db/migrate/20170331124513_add_index_to_spree_stock_items.rb +0 -5
  482. data/db/migrate/20170331124924_add_index_to_spree_stock_movement.rb +0 -5
  483. data/db/migrate/20170413211707_change_indexes_on_friendly_id_slugs.rb +0 -10
  484. data/db/migrate/20170722102643_add_analytics_kind_to_spree_trackers.rb +0 -5
  485. data/db/migrate/20170727103056_rename_tracker_kind_field.rb +0 -5
  486. data/db/migrate/20171004223836_remove_icon_from_taxons.rb +0 -8
  487. data/db/migrate/20180222133746_add_unique_index_on_spree_promotions_code.rb +0 -6
  488. data/db/migrate/20180613080857_rename_guest_token_to_token_in_orders.rb +0 -5
  489. data/db/migrate/20180915160001_add_timestamps_to_spree_prices.rb +0 -12
  490. data/db/migrate/20181024100754_add_deleted_at_to_spree_credit_cards.rb +0 -6
  491. data/db/migrate/20190305121659_add_iso_and_iso3_validation_on_presence_and_uniqueness.rb +0 -18
  492. data/db/migrate/20190523092729_add_user_id_and_deleted_at_to_spree_addresses.rb +0 -12
  493. data/db/migrate/20191005121504_add_store_id_to_payment_methods.rb +0 -7
  494. data/db/migrate/20191016134113_add_deafult_value_for_store_default_currency.rb +0 -5
  495. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +0 -11
  496. data/db/migrate/20200102141311_add_social_to_spree_stores.rb +0 -10
  497. data/db/migrate/20200212144523_add_hide_from_nav_to_taxons.rb +0 -5
  498. data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +0 -7
  499. data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +0 -7
  500. data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +0 -7
  501. data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +0 -9
  502. data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +0 -8
  503. data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +0 -5
  504. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +0 -7
  505. data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +0 -7
  506. data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +0 -5
  507. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +0 -5
  508. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +0 -12
  509. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +0 -10
  510. data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +0 -5
  511. data/db/migrate/20201023152810_add_filterable_to_spree_properties.rb +0 -8
  512. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +0 -5
  513. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +0 -5
  514. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +0 -10
  515. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +0 -15
  516. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +0 -5
  517. data/db/migrate/20210120142527_ensure_default_locale_in_spree_stores.rb +0 -5
  518. data/db/migrate/20210205211040_add_supported_locales_to_spree_stores.rb +0 -11
  519. data/db/migrate/20210215202602_migrate_spree_i18n_globalize_config.rb +0 -22
  520. data/db/migrate/20210407200948_create_spree_menus.rb +0 -16
  521. data/db/migrate/20210408092939_create_spree_menu_items.rb +0 -31
  522. data/db/migrate/20210504163720_add_filter_param_to_spree_product_properties.rb +0 -8
  523. data/db/migrate/20210505114659_add_filter_param_to_spree_properties.rb +0 -8
  524. data/db/migrate/20210512191732_create_spree_cms_pages.rb +0 -24
  525. data/db/migrate/20210514204251_create_spree_cms_sections.rb +0 -22
  526. data/db/migrate/20210527094055_create_spree_products_stores.rb +0 -29
  527. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +0 -5
  528. data/db/migrate/20210702112334_add_missing_timestamp_columns.rb +0 -46
  529. data/db/migrate/20210713131614_add_unique_index_on_property_id_and_product_id_to_product_properties.rb +0 -29
  530. data/db/migrate/20210715091956_add_store_id_to_spree_store_credits.rb +0 -10
  531. data/db/migrate/20210716093151_add_store_id_to_spree_taxonomies.rb +0 -11
  532. data/db/migrate/20210716104141_add_index_on_name_parent_id_and_taxonomy_id_on_spree_taxons.rb +0 -31
  533. data/db/migrate/20210721120857_add_index_on_permalink_parent_id_and_taxonomy_id_on_spree_taxons.rb +0 -31
  534. data/db/migrate/20210721125657_create_spree_promotions_stores.rb +0 -29
  535. data/db/migrate/20210722090705_add_store_id_to_spree_customer_returns.rb +0 -11
  536. data/db/migrate/20210726065456_change_integer_id_columns_into_bigint.rb +0 -305
  537. data/db/migrate/20210730154425_fix_promotion_code_and_path_unique_indexes.rb +0 -9
@@ -24,6 +24,7 @@ module Spree
24
24
  include ProductScopes
25
25
  include MultiStoreResource
26
26
  include MemoizedData
27
+ include Metadata
27
28
 
28
29
  MEMOIZED_METHODS = %w(total_on_hand taxonomy_ids taxon_and_ancestors category
29
30
  default_variant_id tax_category default_variant
@@ -87,6 +88,7 @@ module Spree
87
88
 
88
89
  has_many :store_products, class_name: 'Spree::StoreProduct'
89
90
  has_many :stores, through: :store_products, class_name: 'Spree::Store'
91
+ has_many :digitals, through: :variants_including_master
90
92
 
91
93
  after_create :add_associations_from_prototype
92
94
  after_create :build_variants_from_option_values_hash, if: :option_values_hash
@@ -115,9 +117,11 @@ module Spree
115
117
  validates :price, if: :requires_price?
116
118
  end
117
119
 
118
- validates :slug, presence: true, uniqueness: { allow_blank: true, case_sensitive: true }
120
+ validates :slug, presence: true, uniqueness: { allow_blank: true, case_sensitive: true, scope: spree_base_uniqueness_scope }
119
121
  validate :discontinue_on_must_be_later_than_available_on, if: -> { available_on && discontinue_on }
120
122
 
123
+ scope :for_store, ->(store) { joins(:store_products).where(StoreProduct.table_name => { store_id: store.id }) }
124
+
121
125
  attr_accessor :option_values_hash
122
126
 
123
127
  accepts_nested_attributes_for :product_properties, allow_destroy: true, reject_if: ->(pp) { pp[:property_name].blank? }
@@ -126,7 +130,7 @@ module Spree
126
130
 
127
131
  self.whitelisted_ransackable_associations = %w[taxons stores variants_including_master master variants]
128
132
  self.whitelisted_ransackable_attributes = %w[description name slug discontinue_on]
129
- self.whitelisted_ransackable_scopes = %w[not_discontinued search_by_name]
133
+ self.whitelisted_ransackable_scopes = %w[not_discontinued search_by_name in_taxon price_between]
130
134
 
131
135
  [
132
136
  :sku, :price, :currency, :weight, :height, :width, :depth, :is_master,
@@ -140,19 +144,19 @@ module Spree
140
144
 
141
145
  alias master_images images
142
146
 
143
- # Cant use short form block syntax due to https://github.com/Netflix/fast_jsonapi/issues/259
147
+ # Can't use short form block syntax due to https://github.com/Netflix/fast_jsonapi/issues/259
144
148
  def purchasable?
145
- variants_including_master.any?(&:purchasable?)
149
+ default_variant.purchasable? || variants.any?(&:purchasable?)
146
150
  end
147
151
 
148
- # Cant use short form block syntax due to https://github.com/Netflix/fast_jsonapi/issues/259
152
+ # Can't use short form block syntax due to https://github.com/Netflix/fast_jsonapi/issues/259
149
153
  def in_stock?
150
- variants_including_master.any?(&:in_stock?)
154
+ default_variant.in_stock? || variants.any?(&:in_stock?)
151
155
  end
152
156
 
153
- # Cant use short form block syntax due to https://github.com/Netflix/fast_jsonapi/issues/259
157
+ # Can't use short form block syntax due to https://github.com/Netflix/fast_jsonapi/issues/259
154
158
  def backorderable?
155
- variants_including_master.any?(&:backorderable?)
159
+ default_variant.backorderable? || variants.any?(&:backorderable?)
156
160
  end
157
161
 
158
162
  def find_or_build_master
@@ -193,10 +197,7 @@ module Spree
193
197
  end
194
198
 
195
199
  # Adding properties and option types on creation based on a chosen prototype
196
- attr_reader :prototype_id
197
- def prototype_id=(value)
198
- @prototype_id = value.to_i
199
- end
200
+ attr_accessor :prototype_id
200
201
 
201
202
  # Ensures option_types and product_option_types exist for keys in option_values_hash
202
203
  def ensure_option_types_exist_for_values_hash
@@ -263,14 +264,6 @@ module Spree
263
264
  where conditions.inject(:or)
264
265
  end
265
266
 
266
- def self.search_by_name(query)
267
- if defined?(SpreeGlobalize)
268
- joins(:translations).order(:name).where("LOWER(#{Product::Translation.table_name}.name) LIKE LOWER(:query)", query: "%#{query}%").distinct
269
- else
270
- where("LOWER(#{Product.table_name}.name) LIKE LOWER(:query)", query: "%#{query}%")
271
- end
272
- end
273
-
274
267
  # Suitable for displaying only variants that has at least one option value.
275
268
  # There may be scenarios where an option type is removed and along with it
276
269
  # all option values. At that point all variants associated with only those
@@ -301,11 +294,13 @@ module Spree
301
294
  end
302
295
 
303
296
  def total_on_hand
304
- @total_on_hand ||= if any_variants_not_track_inventory?
305
- Float::INFINITY
306
- else
307
- stock_items.sum(:count_on_hand)
308
- end
297
+ @total_on_hand ||= Rails.cache.fetch(['product-total-on-hand', cache_key_with_version]) do
298
+ if any_variants_not_track_inventory?
299
+ Float::INFINITY
300
+ else
301
+ stock_items.sum(:count_on_hand)
302
+ end
303
+ end
309
304
  end
310
305
 
311
306
  # Master variant may be deleted (i.e. when the product is deleted)
@@ -329,6 +324,14 @@ module Spree
329
324
  end
330
325
  end
331
326
 
327
+ def any_variant_in_stock_or_backorderable?
328
+ if variants.any?
329
+ variants_including_master.in_stock_or_backorderable.exists?
330
+ else
331
+ master.in_stock_or_backorderable?
332
+ end
333
+ end
334
+
332
335
  private
333
336
 
334
337
  def add_associations_from_prototype
@@ -1,6 +1,6 @@
1
1
  # A rule to limit a promotion based on products in the order.
2
2
  # Can require all or any of the products to be present.
3
- # Valid products either come from assigned product group or are assingned directly to the rule.
3
+ # Valid products either come from assigned product group or are assigned directly to the rule.
4
4
  module Spree
5
5
  class Promotion
6
6
  module Rules
@@ -1,6 +1,7 @@
1
1
  module Spree
2
2
  class Promotion < Spree::Base
3
3
  include MultiStoreResource
4
+ include Metadata
4
5
 
5
6
  MATCH_POLICIES = %w(all any)
6
7
  UNACTIVATABLE_ORDER_STATES = ['complete', 'awaiting_return', 'returned']
@@ -18,7 +19,8 @@ module Spree
18
19
  has_many :order_promotions, class_name: 'Spree::OrderPromotion'
19
20
  has_many :orders, through: :order_promotions, class_name: 'Spree::Order'
20
21
 
21
- has_and_belongs_to_many :stores, class_name: 'Spree::Store', join_table: 'spree_promotions_stores'
22
+ has_many :store_promotions, class_name: 'Spree::StorePromotion'
23
+ has_many :stores, class_name: 'Spree::Store', through: :store_promotions
22
24
 
23
25
  accepts_nested_attributes_for :promotion_actions, :promotion_rules
24
26
 
@@ -8,7 +8,7 @@ module Spree
8
8
 
9
9
  scope :of_type, ->(t) { where(type: t) }
10
10
 
11
- # This method should be overriden in subclass
11
+ # This method should be overridden in subclass
12
12
  # Updates the state of the order or performs some other action depending on the subclass
13
13
  # options will contain the payload from the event that activated the promotion. This will include
14
14
  # the key :user which allows user based actions to be performed in addition to actions on the order
@@ -1,6 +1,7 @@
1
1
  module Spree
2
2
  class Property < Spree::Base
3
3
  include Spree::FilterParam
4
+ include Metadata
4
5
 
5
6
  auto_strip_attributes :name, :presentation
6
7
 
@@ -18,7 +19,7 @@ module Spree
18
19
  after_touch :touch_all_products
19
20
  after_save :ensure_product_properties_have_filter_params
20
21
 
21
- self.whitelisted_ransackable_attributes = ['presentation']
22
+ self.whitelisted_ransackable_attributes = ['presentation', 'filterable']
22
23
 
23
24
  def uniq_values(product_properties_scope: nil)
24
25
  with_uniq_values_cache_key(product_properties_scope) do
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class Prototype < Spree::Base
3
+ include Metadata
4
+
3
5
  has_many :property_prototypes, class_name: 'Spree::PropertyPrototype'
4
6
  has_many :properties, through: :property_prototypes, class_name: 'Spree::Property'
5
7
 
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class Refund < Spree::Base
3
+ include Metadata
4
+
3
5
  with_options inverse_of: :refunds do
4
6
  belongs_to :payment
5
7
  belongs_to :reimbursement, optional: true
@@ -1,6 +1,7 @@
1
1
  module Spree
2
2
  class Reimbursement < Spree::Base
3
3
  include Spree::Core::NumberGenerator.new(prefix: 'RI', length: 9)
4
+ include NumberIdentifier
4
5
 
5
6
  class IncompleteReimbursementError < StandardError; end
6
7
 
@@ -15,7 +16,6 @@ module Spree
15
16
  has_many :return_items
16
17
  end
17
18
 
18
- validates :number, uniqueness: true
19
19
  validates :order, presence: true
20
20
  validate :validate_return_items_belong_to_same_order
21
21
 
@@ -1,6 +1,7 @@
1
1
  module Spree
2
2
  class ReturnAuthorization < Spree::Base
3
3
  include Spree::Core::NumberGenerator.new(prefix: 'RA', length: 9)
4
+ include NumberIdentifier
4
5
 
5
6
  belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations
6
7
 
@@ -17,7 +18,6 @@ module Spree
17
18
 
18
19
  accepts_nested_attributes_for :return_items, allow_destroy: true
19
20
 
20
- validates :number, uniqueness: true
21
21
  validates :order, :reason, :stock_location, presence: true
22
22
  validate :must_have_shipped_units, on: :create
23
23
 
@@ -44,7 +44,8 @@ module Spree
44
44
  end
45
45
 
46
46
  def currency
47
- order.nil? ? Spree::Config[:currency] : order.currency
47
+ # FIXME: we should associate ReturnAuthorization with Store
48
+ order.nil? ? Spree::Store.default.default_currency : order.currency
48
49
  end
49
50
 
50
51
  def refundable_amount
@@ -165,7 +165,7 @@ module Spree
165
165
  end
166
166
 
167
167
  def currency
168
- return_authorization.try(:currency) || Spree::Config[:currency]
168
+ return_authorization.try(:currency) || Spree::Store.default.default_currency
169
169
  end
170
170
 
171
171
  private
@@ -1,8 +1,8 @@
1
1
  module Spree
2
2
  class Role < Spree::Base
3
+ include UniqueName
4
+
3
5
  has_many :role_users, class_name: 'Spree::RoleUser', dependent: :destroy
4
6
  has_many :users, through: :role_users, class_name: Spree.user_class.to_s
5
-
6
- validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
7
7
  end
8
8
  end
@@ -3,8 +3,9 @@ require 'ostruct'
3
3
  module Spree
4
4
  class Shipment < Spree::Base
5
5
  include Spree::Core::NumberGenerator.new(prefix: 'H', length: 11)
6
-
6
+ include NumberIdentifier
7
7
  include NumberAsParam
8
+ include Metadata
8
9
 
9
10
  with_options inverse_of: :shipments do
10
11
  belongs_to :address, class_name: 'Spree::Address'
@@ -26,7 +27,6 @@ module Spree
26
27
  before_validation :set_cost_zero_when_nil
27
28
 
28
29
  validates :stock_location, presence: true
29
- validates :number, uniqueness: { case_sensitive: true }
30
30
 
31
31
  attr_accessor :special_instructions
32
32
 
@@ -216,7 +216,7 @@ module Spree
216
216
  return shipping_rates if shipped?
217
217
  return [] unless can_get_rates?
218
218
 
219
- # StockEstimator.new assigment below will replace the current shipping_method
219
+ # StockEstimator.new assignment below will replace the current shipping_method
220
220
  original_shipping_method_id = shipping_method.try(:id)
221
221
 
222
222
  self.shipping_rates = Stock::Estimator.new(order).
@@ -303,34 +303,8 @@ module Spree
303
303
  end
304
304
  end
305
305
 
306
- # Update Shipment and make sure Order states follow the shipment changes
307
306
  def update_attributes_and_order(params = {})
308
- if update params
309
- if params.key? :selected_shipping_rate_id
310
- # Changing the selected Shipping Rate won't update the cost (for now)
311
- # so we persist the Shipment#cost before calculating order shipment
312
- # total and updating payment state (given a change in shipment cost
313
- # might change the Order#payment_state)
314
- update_amounts
315
-
316
- order.updater.update_shipment_total
317
- order.updater.update_payment_state
318
-
319
- # Update shipment state only after order total is updated because it
320
- # (via Order#paid?) affects the shipment state (YAY)
321
- update_columns(
322
- state: determine_state(order),
323
- updated_at: Time.current
324
- )
325
-
326
- # And then it's time to update shipment states and finally persist
327
- # order changes
328
- order.updater.update_shipment_state
329
- order.updater.persist_totals
330
- end
331
-
332
- true
333
- end
307
+ Shipments::Update.call(shipment: self, shipment_attributes: params).success?
334
308
  end
335
309
 
336
310
  # Updates various aspects of the Shipment while bypassing any callbacks. Note that this method takes an explicit reference to the
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class ShippingCategory < Spree::Base
3
- validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
3
+ include UniqueName
4
4
 
5
5
  with_options inverse_of: :shipping_category do
6
6
  has_many :products
@@ -2,6 +2,8 @@ module Spree
2
2
  class ShippingMethod < Spree::Base
3
3
  acts_as_paranoid
4
4
  include Spree::CalculatedAdjustments
5
+ include Metadata
6
+
5
7
  DISPLAY = [:both, :front_end, :back_end]
6
8
 
7
9
  # Used for #refresh_rates
@@ -14,7 +14,7 @@ module Spree
14
14
  validates :country, :name, presence: true
15
15
  validates :name, :abbr, uniqueness: { case_sensitive: false, scope: :country_id }, allow_blank: true
16
16
 
17
- self.whitelisted_ransackable_attributes = %w(abbr)
17
+ self.whitelisted_ransackable_attributes = %w(abbr country_id name)
18
18
 
19
19
  def self.find_all_by_name_or_abbr(name_or_abbr)
20
20
  where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr)
@@ -31,7 +31,7 @@ module Spree
31
31
  private
32
32
 
33
33
  def scope_to_location(collection)
34
- return collection.with_active_stock_location unless stock_location.present?
34
+ return collection.with_active_stock_location if stock_location.blank?
35
35
 
36
36
  collection.where(stock_location: stock_location)
37
37
  end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Stock
3
+ module Splitter
4
+ class Digital < Spree::Stock::Splitter::Base
5
+ def split(packages)
6
+ split_packages = []
7
+ packages.each do |package|
8
+ split_packages += split_by_digital(package)
9
+ end
10
+
11
+ return_next(split_packages)
12
+ end
13
+
14
+ private
15
+
16
+ def split_by_digital(package)
17
+ digitals = Hash.new { |hash, key| hash[key] = [] }
18
+ package.contents.each do |item|
19
+ digitals[item.variant.digital?] << item
20
+ end
21
+
22
+ hash_to_packages(digitals)
23
+ end
24
+
25
+ def hash_to_packages(digitals)
26
+ packages = []
27
+ digitals.each do |_id, contents|
28
+ packages << build_package(contents)
29
+ end
30
+ packages
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -26,7 +26,7 @@ module Spree
26
26
  after_destroy { variant.touch }
27
27
 
28
28
  self.whitelisted_ransackable_attributes = %w[count_on_hand stock_location_id variant_id]
29
- self.whitelisted_ransackable_associations = ['variant']
29
+ self.whitelisted_ransackable_associations = %w[variant stock_location]
30
30
 
31
31
  scope :with_active_stock_location, -> { joins(:stock_location).merge(Spree::StockLocation.active) }
32
32
 
@@ -79,7 +79,7 @@ module Spree
79
79
 
80
80
  if unit.quantity > number
81
81
  # if required quantity is greater than available
82
- # split off and fullfill that
82
+ # split off and fulfill that
83
83
  split = unit.split_inventory!(number)
84
84
  split.fill_backorder
85
85
  else
@@ -1,19 +1,21 @@
1
1
  module Spree
2
2
  class StockLocation < Spree::Base
3
+ include UniqueName
4
+
3
5
  has_many :shipments
4
6
  has_many :stock_items, dependent: :delete_all, inverse_of: :stock_location
7
+ has_many :variants, through: :stock_items
5
8
  has_many :stock_movements, through: :stock_items
6
9
 
7
10
  belongs_to :state, class_name: 'Spree::State', optional: true
8
11
  belongs_to :country, class_name: 'Spree::Country'
9
12
 
10
- validates :name, presence: true, uniqueness: { allow_blank: true, case_sensitive: false }
11
-
12
13
  scope :active, -> { where(active: true) }
13
14
  scope :order_default, -> { order(default: :desc, name: :asc) }
14
15
 
15
16
  after_create :create_stock_items, if: :propagate_all_variants?
16
17
  after_save :ensure_one_default
18
+ after_update :conditional_touch_records
17
19
 
18
20
  def state_text
19
21
  state.try(:abbr) || state.try(:name) || state_name
@@ -45,15 +47,13 @@ module Spree
45
47
  end
46
48
 
47
49
  # Attempts to look up StockItem for the variant, and creates one if not found.
48
- # This method accepts an instance of the variant.
49
- # Other methods in this model attempt to pass a variant,
50
- # but controller actions can pass just the variant id as a parameter.
51
50
  #
52
- # @param variant [Variant] Variant instance.
51
+ # @param variant Variant instance or Variant ID
53
52
  #
54
53
  # @return [StockItem] Corresponding StockItem for the StockLocation's variant.
55
54
  def stock_item_or_create(variant)
56
- stock_item(variant) || stock_items.create(variant_id: variant.id)
55
+ variant_id = variant.is_a?(Spree::Variant) ? variant.id : variant
56
+ stock_item(variant_id) || stock_items.create(variant_id: variant_id)
57
57
  end
58
58
 
59
59
  def count_on_hand(variant)
@@ -106,27 +106,7 @@ module Spree
106
106
  private
107
107
 
108
108
  def create_stock_items
109
- variants_scope = Spree::Variant
110
-
111
- if self.class.method_defined?(:insert_all) && self.class.method_defined?(:touch_all)
112
- prepared_stock_items = variants_scope.ids.map do |variant_id|
113
- Hash[
114
- 'stock_location_id', id,
115
- 'variant_id', variant_id,
116
- 'backorderable', backorderable_default,
117
- 'created_at', Time.current,
118
- 'updated_at', Time.current
119
- ]
120
- end
121
- if prepared_stock_items.any?
122
- stock_items.insert_all(prepared_stock_items)
123
- variants_scope.touch_all
124
- end
125
- else
126
- variants_scope.find_each do |variant|
127
- propagate_variant(variant)
128
- end
129
- end
109
+ Spree::StockLocations::StockItems::CreateJob.perform_later(self)
130
110
  end
131
111
 
132
112
  def ensure_one_default
@@ -134,5 +114,12 @@ module Spree
134
114
  StockLocation.where(default: true).where.not(id: id).update_all(default: false)
135
115
  end
136
116
  end
117
+
118
+ def conditional_touch_records
119
+ return unless active_changed?
120
+
121
+ stock_items.update_all(updated_at: Time.current)
122
+ variants.update_all(updated_at: Time.current)
123
+ end
137
124
  end
138
125
  end
@@ -21,6 +21,9 @@ module Spree
21
21
 
22
22
  scope :recent, -> { order(created_at: :desc) }
23
23
 
24
+ delegate :variant, to: :stock_item
25
+ delegate :product, to: :variant
26
+
24
27
  self.whitelisted_ransackable_attributes = ['quantity']
25
28
 
26
29
  def readonly?
@@ -1,20 +1,17 @@
1
1
  module Spree
2
2
  class StockTransfer < Spree::Base
3
3
  include Spree::Core::NumberGenerator.new(prefix: 'T')
4
+ include NumberIdentifier
5
+ include NumberAsParam
6
+ include Metadata
4
7
 
5
8
  has_many :stock_movements, as: :originator
6
9
 
7
10
  belongs_to :source_location, class_name: 'StockLocation', optional: true
8
11
  belongs_to :destination_location, class_name: 'StockLocation'
9
12
 
10
- validates :number, uniqueness: true
11
-
12
13
  self.whitelisted_ransackable_attributes = %w[reference source_location_id destination_location_id number]
13
14
 
14
- def to_param
15
- number
16
- end
17
-
18
15
  def source_movements
19
16
  find_stock_location_with_location_id(source_location_id)
20
17
  end
@@ -1,8 +1,19 @@
1
1
  module Spree
2
2
  class Store < Spree::Base
3
+ typed_store :settings, coder: ActiveRecord::TypedStore::IdentityCoder do |s|
4
+ # Spree Digital Asset Configurations
5
+ s.boolean :limit_digital_download_count, default: true, null: false
6
+ s.boolean :limit_digital_download_days, default: true, null: false
7
+ s.integer :digital_asset_authorized_clicks, default: 5, null: false # number of times a customer can download a digital file.
8
+ s.integer :digital_asset_authorized_days, default: 7, null: false # number of days after initial purchase the customer can download a file.
9
+ s.integer :digital_asset_link_expire_time, default: 300, null: false # 5 minutes in seconds
10
+ end
11
+
3
12
  MAILER_LOGO_CONTENT_TYPES = ['image/png', 'image/jpg', 'image/jpeg'].freeze
4
13
  FAVICON_CONTENT_TYPES = ['image/png', 'image/x-icon', 'image/vnd.microsoft.icon'].freeze
5
14
 
15
+ acts_as_paranoid
16
+
6
17
  has_many :orders, class_name: 'Spree::Order'
7
18
  has_many :line_items, through: :orders, class_name: 'Spree::LineItem'
8
19
  has_many :shipments, through: :orders, class_name: 'Spree::Shipment'
@@ -19,7 +30,7 @@ module Spree
19
30
  has_many :menus, class_name: 'Spree::Menu'
20
31
  has_many :menu_items, through: :menus, class_name: 'Spree::MenuItem'
21
32
 
22
- has_many :store_products, class_name: 'Spree::StoreProduct', dependent: :destroy
33
+ has_many :store_products, class_name: 'Spree::StoreProduct'
23
34
  has_many :products, through: :store_products, class_name: 'Spree::Product'
24
35
  has_many :product_properties, through: :products, class_name: 'Spree::ProductProperty'
25
36
  has_many :variants, through: :products, class_name: 'Spree::Variant', source: :variants_including_master
@@ -36,6 +47,8 @@ module Spree
36
47
  has_many :store_promotions, class_name: 'Spree::StorePromotion'
37
48
  has_many :promotions, through: :store_promotions, class_name: 'Spree::Promotion'
38
49
 
50
+ has_many :wishlists, class_name: 'Spree::Wishlist'
51
+
39
52
  belongs_to :default_country, class_name: 'Spree::Country'
40
53
  belongs_to :checkout_zone, class_name: 'Spree::Zone'
41
54
 
@@ -43,8 +56,12 @@ module Spree
43
56
  validates :name, :url, :mail_from_address, :default_currency, :code
44
57
  end
45
58
 
46
- validates :code, uniqueness: true
59
+ validates :digital_asset_authorized_clicks, numericality: { only_integer: true, greater_than: 0 }
60
+ validates :digital_asset_authorized_days, numericality: { only_integer: true, greater_than: 0 }
61
+ validates :code, uniqueness: { conditions: -> { with_deleted } }
62
+ validates :mail_from_address, email: { allow_blank: false }
47
63
 
64
+ # FIXME: we should remove this condition in v5
48
65
  if !ENV['SPREE_DISABLE_DB_CONNECTION'] &&
49
66
  connected? &&
50
67
  table_exists? &&
@@ -66,7 +83,8 @@ module Spree
66
83
 
67
84
  before_save :ensure_default_exists_and_is_unique
68
85
  before_save :ensure_supported_currencies, :ensure_supported_locales, :ensure_default_country
69
- before_destroy :validate_not_default
86
+ before_destroy :validate_not_last
87
+ before_destroy :pass_default_flag_to_other_store
70
88
 
71
89
  scope :by_url, ->(url) { where('url like ?', "%#{url}%") }
72
90
 
@@ -76,12 +94,14 @@ module Spree
76
94
 
77
95
  def self.current(url = nil)
78
96
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
79
- `Spree::Store.current` is deprecated and will be removed in Spree 5
80
- Spree::Stores::FindCurrent.new(url: "http://example.com") instead
97
+ `Spree::Store.current` is deprecated and will be removed in Spree 5.0
98
+ Please use `Spree::Stores::FindCurrent.new(url: "https://example.com").execute` instead
81
99
  DEPRECATION
82
100
  Stores::FindCurrent.new(url: url).execute
83
101
  end
84
102
 
103
+ # FIXME: we need to drop `or_initialize` in v5
104
+ # this behaviour is very buggy and unpredictable
85
105
  def self.default
86
106
  Rails.cache.fetch('default_store') do
87
107
  where(default: true).first_or_initialize
@@ -142,14 +162,16 @@ module Spree
142
162
  end
143
163
 
144
164
  def countries_available_for_checkout
145
- @countries_available_for_checkout ||= checkout_zone_or_default.try(:country_list) || Spree::Country.all
165
+ @countries_available_for_checkout ||= checkout_zone.try(:country_list) || Spree::Country.all
146
166
  end
147
167
 
148
168
  def states_available_for_checkout(country)
149
- checkout_zone_or_default.try(:state_list_for, country) || country.states
169
+ checkout_zone.try(:state_list_for, country) || country.states
150
170
  end
151
171
 
152
172
  def checkout_zone_or_default
173
+ ActiveSupport::Deprecation.warn('Store#checkout_zone_or_default is deprecated and will be removed in Spree 5')
174
+
153
175
  @checkout_zone_or_default ||= checkout_zone || Spree::Zone.default_checkout_zone
154
176
  end
155
177
 
@@ -159,6 +181,10 @@ module Spree
159
181
  favicon_image.variant(resize: '32x32')
160
182
  end
161
183
 
184
+ def can_be_deleted?
185
+ self.class.where.not(id: id).any?
186
+ end
187
+
162
188
  private
163
189
 
164
190
  def ensure_default_exists_and_is_unique
@@ -185,13 +211,20 @@ module Spree
185
211
  self.supported_currencies = default_currency
186
212
  end
187
213
 
188
- def validate_not_default
189
- if default
190
- errors.add(:base, :cannot_destroy_default_store)
214
+ def validate_not_last
215
+ unless can_be_deleted?
216
+ errors.add(:base, :cannot_destroy_only_store)
191
217
  throw(:abort)
192
218
  end
193
219
  end
194
220
 
221
+ def pass_default_flag_to_other_store
222
+ if default? && can_be_deleted?
223
+ self.class.where.not(id: id).first.update!(default: true)
224
+ self.default = false
225
+ end
226
+ end
227
+
195
228
  def clear_cache
196
229
  Rails.cache.delete('default_store')
197
230
  Rails.cache.delete('stores_available_locales')