1
class OrderCreate
{

public function __construct(
    \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
    \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Catalog\Model\ProductFactory $_productloader,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Catalog\Model\ProductFactory $productFactory,
    \Magento\Quote\Model\QuoteManagement $quoteManagement,
    \Magento\Customer\Model\CustomerFactory $customerFactory,
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Sales\Model\Service\OrderService $orderService,
    \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
    \Magento\Quote\Api\CartManagementInterface $cartManagementInterface,
    \Magento\Quote\Model\Quote\Address\Rate $shippingRate,
    \Magento\Framework\Data\Form\FormKey $formkey,
    \Magento\Quote\Model\QuoteFactory $quote
)
{
    $this->_transportBuilder = $transportBuilder;
    $this->resultJsonFactory = $resultJsonFactory;
    $this->_scopeConfig = $scopeConfig;
    $this->_productloader = $_productloader;
    $this->_storeManager = $storeManager;
    $this->_productFactory = $productFactory;
    $this->quoteManagement = $quoteManagement;
    $this->customerFactory = $customerFactory;
    $this->customerRepository = $customerRepository;
    $this->orderService = $orderService;
    $this->cartRepositoryInterface = $cartRepositoryInterface;
    $this->cartManagementInterface = $cartManagementInterface;
    $this->shippingRate = $shippingRate;
    $this->_formkey = $formkey;
    $this->quote = $quote;
}
/**
 * Create Order On Your Store
 *
 * @return int $orderId
 *
 */
public function createOrder($_product, $telephone, $customer_email = false)
{

    //init the store id and website id
    $store = $this->_storeManager->getStore();
    $websiteId = $this->_storeManager->getStore()->getWebsiteId();
    //init the customer
    $customer = $this->customerFactory->create();
    if (!$customer_email) {
        $conf = $this->_scopeConfig->getValue(
            'callback',
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
        );
        $customer_email = $conf['general']['callback_email'];
    }
    $customer->setWebsiteId($websiteId);
    $customer->loadByEmail($customer_email); // load customer by email address
    //init the quote
    $orderShipping = $customer->getDefaultShippingAddress();
    $orderShipping->setTelephone($telephone);


    $quote = $this->quote->create(); //Create object of quote
    $quote->setStore($store); //set store for which you create quote

    // if you have allready buyer id then you can load customer directly
    $customer = $this->customerRepository->getById($customer->getEntityId());
    $quote->setCurrency();
    $quote->assignCustomer($customer); //Assign quote to customer
    //add item in quote
    $quote->addProduct(
        $_product,
        1
    );
    $this->cartRepositoryInterface->save($quote); // Add this

    //set shipping adress from customer to array 
    $arrShippingAddress = [
        'firstname' => $customer->getFirstName(), //address Details
        'lastname' => $customer->getLastName(),
        'street' => $orderShipping->getStreet(),
        'city' => $orderShipping->getCity(),
        'country_id' => $orderShipping->getCountry(),
        'postcode' => $orderShipping->getPostcode(),
        'telephone' => $orderShipping->getTelephone(),
        'save_in_address_book' => 1];

    //Set Address to quote
    $quote->getBillingAddress()->addData($arrShippingAddress);
    $quote->getShippingAddress()->addData($arrShippingAddress);

    // Collect Rates and Set Shipping & Payment Method

    $shippingAddress=$quote->getShippingAddress();
    $shippingAddress->setCollectShippingRates(true)
        ->collectShippingRates()
        ->setShippingMethod('flatrate_flatrate'); //shipping method
    $quote->setPaymentMethod('banktransfer'); //payment method
    $quote->getPayment()->setMethod('banktransfer');
    $quote->setInventoryProcessed(false); //not effetc inventory
    $quote->save(); //Now Save quote and your quote is ready

    // Set Sales Order Payment
    $quote->getPayment()->importData(['method' => 'banktransfer']);

    // Collect Totals & Save Quote
    $quote->collectTotals();
    // Create Order From Quote
    $quote = $this->cartRepositoryInterface->get($quote->getId());
    $order = $this->cartManagementInterface->submit($quote);
    $order->setEmailSent(0);
    $increment_id = $order->getRealOrderId();
    return $increment_id;
}

This is my code and it work on 2.1.4, after upgrade to 2.1.7 it don't work at all and throw error:

Fatal error: Uncaught Exception: User Error: Some transactions have not been committed or rolled back in /var/www/preprod.romb.ua/releases/20170629144717Z/public/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php on line 3764 in /var/www/preprod.romb.ua/releases/20170629144717Z/public/vendor/magento/framework/App/ErrorHandler.php:61 Stack trace: #0 [internal function]: Magento\Framework\App\ErrorHandler->handler(256, 'Some transactio...', '/var/www/prepro...', 3764, Array) #1 /var/www/preprod.romb.ua/releases/20170629144717Z/public/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php(3764): trigger_error('Some transactio...', 256) #2 [internal function]: Magento\Framework\DB\Adapter\Pdo\Mysql->__destruct() #3 {main} thrown in /var/www/preprod.romb.ua/releases/20170629144717Z/public/vendor/magento/framework/App/ErrorHandler.php on line 61

Manashvi Birla
  • 8,833
  • 9
  • 27
  • 53
kao
  • 91
  • 6

2 Answers2

2
class OrderCreate
{

public function __construct(
    \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
    \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Catalog\Model\ProductFactory $_productloader,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Catalog\Model\ProductFactory $productFactory,
    \Magento\Quote\Model\QuoteManagementFactory $quoteManagementFactory,
    \Magento\Customer\Model\CustomerFactory $customerFactory,
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Sales\Model\Service\OrderService $orderService,
    \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
    \Magento\Quote\Api\CartManagementInterfaceFactory $cartManagementFactory,
    \Magento\Quote\Model\Quote\Address\Rate $shippingRate,
    \Magento\Framework\Data\Form\FormKey $formkey,
    \Magento\Quote\Model\QuoteFactory $quote
)
{
    $this->_transportBuilder = $transportBuilder;
    $this->resultJsonFactory = $resultJsonFactory;
    $this->_scopeConfig = $scopeConfig;
    $this->_productloader = $_productloader;
    $this->_storeManager = $storeManager;
    $this->_productFactory = $productFactory;
    $this->customerFactory = $customerFactory;
    $this->customerRepository = $customerRepository;
    $this->orderService = $orderService;
    $this->cartRepositoryInterface = $cartRepositoryInterface;
    $this->quoteManagement = $quoteManagementFactory->create();
    $this->cartManagement = $cartManagementFactory->create();
    $this->shippingRate = $shippingRate;
    $this->_formkey = $formkey;
    $this->quote = $quote;
}
/**
 * Create Order On Your Store
 *
 * @return int $orderId
 *
 */
public function createOrder($_product, $telephone, $customer_email = false)
{
    //init the store id and website id
    $store = $this->_storeManager->getStore(1);
    $this->_storeManager->setCurrentStore($store);
    $websiteId = $this->_storeManager->getStore()->getWebsiteId();
    //init the customer
    $customer = $this->customerFactory->create();
    if (!$customer_email) {
        $conf = $this->_scopeConfig->getValue(
            'callback',
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
        );
        $customer_email = $conf['general']['callback_email'];
    }
    $customer->setWebsiteId($websiteId);
    $customer->loadByEmail($customer_email); // load customer by email address
    //init the quote
    $orderShipping = $customer->getDefaultShippingAddress();
    $orderShipping->setTelephone($telephone);

    $cart_id = $this->quoteManagement->createEmptyCart();
    $quote = $this->cartRepositoryInterface->get($cart_id);
    $quote->setCurrency();
    $quote->setStore($store); //set store for which you create quote

    // if you have allready buyer id then you can load customer directly
    $customer = $this->customerRepository->getById($customer->getEntityId());
    //add item in quote
    $quote->addProduct(
        $_product,
        1
    );
    $quote->save();
    $quote = $this->cartRepositoryInterface->get($quote->getId());
    //set shipping adress from customer to array 
    $arrShippingAddress = [
        'firstname' => $customer->getFirstName(), //address Details
        'lastname' => $customer->getLastName(),
        'street' => $orderShipping->getStreet(),
        'city' => $orderShipping->getCity(),
        'country_id' => $orderShipping->getCountry(),
        'postcode' => $orderShipping->getPostcode(),
        'telephone' => $orderShipping->getTelephone(),
        'save_in_address_book' => 1];

    //Set Address to quote
    $quote->getBillingAddress()->addData($arrShippingAddress);
    $quote->getShippingAddress()->addData($arrShippingAddress);
    $quote->setCustomerIsGuest(true);
    $quote->setCustomerEmail($customer_email);
    // Collect Rates and Set Shipping & Payment Method

    $shippingAddress=$quote->getShippingAddress();
    $shippingAddress->setCollectShippingRates(true)
        ->collectShippingRates()
        ->setShippingMethod('freeshipping_freeshipping'); //shipping method
    $quote->setPaymentMethod('banktransfer'); //payment method
    $quote->getPayment()->setMethod('banktransfer');
    $quote->setInventoryProcessed(false); //not effetc inventory
    $quote->save(); //Now Save quote and your quote is ready

    // Set Sales Order Payment
    $quote->getPayment()->importData(['method' => 'banktransfer']);

    // Collect Totals & Save Quote
    $quote->collectTotals();
    $quote->save();
    $quote = $this->cartRepositoryInterface->get($quote->getId());

    // Create Order From Quote
    try{
        $orderId = $this->cartManagement->placeOrder($quote->getId());
        return $orderId;
    }catch (\Exception $e){
        var_dump($e->__toString());
    }
}
}

This code works on 2.1.7 if someone need it.

kao
  • 91
  • 6
0

Try initiation the current store

$this->storeManager->setCurrentStore(1);
$store = $this->_storeManager->getStore(1);

and try to place order.

Priyank
  • 7,682
  • 7
  • 37
  • 70