Magento на русском

Новости, обмен опытом, база знаний для разработчиков.

Программное создание ордера (заказа)

by @ 14:32 on 29.01.2010. Filed under Примеры

Автоматические покупки… футуризм?

Автоматическое создание заказа в Magento

Нет, реальность.

Очень часто разработчики сталкиваются с задачей создания «Заказа» в автоматическом режиме, примеров можно привести кучу, но это не суть важно. Есть много методов по реализации этого. Я делал это как минимум 2-мя методами, но вот нашел еще один, решил позаимствовать, конечно же со ссылочкой на источник.

Итак, перед нами задача – автоматически (программно), создать order в Magento.

Источник http://spiri7.net/blog/magento/magento-create-order-manual

Создание нового заказа(order) программного может потребоваться если Вы захотели переделать логику процесса оформления товара или Вам необходимо произвести импорт заказов с другого сайта.
При создания функции модели мы будем полностью проходить процесс checkout на клиентской части.

В данном примере я буду рассматривать создание заказа как «Гость». Для создания заказа от зарегистрированного пользователя необходимо дополнительно создать пользователя и войти им в систему.

    /**
     * Manual create orders
     *
     * @param array $productInCardList list of product that customer add card. Structure:
     * [][id] => Product id in magento store
     * [][price] => Special price for one qty of product
     * [][qty] => Number of buy product
     *
     * @param array $billingAddress customer billingAddress
     * @param array $shippingAddress customer shippingAddress, if false use same as billing
     * @return int create order ID
     *
     */
    public function createOrder($productInCardList, $billingAddress, $shippingAddress) {

        // Get checkout model
        $checkout = Mage::getSingleton('checkout/type_onepage');
        $checkout->getCheckout()->clear();
        $checkout->initCheckout();
        // Customer cart items
        $quote = $checkout->getQuote();
        // Clear asigned customer
        $quote->setCustomer(Mage::getModel('customer/customer'));

        /* ---- FOR TEST --- */
        /* -- Adding testing product to card -- */
        $productInCardList = array();
        $productInCardList[0]['id'] = 87;
        $productInCardList[0]['price'] = 22;
        $productInCardList[0]['qty'] = 1;
        /* ---- FOR TEST --- */

        // Adding product to customer card
        // All products adding by id
        $result = null;
        foreach ($productInCardList as $productItem) {

            $product = Mage::getModel('catalog/product')->load($productItem['id']);
            $product->setPrice($productItem['price']);
            $request = new Varien_Object();
            $request->setQty($productItem['qty']);
            // Product exist (no error while load by ID)
            if ($product->getId()) {
                // Add product to card
                $result = $quote->addProduct($product, $request);
                if (is_string($result)) {
                    // Error of adding product to card
                    // @todo Log exception into DB and skip
                    throw new Exception("Error adding product to card");
                }
            } else {
                // Error of load product by id
                throw new Exception("Cant load product");
                // @todo Log exception into DB and skip
            }
        }
        // Start checkout steps

        // STEP(1) - Checkout method guest/register
        $checkout->saveCheckoutMethod('guest');

        //STEP(2) - Save Billing Address

        // vvvv -------------------- For testing - this variable get from params
        $billingAddress = array();
        $billingAddress['firstname'] = 'Alex';
        $billingAddress['lastname'] = 'SpiRi7';
        $billingAddress['company'] = 'OOO';
        $billingAddress['email'] = 'alexandr.otchenashev@gmail.com';
        $billingAddress['street'] = array();
        $billingAddress['street'][0] = "Address part 21";
        $billingAddress['street'][1] = "Address part 31";
        $billingAddress['city'] = "Dnepropetrovsk";
        $billingAddress['region_id'] = 1;
        $billingAddress['region'] = "";
        $billingAddress['postcode'] = "49000";
        $billingAddress['country_id'] = "UA";
        $billingAddress['telephone'] = "0238559322";
        $billingAddress['fax'] = "0838559111";

        // ^^^^ -------------------- For testing - this variable get from params

        if (!isset($billingAddress['telephone']) || $billingAddress['telephone'] == "") {
            $billingAddress['telephone'] = "0000000";
        }
        $billingAddress['save_in_address_book'] = 0;
        // Save billing information
        $result = array();

        $result = $checkout->saveBilling($billingAddress, false);

        if (is_array($result) && isset($result['message'])) {
            throw new Exception($result['message']);
        }

        if ($shippingAddress!=false) {
            // Save shipping address, also calculate sippings rate
            $result = $checkout->saveShipping($shippingAddress, false);
        } else {
            // Shipping address same as billing
            $result = $checkout->saveShipping($billingAddress, false);
        }
        // Select already calulated shipping method
        $result = $checkout->saveShippingMethod('flatrate_flatrate');
        // Save payment details
        $result =  $checkout->savePayment(array('method'=>'checkmo'));

        // Create order
        $return = array();
        // for guest checkout use original method
        $checkout->saveOrder();

        // Change order status. Create Invoice and Shipping
        // Get last order ID
        $lastOrderId = $checkout->getCheckout()->getLastOrderId();
        return $lastOrderId;
    }

    /**
     * Create invoice for selected order
     *
     * @param int $orderId order id
     */
    public function createInvoiceForOrder($orderId, $commentToInvoice, $notifyCustomer = false) {
        // Load Order
        $order = Mage::getModel('sales/order')->load($orderId);

        // Conver order to invoice
        $convertor  = Mage::getModel('sales/convert_order');
        $invoice    = $convertor->toInvoice($order);

        /* @var $orderItem Mage_Sales_Model_Order_Item */
        foreach ($order->getAllItems() as $orderItem) {

            if (!$orderItem->isDummy() && !$orderItem->getQtyToInvoice() && $orderItem->getLockedDoInvoice()) {
                continue;
            }

            if ($order->getForcedDoShipmentWithInvoice() && $orderItem->getLockedDoShip()) {
                continue;
            }

            $item = $convertor->itemToInvoiceItem($orderItem);

            if ($orderItem->isDummy()) {
                $qty = 1;
            } else {
                $qty = $orderItem->getQtyToInvoice();
            }

            $item->setQty($qty);
            $invoice->addItem($item);
        }
        $invoice->collectTotals();

        /* Text, Need Notify customer */
        $invoice->addComment($commentToInvoice, $notifyCustomer);
        $invoice->register();
        $invoice->getOrder()->setIsInProcess(true);
        $transactionSave = Mage::getModel('core/resource_transaction')
                ->addObject($invoice)
                ->addObject($invoice->getOrder());

        $transactionSave->save();
    }

    public function createShippingForOrder($orderId, $commentToShipping, $notifyCustomer = false) {
        // Load Order
        $order = Mage::getModel('sales/order')->load($orderId);

        /**
         * Check shipment create availability
         */
        if (!$order->canShip()) {
            return false;
        }

        // Convert order to shipping
        $convertor  = Mage::getModel('sales/convert_order');
        $shipment    = $convertor->toShipment($order);

        foreach ($order->getAllItems() as $orderItem) {
            if (!$orderItem->isDummy(true) && !$orderItem->getQtyToShip()) {
                continue;
            }

            if ($orderItem->getIsVirtual()) {
                continue;
            }
            $item = $convertor->itemToShipmentItem($orderItem);

            if ($orderItem->isDummy(true)) {
                $qty = 1;
            } else {
                $qty = $orderItem->getQtyToShip();
            }

            $item->setQty($qty);
            $shipment->addItem($item);
        }

        $shipment->register();

        if ($commentToShipping!='') {
            $shipment->addComment($commentToShipping, $notifyCustomer);
        }

        $shipment->getOrder()->setIsInProcess(true);
        $transactionSave = Mage::getModel('core/resource_transaction')
                ->addObject($shipment)
                ->addObject($shipment->getOrder())
                ->save();
    }

Обратите внимание на два дополнительных метода – createInvoiceForOrder и createShippingForOrder. Эти методы позволяют создать Invoice и Shipping для созданного заказа.

Метод $checkout->saveShippingMethod(‘flatrate_flatrate’); производит уcтановку метода доставки используемого при checkout. Вы можете установить другой метод, или создать собственный.

Например если Вам необходимо использовать метод доставки с произвольным описанием и ценой, данные в него можно передавать используя сессию.

Похожие Magento-статьи:

  1. Групповой продукт – показ картинок из привязанных продуктов
  2. Создание Shipping Method Module – часть 1, заглушка
  3. Как отправить письмо в Magento?
  4. Наворачиваем свой модуль. Вывод коллекции данных в грид.
  5. Создание нового модуля с нуля.
  6. SEO оптимизация поисковых урлов в Magento
  7. Простой пример кода начинающим разработчикам

The URI to TrackBack this entry is: http://magento.verych.ru/2010/01/programmnoe-sozdanie-ordera-zakaza/trackback/

Оставить комментарий

© 2009-2010 Magento по-русски 99% авторских статей