protected override void StepFinished(object sender, StepEventArgs e)
    {
        base.StepFinished(sender, e);
        // We are on last step and checkout process has not been finalized yet by any web part
        if (e.IsLastStep && (e.GetValue(CHOP_FINALIZED_KEY) == null))
        {
            // Handle automatic selection of payment and shipping options
            HandleAutomaticSelections(ShoppingCart);

            string validationMessage;
            // Validate cart; in case of failure user is able to go through checkout process and fix errors
            if (!ValidateShoppingCart(ShoppingCart, out validationMessage))
            {
                e.CancelEvent = true;
                ShowError(validationMessage);
                e.SetValue(CHOP_FINALIZED_KEY, true);
                return;
            }

            if (FinalizeCheckout())
            {
                int    orderId   = ShoppingCart.OrderId;
                string orderHash = ShoppingCart.GetHashCode().ToString();
                WindowHelper.Add(orderHash, orderId);
                // Create URL for payment page with order id hidden in hash
                e.FinalStepUrl = URLHelper.AddParameterToUrl(e.FinalStepUrl, "o", orderHash);
            }
            else
            {
                // Log events created in transaction
                foreach (Tuple <string, string> error in loggedErrors)
                {
                    EventLogProvider.LogEvent(EventType.ERROR, EVENT_SOURCE, error.Item2, error.Item1);
                }

                foreach (Exception ex in loggedExceptions)
                {
                    EventLogProvider.LogException(EVENT_SOURCE, EVENT_CODE_EXCEPTION, ex);
                }

                e.CancelEvent = true;
                // Get error text
                string errorMessage = HTMLHelper.HTMLEncode(ResHelper.GetString("ecommerce.orderpreview.errorordersave"));

                if (!string.IsNullOrEmpty(registrationBanned))
                {
                    errorMessage += HTMLHelper.HTMLEncode(Environment.NewLine + registrationBanned);
                }

                ShowError(errorMessage);
            }

            CleanUpShoppingCart();
            DocumentWizardManager.ResetWizard();

            e.SetValue(CHOP_FINALIZED_KEY, true);
        }
    }
    protected override void StepFinished(object sender, StepEventArgs e)
    {
        base.StepFinished(sender, e);
        // We are on last step and we don't have order yet
        if (e.IsLastStep && (e.GetValue(ORDER_CREATED_KEY) == null))
        {
            if (FinalizeCheckout())
            {
                int    orderId   = ShoppingCart.OrderId;
                string orderHash = ShoppingCart.GetHashCode().ToString();
                WindowHelper.Add(orderHash, orderId);
                // Create URL for payment page with order id hidden in hash
                e.FinalStepUrl = URLHelper.AddParameterToUrl(e.FinalStepUrl, "o", orderHash);
            }
            else
            {
                // Log events created in transaction
                foreach (Tuple <string, string> error in loggedErrors)
                {
                    EventLogProvider.LogEvent(EventType.ERROR, EVENT_SOURCE, error.Item2, error.Item1);
                }

                foreach (Exception ex in loggedExceptions)
                {
                    EventLogProvider.LogException(EVENT_SOURCE, EVENT_CODE_EXCEPTION, ex);
                }

                e.CancelEvent = true;
                // Get error text
                string errorMessage = HTMLHelper.HTMLEncode(ResHelper.GetString("ecommerce.orderpreview.errorordersave"));

                if (!string.IsNullOrEmpty(registrationBanned))
                {
                    errorMessage += HTMLHelper.HTMLEncode(Environment.NewLine + registrationBanned);
                }

                // Try to show message through Message Panel web part
                CMSEventArgs <string> args = new CMSEventArgs <string>();
                args.Parameter = errorMessage;
                ComponentEvents.RequestEvents.RaiseEvent(this, args, MESSAGE_RAISED);

                // If Message Panel web part is not present (Parameter is cleared by web part after successful handling), show message through alert script
                if (!string.IsNullOrEmpty(args.Parameter))
                {
                    ScriptHelper.Alert(Page, errorMessage);
                }
            }

            CleanUpShoppingCart();
            DocumentWizardManager.ResetWizard();

            e.SetValue(ORDER_CREATED_KEY, true);
        }
    }
    protected override void LoadStep(object sender, StepEventArgs e)
    {
        base.LoadStep(sender, e);

        // Ensure log off check only once
        if (e.GetValue(LOG_OFF_VALIDATION) == null)
        {
            e.SetValue(LOG_OFF_VALIDATION, true);
            // Get current shopping cart user id, 0 for null (public user)
            int currentUserId = ShoppingCart.User == null ? 0 : ShoppingCart.User.UserID;
            // Get last known user saved in previous load of WP. In case there is no record in session current user id is retrieved.
            object userIdSessionObject = SessionHelper.GetValue("CheckoutUserID");
            int    lastKnownUserID     = ValidationHelper.GetInteger(userIdSessionObject, currentUserId);

            // Reset checkout process in case of different users. Possible log-off or login as another user
            if (lastKnownUserID != currentUserId)
            {
                DocumentWizardManager.ResetWizard();

                SessionHelper.Remove("CheckoutUserID");
                // Refresh page for wizard to jump at first step
                URLHelper.Redirect(RequestContext.CurrentURL);
            }

            // Set user id to session for non public users. Change from public user to authorized does not reset checkout process.
            if (currentUserId != 0)
            {
                SessionHelper.SetValue("CheckoutUserID", currentUserId);
            }
            // Clean session entry (if there was one) for public user in case of log-off action to remove previous user id.
            else if (userIdSessionObject != null)
            {
                SessionHelper.Remove("CheckoutUserID");
            }
        }
    }