The checkout process starts on the http://www.yoursite.com/shopping/cart_items page.
Clicking the "checkout button" Starts the order process. This action takes all the active cart_items in the "shopping_cart" state and saves them as order_items. Each order item represents one AND ONLY ONE, I repeat ONLY ONE, item. There is no quantity field. It is IMPOSSIBLE to have a quantity field and do returns correctly. DO NOT CHANGE THIS!
At this point the Order is in an "in_progress" state. Immediately the user is asked to enter their credentials for security reasons (unless they logged in with 20 minutes). Now the user is in the checkout workflow. The basic workflow is determined by the Shopping::BaseController.next_form(order) method. During the checkout the user is directed to the Shopping::OrdersController.index method. The Shopping::BaseController.next_form(order) method is called and the next form to show is redirected to unless they are on the last step.
The order will now be in the 'paid' state. Each order item will also be marked as "paid".