spree_core 2.3.13 → 2.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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.coffee.erb +1 -5
  3. data/app/helpers/spree/base_helper.rb +22 -11
  4. data/app/helpers/spree/products_helper.rb +8 -7
  5. data/app/mailers/spree/base_mailer.rb +1 -0
  6. data/app/mailers/spree/reimbursement_mailer.rb +10 -0
  7. data/app/mailers/spree/test_mailer.rb +2 -3
  8. data/app/models/concerns/spree/adjustment_source.rb +24 -0
  9. data/app/models/concerns/spree/calculated_adjustments.rb +33 -0
  10. data/app/models/concerns/spree/named_type.rb +12 -0
  11. data/app/models/concerns/spree/user_address.rb +30 -0
  12. data/app/models/concerns/spree/user_payment_source.rb +19 -0
  13. data/app/models/spree/address.rb +13 -6
  14. data/app/models/spree/adjustment.rb +5 -5
  15. data/app/models/spree/app_configuration.rb +8 -4
  16. data/app/models/spree/asset.rb +1 -1
  17. data/app/models/spree/base.rb +0 -3
  18. data/app/models/spree/calculator/flat_rate.rb +1 -5
  19. data/app/models/spree/calculator/returns/default_refund_amount.rb +36 -0
  20. data/app/models/spree/classification.rb +1 -1
  21. data/app/models/spree/credit_card.rb +18 -22
  22. data/app/models/spree/customer_return.rb +70 -0
  23. data/app/models/spree/exchange.rb +42 -0
  24. data/app/models/spree/gateway/bogus.rb +3 -3
  25. data/app/models/spree/image.rb +1 -1
  26. data/app/models/spree/inventory_unit.rb +32 -8
  27. data/app/models/spree/item_adjustments.rb +7 -11
  28. data/app/models/spree/legacy_user.rb +2 -2
  29. data/app/models/spree/line_item.rb +25 -12
  30. data/app/models/spree/option_type.rb +1 -1
  31. data/app/models/spree/option_value.rb +1 -8
  32. data/app/models/spree/order.rb +163 -145
  33. data/app/models/spree/order/checkout.rb +35 -23
  34. data/app/models/spree/order/payments.rb +66 -0
  35. data/app/models/spree/order_contents.rb +34 -24
  36. data/app/models/spree/order_populator.rb +6 -4
  37. data/app/models/spree/order_updater.rb +10 -1
  38. data/app/models/spree/payment.rb +19 -16
  39. data/app/models/spree/payment/processing.rb +40 -72
  40. data/app/models/spree/payment_method.rb +1 -1
  41. data/app/models/spree/payment_method/check.rb +0 -2
  42. data/app/models/spree/preference.rb +1 -1
  43. data/app/models/spree/preferences/preferable.rb +20 -0
  44. data/app/models/spree/price.rb +13 -3
  45. data/app/models/spree/product.rb +24 -29
  46. data/app/models/spree/product_property.rb +0 -2
  47. data/app/models/spree/promotion.rb +66 -24
  48. data/app/models/spree/promotion/actions/create_adjustment.rb +2 -2
  49. data/app/models/spree/promotion/actions/create_item_adjustments.rb +15 -11
  50. data/app/models/spree/promotion/actions/create_line_items.rb +2 -12
  51. data/app/models/spree/promotion/rules/first_order.rb +6 -2
  52. data/app/models/spree/promotion/rules/item_total.rb +42 -4
  53. data/app/models/spree/promotion/rules/one_use_per_user.rb +24 -0
  54. data/app/models/spree/promotion/rules/product.rb +13 -11
  55. data/app/models/spree/promotion/rules/taxon.rb +61 -0
  56. data/app/models/spree/promotion/rules/user.rb +1 -1
  57. data/app/models/spree/promotion/rules/user_logged_in.rb +4 -1
  58. data/app/models/spree/promotion_category.rb +6 -0
  59. data/app/models/spree/promotion_handler/cart.rb +14 -18
  60. data/app/models/spree/promotion_handler/coupon.rb +25 -16
  61. data/app/models/spree/promotion_rule.rb +13 -0
  62. data/app/models/spree/property.rb +1 -3
  63. data/app/models/spree/refund.rb +91 -0
  64. data/app/models/spree/refund_reason.rb +13 -0
  65. data/app/models/spree/reimbursement.rb +148 -0
  66. data/app/models/spree/reimbursement/credit.rb +25 -0
  67. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
  68. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +12 -0
  69. data/app/models/spree/reimbursement_performer.rb +43 -0
  70. data/app/models/spree/reimbursement_tax_calculator.rb +38 -0
  71. data/app/models/spree/reimbursement_type.rb +16 -0
  72. data/app/models/spree/reimbursement_type/credit.rb +13 -0
  73. data/app/models/spree/reimbursement_type/exchange.rb +9 -0
  74. data/app/models/spree/reimbursement_type/original_payment.rb +13 -0
  75. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +50 -0
  76. data/app/models/spree/return_authorization.rb +52 -68
  77. data/app/models/spree/return_authorization_reason.rb +7 -0
  78. data/app/models/spree/return_item.rb +230 -0
  79. data/app/models/spree/return_item/default_eligibility_validator.rb +27 -0
  80. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +24 -0
  81. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +17 -0
  82. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +16 -0
  83. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +34 -0
  84. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +10 -0
  85. data/app/models/spree/returns_calculator.rb +8 -0
  86. data/app/models/spree/shipment.rb +209 -154
  87. data/app/models/spree/shipment_handler.rb +43 -0
  88. data/app/models/spree/shipping_calculator.rb +1 -1
  89. data/app/models/spree/shipping_category.rb +2 -2
  90. data/app/models/spree/shipping_method.rb +1 -1
  91. data/app/models/spree/shipping_method_category.rb +1 -1
  92. data/app/models/spree/shipping_rate.rb +4 -0
  93. data/app/models/spree/stock/adjuster.rb +10 -11
  94. data/app/models/spree/stock/availability_validator.rb +6 -10
  95. data/app/models/spree/stock/content_item.rb +48 -0
  96. data/app/models/spree/stock/coordinator.rb +14 -7
  97. data/app/models/spree/stock/estimator.rb +1 -1
  98. data/app/models/spree/stock/inventory_unit_builder.rb +21 -0
  99. data/app/models/spree/stock/package.rb +38 -51
  100. data/app/models/spree/stock/packer.rb +13 -11
  101. data/app/models/spree/stock/prioritizer.rb +7 -7
  102. data/app/models/spree/stock/splitter/base.rb +2 -2
  103. data/app/models/spree/stock_item.rb +6 -9
  104. data/app/models/spree/stock_location.rb +17 -25
  105. data/app/models/spree/stock_movement.rb +1 -8
  106. data/app/models/spree/stock_transfer.rb +0 -2
  107. data/app/models/spree/store.rb +1 -1
  108. data/app/models/spree/tax_category.rb +2 -2
  109. data/app/models/spree/tax_rate.rb +16 -22
  110. data/app/models/spree/taxon.rb +1 -1
  111. data/app/models/spree/variant.rb +45 -23
  112. data/app/models/spree/zone.rb +17 -17
  113. data/app/models/spree/zone_member.rb +1 -1
  114. data/app/views/layouts/spree/base_mailer.html.erb +784 -0
  115. data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
  116. data/app/views/spree/order_mailer/cancel_email.text.erb +2 -2
  117. data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
  118. data/app/views/spree/order_mailer/confirm_email.text.erb +2 -2
  119. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +22 -0
  120. data/app/views/spree/shared/_base_mailer_footer.html.erb +20 -0
  121. data/app/views/spree/shared/_base_mailer_header.html.erb +31 -0
  122. data/app/views/spree/shipment_mailer/shipped_email.html.erb +34 -0
  123. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  124. data/app/views/spree/test_mailer/test_email.text.erb +2 -2
  125. data/config/initializers/friendly_id.rb +88 -0
  126. data/config/initializers/premailer_assets.rb +1 -0
  127. data/config/initializers/user_class_extensions.rb +9 -22
  128. data/config/locales/en.yml +180 -12
  129. data/db/default/spree/states.rb +73 -55
  130. data/db/migrate/20130213191427_create_default_stock.rb +1 -0
  131. data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -5
  132. data/db/migrate/20140309033438_create_store_from_preferences.rb +0 -7
  133. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +8 -0
  134. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
  135. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +5 -3
  136. data/db/migrate/20140625214618_create_spree_refunds.rb +12 -0
  137. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +12 -0
  138. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +5 -0
  139. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +10 -0
  140. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +55 -0
  141. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +7 -0
  142. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +5 -0
  143. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +28 -0
  144. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +14 -0
  145. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +5 -0
  146. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +11 -0
  147. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +9 -0
  148. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +6 -0
  149. data/db/migrate/20140717155155_create_default_refund_reason.rb +9 -0
  150. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +5 -0
  151. data/db/migrate/20140718133010_create_spree_customer_returns.rb +9 -0
  152. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +6 -0
  153. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +15 -0
  154. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +5 -0
  155. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +13 -0
  156. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +15 -0
  157. data/db/migrate/20140725131539_create_spree_reimbursements.rb +21 -0
  158. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +5 -0
  159. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +7 -0
  160. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +5 -0
  161. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +20 -0
  162. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +5 -0
  163. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +10 -0
  164. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +9 -0
  165. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +10 -0
  166. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +7 -0
  167. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +5 -0
  168. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +5 -0
  169. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +6 -0
  170. data/db/migrate/20141009204607_add_store_id_to_orders.rb +8 -0
  171. data/lib/generators/spree/install/install_generator.rb +7 -3
  172. data/lib/spree/core.rb +11 -10
  173. data/lib/spree/core/controller_helpers/common.rb +3 -10
  174. data/lib/spree/core/controller_helpers/order.rb +15 -12
  175. data/lib/spree/core/controller_helpers/strong_parameters.rb +9 -9
  176. data/lib/spree/core/engine.rb +8 -1
  177. data/lib/spree/core/importer/order.rb +5 -17
  178. data/lib/spree/core/search/base.rb +1 -1
  179. data/lib/spree/core/validators/email.rb +1 -1
  180. data/lib/spree/core/version.rb +1 -1
  181. data/lib/spree/instrumentation.rb +41 -0
  182. data/lib/spree/migrations.rb +3 -7
  183. data/lib/spree/money.rb +2 -2
  184. data/lib/spree/permitted_attributes.rb +10 -9
  185. data/lib/spree/testing_support/ability_helpers.rb +25 -25
  186. data/lib/spree/testing_support/authorization_helpers.rb +3 -5
  187. data/lib/spree/testing_support/capybara_ext.rb +2 -2
  188. data/lib/spree/testing_support/factories/calculator_factory.rb +0 -8
  189. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  190. data/lib/spree/testing_support/factories/customer_return_factory.rb +31 -0
  191. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -0
  192. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -1
  193. data/lib/spree/testing_support/factories/order_factory.rb +11 -6
  194. data/lib/spree/testing_support/factories/promotion_category_factory.rb +6 -0
  195. data/lib/spree/testing_support/factories/promotion_factory.rb +9 -7
  196. data/lib/spree/testing_support/factories/refund_factory.rb +14 -0
  197. data/lib/spree/testing_support/factories/reimbursement_factory.rb +16 -0
  198. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +7 -0
  199. data/lib/spree/testing_support/factories/return_authorization_factory.rb +9 -3
  200. data/lib/spree/testing_support/factories/return_item_factory.rb +10 -0
  201. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -0
  202. data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -2
  203. data/lib/spree/testing_support/factories/stock_factory.rb +12 -11
  204. data/lib/spree/testing_support/flash.rb +2 -2
  205. data/lib/tasks/email.rake +7 -0
  206. data/lib/tasks/exchanges.rake +70 -0
  207. data/vendor/assets/javascripts/jquery.validate/localization/messages_et.js +23 -0
  208. data/vendor/assets/javascripts/jquery.validate/localization/messages_eu.js +25 -0
  209. data/vendor/assets/javascripts/jquery.validate/localization/messages_hr.js +25 -0
  210. data/vendor/assets/javascripts/jquery.validate/localization/messages_ka.js +25 -0
  211. data/vendor/assets/javascripts/jquery.validate/localization/messages_ko.js +25 -0
  212. data/vendor/assets/javascripts/jquery.validate/localization/messages_my.js +25 -0
  213. data/vendor/assets/javascripts/jquery.validate/localization/messages_pt_BR.js +26 -0
  214. data/vendor/assets/javascripts/jquery.validate/localization/messages_pt_PT.js +26 -0
  215. data/vendor/assets/javascripts/jquery.validate/localization/messages_sl.js +25 -0
  216. data/vendor/assets/javascripts/jquery.validate/localization/messages_sv.js +23 -0
  217. data/vendor/assets/javascripts/jquery.validate/localization/messages_uk.js +25 -0
  218. data/vendor/assets/javascripts/jquery.validate/localization/messages_zh.js +25 -0
  219. data/vendor/assets/javascripts/jquery.validate/localization/messages_zh_TW.js +26 -0
  220. metadata +163 -47
  221. data/app/models/concerns/spree/ransackable_attributes.rb +0 -19
  222. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +0 -5
  223. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +0 -13
  224. data/db/migrate/20141105213646_update_classifications_positions.rb +0 -9
  225. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +0 -5
  226. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -70
  227. data/lib/spree/core/adjustment_source.rb +0 -26
  228. data/lib/spree/core/calculated_adjustments.rb +0 -35
  229. data/lib/spree/core/controller_helpers.rb +0 -20
  230. data/lib/spree/core/user_address.rb +0 -32
  231. data/lib/spree/core/user_payment_source.rb +0 -20
  232. data/lib/spree/localized_number.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01725f9ca0e549175b6eff9da2061ad94f0e24c6
4
- data.tar.gz: 812d8b5e508a5ccbd8e0a53728335a5d43a25b30
3
+ metadata.gz: 3b41e23ca4232364a10edcb30ee1df77239ac6a6
4
+ data.tar.gz: 3ac2a1a353eb0d2d6b5130b773ebbdb115847b5b
5
5
  SHA512:
6
- metadata.gz: a56c3a3d6b44d2b584668fbeebace2bcb389d2962a8959345fa84f676b315417eeedf61b56152e6a3b42ede1c0173efcb401715a5c244d0c99a27370cf93aa34
7
- data.tar.gz: 0c4f145ce06584f368f388c3c7a1825a7f5458109abb68ba2c297b748428b7ff04e897568deb072fb55ccfaee5a3fa6e7badf6eda55014dd3a69fdeac0480ea2
6
+ metadata.gz: 47ae6a4ab3482c89afdee602d0b6951608e0f885690137815bddd5a20f6d91fa62e868e6f72d445289149117cbf658c41e276dbc7f1f54c78a1714fa836685ca
7
+ data.tar.gz: a8219fa078d69a3045bfdab968dc0c327a2c050253e5d779170a2770346e8f602005795ef14ee9d26fedf23f10838fba31df8194774e992f3c16d5e92b30d8bb
@@ -11,7 +11,7 @@ class window.Spree
11
11
  "#{locationOrigin}#{@mountedAt()}#{path}"
12
12
 
13
13
  # Helper function to take a URL and add query parameters to it
14
- # Uses the JSUri library from here: https://code.google.com/p/jsuri/
14
+ # Uses the JSUri library from here: https://github.com/derek-watson/jsUri
15
15
  # Thanks to Jake Moffat for the suggestion: https://twitter.com/jakeonrails/statuses/321776992221544449
16
16
  @url: (uri, query) ->
17
17
  if uri.path == undefined
@@ -21,10 +21,6 @@ class window.Spree
21
21
  uri.addQueryParam(key, value)
22
22
  return uri
23
23
 
24
- # Helper method in case people want to call uri rather than url
25
- @uri: (uri, query) ->
26
- url(uri, query)
27
-
28
24
  # This function automatically appends the API token
29
25
  # for the user to the end of any URL.
30
26
  # Immediately after, this string is then passed to jQuery.ajax.
@@ -48,7 +48,7 @@ module Spree
48
48
  meta.reverse_merge!({
49
49
  keywords: current_store.meta_keywords,
50
50
  description: current_store.meta_description,
51
- }) if meta[:keywords].blank? or meta[:description].blank?
51
+ })
52
52
  meta
53
53
  end
54
54
 
@@ -78,19 +78,30 @@ module Spree
78
78
  nil
79
79
  end
80
80
 
81
- def breadcrumbs(taxon, separator=" » ")
81
+ def breadcrumbs(taxon, separator=" » ", breadcrumb_class="inline")
82
82
  return "" if current_page?("/") || taxon.nil?
83
- separator = raw(separator)
84
- crumbs = [content_tag(:li, link_to(Spree.t(:home), spree.root_path) + separator)]
83
+
84
+ crumbs = [[Spree.t(:home), spree.root_path]]
85
+
85
86
  if taxon
86
- crumbs << content_tag(:li, link_to(Spree.t(:products), products_path) + separator)
87
- crumbs << taxon.ancestors.collect { |ancestor| content_tag(:li, link_to(ancestor.name , seo_url(ancestor)) + separator) } unless taxon.ancestors.empty?
88
- crumbs << content_tag(:li, content_tag(:span, link_to(taxon.name , seo_url(taxon))))
87
+ crumbs << [Spree.t(:products), products_path]
88
+ crumbs += taxon.ancestors.collect { |a| [a.name, spree.nested_taxons_path(a.permalink)] } unless taxon.ancestors.empty?
89
+ crumbs << [taxon.name, spree.nested_taxons_path(taxon.permalink)]
89
90
  else
90
- crumbs << content_tag(:li, content_tag(:span, Spree.t(:products)))
91
+ crumbs << [Spree.t(:products), products_path]
91
92
  end
92
- crumb_list = content_tag(:ul, raw(crumbs.flatten.map{|li| li.mb_chars}.join), class: 'inline')
93
- content_tag(:nav, crumb_list, id: 'breadcrumbs', class: 'sixteen columns')
93
+
94
+ separator = raw(separator)
95
+
96
+ crumbs.map! do |crumb|
97
+ content_tag(:li, itemscope:"itemscope", itemtype:"http://data-vocabulary.org/Breadcrumb") do
98
+ link_to(crumb.last, itemprop: "url") do
99
+ content_tag(:span, crumb.first, itemprop: "title")
100
+ end + (crumb == crumbs.last ? '' : separator)
101
+ end
102
+ end
103
+
104
+ content_tag(:nav, content_tag(:ul, raw(crumbs.map(&:mb_chars).join), class: breadcrumb_class), id: 'breadcrumbs', class: 'sixteen columns')
94
105
  end
95
106
 
96
107
  def taxons_tree(root_taxon, current_taxon, max_level = 1)
@@ -152,7 +163,7 @@ module Spree
152
163
  end
153
164
 
154
165
  def link_to_tracking(shipment, options = {})
155
- return unless shipment.tracking
166
+ return unless shipment.tracking && shipment.shipping_method
156
167
 
157
168
  if shipment.tracking_url
158
169
  link_to(shipment.tracking, shipment.tracking_url, options)
@@ -11,13 +11,14 @@ module Spree
11
11
 
12
12
  # returns the formatted price for the specified variant as a difference from product price
13
13
  def variant_price_diff(variant)
14
- variant_amount = variant.amount_in(current_currency)
15
- product_amount = variant.product.amount_in(current_currency)
16
- return if variant_amount == product_amount || product_amount.nil?
17
- diff = variant.amount_in(current_currency) - product_amount
18
- amount = Spree::Money.new(diff.abs, currency: current_currency).to_html
19
- label = diff > 0 ? :add : :subtract
20
- "(#{Spree.t(label)}: #{amount})".html_safe
14
+ diff = variant.amount_in(current_currency) - variant.product.amount_in(current_currency)
15
+ return nil if diff == 0
16
+ amount = Spree::Money.new(diff.abs, { currency: current_currency }).to_html
17
+ if diff > 0
18
+ "(#{Spree.t(:add)}: #{amount})".html_safe
19
+ else
20
+ "(#{Spree.t(:subtract)}: #{amount})".html_safe
21
+ end
21
22
  end
22
23
 
23
24
  # returns the formatted full price for the variant, if at least one variant price differs from product price
@@ -1,5 +1,6 @@
1
1
  module Spree
2
2
  class BaseMailer < ActionMailer::Base
3
+
3
4
  def from_address
4
5
  Spree::Config[:mails_from]
5
6
  end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ class ReimbursementMailer < BaseMailer
3
+ def reimbursement_email(reimbursement, resend = false)
4
+ @reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
5
+ subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
6
+ subject += "#{Spree::Store.current.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@reimbursement.order.number}"
7
+ mail(to: @reimbursement.order.email, from: from_address, subject: subject)
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,8 @@
1
1
  module Spree
2
2
  class TestMailer < BaseMailer
3
- def test_email(user)
4
- recipient = user.respond_to?(:id) ? user : Spree.user_class.find(user)
3
+ def test_email(email)
5
4
  subject = "#{Spree::Store.current.name} #{Spree.t('test_mailer.test_email.subject')}"
6
- mail(to: recipient.email, from: from_address, subject: subject)
5
+ mail(to: email, from: from_address, subject: subject)
7
6
  end
8
7
  end
9
8
  end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module AdjustmentSource
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ def deals_with_adjustments_for_deleted_source
7
+ adjustment_scope = self.adjustments.includes(:order).references(:spree_orders)
8
+
9
+ # For incomplete orders, remove the adjustment completely.
10
+ adjustment_scope.where("spree_orders.completed_at IS NULL").destroy_all
11
+
12
+ # For complete orders, the source will be invalid.
13
+ # Therefore we nullify the source_id, leaving the adjustment in place.
14
+ # This would mean that the order's total is not altered at all.
15
+ adjustment_scope.where("spree_orders.completed_at IS NOT NULL").each do |adjustment|
16
+ adjustment.update_columns(
17
+ source_id: nil,
18
+ updated_at: Time.now,
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module CalculatedAdjustments
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_one :calculator, class_name: "Spree::Calculator", as: :calculable, inverse_of: :calculable, dependent: :destroy, autosave: true
7
+ accepts_nested_attributes_for :calculator
8
+ validates :calculator, presence: true
9
+
10
+ def self.calculators
11
+ spree_calculators.send model_name_without_spree_namespace
12
+ end
13
+
14
+ def calculator_type
15
+ calculator.class.to_s if calculator
16
+ end
17
+
18
+ def calculator_type=(calculator_type)
19
+ klass = calculator_type.constantize if calculator_type
20
+ self.calculator = klass.new if klass && !self.calculator.is_a?(klass)
21
+ end
22
+
23
+ private
24
+ def self.model_name_without_spree_namespace
25
+ self.to_s.tableize.gsub('/', '_').sub('spree_', '')
26
+ end
27
+
28
+ def self.spree_calculators
29
+ Rails.application.config.spree.calculators
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module NamedType
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ scope :active, -> { where(active: true) }
7
+ default_scope -> { order("LOWER(#{self.table_name}.name)") }
8
+
9
+ validates :name, presence: true, uniqueness: { case_sensitive: false }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,30 @@
1
+ module Spree
2
+ module UserAddress
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
7
+ alias_attribute :billing_address, :bill_address
8
+
9
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
10
+ alias_attribute :shipping_address, :ship_address
11
+
12
+ accepts_nested_attributes_for :ship_address, :bill_address
13
+
14
+ def persist_order_address(order)
15
+ b_address = self.bill_address || self.build_bill_address
16
+ b_address.attributes = order.bill_address.attributes.except('id', 'updated_at', 'created_at')
17
+ b_address.save
18
+ self.update_attributes(bill_address_id: b_address.id)
19
+
20
+ # May not be present if delivery step has been removed
21
+ if order.ship_address
22
+ s_address = self.ship_address || self.build_ship_address
23
+ s_address.attributes = order.ship_address.attributes.except('id', 'updated_at', 'created_at')
24
+ s_address.save
25
+ self.update_attributes(ship_address_id: s_address.id)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module UserPaymentSource
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id
7
+ def default_credit_card; credit_cards.default.first; end
8
+
9
+ def payment_sources
10
+ credit_cards.with_payment_profile
11
+ end
12
+
13
+ def drop_payment_source(source)
14
+ gateway = source.payment_method
15
+ gateway.disable_customer_profile(source)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class Address < Spree::Base
3
+ require 'twitter_cldr'
4
+
3
5
  belongs_to :country, class_name: "Spree::Country"
4
6
  belongs_to :state, class_name: "Spree::State"
5
7
 
@@ -9,22 +11,19 @@ module Spree
9
11
  validates :zipcode, presence: true, if: :require_zipcode?
10
12
  validates :phone, presence: true, if: :require_phone?
11
13
 
12
- validate :state_validate
14
+ validate :state_validate, :postal_code_validate
13
15
 
14
16
  alias_attribute :first_name, :firstname
15
17
  alias_attribute :last_name, :lastname
16
18
 
17
-
18
- self.whitelisted_ransackable_attributes = %w[firstname lastname]
19
-
20
19
  def self.build_default
21
20
  country = Spree::Country.find(Spree::Config[:default_country_id]) rescue Spree::Country.first
22
21
  new(country: country)
23
22
  end
24
23
 
25
24
  def self.default(user = nil, kind = "bill")
26
- if user
27
- user.send(:"#{kind}_address") || build_default
25
+ if user && user_address = user.send(:"#{kind}_address")
26
+ user_address.clone
28
27
  else
29
28
  build_default
30
29
  end
@@ -130,5 +129,13 @@ module Spree
130
129
  # ensure at least one state field is populated
131
130
  errors.add :state, :blank if state.blank? && state_name.blank?
132
131
  end
132
+
133
+ def postal_code_validate
134
+ return if country.blank? || country.iso.blank? || !require_zipcode?
135
+ return if !TwitterCldr::Shared::PostalCodes.territories.include?(country.iso.downcase.to_sym)
136
+
137
+ postal_code = TwitterCldr::Shared::PostalCodes.for_territory(country.iso)
138
+ errors.add(:zipcode, :invalid) if !postal_code.valid?(zipcode.to_s)
139
+ end
133
140
  end
134
141
  end
@@ -24,10 +24,8 @@ module Spree
24
24
  class Adjustment < Spree::Base
25
25
  belongs_to :adjustable, polymorphic: true, touch: true
26
26
  belongs_to :source, polymorphic: true
27
- belongs_to :order, class_name: 'Spree::Order', inverse_of: :all_adjustments
27
+ belongs_to :order, class_name: "Spree::Order"
28
28
 
29
- validates :adjustable, presence: true
30
- validates :order, presence: true
31
29
  validates :label, presence: true
32
30
  validates :amount, numericality: true
33
31
 
@@ -47,15 +45,17 @@ module Spree
47
45
  scope :open, -> { where(state: 'open') }
48
46
  scope :closed, -> { where(state: 'closed') }
49
47
  scope :tax, -> { where(source_type: 'Spree::TaxRate') }
48
+ scope :non_tax, -> { where.not(source_type: 'Spree::TaxRate') }
50
49
  scope :price, -> { where(adjustable_type: 'Spree::LineItem') }
51
50
  scope :shipping, -> { where(adjustable_type: 'Spree::Shipment') }
52
51
  scope :optional, -> { where(mandatory: false) }
53
52
  scope :eligible, -> { where(eligible: true) }
54
53
  scope :charge, -> { where("#{quoted_table_name}.amount >= 0") }
55
54
  scope :credit, -> { where("#{quoted_table_name}.amount < 0") }
55
+ scope :nonzero, -> { where("#{quoted_table_name}.amount != 0") }
56
56
  scope :promotion, -> { where(source_type: 'Spree::PromotionAction') }
57
57
  scope :return_authorization, -> { where(source_type: "Spree::ReturnAuthorization") }
58
- scope :is_included, -> { where(included: true) }
58
+ scope :included, -> { where(included: true) }
59
59
  scope :additional, -> { where(included: false) }
60
60
 
61
61
  def closed?
@@ -103,7 +103,7 @@ module Spree
103
103
 
104
104
  def update_adjustable_adjustment_total
105
105
  # Cause adjustable's total to be recalculated
106
- ItemAdjustments.new(adjustable).update
106
+ Spree::ItemAdjustments.new(adjustable).update if adjustable
107
107
  end
108
108
 
109
109
  end
@@ -23,9 +23,9 @@ module Spree
23
23
  preference :address_requires_state, :boolean, default: true # should state/state_name be required
24
24
  preference :admin_interface_logo, :string, default: 'logo/spree_50.png'
25
25
  preference :admin_products_per_page, :integer, default: 10
26
- preference :allow_backorder_shipping, :boolean, default: false # should only be true if you don't need to track inventory
27
26
  preference :allow_checkout_on_gateway_error, :boolean, default: false
28
27
  preference :allow_guest_checkout, :boolean, default: true
28
+ preference :allow_return_item_amount_editing, :boolean, default: false # Determines whether an admin is allowed to change a return item's pre-calculated amount
29
29
  preference :allow_ssl_in_development_and_test, :boolean, default: false
30
30
  preference :allow_ssl_in_production, :boolean, default: true
31
31
  preference :allow_ssl_in_staging, :boolean, default: true
@@ -34,6 +34,7 @@ module Spree
34
34
  preference :always_include_confirm_step, :boolean, default: false # Ensures confirmation step is always in checkout_progress bar, but does not force a confirm step if your payment methods do not support it.
35
35
  preference :always_put_site_name_in_title, :boolean, default: true
36
36
  preference :auto_capture, :boolean, default: false # automatically capture the credit card (as opposed to just authorize and capture later)
37
+ preference :auto_capture_on_dispatch, :boolean, default: false # Captures payment for each shipment in Shipment#after_ship callback, and makes Shipment.ready when payment authorized.
37
38
  preference :binary_inventory_cache, :boolean, default: false # only invalidate product cache when a stock item changes whether it is in_stock
38
39
  preference :check_for_spree_alerts, :boolean, default: true
39
40
  preference :checkout_zone, :string, default: nil # replace with the name of a zone if you would like to limit the countries
@@ -46,6 +47,8 @@ module Spree
46
47
  preference :display_currency, :boolean, default: false
47
48
  preference :default_country_id, :integer
48
49
  preference :dismissed_spree_alerts, :string, default: ''
50
+ preference :expedited_exchanges, :boolean, default: false # NOTE this requires payment profiles to be supported on your gateway of choice as well as a delayed job handler to be configured with activejob. kicks off an exchange shipment upon return authorization save. charge customer if they do not return items within timely manner.
51
+ preference :expedited_exchanges_days_window, :integer, default: 14 # the amount of days the customer has to return their item after the expedited exchange is shipped in order to avoid being charged
49
52
  preference :hide_cents, :boolean, default: false
50
53
  preference :last_check_for_spree_alerts, :string, default: nil
51
54
  preference :layout, :string, default: 'spree/layouts/spree_application'
@@ -55,8 +58,11 @@ module Spree
55
58
  preference :properties_per_page, :integer, default: 15
56
59
  preference :products_per_page, :integer, default: 12
57
60
  preference :promotions_per_page, :integer, default: 15
61
+ preference :customer_returns_per_page, :integer, default: 15
58
62
  preference :redirect_https_to_http, :boolean, :default => false
59
63
  preference :require_master_price, :boolean, default: true
64
+ preference :restock_inventory, :boolean, default: true # Determines if a return item is restocked automatically once it has been received
65
+ preference :return_eligibility_number_of_days, :integer, default: 365
60
66
  preference :shipping_instructions, :boolean, default: false # Request instructions/info for shipping
61
67
  preference :show_only_complete_orders_by_default, :boolean, default: true
62
68
  preference :show_variant_full_price, :boolean, default: false #Displays variant full price or difference with product price. Default false to be compatible with older behavior
@@ -91,9 +97,7 @@ module Spree
91
97
  # support all the old preference methods with a warning
92
98
  define_method "preferred_#{old_preference_name}" do
93
99
  ActiveSupport::Deprecation.warn("#{old_preference_name} is no longer supported on Spree::Config, please access it through #{store_method} on Spree::Store")
94
- if ActiveRecord::Base.connection.table_exists?("spree_stores") # guards against 2.2 upgraders unable to rake db migration
95
- Store.default.send(store_method)
96
- end
100
+ Store.default.send(store_method)
97
101
  end
98
102
  end
99
103
  end
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class Asset < Spree::Base
3
3
  belongs_to :viewable, polymorphic: true, touch: true
4
- acts_as_list scope: [:viewable_id, :viewable_type]
4
+ acts_as_list scope: :viewable
5
5
  end
6
6
  end
@@ -1,9 +1,6 @@
1
1
  class Spree::Base < ActiveRecord::Base
2
2
  include Spree::Preferences::Preferable
3
3
  serialize :preferences, Hash
4
-
5
- include Spree::RansackableAttributes
6
-
7
4
  after_initialize do
8
5
  self.preferences = default_preferences.merge(preferences) if has_attribute?(:preferences)
9
6
  end
@@ -10,11 +10,7 @@ module Spree
10
10
  end
11
11
 
12
12
  def compute(object=nil)
13
- if object && preferred_currency.upcase == object.currency.upcase
14
- preferred_amount
15
- else
16
- 0
17
- end
13
+ self.preferred_amount
18
14
  end
19
15
  end
20
16
  end