comable_core 0.3.4 → 0.4.0

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 (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