I am trying to remove 2 checkout steps. I have tried to follow the documentation in the site http://guides.spreecommerce.com/checkout.html but still nothing happens.
I am using Spree 1.1.2 ruby 1.9.2p318 Rails 3.2.6 Ubuntu 12.04 (precise) 32-bit
I'll tell you what I have done and you will tell me what to fix. Should I change the name or location of the file? Or should I change other files too? How can I debug it?
I have created a new file "app/models/spree/order_decorator.rb" (also tried it under "app/models/order_decorator.rb")
module SpreeCustomExtension
class Engine < Rails::Engine
def self.activate
Spree::Order.class_eval do
StateMachine::Machine.ignore_method_conflicts = true # I HAVE ADDED THOSE 2 LINES LATER, HOPING IT WOULD HELP ME,
Spree::Order.state_machines.clear # IT DIDN'T.
# customize the checkout state machine
Order.state_machines[:state] = StateMachine::Machine.new(Order, :initial => 'cart') do
after_transition :to => 'complete', :do => :complete_order
before_transition :to => 'complete', :do => :process_payment
event :next do
transition :from => 'cart', :to => 'payment'
transition :from => 'payment', :to => 'complete'
end
event :cancel do
transition :to => 'canceled', :if => :allow_cancel?
end
event :return do
transition :to => 'returned', :from => 'awaiting_return'
end
event :resume do
transition :to => 'resumed', :from => 'canceled', :if => :allow_resume?
end
event :authorize_return do
transition :to => 'awaiting_return'
end
before_transition :to => 'complete' do |order|
begin
order.process_payments!
rescue Core::GatewayError
!!Spree::Config[:allow_checkout_on_gateway_error]
end
end
before_transition :to => ['delivery'] do |order|
order.shipments.each { |s| s.destroy unless s.shipping_method.available_to_order?(order) }
end
after_transition :to => 'complete', :do => :finalize!
after_transition :to => 'delivery', :do => :create_tax_charge!
after_transition :to => 'payment', :do => :create_shipment!
after_transition :to => 'resumed', :do => :after_resume
after_transition :to => 'canceled', :do => :after_cancel
end
end
end
end
end
Then I tried the same file with different code, still nothing happened
Spree::Order.class_eval do
StateMachine::Machine.ignore_method_conflicts = true
Spree::Order.state_machines.clear
state_machine :initial => 'cart', :use_transactions => false do
event :next do
transition :from => 'cart', :to => 'payment', :if => :payment_required?
transition :from => 'cart', :to => 'complete'
transition :from => 'confirm', :to => 'complete'
# note: some payment methods will not support a confirm step
transition :from => 'payment', :to => 'confirm',
:if => Proc.new { |order| order.payment_method && order.payment_method.payment_profiles_supported? }
transition :from => 'payment', :to => 'complete'
end
event :cancel do
transition :to => 'canceled', :if => :allow_cancel?
end
event :return do
transition :to => 'returned', :from => 'awaiting_return'
end
event :resume do
transition :to => 'resumed', :from => 'canceled', :if => :allow_resume?
end
event :authorize_return do
transition :to => 'awaiting_return'
end
before_transition :to => 'complete' do |order|
begin
order.process_payments!
rescue Core::GatewayError
if Spree::Config[:allow_checkout_on_gateway_error]
true
else
false
end
end
end
before_transition :to => ['delivery'] do |order|
order.shipments.each { |s| s.destroy unless s.shipping_method.available_to_order?(order) }
end
after_transition :to => 'complete', :do => :finalize!
after_transition :to => 'delivery', :do => :create_tax_charge!
after_transition :to => 'payment', :do => :create_shipment!
after_transition :to => 'resumed', :do => :after_resume
after_transition :to => 'canceled', :do => :after_cancel
end
end
OK, so I have finally found it -
Spree have released a new version #1.2.0 with a major fix for this exact problem.
Spree 1.2.0 Release Notes
So the solution now is quit easy -
Just undo all your previous checkout manipulation attempts,
upgrade spree to 1.2.0 by updating your gem file and bundle install,
handle all your code breakups by following their documentation (I guess you'll have some).
and create a simple order_decorator.rb under app/models/spree/
enjoy.
In spree >= 2.0.0 you can use following helper method to remove any checkout step. Follow the steps given below.
Step 1: in app/models/spree/ create new file with name order_decorator.rb
Step 2: Copy and paste following code in it.
Thanks to spree community. http://guides.spreecommerce.com/developer/
It works with the new fork of Spree Solidus also
Default checkout Steps in Spree
Spree(2.0) allows you to modify checkout process to add or remove steps by using respective helpers.
Need to remember that remove_checkout_step will remove just one checkout step at a time: