solidus_core 1.0.0.pre → 1.0.0.pre2

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.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/app/mailers/spree/carton_mailer.rb +1 -1
  3. data/app/mailers/spree/reimbursement_mailer.rb +3 -2
  4. data/app/mailers/spree/test_mailer.rb +1 -1
  5. data/app/models/concerns/spree/user_methods.rb +49 -0
  6. data/app/models/spree/ability.rb +2 -0
  7. data/app/models/spree/adjustment.rb +1 -0
  8. data/app/models/spree/adjustment_reason.rb +12 -0
  9. data/app/models/spree/app_configuration.rb +1 -1
  10. data/app/models/spree/carton.rb +1 -1
  11. data/app/models/spree/inventory_unit.rb +10 -6
  12. data/app/models/spree/legacy_user.rb +4 -12
  13. data/app/models/spree/order.rb +15 -15
  14. data/app/models/spree/order/checkout.rb +20 -15
  15. data/app/models/spree/order/payments.rb +1 -5
  16. data/app/models/spree/order_cancellations.rb +1 -1
  17. data/app/models/spree/order_capturing.rb +1 -1
  18. data/app/models/spree/order_mutex.rb +1 -1
  19. data/app/models/spree/order_shipping.rb +1 -1
  20. data/app/models/spree/payment/processing.rb +39 -13
  21. data/app/models/spree/payment_method.rb +2 -2
  22. data/app/models/spree/permission_sets/base.rb +17 -0
  23. data/app/models/spree/permission_sets/configuration_display.rb +24 -0
  24. data/app/models/spree/permission_sets/configuration_management.rb +24 -0
  25. data/app/models/spree/permission_sets/dashboard_display.rb +9 -0
  26. data/app/models/spree/permission_sets/order_display.rb +15 -0
  27. data/app/models/spree/permission_sets/order_management.rb +15 -0
  28. data/app/models/spree/permission_sets/product_display.rb +18 -0
  29. data/app/models/spree/permission_sets/product_management.rb +19 -0
  30. data/app/models/spree/permission_sets/promotion_display.rb +12 -0
  31. data/app/models/spree/permission_sets/promotion_management.rb +12 -0
  32. data/app/models/spree/permission_sets/report_display.rb +9 -0
  33. data/app/models/spree/permission_sets/stock_display.rb +10 -0
  34. data/app/models/spree/permission_sets/stock_management.rb +11 -0
  35. data/app/models/spree/permission_sets/user_display.rb +11 -0
  36. data/app/models/spree/permission_sets/user_management.rb +11 -0
  37. data/app/models/spree/promotion/rules/item_total.rb +12 -33
  38. data/app/models/spree/promotion/rules/user.rb +2 -2
  39. data/app/models/spree/promotion_rule.rb +2 -2
  40. data/app/models/spree/reimbursement.rb +0 -12
  41. data/app/models/spree/return_authorization.rb +2 -2
  42. data/app/models/spree/return_item.rb +1 -0
  43. data/app/models/spree/return_reason.rb +18 -0
  44. data/app/models/spree/role_user.rb +1 -1
  45. data/app/models/spree/shipment.rb +9 -26
  46. data/app/models/spree/store_credit.rb +31 -7
  47. data/app/models/spree/store_credit_event.rb +13 -11
  48. data/app/models/spree/store_credit_update_reason.rb +2 -0
  49. data/app/models/spree/user_class_handle.rb +21 -0
  50. data/app/models/spree/user_stock_location.rb +1 -1
  51. data/config/initializers/spree_user.rb +10 -0
  52. data/config/locales/en.yml +58 -16
  53. data/db/default/spree/return_reasons.rb +9 -0
  54. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +11 -9
  55. data/db/migrate/20150618212517_create_spree_store_credit_update_reasons.rb +8 -0
  56. data/db/migrate/20150619160613_create_adjustment_reason.rb +18 -0
  57. data/db/migrate/20150622144655_add_update_reason_to_store_credit_events.rb +5 -0
  58. data/db/migrate/20150623194316_add_return_authorization_reason_id_to_return_items.rb +7 -0
  59. data/db/migrate/20150623214058_seed_store_credit_update_reasons.rb +9 -0
  60. data/db/migrate/20150626200816_remove_shipping_method_id_from_spree_orders.rb +9 -0
  61. data/db/seeds.rb +9 -0
  62. data/lib/spree/core.rb +1 -4
  63. data/lib/spree/core/controller_helpers/auth.rb +15 -20
  64. data/lib/spree/core/engine.rb +1 -0
  65. data/lib/spree/core/importer/order.rb +8 -5
  66. data/lib/spree/core/role_configuration.rb +70 -0
  67. data/lib/spree/permitted_attributes.rb +1 -1
  68. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +6 -0
  69. data/lib/spree/testing_support/factories/order_factory.rb +14 -1
  70. data/lib/spree/testing_support/factories/promotion_factory.rb +2 -4
  71. data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
  72. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -0
  73. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +10 -0
  74. data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +5 -0
  75. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  76. data/lib/spree/testing_support/order_walkthrough.rb +2 -7
  77. metadata +36 -10
  78. data/app/assets/images/logo/solidus.png +0 -0
  79. data/app/models/spree/item_adjustments.rb.orig +0 -93
  80. data/app/models/spree/return_authorization_reason.rb +0 -7
  81. data/app/models/spree/static_model_preferences.rb +0 -32
  82. data/config/initializers/user_class_extensions.rb +0 -42
@@ -16,14 +16,14 @@ module Spree
16
16
  end
17
17
 
18
18
  def provider_class
19
- raise ::NotImplementedError, 'You must implement provider_class method for this gateway.'
19
+ raise ::NotImplementedError, "You must implement provider_class method for #{self.class}."
20
20
  end
21
21
 
22
22
  # The class that will process payments for this payment type, used for @payment.source
23
23
  # e.g. CreditCard in the case of a the Gateway payment type
24
24
  # nil means the payment method doesn't require a source e.g. check
25
25
  def payment_source_class
26
- raise ::NotImplementedError, 'You must implement payment_source_class method for this gateway.'
26
+ raise ::NotImplementedError, "You must implement payment_source_class method for #{self.class}."
27
27
  end
28
28
 
29
29
  def self.available(display_on = 'both')
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class Base
4
+ def initialize ability
5
+ @ability = ability
6
+ end
7
+
8
+ def activate!
9
+ raise NotImplementedError.new
10
+ end
11
+
12
+ private
13
+
14
+ delegate :can, :cannot, to: :@ability
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class ConfigurationDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:edit, :admin], :general_settings
6
+ can [:display, :admin], Spree::TaxCategory
7
+ can [:display, :admin], Spree::TaxRate
8
+ can [:display, :admin], Spree::Zone
9
+ can [:display, :admin], Spree::Country
10
+ can [:display, :admin], Spree::State
11
+ can [:display, :admin], Spree::PaymentMethod
12
+ can [:display, :admin], Spree::Taxonomy
13
+ can [:display, :admin], Spree::ShippingMethod
14
+ can [:display, :admin], Spree::ShippingCategory
15
+ can [:display, :admin], Spree::StockLocation
16
+ can [:display, :admin], Spree::StockMovement
17
+ can [:display, :admin], Spree::Tracker
18
+ can [:display, :admin], Spree::RefundReason
19
+ can [:display, :admin], Spree::ReimbursementType
20
+ can [:display, :admin], Spree::ReturnReason
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class ConfigurationManagement < PermissionSets::Base
4
+ def activate!
5
+ can :manage, :general_settings
6
+ can :manage, Spree::TaxCategory
7
+ can :manage, Spree::TaxRate
8
+ can :manage, Spree::Zone
9
+ can :manage, Spree::Country
10
+ can :manage, Spree::State
11
+ can :manage, Spree::PaymentMethod
12
+ can :manage, Spree::Taxonomy
13
+ can :manage, Spree::ShippingMethod
14
+ can :manage, Spree::ShippingCategory
15
+ can :manage, Spree::StockLocation
16
+ can :manage, Spree::StockMovement
17
+ can :manage, Spree::Tracker
18
+ can :manage, Spree::RefundReason
19
+ can :manage, Spree::ReimbursementType
20
+ can :manage, Spree::ReturnReason
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class DashboardDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:admin, :home], :dashboards
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class OrderDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:display, :admin, :edit, :cart], Spree::Order
6
+ can [:display, :admin], Spree::Payment
7
+ can [:display, :admin], Spree::Shipment
8
+ can [:display, :admin], Spree::Adjustment
9
+ can [:display, :admin], Spree::LineItem
10
+ can [:display, :admin], Spree::ReturnAuthorization
11
+ can [:display, :admin], Spree::CustomerReturn
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class OrderManagement < PermissionSets::Base
4
+ def activate!
5
+ can :manage, Spree::Order
6
+ can :manage, Spree::Payment
7
+ can :manage, Spree::Shipment
8
+ can :manage, Spree::Adjustment
9
+ can :manage, Spree::LineItem
10
+ can :manage, Spree::ReturnAuthorization
11
+ can :manage, Spree::CustomerReturn
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class ProductDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:display, :admin, :edit], Spree::Product
6
+ can [:display, :admin], Spree::Image
7
+ can [:display, :admin], Spree::Variant
8
+ can [:display, :admin], Spree::OptionValue
9
+ can [:display, :admin], Spree::ProductProperty
10
+ can [:display, :admin], Spree::OptionType
11
+ can [:display, :admin], Spree::Property
12
+ can [:display, :admin], Spree::Prototype
13
+ can [:display, :admin], Spree::Taxonomy
14
+ can [:display, :admin], Spree::Taxon
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class ProductManagement < PermissionSets::Base
4
+ def activate!
5
+ can :manage, Spree::Product
6
+ can :manage, Spree::Image
7
+ can :manage, Spree::Variant
8
+ can :manage, Spree::OptionValue
9
+ can :manage, Spree::ProductProperty
10
+ can :manage, Spree::OptionType
11
+ can :manage, Spree::Property
12
+ can :manage, Spree::Prototype
13
+ can :manage, Spree::Taxonomy
14
+ can :manage, Spree::Taxon
15
+ can :manage, Spree::Classification
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class PromotionDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:display, :admin], Spree::Promotion
6
+ can [:display, :admin], Spree::PromotionRule
7
+ can [:display, :admin], Spree::PromotionAction
8
+ can [:display, :admin], Spree::PromotionCategory
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class PromotionManagement < PermissionSets::Base
4
+ def activate!
5
+ can :manage, Spree::Promotion
6
+ can :manage, Spree::PromotionRule
7
+ can :manage, Spree::PromotionAction
8
+ can :manage, Spree::PromotionCategory
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class ReportDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:display, :admin, :sales_total], :reports
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class StockDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:display, :admin], Spree::StockItem
6
+ can [:display, :admin], Spree::StockTransfer
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class StockManagement < PermissionSets::Base
4
+ def activate!
5
+ can :manage, Spree::StockItem
6
+ can :manage, Spree::StockTransfer
7
+ can :manage, Spree::TransferItem
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class UserDisplay < PermissionSets::Base
4
+ def activate!
5
+ can [:display, :admin, :edit, :addresses, :orders, :items], Spree.user_class
6
+ can [:display, :admin], Spree::StoreCredit
7
+ can :display, Spree::Role
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module PermissionSets
3
+ class UserManagement < PermissionSets::Base
4
+ def activate!
5
+ can :manage, Spree.user_class
6
+ can :manage, Spree::StoreCredit
7
+ can :display, Spree::Role
8
+ end
9
+ end
10
+ end
11
+ end
@@ -4,14 +4,10 @@ module Spree
4
4
  # A rule to apply to an order greater than (or greater than or equal to)
5
5
  # a specific amount
6
6
  class ItemTotal < PromotionRule
7
- preference :amount_min, :decimal, default: 100.00
8
- preference :operator_min, :string, default: '>'
9
- preference :amount_max, :decimal, default: 1000.00
10
- preference :operator_max, :string, default: '<'
7
+ preference :amount, :decimal, default: 100.00
8
+ preference :operator, :string, default: '>'
11
9
 
12
-
13
- OPERATORS_MIN = ['gt', 'gte']
14
- OPERATORS_MAX = ['lt','lte']
10
+ OPERATORS = ['gt', 'gte']
15
11
 
16
12
  def applicable?(promotable)
17
13
  promotable.is_a?(Spree::Order)
@@ -19,42 +15,25 @@ module Spree
19
15
 
20
16
  def eligible?(order, options = {})
21
17
  item_total = order.item_total
22
-
23
- lower_limit_condition = item_total.send(preferred_operator_min == 'gte' ? :>= : :>, BigDecimal.new(preferred_amount_min.to_s))
24
- upper_limit_condition = item_total.send(preferred_operator_max == 'lte' ? :<= : :<, BigDecimal.new(preferred_amount_max.to_s))
25
-
26
- eligibility_errors.add(:base, ineligible_message_max) unless upper_limit_condition
27
- eligibility_errors.add(:base, ineligible_message_min) unless lower_limit_condition
18
+ unless item_total.send(preferred_operator == 'gte' ? :>= : :>, BigDecimal.new(preferred_amount.to_s))
19
+ eligibility_errors.add(:base, ineligible_message)
20
+ end
28
21
 
29
22
  eligibility_errors.empty?
30
23
  end
31
24
 
32
25
  private
33
- def formatted_amount_min
34
- Spree::Money.new(preferred_amount_min).to_s
35
- end
36
-
37
- def formatted_amount_max
38
- Spree::Money.new(preferred_amount_max).to_s
26
+ def formatted_amount
27
+ Spree::Money.new(preferred_amount).to_s
39
28
  end
40
29
 
41
-
42
- def ineligible_message_max
43
- if preferred_operator_max == 'gte'
44
- eligibility_error_message(:item_total_more_than_or_equal, amount: formatted_amount_max)
45
- else
46
- eligibility_error_message(:item_total_more_than, amount: formatted_amount_max)
47
- end
48
- end
49
-
50
- def ineligible_message_min
51
- if preferred_operator_min == 'gte'
52
- eligibility_error_message(:item_total_less_than, amount: formatted_amount_min)
30
+ def ineligible_message
31
+ if preferred_operator == 'gte'
32
+ eligibility_error_message(:item_total_less_than, amount: formatted_amount)
53
33
  else
54
- eligibility_error_message(:item_total_less_than_or_equal, amount: formatted_amount_min)
34
+ eligibility_error_message(:item_total_less_than_or_equal, amount: formatted_amount)
55
35
  end
56
36
  end
57
-
58
37
  end
59
38
  end
60
39
  end
@@ -2,9 +2,9 @@ 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::UserClassHandle.new
6
6
 
7
- has_and_belongs_to_many :users, class_name: "::#{Spree.user_class.to_s}",
7
+ has_and_belongs_to_many :users, class_name: Spree::UserClassHandle.new,
8
8
  join_table: 'spree_promotion_rules_users',
9
9
  foreign_key: 'promotion_rule_id',
10
10
  association_foreign_key: :user_id
@@ -13,11 +13,11 @@ module Spree
13
13
  end
14
14
 
15
15
  def applicable?(promotable)
16
- raise 'applicable? should be implemented in a sub-class of Spree::PromotionRule'
16
+ raise NotImplementedError, "applicable? should be implemented in a sub-class of Spree::PromotionRule"
17
17
  end
18
18
 
19
19
  def eligible?(promotable, options = {})
20
- raise 'eligible? should be implemented in a sub-class of Spree::PromotionRule'
20
+ raise NotImplementedError, "eligible? should be implemented in a sub-class of Spree::PromotionRule"
21
21
  end
22
22
 
23
23
  # This states if a promotion can be applied to the specified line item
@@ -172,17 +172,5 @@ module Spree
172
172
  end
173
173
  unpaid_amount.abs.between?(0, leniency)
174
174
  end
175
-
176
-
177
- # If there are multiple different reimbursement types for a single reimbursement,
178
- # We open ourselves to a one-cent rounding error for every type over the first one.
179
- # This is due to how we round #unpaid_amount and how each reimbursement type will round as well.
180
- # Since at this point, the payments and credits have already been processed, we should
181
- # allow the reimbursement to show as 'reimbursed' and not 'errored'
182
- def unpaid_amount_within_tolerance?
183
- reimbursement_count = reimbursement_models.count { |model| model.total_amount_reimbursed_for(self) > 0 }
184
- leniency = reimbursement_count > 0 ? (reimbursement_count - 1) * 0.01.to_d : 0
185
- unpaid_amount.abs.between?(0, leniency)
186
- end
187
175
  end
188
176
  end
@@ -7,7 +7,8 @@ module Spree
7
7
  has_many :customer_returns, through: :return_items
8
8
 
9
9
  belongs_to :stock_location
10
- belongs_to :reason, class_name: 'Spree::ReturnAuthorizationReason', foreign_key: :return_authorization_reason_id
10
+ belongs_to :reason, class_name: 'Spree::ReturnReason', foreign_key: :return_reason_id
11
+
11
12
  before_create :generate_number
12
13
 
13
14
  after_save :generate_expedited_exchange_reimbursements
@@ -15,7 +16,6 @@ module Spree
15
16
  accepts_nested_attributes_for :return_items, allow_destroy: true
16
17
 
17
18
  validates :order, presence: true
18
- validates :reason, presence: true
19
19
  validates :stock_location, presence: true
20
20
  validate :must_have_shipped_units, on: :create
21
21
  validate :no_previously_exchanged_inventory_units, on: :create
@@ -36,6 +36,7 @@ module Spree
36
36
  belongs_to :reimbursement, inverse_of: :return_items
37
37
  belongs_to :preferred_reimbursement_type, class_name: 'Spree::ReimbursementType'
38
38
  belongs_to :override_reimbursement_type, class_name: 'Spree::ReimbursementType'
39
+ belongs_to :return_reason, class_name: 'Spree::ReturnReason', foreign_key: :return_reason_id
39
40
 
40
41
  validate :eligible_exchange_variant
41
42
  validate :belongs_to_same_customer_order
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ class ReturnReason < ActiveRecord::Base
3
+ include Spree::NamedType
4
+
5
+ has_many :return_authorizations
6
+
7
+ def self.reasons_for_return_items(return_items)
8
+ reasons = Spree::ReturnReason.active
9
+ # Only allow an inactive reason if it's already associated to a return item
10
+ return_items.each do |return_item|
11
+ if return_item.return_reason && !return_item.return_reason.active?
12
+ reasons << return_item.return_reason
13
+ end
14
+ end
15
+ reasons
16
+ end
17
+ end
18
+ end
@@ -2,7 +2,7 @@ module Spree
2
2
  class RoleUser < ActiveRecord::Base
3
3
  self.table_name = "spree_roles_users"
4
4
  belongs_to :role, class_name: "Spree::Role"
5
- belongs_to :user, class_name: Spree.user_class.to_s
5
+ belongs_to :user, class_name: Spree::UserClassHandle.new
6
6
 
7
7
  after_save :generate_admin_api_key
8
8
 
@@ -19,6 +19,8 @@ module Spree
19
19
 
20
20
  before_validation :set_cost_zero_when_nil
21
21
 
22
+ before_destroy :ensure_can_destroy
23
+
22
24
  # TODO remove the suppress_mailer temporary variable once we are calling 'ship'
23
25
  # from outside of the state machine and can actually pass variables through.
24
26
  attr_accessor :special_instructions, :suppress_mailer
@@ -152,32 +154,6 @@ module Spree
152
154
  inventory_units.includes(:line_item).map(&:line_item).uniq
153
155
  end
154
156
 
155
- def process_order_payments
156
- pending_payments = order.pending_payments
157
- .sort_by(&:uncaptured_amount).reverse
158
-
159
- shipment_to_pay = final_price_with_items
160
- payments_amount = 0
161
-
162
- payments_pool = pending_payments.each_with_object([]) do |payment, pool|
163
- break if payments_amount >= shipment_to_pay
164
- payments_amount += payment.uncaptured_amount
165
- pool << payment
166
- end
167
-
168
- payments_pool.each do |payment|
169
- capturable_amount = if payment.amount >= shipment_to_pay
170
- shipment_to_pay
171
- else
172
- payment.amount
173
- end
174
-
175
- cents = (capturable_amount * 100).to_i
176
- payment.capture!(cents)
177
- shipment_to_pay -= capturable_amount
178
- end
179
- end
180
-
181
157
  def line_items
182
158
  inventory_units.includes(:line_item).map(&:line_item).uniq
183
159
  end
@@ -423,5 +399,12 @@ module Spree
423
399
  end
424
400
  end
425
401
 
402
+
403
+ def ensure_can_destroy
404
+ unless pending?
405
+ errors.add(:state, :cannot_destroy, state: self.state)
406
+ return false
407
+ end
408
+ end
426
409
  end
427
410
  end