Order state machine
Orders flow through a state machine, which is defined in the
Spree::Order::Checkout module. It begins with a
cart state and ends with
There are six order states by default:
If you go through the checkout provided in the
solidus_frontend gem, you can
see that there is a clearly defined step for each of these states during checkout.
payment state is optional and it's only triggered if
complete state is triggered in one of two ways:
- No payment is required on the order. (The
- Payment is required on the order, and at least the order total has been received as payment.
Each order state has criteria that must be met before the state can change. For
example, before the state can change from
address, line items must be
present on the order. Then, to change from
delivery, the user
must have a default address assigned.
Once an order meets the criteria to go to the next state, you can call
the order object to transition into the next state. For example, in the
solidus_frontend gem, the
transition_forward method that always calls
next unless the order
can be completed:
def transition_forward if @order.can_complete? @order.complete else @order.next end end
false, then the order does not meet the criteria and does
not transition to the next state.
Payments and shipments have their own state machines
Note that a
Spree::Order with the state
complete does not mean that the
payment has been processed or the order shipments have been shipped. See also
the values of the
Solidus is an open source platform supported by the community. We encourage everyone using Solius to contribute back to the documentation and the code.