src/Checkout/OrderProcessor.php
public function placeOrder()
    {
        if (!$this->order) {
            $this->error(_t(__CLASS__ . ".NoOrderStarted", "A new order has not yet been started."));
            return false;
        }
        if (!$this->canPlace($this->order)) { //final cart validation
            return false;
        }

        if ($this->order->Locale) {
            ShopTools::install_locale($this->order->Locale);
        }

        // recalculate order to be sure we have the correct total
        $this->order->calculate();

        if (DB::get_conn()->supportsTransactions()) {
            DB::get_conn()->transactionStart();
        }

        //update status
        if ($this->order->TotalOutstanding(false)) {
            $this->order->Status = 'Unpaid';
        } else {
            $this->order->Status = 'Paid';
        }

        if (!$this->order->Placed) {
            $this->order->Placed = DBDatetime::now()->Rfc2822(); //record placed order datetime
            if ($request = Controller::curr()->getRequest()) {
                $this->order->IPAddress = $request->getIP(); //record client IP
            }
        }

        // Add an error handler that throws an exception upon error, so that we can catch errors as exceptions
        // in the following block.
        set_error_handler(
            function ($severity, $message, $file, $line) {
                throw new ErrorException($message, 0, $severity, $file, $line);
            },
            E_ALL & ~(E_STRICT | E_NOTICE)
        );

        try {
            //re-write all attributes and modifiers to make sure they are up-to-date before they can't be changed again
            $items = $this->order->Items();
            if ($items->exists()) {
                foreach ($items as $item) {
                    $item->onPlacement();
                    $item->write();
                }
            }
            $modifiers = $this->order->Modifiers();
            if ($modifiers->exists()) {
                foreach ($modifiers as $modifier) {
                    $modifier->write();
                }
            }
            //add member to order & customers group
            if ($member = Security::getCurrentUser()) {
                if (!$this->order->MemberID) {
                    $this->order->MemberID = $member->ID;
                }
                $cgroup = ShopConfigExtension::current()->CustomerGroup();
                if ($cgroup->exists()) {
                    $member->Groups()->add($cgroup);
                }
            }
            //allow decorators to do stuff when order is saved.
            $this->order->extend('onPlaceOrder');
            $this->order->write();
        } catch (Exception $ex) {
            // Rollback the transaction if an error occurred
            if (DB::get_conn()->supportsTransactions()) {
                DB::get_conn()->transactionRollback();
            }
            $this->error($ex->getMessage());
            return false;
        } finally {
            // restore the error handler, no matter what
            restore_error_handler();
        }

        // Everything went through fine, complete the transaction
        if (DB::get_conn()->supportsTransactions()) {
            DB::get_conn()->transactionEnd();
        }

        //remove from session
        ShoppingCart::singleton()->clear(false);
        /*
        $cart = ShoppingCart::curr();
        if ($cart && $cart->ID == $this->order->ID) {
            // clear the cart, but don't write the order in the process (order is finalized and should NOT be overwritten)
        }
        */

        //send confirmation if configured and receipt hasn't been sent
        if (self::config()->send_confirmation
            && !$this->order->ReceiptSent
        ) {
            $this->notifier->sendConfirmation();
        }

        //notify admin, if configured
        if (self::config()->send_admin_notification) {
            $this->notifier->sendAdminNotification();
        }

        // Save order reference to session
        OrderManipulationExtension::add_session_order($this->order);

        return true; //report success
    }
public function placeOrder()
    {
        if (!$this->order) {
            $this->error(_t(__CLASS__ . ".NoOrderStarted", "A new order has not yet been started."));
            return false;
        }
        if (!$this->canPlace($this->order)) { //final cart validation
            return false;
        }

        if ($this->order->Locale) {
            ShopTools::install_locale($this->order->Locale);
        }

        // recalculate order to be sure we have the correct total
        $this->order->calculate();

        if (DB::get_conn()->supportsTransactions()) {
            DB::get_conn()->transactionStart();
        }

        //update status
        if ($this->order->TotalOutstanding(false)) {
            $this->order->Status = 'Unpaid';
        } else {
            $this->order->Status = 'Paid';
        }

        if (!$this->order->Placed) {
            $this->order->Placed = DBDatetime::now()->Rfc2822(); //record placed order datetime
            if ($request = Controller::curr()->getRequest()) {
                $this->order->IPAddress = $request->getIP(); //record client IP
            }
        }

        // Add an error handler that throws an exception upon error, so that we can catch errors as exceptions
        // in the following block.
        set_error_handler(
            function ($severity, $message, $file, $line) {
                throw new ErrorException($message, 0, $severity, $file, $line);
            },
            E_ALL & ~(E_STRICT | E_NOTICE)
        );

        try {
            //re-write all attributes and modifiers to make sure they are up-to-date before they can't be changed again
            $items = $this->order->Items();
            if ($items->exists()) {
                foreach ($items as $item) {
                    $item->onPlacement();
                    $item->write();
                }
            }
            $modifiers = $this->order->Modifiers();
            if ($modifiers->exists()) {
                foreach ($modifiers as $modifier) {
                    $modifier->write();
                }
            }
            //add member to order & customers group
            if ($member = Security::getCurrentUser()) {
                if (!$this->order->MemberID) {
                    $this->order->MemberID = $member->ID;
                }
                $cgroup = ShopConfigExtension::current()->CustomerGroup();
                if ($cgroup->exists()) {
                    $member->Groups()->add($cgroup);
                }
            }
            //allow decorators to do stuff when order is saved.
            $this->order->extend('onPlaceOrder');
            $this->order->write();
        } catch (Exception $ex) {
            // Rollback the transaction if an error occurred
            if (DB::get_conn()->supportsTransactions()) {
                DB::get_conn()->transactionRollback();
            }
            $this->error($ex->getMessage());
            return false;
        } finally {
            // restore the error handler, no matter what
            restore_error_handler();
        }

        // Everything went through fine, complete the transaction
        if (DB::get_conn()->supportsTransactions()) {
            DB::get_conn()->transactionEnd();
        }

        //remove from session
        ShoppingCart::singleton()->clear(false);
        /*
        $cart = ShoppingCart::curr();
        if ($cart && $cart->ID == $this->order->ID) {
            // clear the cart, but don't write the order in the process (order is finalized and should NOT be overwritten)
        }
        */

        //send confirmation if configured and receipt hasn't been sent
        if (self::config()->send_confirmation
            && !$this->order->ReceiptSent
        ) {
            $this->notifier->sendConfirmation();
        }

        //notify admin, if configured
        if (self::config()->send_admin_notification) {
            $this->notifier->sendAdminNotification();
        }

        // Save order reference to session
        OrderManipulationExtension::add_session_order($this->order);

        return true; //report success
    }
Takes an order from being a cart to awaiting payment.

@return boolean - success/failure