spree_core 3.3.6 → 3.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +17 -18
  3. data/app/helpers/spree/products_helper.rb +5 -5
  4. data/app/models/concerns/spree/calculated_adjustments.rb +4 -3
  5. data/app/models/concerns/spree/default_price.rb +4 -5
  6. data/app/models/concerns/spree/display_money.rb +1 -1
  7. data/app/models/concerns/spree/named_type.rb +1 -1
  8. data/app/models/concerns/spree/ransackable_attributes.rb +5 -6
  9. data/app/models/concerns/spree/user_address.rb +6 -6
  10. data/app/models/concerns/spree/user_methods.rb +3 -3
  11. data/app/models/concerns/spree/user_payment_source.rb +4 -2
  12. data/app/models/concerns/spree/user_reporting.rb +1 -1
  13. data/app/models/spree/ability.rb +3 -3
  14. data/app/models/spree/address.rb +13 -9
  15. data/app/models/spree/adjustable/adjuster/promotion.rb +1 -1
  16. data/app/models/spree/adjustable/adjustments_updater.rb +2 -2
  17. data/app/models/spree/adjustable/promotion_accumulator.rb +6 -4
  18. data/app/models/spree/adjustment.rb +2 -3
  19. data/app/models/spree/app_configuration.rb +5 -6
  20. data/app/models/spree/base.rb +1 -1
  21. data/app/models/spree/calculator/default_tax.rb +4 -5
  22. data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
  23. data/app/models/spree/calculator/flat_rate.rb +3 -3
  24. data/app/models/spree/calculator/flexi_rate.rb +5 -5
  25. data/app/models/spree/calculator/price_sack.rb +9 -9
  26. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
  27. data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
  28. data/app/models/spree/calculator/shipping/flexi_rate.rb +7 -7
  29. data/app/models/spree/calculator/shipping/per_item.rb +2 -2
  30. data/app/models/spree/calculator/shipping/price_sack.rb +4 -4
  31. data/app/models/spree/calculator/tiered_flat_rate.rb +3 -2
  32. data/app/models/spree/calculator/tiered_percent.rb +4 -3
  33. data/app/models/spree/calculator.rb +4 -4
  34. data/app/models/spree/classification.rb +2 -2
  35. data/app/models/spree/credit_card.rb +1 -1
  36. data/app/models/spree/exchange.rb +4 -5
  37. data/app/models/spree/gateway/bogus.rb +20 -20
  38. data/app/models/spree/gateway/bogus_simple.rb +2 -4
  39. data/app/models/spree/gateway.rb +4 -4
  40. data/app/models/spree/image.rb +3 -3
  41. data/app/models/spree/inventory_unit.rb +30 -30
  42. data/app/models/spree/line_item.rb +7 -9
  43. data/app/models/spree/option_type.rb +1 -1
  44. data/app/models/spree/order/checkout.rb +5 -5
  45. data/app/models/spree/order/currency_updater.rb +1 -4
  46. data/app/models/spree/order/payments.rb +4 -4
  47. data/app/models/spree/order/store_credit.rb +2 -2
  48. data/app/models/spree/order.rb +11 -29
  49. data/app/models/spree/order_contents.rb +6 -5
  50. data/app/models/spree/order_inventory.rb +3 -4
  51. data/app/models/spree/order_updater.rb +13 -14
  52. data/app/models/spree/payment/processing.rb +25 -26
  53. data/app/models/spree/payment.rb +72 -79
  54. data/app/models/spree/payment_capture_event.rb +1 -1
  55. data/app/models/spree/payment_method/check.rb +1 -1
  56. data/app/models/spree/payment_method/store_credit.rb +5 -5
  57. data/app/models/spree/payment_method.rb +7 -7
  58. data/app/models/spree/preferences/configuration.rb +6 -9
  59. data/app/models/spree/preferences/preferable.rb +11 -11
  60. data/app/models/spree/preferences/preferable_class_methods.rb +2 -3
  61. data/app/models/spree/preferences/scoped_store.rb +6 -5
  62. data/app/models/spree/preferences/store.rb +9 -14
  63. data/app/models/spree/price.rb +1 -1
  64. data/app/models/spree/product/scopes.rb +49 -49
  65. data/app/models/spree/product.rb +16 -16
  66. data/app/models/spree/promotion/actions/create_item_adjustments.rb +2 -1
  67. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  68. data/app/models/spree/promotion/rules/first_order.rb +7 -6
  69. data/app/models/spree/promotion/rules/item_total.rb +3 -5
  70. data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
  71. data/app/models/spree/promotion/rules/option_value.rb +14 -6
  72. data/app/models/spree/promotion/rules/product.rb +4 -4
  73. data/app/models/spree/promotion/rules/taxon.rb +6 -6
  74. data/app/models/spree/promotion/rules/user.rb +3 -3
  75. data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
  76. data/app/models/spree/promotion.rb +15 -16
  77. data/app/models/spree/promotion_action.rb +1 -1
  78. data/app/models/spree/promotion_handler/cart.rb +3 -2
  79. data/app/models/spree/promotion_handler/free_shipping.rb +1 -3
  80. data/app/models/spree/promotion_handler/page.rb +3 -3
  81. data/app/models/spree/promotion_rule.rb +5 -4
  82. data/app/models/spree/refund.rb +8 -8
  83. data/app/models/spree/reimbursement/credit.rb +1 -1
  84. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
  85. data/app/models/spree/reimbursement.rb +4 -8
  86. data/app/models/spree/reimbursement_performer.rb +0 -5
  87. data/app/models/spree/reimbursement_tax_calculator.rb +5 -12
  88. data/app/models/spree/reimbursement_type.rb +2 -2
  89. data/app/models/spree/return_authorization.rb +22 -26
  90. data/app/models/spree/return_item/eligibility_validator/default.rb +3 -3
  91. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +2 -2
  92. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +2 -2
  93. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +2 -2
  94. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +2 -3
  95. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +2 -2
  96. data/app/models/spree/return_item.rb +15 -19
  97. data/app/models/spree/returns_calculator.rb +1 -2
  98. data/app/models/spree/shipment.rb +14 -35
  99. data/app/models/spree/shipment_handler.rb +10 -12
  100. data/app/models/spree/shipping_calculator.rb +5 -6
  101. data/app/models/spree/shipping_method.rb +3 -3
  102. data/app/models/spree/shipping_rate.rb +2 -2
  103. data/app/models/spree/state.rb +2 -2
  104. data/app/models/spree/stock/availability_validator.rb +1 -1
  105. data/app/models/spree/stock/content_item.rb +2 -3
  106. data/app/models/spree/stock/coordinator.rb +3 -2
  107. data/app/models/spree/stock/differentiator.rb +3 -2
  108. data/app/models/spree/stock/estimator.rb +7 -5
  109. data/app/models/spree/stock/package.rb +5 -5
  110. data/app/models/spree/stock/packer.rb +1 -1
  111. data/app/models/spree/stock/prioritizer.rb +5 -7
  112. data/app/models/spree/stock/quantifier.rb +0 -1
  113. data/app/models/spree/stock/splitter/backordered.rb +2 -4
  114. data/app/models/spree/stock/splitter/base.rb +3 -2
  115. data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
  116. data/app/models/spree/stock_item.rb +1 -1
  117. data/app/models/spree/stock_location.rb +12 -11
  118. data/app/models/spree/stock_movement.rb +1 -3
  119. data/app/models/spree/stock_transfer.rb +1 -1
  120. data/app/models/spree/store.rb +4 -4
  121. data/app/models/spree/store_credit.rb +3 -3
  122. data/app/models/spree/tax_category.rb +1 -1
  123. data/app/models/spree/tax_rate.rb +10 -10
  124. data/app/models/spree/taxon.rb +13 -13
  125. data/app/models/spree/taxonomy.rb +9 -8
  126. data/app/models/spree/validations/db_maximum_length_validator.rb +2 -3
  127. data/app/models/spree/variant.rb +30 -41
  128. data/app/models/spree/zone.rb +10 -10
  129. data/app/validators/db_maximum_length_validator.rb +5 -5
  130. data/config/initializers/acts_as_taggable_on.rb +3 -3
  131. data/config/initializers/assets.rb +1 -1
  132. data/config/initializers/friendly_id.rb +1 -1
  133. data/config/initializers/premailer_assets.rb +1 -1
  134. data/config/locales/en.yml +8 -2
  135. data/db/default/spree/states.rb +1 -0
  136. data/lib/generators/spree/custom_user/custom_user_generator.rb +12 -15
  137. data/lib/generators/spree/install/install_generator.rb +45 -32
  138. data/lib/spree/core/components.rb +3 -3
  139. data/lib/spree/core/controller_helpers/auth.rb +5 -10
  140. data/lib/spree/core/controller_helpers/common.rb +2 -3
  141. data/lib/spree/core/controller_helpers/order.rb +3 -7
  142. data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
  143. data/lib/spree/core/engine.rb +3 -3
  144. data/lib/spree/core/environment/calculators.rb +0 -1
  145. data/lib/spree/core/environment_extension.rb +8 -8
  146. data/lib/spree/core/importer/order.rb +64 -67
  147. data/lib/spree/core/importer/product.rb +10 -9
  148. data/lib/spree/core/product_filters.rb +17 -18
  149. data/lib/spree/core/routes.rb +2 -6
  150. data/lib/spree/core/search/base.rb +62 -59
  151. data/lib/spree/core/version.rb +1 -1
  152. data/lib/spree/core.rb +4 -6
  153. data/lib/spree/i18n.rb +3 -5
  154. data/lib/spree/localized_number.rb +0 -2
  155. data/lib/spree/migrations.rb +8 -7
  156. data/lib/spree/money.rb +3 -7
  157. data/lib/spree/permitted_attributes.rb +2 -2
  158. data/lib/spree/responder.rb +4 -5
  159. data/lib/spree/testing_support/authorization_helpers.rb +3 -3
  160. data/lib/spree/testing_support/caching.rb +5 -5
  161. data/lib/spree/testing_support/capybara_ext.rb +16 -18
  162. data/lib/spree/testing_support/common_rake.rb +8 -9
  163. data/lib/spree/testing_support/controller_requests.rb +6 -6
  164. data/lib/spree/testing_support/extension_rake.rb +2 -3
  165. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  166. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -1
  167. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
  168. data/lib/spree/testing_support/factories/country_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  170. data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -3
  171. data/lib/spree/testing_support/factories/image_factory.rb +2 -2
  172. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  173. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
  174. data/lib/spree/testing_support/factories/options_factory.rb +1 -1
  175. data/lib/spree/testing_support/factories/order_factory.rb +1 -1
  176. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  177. data/lib/spree/testing_support/factories/payment_method_factory.rb +4 -4
  178. data/lib/spree/testing_support/factories/price_factory.rb +1 -1
  179. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  180. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  181. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -2
  183. data/lib/spree/testing_support/factories/promotion_factory.rb +1 -2
  184. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
  185. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  186. data/lib/spree/testing_support/factories/prototype_factory.rb +1 -1
  187. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  188. data/lib/spree/testing_support/factories/reimbursement_factory.rb +2 -2
  189. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  190. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  191. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  192. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  193. data/lib/spree/testing_support/factories/shipment_factory.rb +2 -2
  194. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  195. data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -3
  196. data/lib/spree/testing_support/factories/state_factory.rb +1 -1
  197. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  198. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  199. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
  200. data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
  201. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +2 -2
  202. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
  203. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  204. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
  205. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  206. data/lib/spree/testing_support/factories/tag_factory.rb +1 -1
  207. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
  208. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  209. data/lib/spree/testing_support/factories/taxon_factory.rb +1 -1
  210. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
  211. data/lib/spree/testing_support/factories/tracker_factory.rb +1 -1
  212. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  213. data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
  214. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  215. data/lib/spree/testing_support/factories/zone_member_factory.rb +1 -1
  216. data/lib/spree/testing_support/factories.rb +3 -3
  217. data/lib/spree/testing_support/flash.rb +1 -3
  218. data/lib/spree/testing_support/i18n.rb +5 -6
  219. data/lib/spree/testing_support/kernel.rb +1 -2
  220. data/lib/spree/testing_support/order_walkthrough.rb +12 -15
  221. data/lib/spree/testing_support/preferences.rb +0 -1
  222. data/lib/tasks/core.rake +47 -56
  223. data/lib/tasks/email.rake +2 -2
  224. data/lib/tasks/exchanges.rake +5 -5
  225. data/spree_core.gemspec +1 -1
  226. metadata +5 -9
  227. data/app/models/spree/calculator/percent_per_item.rb +0 -51
  228. data/config/initializers/premailer_rails.rb +0 -3
  229. data/lib/spree/core/delegate_belongs_to.rb +0 -99
  230. data/lib/spree/testing_support/microdata.rb +0 -192
@@ -6,7 +6,7 @@ module Spree
6
6
  promotable.is_a?(Spree::Order)
7
7
  end
8
8
 
9
- def eligible?(order, options = {})
9
+ def eligible?(order, _options = {})
10
10
  if order.user.present?
11
11
  if promotion.used_by?(order.user, [order])
12
12
  eligibility_errors.add(:base, eligibility_error_message(:limit_once_per_user))
@@ -21,4 +21,3 @@ module Spree
21
21
  end
22
22
  end
23
23
  end
24
-
@@ -6,7 +6,7 @@ module Spree
6
6
  values = super || {}
7
7
  Hash[values.keys.map(&:to_i).zip(
8
8
  values.values.map do |v|
9
- (v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
9
+ (v.is_a?(Array) ? v : v.split(',')).map(&:to_i)
10
10
  end
11
11
  )]
12
12
  end
@@ -31,12 +31,20 @@ module Spree
31
31
  end
32
32
 
33
33
  def actionable?(line_item)
34
- product_id = line_item.product.id
35
- option_values_ids = line_item.variant.option_value_ids
36
- eligible_product_ids = preferred_eligible_values.keys
37
- eligible_value_ids = preferred_eligible_values[product_id]
34
+ pid = line_item.product.id
35
+ ovids = line_item.variant.option_values.pluck(:id)
38
36
 
39
- eligible_product_ids.include?(product_id) && (eligible_value_ids & option_values_ids).present?
37
+ product_ids.include?(pid) && (value_ids(pid) - ovids).empty?
38
+ end
39
+
40
+ private
41
+
42
+ def product_ids
43
+ preferred_eligible_values.keys
44
+ end
45
+
46
+ def value_ids(product_id)
47
+ preferred_eligible_values[product_id]
40
48
  end
41
49
  end
42
50
  end
@@ -21,19 +21,19 @@ module Spree
21
21
  promotable.is_a?(Spree::Order)
22
22
  end
23
23
 
24
- def eligible?(order, options = {})
24
+ def eligible?(order, _options = {})
25
25
  return true if eligible_products.empty?
26
26
 
27
27
  if preferred_match_policy == 'all'
28
- unless eligible_products.all? {|p| order.products.include?(p) }
28
+ unless eligible_products.all? { |p| order.products.include?(p) }
29
29
  eligibility_errors.add(:base, eligibility_error_message(:missing_product))
30
30
  end
31
31
  elsif preferred_match_policy == 'any'
32
- unless order.products.any? {|p| eligible_products.include?(p) }
32
+ unless order.products.any? { |p| eligible_products.include?(p) }
33
33
  eligibility_errors.add(:base, eligibility_error_message(:no_applicable_products))
34
34
  end
35
35
  else
36
- unless order.products.none? {|p| eligible_products.include?(p) }
36
+ unless order.products.none? { |p| eligible_products.include?(p) }
37
37
  eligibility_errors.add(:base, eligibility_error_message(:has_excluded_product))
38
38
  end
39
39
  end
@@ -12,14 +12,14 @@ module Spree
12
12
  promotable.is_a?(Spree::Order)
13
13
  end
14
14
 
15
- def eligible?(order, options = {})
15
+ def eligible?(order, _options = {})
16
16
  if preferred_match_policy == 'all'
17
17
  unless (taxons.to_a - taxons_in_order_including_parents(order)).empty?
18
18
  eligibility_errors.add(:base, eligibility_error_message(:missing_taxon))
19
19
  end
20
20
  else
21
21
  order_taxons = taxons_in_order_including_parents(order)
22
- unless taxons.any?{ |taxon| order_taxons.include? taxon }
22
+ unless taxons.any? { |taxon| order_taxons.include? taxon }
23
23
  eligibility_errors.add(:base, eligibility_error_message(:no_matching_taxons))
24
24
  end
25
25
  end
@@ -44,12 +44,12 @@ module Spree
44
44
 
45
45
  # All taxons in an order
46
46
  def order_taxons(order)
47
- Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).distinct
47
+ Spree::Taxon.joins(products: { variants_including_master: :line_items }).where(spree_line_items: { order_id: order.id }).distinct
48
48
  end
49
49
 
50
50
  # ids of taxons rules and taxons rules children
51
51
  def taxons_including_children_ids
52
- taxons.inject([]){ |ids,taxon| ids += taxon.self_and_descendants.ids }
52
+ taxons.inject([]) { |ids, taxon| ids += taxon.self_and_descendants.ids }
53
53
  end
54
54
 
55
55
  # taxons order vs taxons rules and taxons rules children
@@ -58,11 +58,11 @@ module Spree
58
58
  end
59
59
 
60
60
  def taxons_in_order_including_parents(order)
61
- order_taxons_in_taxons_and_children(order).inject([]){ |taxons, taxon| taxons << taxon.self_and_ancestors }.flatten.uniq
61
+ order_taxons_in_taxons_and_children(order).inject([]) { |taxons, taxon| taxons << taxon.self_and_ancestors }.flatten.uniq
62
62
  end
63
63
 
64
64
  def taxon_product_ids
65
- Spree::Product.joins(:taxons).where(spree_taxons: {id: taxons.pluck(:id)}).pluck(:id).uniq
65
+ Spree::Product.joins(:taxons).where(spree_taxons: { id: taxons.pluck(:id) }).pluck(:id).uniq
66
66
  end
67
67
  end
68
68
  end
@@ -2,18 +2,18 @@ module Spree
2
2
  class Promotion
3
3
  module Rules
4
4
  class User < PromotionRule
5
- belongs_to :user, class_name: "::#{Spree.user_class.to_s}"
5
+ belongs_to :user, class_name: "::#{Spree.user_class}"
6
6
 
7
7
  has_many :promotion_rule_users, class_name: 'Spree::PromotionRuleUser',
8
8
  foreign_key: :promotion_rule_id,
9
9
  dependent: :destroy
10
- has_many :users, through: :promotion_rule_users, class_name: "::#{Spree.user_class.to_s}"
10
+ has_many :users, through: :promotion_rule_users, class_name: "::#{Spree.user_class}"
11
11
 
12
12
  def applicable?(promotable)
13
13
  promotable.is_a?(Spree::Order)
14
14
  end
15
15
 
16
- def eligible?(order, options = {})
16
+ def eligible?(order, _options = {})
17
17
  users.include?(order.user)
18
18
  end
19
19
 
@@ -6,7 +6,7 @@ module Spree
6
6
  promotable.is_a?(Spree::Order)
7
7
  end
8
8
 
9
- def eligible?(order, options = {})
9
+ def eligible?(order, _options = {})
10
10
  unless order.user.present?
11
11
  eligibility_errors.add(:base, eligibility_error_message(:no_user_specified))
12
12
  end
@@ -1,17 +1,17 @@
1
1
  module Spree
2
2
  class Promotion < Spree::Base
3
3
  MATCH_POLICIES = %w(all any)
4
- UNACTIVATABLE_ORDER_STATES = ["complete", "awaiting_return", "returned"]
4
+ UNACTIVATABLE_ORDER_STATES = ['complete', 'awaiting_return', 'returned']
5
5
 
6
6
  attr_reader :eligibility_errors
7
7
 
8
8
  belongs_to :promotion_category, optional: true
9
9
 
10
10
  has_many :promotion_rules, autosave: true, dependent: :destroy
11
- alias_method :rules, :promotion_rules
11
+ alias rules promotion_rules
12
12
 
13
13
  has_many :promotion_actions, autosave: true, dependent: :destroy
14
- alias_method :actions, :promotion_actions
14
+ alias actions promotion_actions
15
15
 
16
16
  has_many :order_promotions, class_name: 'Spree::OrderPromotion'
17
17
  has_many :orders, through: :order_promotions, class_name: 'Spree::Order'
@@ -40,9 +40,9 @@ module Spree
40
40
  self.whitelisted_ransackable_attributes = ['path', 'promotion_category_id', 'code']
41
41
 
42
42
  def self.with_coupon_code(coupon_code)
43
- where("lower(#{table_name}.code) = ?", coupon_code.strip.downcase)
44
- .includes(:promotion_actions).where.not(spree_promotion_actions: { id: nil })
45
- .first
43
+ where("lower(#{table_name}.code) = ?", coupon_code.strip.downcase).
44
+ includes(:promotion_actions).where.not(spree_promotion_actions: { id: nil }).
45
+ first
46
46
  end
47
47
 
48
48
  def self.active
@@ -74,10 +74,10 @@ module Spree
74
74
  action_taken = results.include?(true)
75
75
 
76
76
  if action_taken
77
- # connect to the order
78
- # create the join_table entry.
79
- self.orders << order
80
- self.save
77
+ # connect to the order
78
+ # create the join_table entry.
79
+ orders << order
80
+ save
81
81
  end
82
82
 
83
83
  action_taken
@@ -122,7 +122,7 @@ module Spree
122
122
  def eligible_rules(promotable, options = {})
123
123
  # Promotions without rules are eligible by default.
124
124
  return [] if rules.none?
125
- eligible = lambda { |r| r.eligible?(promotable, options) }
125
+ eligible = ->(r) { r.eligible?(promotable, options) }
126
126
  specific_rules = rules.select { |rule| rule.applicable?(promotable) }
127
127
  return [] if specific_rules.none?
128
128
 
@@ -149,7 +149,7 @@ module Spree
149
149
  end
150
150
 
151
151
  def products
152
- rules.where(type: "Spree::Promotion::Rules::Product").map(&:products).flatten.uniq
152
+ rules.where(type: 'Spree::Promotion::Rules::Product').map(&:products).flatten.uniq
153
153
  end
154
154
 
155
155
  def usage_limit_exceeded?(promotable)
@@ -203,13 +203,14 @@ module Spree
203
203
  end
204
204
 
205
205
  private
206
+
206
207
  def blacklisted?(promotable)
207
208
  case promotable
208
209
  when Spree::LineItem
209
210
  !promotable.product.promotionable?
210
211
  when Spree::Order
211
212
  promotable.line_items.any? &&
212
- !promotable.line_items.joins(:product).where(spree_products: {promotionable: true}).any?
213
+ promotable.line_items.joins(:product).where(spree_products: { promotionable: true }).none?
213
214
  end
214
215
  end
215
216
 
@@ -224,9 +225,7 @@ module Spree
224
225
  end
225
226
 
226
227
  def expires_at_must_be_later_than_starts_at
227
- if expires_at < starts_at
228
- errors.add(:expires_at, :invalid_date_range)
229
- end
228
+ errors.add(:expires_at, :invalid_date_range) if expires_at < starts_at
230
229
  end
231
230
  end
232
231
  end
@@ -12,7 +12,7 @@ module Spree
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
15
- def perform(options = {})
15
+ def perform(_options = {})
16
16
  raise 'perform should be implemented in a sub-class of PromotionAction'
17
17
  end
18
18
 
@@ -16,8 +16,9 @@ module Spree
16
16
  attr_reader :line_item, :order
17
17
  attr_accessor :error, :success
18
18
 
19
- def initialize(order, line_item=nil)
20
- @order, @line_item = order, line_item
19
+ def initialize(order, line_item = nil)
20
+ @order = order
21
+ @line_item = line_item
21
22
  end
22
23
 
23
24
  def activate
@@ -14,9 +14,7 @@ module Spree
14
14
  promotions.each do |promotion|
15
15
  next if promotion.code.present? && !order_promo_ids.include?(promotion.id)
16
16
 
17
- if promotion.eligible?(order)
18
- promotion.activate(order: order)
19
- end
17
+ promotion.activate(order: order) if promotion.eligible?(order)
20
18
  end
21
19
  end
22
20
 
@@ -16,9 +16,9 @@ module Spree
16
16
 
17
17
  private
18
18
 
19
- def promotion
20
- @promotion ||= Promotion.active.find_by(path: path)
21
- end
19
+ def promotion
20
+ @promotion ||= Promotion.active.find_by(path: path)
21
+ end
22
22
  end
23
23
  end
24
24
  end
@@ -11,17 +11,17 @@ module Spree
11
11
  all.select { |rule| rule.applicable?(promotable) }
12
12
  end
13
13
 
14
- def applicable?(promotable)
14
+ def applicable?(_promotable)
15
15
  raise 'applicable? should be implemented in a sub-class of Spree::PromotionRule'
16
16
  end
17
17
 
18
- def eligible?(promotable, options = {})
18
+ def eligible?(_promotable, _options = {})
19
19
  raise 'eligible? should be implemented in a sub-class of Spree::PromotionRule'
20
20
  end
21
21
 
22
22
  # This states if a promotion can be applied to the specified line item
23
23
  # It is true by default, but can be overridden by promotion rules to provide conditions
24
- def actionable?(line_item)
24
+ def actionable?(_line_item)
25
25
  true
26
26
  end
27
27
 
@@ -30,9 +30,10 @@ module Spree
30
30
  end
31
31
 
32
32
  private
33
+
33
34
  def unique_per_promotion
34
35
  if Spree::PromotionRule.exists?(promotion_id: promotion_id, type: self.class.name)
35
- errors[:base] << "Promotion already contains this rule type"
36
+ errors[:base] << 'Promotion already contains this rule type'
36
37
  end
37
38
  end
38
39
 
@@ -22,7 +22,7 @@ module Spree
22
22
  scope :non_reimbursement, -> { where(reimbursement_id: nil) }
23
23
 
24
24
  def money
25
- Spree::Money.new(amount, { currency: payment.currency })
25
+ Spree::Money.new(amount, currency: payment.currency)
26
26
  end
27
27
  alias display_amount money
28
28
 
@@ -43,7 +43,7 @@ module Spree
43
43
  def perform!
44
44
  return true if transaction_id.present?
45
45
 
46
- credit_cents = Spree::Money.new(amount.to_f, currency: payment.currency).amount_in_cents
46
+ credit_cents = Spree::Money.new(amount.to_f, currency: payment.currency).money.cents
47
47
 
48
48
  @response = process!(credit_cents)
49
49
 
@@ -55,21 +55,21 @@ module Spree
55
55
  # return an activemerchant response object if successful or else raise an error
56
56
  def process!(credit_cents)
57
57
  response = if payment.payment_method.payment_profiles_supported?
58
- payment.payment_method.credit(credit_cents, payment.source, payment.transaction_id, {originator: self})
59
- else
60
- payment.payment_method.credit(credit_cents, payment.transaction_id, {originator: self})
58
+ payment.payment_method.credit(credit_cents, payment.source, payment.transaction_id, originator: self)
59
+ else
60
+ payment.payment_method.credit(credit_cents, payment.transaction_id, originator: self)
61
61
  end
62
62
 
63
- if !response.success?
63
+ unless response.success?
64
64
  logger.error(Spree.t(:gateway_error) + " #{response.to_yaml}")
65
65
  text = response.params['message'] || response.params['response_reason_text'] || response.message
66
- raise Core::GatewayError.new(text)
66
+ raise Core::GatewayError, text
67
67
  end
68
68
 
69
69
  response
70
70
  rescue ActiveMerchant::ConnectionError => e
71
71
  logger.error(Spree.t(:gateway_error) + " #{e.inspect}")
72
- raise Core::GatewayError.new(Spree.t(:unable_to_connect_to_gateway))
72
+ raise Core::GatewayError, Spree.t(:unable_to_connect_to_gateway)
73
73
  end
74
74
 
75
75
  def create_log_entry
@@ -19,7 +19,7 @@ module Spree
19
19
  end
20
20
 
21
21
  def display_amount
22
- Spree::Money.new(amount, { currency: creditable.try(:currency) || "USD" })
22
+ Spree::Money.new(amount, currency: creditable.try(:currency) || 'USD')
23
23
  end
24
24
  end
25
25
  end
@@ -16,7 +16,7 @@ module Spree
16
16
 
17
17
  def initialize(return_items)
18
18
  @return_items = return_items
19
- @reimbursement_type_hash = Hash.new {|h,k| h[k] = Array.new }
19
+ @reimbursement_type_hash = Hash.new { |h, k| h[k] = [] }
20
20
  end
21
21
 
22
22
  def calculate_reimbursement_types
@@ -38,8 +38,6 @@ module Spree
38
38
  elsif return_item.preferred_reimbursement_type.present?
39
39
  if valid_preferred_reimbursement_type?(return_item)
40
40
  return_item.preferred_reimbursement_type.class
41
- else
42
- nil
43
41
  end
44
42
  elsif past_reimbursable_time_period?(return_item)
45
43
  expired_reimbursement_type
@@ -61,7 +61,6 @@ module Spree
61
61
  self.reimbursement_failure_hooks = []
62
62
 
63
63
  state_machine :reimbursement_status, initial: :pending do
64
-
65
64
  event :errored do
66
65
  transition to: :errored, from: :pending
67
66
  end
@@ -69,21 +68,18 @@ module Spree
69
68
  event :reimbursed do
70
69
  transition to: :reimbursed, from: [:pending, :errored]
71
70
  end
72
-
73
71
  end
74
72
 
75
73
  class << self
76
74
  def build_from_customer_return(customer_return)
77
75
  order = customer_return.order
78
- order.reimbursements.build({
79
- customer_return: customer_return,
80
- return_items: customer_return.return_items.accepted.not_reimbursed,
81
- })
76
+ order.reimbursements.build(customer_return: customer_return,
77
+ return_items: customer_return.return_items.accepted.not_reimbursed)
82
78
  end
83
79
  end
84
80
 
85
81
  def display_total
86
- Spree::Money.new(total, { currency: order.currency })
82
+ Spree::Money.new(total, currency: order.currency)
87
83
  end
88
84
 
89
85
  def calculated_total
@@ -116,7 +112,7 @@ module Spree
116
112
  else
117
113
  errored!
118
114
  reimbursement_failure_hooks.each { |h| h.call self }
119
- raise IncompleteReimbursementError, Spree.t("validation.unpaid_amount_not_zero", amount: unpaid_amount)
115
+ raise IncompleteReimbursementError, Spree.t('validation.unpaid_amount_not_zero', amount: unpaid_amount)
120
116
  end
121
117
  end
122
118
 
@@ -1,7 +1,5 @@
1
1
  module Spree
2
-
3
2
  class ReimbursementPerformer
4
-
5
3
  class << self
6
4
  class_attribute :reimbursement_type_engine
7
5
  self.reimbursement_type_engine = Spree::Reimbursement::ReimbursementTypeEngine
@@ -35,9 +33,6 @@ module Spree
35
33
  # {Spree::ReimbursementType::OriginalPayment => [ReturnItem, ...], Spree::ReimbursementType::Exchange => [ReturnItem, ...]}
36
34
  reimbursement_type_engine.new(reimbursement.return_items).calculate_reimbursement_types
37
35
  end
38
-
39
36
  end
40
-
41
37
  end
42
-
43
38
  end
@@ -1,5 +1,4 @@
1
1
  module Spree
2
-
3
2
  # Tax calculation is broken out at this level to allow easy integration with 3rd party
4
3
  # taxation systems. Those systems are usually geared toward calculating all items at once
5
4
  # rather than one at a time.
@@ -9,9 +8,7 @@ module Spree
9
8
  # where `calculator_object` is an object that responds to "call" and accepts a reimbursement object
10
9
 
11
10
  class ReimbursementTaxCalculator
12
-
13
11
  class << self
14
-
15
12
  def call(reimbursement)
16
13
  reimbursement.return_items.includes(:inventory_unit).each do |return_item|
17
14
  set_tax!(return_item)
@@ -24,21 +21,17 @@ module Spree
24
21
  calculated_refund = Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
25
22
 
26
23
  percent_of_tax = if return_item.pre_tax_amount <= 0 || calculated_refund <= 0
27
- 0
28
- else
29
- return_item.pre_tax_amount / calculated_refund
24
+ 0
25
+ else
26
+ return_item.pre_tax_amount / calculated_refund
30
27
  end
31
28
 
32
29
  additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
33
30
  included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
34
31
 
35
- return_item.update_attributes!({
36
- additional_tax_total: additional_tax_total,
37
- included_tax_total: included_tax_total,
38
- })
32
+ return_item.update_attributes!(additional_tax_total: additional_tax_total,
33
+ included_tax_total: included_tax_total)
39
34
  end
40
35
  end
41
-
42
36
  end
43
-
44
37
  end
@@ -13,8 +13,8 @@ module Spree
13
13
  # This method will reimburse the return items based on however its child implements it
14
14
  # By default it takes a reimbursement, the return items it needs to reimburse, and if
15
15
  # it is a simulation or a real reimbursement. This should return an array
16
- def self.reimburse(reimbursement, return_items, simulate)
17
- raise "Implement me"
16
+ def self.reimburse(_reimbursement, _return_items, _simulate)
17
+ raise 'Implement me'
18
18
  end
19
19
  end
20
20
  end
@@ -21,7 +21,6 @@ module Spree
21
21
  validates :order, :reason, :stock_location, presence: true
22
22
  validate :must_have_shipped_units, on: :create
23
23
 
24
-
25
24
  # These are called prior to generating expedited exchanges shipments.
26
25
  # Should respond to a "call" method that takes the list of return items
27
26
  class_attribute :pre_expedited_exchange_hooks
@@ -31,9 +30,8 @@ module Spree
31
30
  before_transition to: :canceled, do: :cancel_return_items
32
31
 
33
32
  event :cancel do
34
- transition to: :canceled, from: :authorized, if: lambda { |return_authorization| return_authorization.can_cancel_return_items? }
33
+ transition to: :canceled, from: :authorized, if: ->(return_authorization) { return_authorization.can_cancel_return_items? }
35
34
  end
36
-
37
35
  end
38
36
 
39
37
  extend DisplayMoney
@@ -63,37 +61,35 @@ module Spree
63
61
 
64
62
  private
65
63
 
66
- def must_have_shipped_units
67
- if order.nil? || order.inventory_units.shipped.none?
68
- errors.add(:order, Spree.t(:has_no_shipped_units))
69
- end
70
- end
71
-
72
-
73
- def cancel_return_items
74
- return_items.each { |item| item.cancel! if item.can_cancel? }
64
+ def must_have_shipped_units
65
+ if order.nil? || order.inventory_units.shipped.none?
66
+ errors.add(:order, Spree.t(:has_no_shipped_units))
75
67
  end
68
+ end
76
69
 
77
- def generate_expedited_exchange_reimbursements
78
- return unless Spree::Config[:expedited_exchanges]
70
+ def cancel_return_items
71
+ return_items.each { |item| item.cancel! if item.can_cancel? }
72
+ end
79
73
 
80
- items_to_exchange = return_items.select(&:exchange_required?)
81
- items_to_exchange.each(&:attempt_accept)
82
- items_to_exchange.select!(&:accepted?)
74
+ def generate_expedited_exchange_reimbursements
75
+ return unless Spree::Config[:expedited_exchanges]
83
76
 
84
- return if items_to_exchange.blank?
77
+ items_to_exchange = return_items.select(&:exchange_required?)
78
+ items_to_exchange.each(&:attempt_accept)
79
+ items_to_exchange.select!(&:accepted?)
85
80
 
86
- pre_expedited_exchange_hooks.each { |h| h.call items_to_exchange }
81
+ return if items_to_exchange.blank?
87
82
 
88
- reimbursement = Reimbursement.new(return_items: items_to_exchange, order: order)
83
+ pre_expedited_exchange_hooks.each { |h| h.call items_to_exchange }
89
84
 
90
- if reimbursement.save
91
- reimbursement.perform!
92
- else
93
- errors.add(:base, reimbursement.errors.full_messages)
94
- raise ActiveRecord::RecordInvalid.new(self)
95
- end
85
+ reimbursement = Reimbursement.new(return_items: items_to_exchange, order: order)
96
86
 
87
+ if reimbursement.save
88
+ reimbursement.perform!
89
+ else
90
+ errors.add(:base, reimbursement.errors.full_messages)
91
+ raise ActiveRecord::RecordInvalid, self
97
92
  end
93
+ end
98
94
  end
99
95
  end
@@ -10,11 +10,11 @@ module Spree
10
10
  ]
11
11
 
12
12
  def eligible_for_return?
13
- validators.all? {|v| v.eligible_for_return? }
13
+ validators.all?(&:eligible_for_return?)
14
14
  end
15
15
 
16
16
  def requires_manual_intervention?
17
- validators.any? {|v| v.requires_manual_intervention? }
17
+ validators.any?(&:requires_manual_intervention?)
18
18
  end
19
19
 
20
20
  def errors
@@ -24,7 +24,7 @@ module Spree
24
24
  private
25
25
 
26
26
  def validators
27
- @validators ||= permitted_eligibility_validators.map{|v| v.new(@return_item) }
27
+ @validators ||= permitted_eligibility_validators.map { |v| v.new(@return_item) }
28
28
  end
29
29
  end
30
30
  end
@@ -2,10 +2,10 @@ module Spree
2
2
  class ReturnItem::EligibilityValidator::InventoryShipped < Spree::ReturnItem::EligibilityValidator::BaseValidator
3
3
  def eligible_for_return?
4
4
  if @return_item.inventory_unit.shipped?
5
- return true
5
+ true
6
6
  else
7
7
  add_error(:inventory_unit_shipped, Spree.t('return_item_inventory_unit_ineligible'))
8
- return false
8
+ false
9
9
  end
10
10
  end
11
11
 
@@ -3,9 +3,9 @@ module Spree
3
3
  def eligible_for_return?
4
4
  if Spree::ReturnItem.where(inventory_unit: @return_item.inventory_unit).where.not(reimbursement_id: nil).any?
5
5
  add_error(:inventory_unit_reimbursed, Spree.t('return_item_inventory_unit_reimbursed'))
6
- return false
6
+ false
7
7
  else
8
- return true
8
+ true
9
9
  end
10
10
  end
11
11
 
@@ -2,10 +2,10 @@ module Spree
2
2
  class ReturnItem::EligibilityValidator::OrderCompleted < Spree::ReturnItem::EligibilityValidator::BaseValidator
3
3
  def eligible_for_return?
4
4
  if @return_item.inventory_unit.order.completed?
5
- return true
5
+ true
6
6
  else
7
7
  add_error(:order_not_completed, Spree.t('return_item_order_not_completed'))
8
- return false
8
+ false
9
9
  end
10
10
  end
11
11