comable_core 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/comable/application_helper.rb +17 -10
  3. data/app/models/comable/ability.rb +1 -1
  4. data/app/models/comable/address.rb +2 -2
  5. data/app/models/comable/order/associations.rb +22 -0
  6. data/app/models/comable/order/callbacks.rb +43 -0
  7. data/app/models/comable/order/scopes.rb +17 -0
  8. data/app/models/comable/order/validations.rb +39 -0
  9. data/app/models/comable/order.rb +63 -72
  10. data/app/models/comable/order_item/csvable.rb +32 -0
  11. data/app/models/comable/{order_detail.rb → order_item.rb} +19 -10
  12. data/app/models/comable/payment.rb +82 -0
  13. data/app/models/comable/payment_method.rb +1 -0
  14. data/app/models/comable/product/csvable.rb +20 -0
  15. data/app/models/comable/product.rb +2 -7
  16. data/app/models/comable/shipment.rb +79 -0
  17. data/app/models/comable/stock/csvable.rb +26 -0
  18. data/app/models/comable/stock.rb +2 -17
  19. data/app/models/comable/tracker.rb +17 -0
  20. data/app/models/comable/{customer.rb → user.rb} +11 -23
  21. data/app/models/concerns/comable/checkout.rb +35 -36
  22. data/app/models/concerns/comable/importable.rb +67 -0
  23. data/app/views/comable/order_mailer/complete.text.erb +9 -8
  24. data/config/initializers/comma.rb +8 -0
  25. data/config/locales/en.yml +105 -14
  26. data/config/locales/ja.yml +92 -19
  27. data/db/migrate/{20140120032559_create_comable_customers.rb → 20140120032559_create_comable_users.rb} +6 -6
  28. data/db/migrate/20140723175431_create_comable_orders.rb +2 -4
  29. data/db/migrate/{20140723175810_create_comable_order_details.rb → 20140723175810_create_comable_order_items.rb} +3 -3
  30. data/db/migrate/20140817194104_create_comable_payment_methods.rb +1 -0
  31. data/db/migrate/20141024025526_create_comable_addresses.rb +1 -1
  32. data/db/migrate/20150423095210_create_comable_shipments.rb +12 -0
  33. data/db/migrate/20150511171940_create_comable_payments.rb +11 -0
  34. data/db/migrate/20150513185230_create_comable_trackers.rb +12 -0
  35. data/db/seeds/comable/{customers.rb → users.rb} +3 -3
  36. data/lib/comable/core/configuration.rb +7 -1
  37. data/lib/comable/core/engine.rb +0 -25
  38. data/lib/comable/payment_provider/base.rb +16 -0
  39. data/lib/comable_core.rb +6 -1
  40. data/lib/comma_extractor_extentions.rb +31 -0
  41. data/lib/generators/comable/install/templates/config/initializers/comable.rb +16 -1
  42. metadata +79 -8
  43. data/lib/comable/errors.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eff5ae9b60000ce4171fd14e7848dc952cd084eb
4
- data.tar.gz: dd80b2206c1d2ac96a99421760547bcc4bd0717f
3
+ metadata.gz: b3586df9a1e1a2267feb7f84f1658f21f92909b2
4
+ data.tar.gz: 94e817e742c94849a8eb08ebf7f8de9c983c3a33
5
5
  SHA512:
6
- metadata.gz: d6ba4f76bc521aa0fb526ce74fbdcfe7020ae7ab1db57e911da4434fbc275917436bcb02a84af19b317dfda3de47cd85e21dd83e42d37a1da4519220f57595dc
7
- data.tar.gz: 598942cd5f8e84f1cc2bd6fc2e51465d99e24474cbfa2c83b1e5fe44ae92254b4b0b2308e7fbfa8819cd2c2f0d35ddb4b589a9883b26ee101e543c5f9101948f
6
+ metadata.gz: 6b03e1b7ff2c55f92048da4ab2fa08fb7c503ea2e6d70da22eebf8b1cc8f98c6c2bfb11241811c76fce533cad8cdc1dc190bf158290f58cbda72555902498132
7
+ data.tar.gz: 7c24b354ae4934ba2670851b2390e18f1c292f9675cde73ac251bf0799e1d49b81f1d551926db6afed7dd6cc5074dae95c9542b76b0fc245b4a1e989cb36f75d
@@ -4,15 +4,17 @@ module Comable
4
4
  @current_store ||= Comable::Store.instance
5
5
  end
6
6
 
7
- # Override the devise method.
8
- # The below codes move to core/lib/comable/core/engine.rb:
9
- #
10
- # def current_customer
11
- # ...
12
- # end
7
+ def current_comable_user
8
+ resource = current_admin_user || current_user || Comable::User.new
9
+ resource.with_cookies(cookies)
10
+ end
13
11
 
14
12
  def current_order
15
- current_customer.incomplete_order
13
+ current_comable_user.incomplete_order
14
+ end
15
+
16
+ def current_trackers
17
+ @curent_trackers ||= (controller_name == 'orders' && action_name == 'create') ? Comable::Tracker.activated : Comable::Tracker.activated.with_place(:everywhere)
16
18
  end
17
19
 
18
20
  def next_order_path
@@ -25,7 +27,7 @@ module Comable
25
27
  end
26
28
 
27
29
  def store_location
28
- session[:customer_return_to] = request.fullpath.gsub('//', '/')
30
+ session[:user_return_to] = request.fullpath.gsub('//', '/')
29
31
  end
30
32
 
31
33
  def name_with_honorific(name)
@@ -41,14 +43,19 @@ module Comable
41
43
  ].join(' ')
42
44
  end
43
45
 
46
+ def liquidize(content, arguments)
47
+ string = Liquid::Template.parse(content).render(arguments.stringify_keys)
48
+ string.respond_to?(:html_safe) ? string.html_safe : string
49
+ end
50
+
44
51
  private
45
52
 
46
53
  def after_sign_in_path_for(_resource)
47
- session.delete(:customer_return_to) || comable.root_path
54
+ session.delete(:user_return_to) || comable.root_path
48
55
  end
49
56
 
50
57
  def after_sign_out_path_for(_resource)
51
- session.delete(:customer_return_to) || comable.root_path
58
+ session.delete(:user_return_to) || comable.root_path
52
59
  end
53
60
 
54
61
  def after_sign_up_path_for(resource)
@@ -3,7 +3,7 @@ module Comable
3
3
  include CanCan::Ability
4
4
 
5
5
  def initialize(user)
6
- user ||= Comable::Customer.new # guest user (not logged in)
6
+ user ||= Comable::User.new # guest user (not logged in)
7
7
 
8
8
  case user.role.to_sym
9
9
  when :admin
@@ -1,6 +1,6 @@
1
1
  module Comable
2
2
  class Address < ActiveRecord::Base
3
- belongs_to :customer, class_name: Comable::Customer.name, autosave: false
3
+ belongs_to :user, class_name: Comable::User.name, autosave: false
4
4
 
5
5
  validates :family_name, presence: true, length: { maximum: 255 }
6
6
  validates :first_name, presence: true, length: { maximum: 255 }
@@ -25,7 +25,7 @@ module Comable
25
25
  end
26
26
 
27
27
  def attributes_without_id
28
- attributes.except('id', 'customer_id')
28
+ attributes.except('id', 'user_id')
29
29
  end
30
30
 
31
31
  def full_name
@@ -0,0 +1,22 @@
1
+ module Comable
2
+ class Order < ActiveRecord::Base
3
+ module Associations
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ belongs_to :user, class_name: Comable::User.name, autosave: false
8
+ belongs_to :bill_address, class_name: Comable::Address.name, autosave: true, dependent: :destroy
9
+ belongs_to :ship_address, class_name: Comable::Address.name, autosave: true, dependent: :destroy
10
+ has_many :order_items, dependent: :destroy, class_name: Comable::OrderItem.name, inverse_of: :order
11
+ has_one :payment, dependent: :destroy, class_name: Comable::Payment.name, inverse_of: :order
12
+ has_one :shipment, dependent: :destroy, class_name: Comable::Shipment.name, inverse_of: :order
13
+
14
+ accepts_nested_attributes_for :bill_address
15
+ accepts_nested_attributes_for :ship_address
16
+ accepts_nested_attributes_for :order_items
17
+ accepts_nested_attributes_for :payment
18
+ accepts_nested_attributes_for :shipment
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ module Comable
2
+ class Order < ActiveRecord::Base
3
+ module Callbacks
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ define_model_callbacks :complete
8
+
9
+ before_validation :generate_guest_token, on: :create
10
+ before_validation :clone_addresses_from_user, on: :create
11
+ before_complete :generate_code
12
+ after_complete :clone_addresses_to_user
13
+ end
14
+
15
+ def generate_code
16
+ self.code = loop do
17
+ random_token = "C#{Array.new(11) { rand(9) }.join}"
18
+ break random_token unless self.class.exists?(code: random_token)
19
+ end
20
+ end
21
+
22
+ def generate_guest_token
23
+ return if user
24
+ self.guest_token ||= loop do
25
+ random_token = SecureRandom.urlsafe_base64(nil, false)
26
+ break random_token unless self.class.exists?(guest_token: random_token)
27
+ end
28
+ end
29
+
30
+ def clone_addresses_from_user
31
+ return unless user
32
+ self.bill_address ||= user.bill_address.try(:clone)
33
+ self.ship_address ||= user.ship_address.try(:clone)
34
+ end
35
+
36
+ def clone_addresses_to_user
37
+ return unless user
38
+ user.update_bill_address_by bill_address
39
+ user.update_ship_address_by ship_address
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ module Comable
2
+ class Order < ActiveRecord::Base
3
+ module Scopes
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ scope :complete, -> { where.not(completed_at: nil) }
8
+ scope :incomplete, -> { where(completed_at: nil) }
9
+ scope :by_user, -> (user) { where(user_id: user) }
10
+ scope :this_month, -> { where(completed_at: Time.now.beginning_of_month..Time.now.end_of_month) }
11
+ scope :this_week, -> { where(completed_at: Time.now.beginning_of_week..Time.now.end_of_week) }
12
+ scope :last_week, -> { where(completed_at: 1.week.ago.beginning_of_week..1.week.ago.end_of_week) }
13
+ scope :recent, -> { order('completed_at DESC, id DESC') }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ module Comable
2
+ class Order < ActiveRecord::Base
3
+ module Validations
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ validates :user_id, uniqueness: { scope: :completed_at }, if: :user
8
+ validates :guest_token, presence: true, uniqueness: { scope: :completed_at }, unless: :user
9
+
10
+ with_options if: -> { stated?(:cart) } do |context|
11
+ context.validates :email, presence: true, length: { maximum: 255 }
12
+ end
13
+
14
+ with_options if: -> { stated?(:orderer) } do |context|
15
+ context.validates :bill_address, presence: true
16
+ end
17
+
18
+ with_options if: -> { stated?(:delivery) } do |context|
19
+ context.validates :ship_address, presence: true
20
+ end
21
+
22
+ with_options if: -> { stated?(:shipment) && shipment_required? } do |context|
23
+ context.validates :shipment, presence: true
24
+ end
25
+
26
+ with_options if: -> { stated?(:payment) && payment_required? } do |context|
27
+ context.validates :payment, presence: true
28
+ end
29
+
30
+ with_options if: -> { stated?(:confirm) } do |context|
31
+ context.validates :code, presence: true
32
+ context.validates :payment_fee, presence: true
33
+ context.validates :shipment_fee, presence: true
34
+ context.validates :total_price, presence: true
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,125 +1,116 @@
1
+ require_dependency 'comable/order/associations'
2
+ require_dependency 'comable/order/callbacks'
3
+ require_dependency 'comable/order/scopes'
4
+ require_dependency 'comable/order/validations'
5
+ require_dependency 'comable/order/morrisable'
6
+
1
7
  module Comable
2
8
  class Order < ActiveRecord::Base
3
9
  include Comable::Checkout
4
10
  include Comable::Ransackable
11
+ include Comable::Order::Associations
12
+ include Comable::Order::Callbacks
13
+ include Comable::Order::Scopes
14
+ include Comable::Order::Validations
5
15
  include Comable::Order::Morrisable
6
16
 
7
- belongs_to :customer, class_name: Comable::Customer.name, autosave: false
8
- belongs_to :payment_method, class_name: Comable::PaymentMethod.name, autosave: false
9
- belongs_to :shipment_method, class_name: Comable::ShipmentMethod.name, autosave: false
10
- belongs_to :bill_address, class_name: Comable::Address.name, autosave: true, dependent: :destroy
11
- belongs_to :ship_address, class_name: Comable::Address.name, autosave: true, dependent: :destroy
12
- has_many :order_details, dependent: :destroy, class_name: Comable::OrderDetail.name, inverse_of: :order
13
-
14
- accepts_nested_attributes_for :bill_address
15
- accepts_nested_attributes_for :ship_address
16
- accepts_nested_attributes_for :order_details
17
-
18
- define_model_callbacks :complete
19
- before_validation :generate_guest_token, on: :create
20
- before_validation :clone_addresses_from_customer, on: :create
21
- after_complete :clone_addresses_to_customer
17
+ ransack_options attribute_select: { associations: [:payment, :shipment] }, ransackable_attributes: { except: [:bill_address_id, :ship_address_id] }
22
18
 
23
- scope :complete, -> { where.not(completed_at: nil) }
24
- scope :incomplete, -> { where(completed_at: nil) }
25
- scope :by_customer, -> (customer) { where(customer_id: customer) }
26
- scope :this_month, -> { where(completed_at: Time.now.beginning_of_month..Time.now.end_of_month) }
27
- scope :this_week, -> { where(completed_at: Time.now.beginning_of_week..Time.now.end_of_week) }
28
- scope :last_week, -> { where(completed_at: 1.week.ago.beginning_of_week..1.week.ago.end_of_week) }
29
-
30
- ransack_options ransackable_attributes: { except: [:shipment_method_id, :payment_method_id, :bill_address_id, :ship_address_id] }
19
+ liquid_methods :code, :payment_fee, :shipment_fee, :item_total_price, :total_price
31
20
 
32
21
  delegate :full_name, to: :bill_address, allow_nil: true, prefix: :bill
33
22
  delegate :full_name, to: :ship_address, allow_nil: true, prefix: :ship
23
+ delegate :state, :human_state_name, to: :payment, allow_nil: true, prefix: true
24
+ delegate :state, :human_state_name, to: :shipment, allow_nil: true, prefix: true
34
25
 
35
- def complete
26
+ def complete!
36
27
  ActiveRecord::Base.transaction do
37
28
  run_callbacks :complete do
38
- save_to_complete.tap { |completed| self.completed_at = nil unless completed }
29
+ self.attributes = current_attributes
30
+
31
+ order_items.each(&:complete)
32
+ save!
33
+
34
+ payment.next_state! if payment
35
+ shipment.next_state! if shipment
36
+
37
+ touch(:completed_at)
39
38
  end
40
39
  end
41
40
  end
42
41
 
43
- def complete!
44
- Rails.logger.debug '[DEPRECATED] #complete! is deprecated. Please use #next_state method.'
45
- fail Comable::InvalidOrder unless complete
46
- self
47
- end
42
+ alias_method :complete, :complete!
43
+ deprecate :complete, deprecator: Comable::Deprecator.instance
48
44
 
49
- def completed?
50
- !completed_at.nil?
45
+ def restock!
46
+ order_items.each(&:restock)
47
+ save!
51
48
  end
52
49
 
53
- # TODO: switch to state_machine
54
- def completing?
55
- completed_at && completed_at_was.nil?
50
+ def unstock!
51
+ order_items.each(&:unstock)
52
+ save!
56
53
  end
57
54
 
58
55
  def stocked_items
59
- order_details.to_a.select(&:unstocked?)
56
+ order_items.to_a.select(&:unstocked?)
60
57
  end
61
58
 
62
- alias_method :soldout_stocks, :stocked_items
63
- deprecate :soldout_stocks, deprecator: Comable::Deprecator.instance
64
-
65
59
  # 時価商品合計を取得
66
60
  def current_item_total_price
67
- order_details.to_a.sum(&:current_subtotal_price)
61
+ order_items.to_a.sum(&:current_subtotal_price)
68
62
  end
69
63
 
70
64
  # 売価商品合計を取得
71
65
  def item_total_price
72
- order_details.to_a.sum(&:subtotal_price)
66
+ order_items.to_a.sum(&:subtotal_price)
73
67
  end
74
68
 
75
69
  # 時価送料を取得
76
70
  def current_shipment_fee
77
- shipment_method.try(:fee) || 0
71
+ shipment.try(:fee) || 0
72
+ end
73
+
74
+ # Get the current payment fee
75
+ def current_payment_fee
76
+ payment.try(:fee) || 0
78
77
  end
79
78
 
80
79
  # 時価合計を取得
81
80
  def current_total_price
82
- current_item_total_price + current_shipment_fee
81
+ current_item_total_price + current_payment_fee + current_shipment_fee
83
82
  end
84
83
 
85
- private
86
-
87
- def save_to_complete
88
- self.completed_at = Time.now
89
- self.shipment_fee = current_shipment_fee
90
- self.total_price = current_total_price
91
- generate_code
84
+ # Inherit from other Order
85
+ def inherit!(order)
86
+ self.bill_address ||= order.bill_address
87
+ self.ship_address ||= order.ship_address
88
+ self.payment ||= order.payment
89
+ self.shipment ||= order.shipment
92
90
 
93
- order_details.each(&:complete)
94
-
95
- save
91
+ stated?(order.state) ? save! : next_state!
96
92
  end
97
93
 
98
- def generate_code
99
- self.code = loop do
100
- random_token = "C#{Array.new(11) { rand(9) }.join}"
101
- break random_token unless self.class.exists?(code: random_token)
102
- end
94
+ def paid?
95
+ payment ? payment.completed? : true
103
96
  end
104
97
 
105
- def generate_guest_token
106
- return if customer
107
- self.guest_token ||= loop do
108
- random_token = SecureRandom.urlsafe_base64(nil, false)
109
- break random_token unless self.class.exists?(guest_token: random_token)
110
- end
98
+ def shipped?
99
+ shipment ? shipment.completed? : true
111
100
  end
112
101
 
113
- def clone_addresses_from_customer
114
- return unless customer
115
- self.bill_address ||= customer.bill_address.try(:clone)
116
- self.ship_address ||= customer.ship_address.try(:clone)
102
+ def can_ship?
103
+ shipment && shipment.ready? && paid? && completed?
117
104
  end
118
105
 
119
- def clone_addresses_to_customer
120
- return unless customer
121
- customer.update_bill_address_by bill_address
122
- customer.update_ship_address_by ship_address
106
+ private
107
+
108
+ def current_attributes
109
+ {
110
+ payment_fee: current_payment_fee,
111
+ shipment_fee: current_shipment_fee,
112
+ total_price: current_total_price
113
+ }
123
114
  end
124
115
  end
125
116
  end
@@ -0,0 +1,32 @@
1
+ module Comable
2
+ class OrderItem < ActiveRecord::Base
3
+ module Csvable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ comma do
8
+ __association__ order: :code
9
+ __association__ order: :email
10
+ __association__ order: :payment_fee
11
+ __association__ order: :shipment_fee
12
+ __association__ order: :total_price
13
+ __association__ order: { bill_address: :family_name }
14
+ __association__ order: { bill_address: :first_name }
15
+ __association__ order: { bill_address: :zip_code }
16
+ __association__ order: { bill_address: :state_name }
17
+ __association__ order: { bill_address: :city }
18
+ __association__ order: { bill_address: :detail }
19
+ __association__ order: { bill_address: :phone_number }
20
+ name
21
+ code
22
+ price
23
+ sku_h_item_name
24
+ sku_v_item_name
25
+ sku_h_choice_name
26
+ sku_v_choice_name
27
+ quantity
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,29 +1,36 @@
1
1
  module Comable
2
- class OrderDetail < ActiveRecord::Base
2
+ class OrderItem < ActiveRecord::Base
3
3
  include Comable::SkuItem
4
4
  include Comable::SkuChoice
5
+ include Comable::OrderItem::Csvable
5
6
 
6
7
  belongs_to :stock, class_name: Comable::Stock.name, autosave: true
7
- belongs_to :order, class_name: Comable::Order.name, inverse_of: :order_details
8
+ belongs_to :order, class_name: Comable::Order.name, inverse_of: :order_items
8
9
 
9
10
  validates :quantity, numericality: { greater_than: 0 }
10
11
  validate :valid_stock_quantity
11
12
 
13
+ liquid_methods :name, :name_with_sku, :code, :quantity, :price, :subtotal_price
14
+
12
15
  delegate :product, to: :stock
13
16
  delegate :image_url, to: :product
14
17
  delegate :guest_token, to: :order
15
18
  delegate :completed?, to: :order, allow_nil: true
16
- delegate :completing?, to: :order, allow_nil: true
17
19
 
18
- with_options if: -> { !completed? || completing? } do |incomplete|
19
- incomplete.before_validation :copy_attributes
20
- end
20
+ before_validation :copy_attributes, unless: :completed?
21
21
 
22
22
  def complete
23
- copy_attributes
23
+ unstock
24
+ end
25
+
26
+ def unstock
24
27
  decrement_stock
25
28
  end
26
29
 
30
+ def restock
31
+ increment_stock
32
+ end
33
+
27
34
  # TODO: カート投入時との差額表示
28
35
  def copy_attributes
29
36
  self.attributes = current_attributes
@@ -50,9 +57,6 @@ module Comable
50
57
  end
51
58
  end
52
59
 
53
- alias_method :soldout_stock?, :unstocked?
54
- deprecate :soldout_stock?, deprecator: Comable::Deprecator.instance
55
-
56
60
  private
57
61
 
58
62
  def valid_stock_quantity
@@ -73,6 +77,11 @@ module Comable
73
77
  stock.quantity -= quantity
74
78
  end
75
79
 
80
+ def increment_stock
81
+ stock.lock!
82
+ stock.quantity += quantity
83
+ end
84
+
76
85
  def current_attributes
77
86
  {
78
87
  name: product.name,
@@ -0,0 +1,82 @@
1
+ module Comable
2
+ class Payment < ActiveRecord::Base
3
+ include Comable::Ransackable
4
+
5
+ belongs_to :order, class_name: Comable::Order.name, inverse_of: :payment
6
+ belongs_to :payment_method, class_name: Comable::PaymentMethod.name
7
+
8
+ before_validation :copy_attributes_from_payment_method, unless: :order_completed?
9
+
10
+ validates :order, presence: true
11
+ validates :payment_method, presence: true
12
+ validates :fee, presence: true, numericality: { greater_than_or_equal_to: 0 }
13
+
14
+ delegate :name, to: :payment_method
15
+ delegate :payment_provider, to: :payment_method
16
+ delegate :authorize!, :complete!, :cancel!, :resume!, to: :payment_provider, prefix: :provider
17
+
18
+ ransack_options ransackable_attributes: { except: [:order_id, :payment_method_id] }
19
+
20
+ # The #state attribute assigns the following values:
21
+ #
22
+ # pending when Order is not able to pay (default)
23
+ # ready when Order is able to pay
24
+ # completed when Order is already paid
25
+ # canceled when Order is canceled
26
+ # resumed when Order is resumed from the "canceled" state
27
+ state_machine initial: :pending do
28
+ state :pending
29
+ state :ready
30
+ state :completed
31
+ state :canceled
32
+ state :resumed
33
+
34
+ event :next_state do
35
+ transition :pending => :ready
36
+ transition :ready => :completed
37
+ end
38
+
39
+ event :cancel do
40
+ transition [:completed, :resumed] => :canceled
41
+ end
42
+
43
+ event :resume do
44
+ transition :canceled => :resumed
45
+ end
46
+
47
+ after_transition to: :ready, do: :next_state!
48
+ before_transition to: :ready, do: -> (s) { s.provider_authorize! }
49
+ before_transition to: :completed, do: -> (s) { s.provider_complete! }
50
+ before_transition to: :canceled, do: -> (s) { s.provider_cancel! }
51
+ before_transition to: :canceled, do: -> (s) { s.provider_resume! }
52
+ end
53
+
54
+ class << self
55
+ def state_names
56
+ state_machine.states.keys
57
+ end
58
+ end
59
+
60
+ def stated?(target_state)
61
+ target_state_index = self.class.state_names.index(target_state.to_sym)
62
+ current_state_index = self.class.state_names.index(state_name)
63
+ target_state_index < current_state_index
64
+ end
65
+
66
+ def completed?
67
+ state?(:completed) || state?(:resumed)
68
+ end
69
+
70
+ private
71
+
72
+ def order_completed?
73
+ order.completed?
74
+ end
75
+
76
+ def copy_attributes_from_payment_method
77
+ self.attributes = {
78
+ fee: payment_method.fee
79
+ }
80
+ end
81
+ end
82
+ end
@@ -3,6 +3,7 @@ module Comable
3
3
  validates :name, presence: true, length: { maximum: 255 }
4
4
  validates :payment_provider_type, presence: true, length: { maximum: 255 }
5
5
  validates :payment_provider_kind, presence: true, numericality: { greater_than_or_equal_to: 0 }
6
+ validates :fee, presence: true, numericality: { greater_than_or_equal_to: 0 }
6
7
  validates :enable_price_from, numericality: { greater_than_or_equal_to: 0, allow_blank: true }
7
8
  validates :enable_price_to, numericality: { greater_than_or_equal_to: 0, allow_blank: true }
8
9
 
@@ -0,0 +1,20 @@
1
+ module Comable
2
+ class Product < ActiveRecord::Base
3
+ module Csvable
4
+ extend ActiveSupport::Concern
5
+
6
+ include Comable::Importable
7
+
8
+ included do
9
+ comma do
10
+ name
11
+ code
12
+ price
13
+ caption
14
+ sku_h_item_name
15
+ sku_v_item_name
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,8 +1,9 @@
1
1
  module Comable
2
2
  class Product < ActiveRecord::Base
3
3
  include Comable::SkuItem
4
- include Comable::Product::Search
5
4
  include Comable::Ransackable
5
+ include Comable::Product::Search
6
+ include Comable::Product::Csvable
6
7
 
7
8
  has_many :stocks, class_name: Comable::Stock.name, dependent: :destroy
8
9
  has_many :images, class_name: Comable::Image.name, dependent: :destroy
@@ -34,16 +35,10 @@ module Comable
34
35
  stocks.stocked.exists?
35
36
  end
36
37
 
37
- alias_method :unsold?, :stocked?
38
- deprecate :unsold?, deprecator: Comable::Deprecator.instance
39
-
40
38
  def unstocked?
41
39
  !stocked?
42
40
  end
43
41
 
44
- alias_method :soldout?, :unstocked?
45
- deprecate :soldout?, deprecator: Comable::Deprecator.instance
46
-
47
42
  def category_path_names=(category_path_names, delimiter: Comable::Category::DEFAULT_PATH_NAME_DELIMITER)
48
43
  self.categories = Comable::Category.find_by_path_names(category_path_names, delimiter: delimiter)
49
44
  end