Wednesday 8 November 2017

Create custom order in magento programatically

function createorderAction(){
       
        $order = Mage::getModel('sales/order')->load(124);
       
        $ba = $order->getBillingAddress();
        $sa = $order->getShippingAddress();
       
        $customer_id = $order->getCustomerId();
       
        $store_id = 1;
        /*------------------------------------------------------------------------
        Payment and Shipping Method
        ------------------------------------------------------------------------*/
        $payment_method = 'checkmo';
        //$payment_method = 'stripe_cc';
        $shipping_method = 'flatrate_flatrate';
        $customer = Mage::getModel('customer/customer')->load($customer_id);
       
        /*------------------------------------------------------------------------
        Create a Quote
        ------------------------------------------------------------------------*/
        $quote = Mage::getModel('sales/quote');
        $quote->setStoreId($store_id);
        $quote->assignCustomer($customer);
        $quote->setSendCconfirmation(1);
        /*------------------------------------------------------------------------
        Add products to Quote
        ------------------------------------------------------------------------*/
        $items = $order->getAllItems();
       
        $block = Mage::app()->getLayout()->createBlock('sales/order_item_renderer_default');
       
        $quote->setCouponCode('20OFF');
       
        foreach ($items as $item):
           
            $block->setItem($item);
           
            $_options = $block->getItemOptions();
           
            $addproduct = array('product'=>$item->getProductId(), 'qty'=>1);
            foreach ($_options as $_option):
                $addproduct['options'][$_option['option_id']] = $_option['option_value'];
            endforeach;
           
            $product = Mage::getModel('catalog/product')->load($addproduct['product']);
            $quote->addProduct($product,
                new Varien_Object(
                    $addproduct
                )
            );
            //$item->setDiscountAmount($price);
            //$item->setBaseDiscountAmount($price);
        endforeach;
       
        /*------------------------------------------------------------------------
        Assign Address, Shipping and Payment methods
        ------------------------------------------------------------------------*/
       
        $address_data = array(
            'customer_address_id' => $ba->getId(),
            'firstname' => $ba->getFirstname(),
            'lastname' => $ba->getLastname(),
            'street' => array(
                '0' => $ba->getStreet()
            ),
            'city' => $ba->getCity(),
            'postcode' => $ba->getPostcode(),
            'telephone' => $ba->getTelephone(),
            'country_id' => $ba->getCountryId(),
            'region_id' => $ba->getRegionId(),
        );
       
        $s_address_data = array(
            'customer_address_id' => $sa->getId(),
            'firstname' => $sa->getFirstname(),
            'lastname' => $sa->getLastname(),
            'street' => array(
                '0' => $sa->getStreet()
            ),
            'city' => $sa->getCity(),
            'postcode' => $sa->getPostcode(),
            'telephone' => $sa->getTelephone(),
            'country_id' => $sa->getCountryId(),
            'region_id' => $sa->getRegionId(),
        );
       
        $billingAddress = $quote->getBillingAddress()->addData($address_data);
        $shippingAddress = $quote->getShippingAddress()->addData($s_address_data);
        $shippingAddress->setCollectShippingRates(true)->collectShippingRates()
            ->setShippingMethod($shipping_method)
            ->setPaymentMethod($payment_method);
       
        $quote->getPayment()->importData(array('method' => $payment_method));
       
        //$quote->setDiscountAmount($discountAmount);
       
        $quote->collectTotals()->save();
       
        $discountAmount = 85.33;
        $paymentplantotal = 512.00;
        $downpayment = 42.67;
        $pymtfrequency = 1;
        $leftpayments = 11;
        $nextpayments = 42.67;
       
        $quote->setDiscountdue($discountAmount);
        $quote->setPaymentplantotal($paymentplantotal);
        $quote->setDownpayment($downpayment);
        $quote->setPymtfrequency($pymtfrequency);
        $quote->setLeftpayments($leftpayments);
        $quote->setNextpayments($nextpayments);
       
        $quote->setGrandTotal($quote->getBaseSubtotal() - $discountAmount)
            ->setBaseGrandTotal($quote->getBaseSubtotal() - $discountAmount)
            ->setSubtotalWithDiscount($quote->getBaseSubtotal() - $discountAmount)
            ->setBaseSubtotalWithDiscount($quote->getBaseSubtotal() - $discountAmount);
       
        $quote->collectTotals()->save();
        //$quote->setCouponCode("20OFF")->save();
               
        $canAddItems = $quote->isVirtual() ? ('billing') : ('shipping');
        foreach ($quote->getAllAddresses() as $address) {
           
            if ($address->getAddressType() == $canAddItems) {
                $address->setSubtotalWithDiscount((float) $address->getSubtotalWithDiscount() - $discountAmount);
                $address->setGrandTotal((float) $address->getGrandTotal() - $discountAmount);
                $address->setBaseSubtotalWithDiscount((float) $address->getBaseSubtotalWithDiscount() - $discountAmount);
                $address->setBaseGrandTotal((float) $address->getBaseGrandTotal() - $discountAmount);
                /*************************/
                $address->setDiscountdue($discountAmount);
                $address->setPaymentplantotal($paymentplantotal);
                $address->setDownpayment($downpayment);
                $address->setPymtfrequency($pymtfrequency);
                $address->setLeftpayments($leftpayments);
                $address->setNextpayments($nextpayments);
                $address->save();
            }
        }
       
        foreach ($quote->getAllItems() as $item) {
            //We apply discount amount based on the ratio between the GrandTotal and the RowTotal
            $rat = $item->getPriceInclTax() / $quote->getBaseSubtotal();
            $ratdisc = $discountAmount * $rat;
            $item->setDiscountAmount(($item->getDiscountAmount() + $ratdisc) * $item->getQty());
            $item->setBaseDiscountAmount(($item->getBaseDiscountAmount() + $ratdisc) * $item->getQty())->save();
        }
       
        /*----------------------------------------------------------------------*/
        /*------------------------------------------------------------------------
        SECTION : CHECKOUT
        ------------------------------------------------------------------------*/
        $convertQuote = Mage::getModel('sales/convert_quote');
        if ($quote->getIsVirtual()) {
            $order = $convertQuote->addressToOrder($quote->getBillingAddress());
        } else {
            $order = $convertQuote->addressToOrder($quote->getShippingAddress());
        }
        // assign payment method
        $quotePayment = $quote->getPayment();
        $quotePayment->setMethod($quote->getPayment()->getMethod());
        $quote->setPayment($quotePayment);
        $orderPayment = $convertQuote->paymentToOrderPayment($quotePayment);
        $order->setBillingAddress($convertQuote->addressToOrderAddress($quote->getBillingAddress()));
        $order->setPayment($convertQuote->paymentToOrderPayment($quote->getPayment()));
        if (!$quote->getIsVirtual()) {
            $order->setShippingAddress($convertQuote->addressToOrderAddress($quote->getShippingAddress()));
        }
        // set payment options
        $order->setPayment($convertQuote->paymentToOrderPayment($quote->getPayment()));
        // order products
        $items = $quote->getAllItems();
        foreach ($items as $item) {
            //@var $item Mage_Sales_Model_Quote_Item
            $orderItem = $convertQuote->itemToOrderItem($item);
            if ($item->getParentItem()) {
                $orderItem->setParentItem($order->getItemByQuoteItemId($item->getParentItem()->getId()));
            }
            $order->addItem($orderItem);
        }
       
       
        $order->setCanShipPartiallyItem(false);
        $order->sendNewOrderEmail();
        $order->place();
        $order->save();
        $quote->setIsActive(0);
        $quote->save();
        //pre($order->getData());exit;
        //pre($quote->getData());
    }