0

How to create order for bundle product with rest api Magento2 ?

I create an order using Rest Api for a simple product, but for a bundle product it does not work, any example can help me, thanks.

For this, I use this link

https://devdocs.magento.com/redoc/2.3/admin-rest-api.html#operation/salesOrderRepositoryV1SavePut

/rest/V1/orders/create

 "entity"=>
        [
            "base_currency_code"=>"USD",
            "base_discount_amount"=> 0,
            "base_grand_total"=> 120,
            "base_shipping_amount"=> 0,
            "base_subtotal"=> 120,
            "base_tax_amount"=>0,
            "customer_email"=> "test@test.test",
            "customer_firstname"=> "test",
            "customer_group_id"=> 1,
            "customer_id"=> 134,
            "customer_is_guest"=> 0,
            "customer_lastname"=> "test",
            "customer_note_notify"=> 1,
            "discount_amount"=> 0,
            "email_sent"=> 1,
            "coupon_code"=> "Test1",
            "discount_description"=> "Test1",
            "grand_total"=> 120,
            "is_virtual"=> 0,
            "order_currency_code"=> "USD",
            "shipping_amount"=> 0,
            "shipping_description"=> "Flat Rate - Fixed",
            "state"=> "new",
            "status"=> "pending",
            "store_currency_code"=> "USD",
            "store_id"=> 1,
            "store_name"=> "Main Website\nMain Website Store\n",
            "subtotal"=> 120,
            "subtotal_incl_tax"=> 120,
            "tax_amount"=> 0,
            "total_item_count"=> 1,
            "total_qty_ordered"=> 1,
            "weight"=> 0,
            "items" => [ [
                "base_discount_amount"=> 0,
                "base_original_price"=> 0,
                "base_price"=> 0,
                "base_price_incl_tax"=> 0,
                "base_row_invoiced"=> 0,
                "base_row_total"=> 0,
                "base_tax_amount"=> 0,
                "base_tax_invoiced"=> 0,
                "discount_amount"=> 0,
                "discount_percent"=> 0,
                "free_shipping"=> 0,
                "is_virtual"=> 0,
                "name"=> "Mixte tandem",
                "original_price"=> 0,
                "price"=> 0,
                "price_incl_tax"=> 0,
                "product_id"=> 8,
                "product_type"=> "bundle",
                "qty_ordered"=> 1,
                "row_total"=> 0,
                "row_total_incl_tax"=> 0,
                "sku"=> "Mixte Tandem",
                "store_id"=> 1,
                "product_option"=> [
                "extension_attributes"=> [
                    "bundle_options"=> [
                        [
                            "option_id"=> 3,
                            "option_qty"=> 3,
                            "option_selections"=> ["12","15","16"]
                        ], [
                            "option_id"=> 4,
                            "option_qty"=> 2,
                            "option_selections"=> ["13","14"]
                        ]
                    ],
                    ]
                ],
            ] ],
            "billing_address"=> [
                "address_type"=> "billing",
                "city"=> "Gyumri",
                "company"=> "Shooga",
                "country_id"=> "AM",
                "email"=> "test@test.test",
                "firstname"=> "test",
                "lastname"=> "test",
                "postcode"=> "30332",
                "region"=> "Shirak",
                "region_code"=> "SK",
                "region_id"=> 19,
                "street"=> [
                        "Street 1",
                        "Street 2"
                    ],
                "telephone"=> "12345688"
            ],
    "payment"=> [
            "method"=> "checkmo"
    ],
    "extension_attributes"=> [
            "shipping_assignments"=> [
            [
                "shipping"=> [
                "address"=> [
                    "address_type"=> "shipping",
                        "city"=> "Gyumri",
                        "company"=> "Shooga",
                        "country_id"=> "AM",
                        "email"=> "test@test.test",
                        "firstname"=> "test",
                        "lastname"=> "test",
                        "postcode"=> "30332",
                        "region"=> "Shirak",
                        "region_code"=> "SK",
                        "region_id"=> 19,
                        "street"=> [
                        "Street 1",
                        "Street 2"
                    ],
                        "telephone"=> "12345688"
                    ],
                    "method"=> "flatrate_flatrate"
                ]
            ]
        ]
    ]
        ]

Now i have it in admin

enter image description here

but i need like this

enter image description here

12
  • explain "does not work" show us your payload and to what endpoint you are sending it – Philipp Sander May 13 '19 at 9:55
  • Philipp Sander, i updated my question – Robinio May 13 '19 at 10:05
  • I need to show selected products too – Robinio May 13 '19 at 10:14
  • but you are only sending 1 product...why do you expect more to show up – Philipp Sander May 13 '19 at 10:52
  • then what's the point of bundle_options in this code? – Robinio May 13 '19 at 10:54
0

@Bharath, I don't know it will help you , but it works for me

namespace venodor\Module\Block;
use Magento\Tax\Model\TaxClass\Source\Product as ProductTaxClassSource;
class CreateCheckout extends \Magento\Framework\View\Element\Template
{
    protected $orders;
    protected $customerRepository;
    protected $_quoteRepository;
    protected $_customerRepositoryInterface;
    protected $_storeManager;
    protected $orderRepository;
    protected $_customerFactory;


    public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
    \Magento\Quote\Model\QuoteManagement $quoteManagement,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Quote\Model\QuoteRepository $quoteRepository,
    \Magento\Customer\Model\CustomerFactory $customerFactory,
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepositoryInterface,
    \Magento\Customer\Api\CustomerRepositoryInterfaceFactory $customerRepositoryFactory,
    \Magento\Customer\Model\ResourceModel\Customer\CollectionFactory $customerFactory,
    \Magento\Quote\Model\QuoteFactory $quoteFactory,
    \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
    array $data = []

)
{
$this->cartRepositoryInterface = $cartRepositoryInterface;
$this->quoteManagement = $quoteManagement;
$this->quoteFactory = $quoteFactory;
$this->_quoteRepository = $quoteRepository;
$this->customerFactory = $customerFactory;
$this->_storeManager = $storeManager;
$this->_customerRepositoryInterface = $customerRepositoryInterface;
$this->customerRepository = $customerRepositoryFactory->create();
$this->orderRepository = $orderRepository;
parent::__construct($context, $data);
}

public function getCustomerCollection()
       {
           return $this->_customerFactory->create();
       }

public function createOrder(){
           try {
               $store = $this->_storeManager->getStore();
               $websiteId = $this->_storeManager->getStore()->getWebsiteId();

                           $customer = $this->customerFactory->create();
                           $customer->setWebsiteId($websiteId);
                           $customerCollection = $this->getCustomerCollection();
                           foreach ($customerCollection as $customerCollection) {
                            $customerId = $customerCollection->getId();

                            $customerData = $this->customerRepository->getById($customerId);
                            $getEmailCustomers = $customerData->getEmail();
                            $customer->loadByEmail($getEmailCustomers);

                            $checkCartExist = $this->quoteFactory->create()->loadByCustomer($customerId);
                            $checkCartExist->getAllVisibleItems();
                            if ($checkCartExist['entity_id']) {
                                $quote = $this->cartRepositoryInterface->getForCustomer($customerId);

                                $assignCustomer= $this->_customerRepositoryInterface->getById($customer->getEntityId());
                                $quote->setCurrency();
                                $quote->assignCustomer($assignCustomer);
                                $shippingAddress = $quote->getShippingAddress();
                                $shippingAddress->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod('flatrate_flatrate');
                                $quote->setPaymentMethod('checkmo'); //payment method
                                $quote->setInventoryProcessed(false); //not effetc inventory
                                $quote->save(); //Now Save quote and your quote is ready
                                $this->_quoteRepository->save($quote);
                                $quote->getPayment()->importData(['method' => 'checkmo']);
                                $quote->collectTotals();
                                $order = $this->quoteManagement->submit($quote);

                            }
                            if (isset($order)) {

                                $order->setEmailSent(0);
                                $increment_id = $order->getRealOrderId();
                                $order = $this->orderRepository->get($order->getId()); 
                            }
                        }


           } catch (\Exception $e) {
               echo $e->getMessage();
           }
       }


 }
3
  • Thank you..but I don't see that you were setting bundle product or its selection items to quote which is the actual problem, can you please add that. Appreciate your help for this – Bharath Aug 28 '19 at 19:53
  • @Bharath Do you need to add a bundle product to the cart? – Robinio Aug 29 '19 at 12:17
  • Thank you so much for your help..! – Bharath Aug 30 '19 at 9:45
0

@Bharath this step added to the cart, the former was how I created the order.

You must add to this code in the foreach where you can take the product id and the product qty of the place these $products_id = $jsonData['product_id']; $products_count = $jsonData['product_count'];
I hope this helps you

                $products_id = $jsonData['product_id'];
                $products_count = $jsonData['product_count'];
                $_product = $this->_productRepository->getById($products_id);
                $options = $objectManager->get('Magento\Bundle\Model\Option')
                    ->getResourceCollection()
                    ->setProductIdFilter($products_id)
                    ->setPositionOrder();
                $options->joinValues($store_id);
                $typeInstance = $objectManager->get('Magento\Bundle\Model\Product\Type');
                $options = $_product->getOptions($products_id);
                $selections = $typeInstance->getSelectionsCollection($typeInstance->getOptionsIds($_product), $_product);
                $selectionProds = array_reduce($selections->getData(), function ($carry, $selection) {
                    if (!isset($carry[$selection['option_id']])) {
                        $carry[$selection['option_id']] = [];
                    }

                    $carry[$selection['option_id']][] = $selection['selection_id'];

                    return $carry;
                }, []);
                $selectionQty = array_reduce($selections->getData(), function ($carry, $selection) {
                    if (!isset($carry[$selection['option_id']])) {
                        $carry[$selection['option_id']] = [];
                    }

                    $carry[$selection['option_id']][] = $selection['selection_qty'];

                    return $carry;
                }, []);


                    $data = [
                        'qty' => $products_count,
                        'product' => $products_id,
                        'bundle_option' => $selectionProds
                    ];

                    $checkCartExist = $this->quoteFactory->create()->loadByCustomer($customerId);
                    $checkCartExist->getAllVisibleItems();

                    $customerData = $this->customerRepository->getById($customerId);

                    $getEmailCustomers = $customerData->getEmail();
                    $request->setData($data);
                    $customer = $this->customerFactory->create();
                    $customer->setWebsiteId($websiteId);
                    $customer->loadByEmail($getEmailCustomers);
                    if (!$checkCartExist['entity_id']) {
                        $cartId = $this->cartManagementInterface->createEmptyCart(); //Create empty cart
                        $quote = $this->cartRepositoryInterface->get($cartId); // load empty cart quote

                    } else {

                        $quote = $this->cartRepositoryInterface->getForCustomer($customerId);
                    }
                    $quote->setStore($store);
                    $customer = $this->_customerRepositoryInterface->getById($customer->getEntityId());

                    $quote->setCurrency();
                    $quote->assignCustomer($customer);
                    $quote->addProduct($_product, $request);
                    $quote->collectTotals();
                    $quote->save(); //Now Save quote and your quote is ready
                    $this->_quoteRepository->save($quote);
                    $this->_sendemail->sendTransactionalEmail($getEmailCustomers);

And all the classes that I injected . here, there may be superfluous classes you may not need, you can simply remove them

 public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Directory\Model\Currency $currency,
    \Magento\Catalog\Model\ProductRepository $productRepository,
    \Magento\Checkout\Model\Cart $cart,
    \Magento\Quote\Api\CartRepositoryInterface $cartRepositoryInterface,
    \Magento\Quote\Api\CartManagementInterface $cartManagementInterface,
    \Magento\Customer\Model\CustomerFactory $customerFactory,
    \Magento\Quote\Model\QuoteManagement $quoteManagement,
    \Magento\Quote\Model\QuoteRepository $quoteRepository,
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepositoryInterface,
    \Magento\Customer\Api\CustomerRepositoryInterfaceFactory $customerRepositoryFactory,
    \Magento\Quote\Model\QuoteFactory $quoteFactory,
    \Magento\Customer\Model\AddressFactory $addressFactory,
    \AutoAddtocart\BundleAddtocart\Helper\Data $sendEmail,
    array $data = []

)
{
    $this->_productCollectionFactory = $productCollectionFactory;
    $this->_storeManager = $storeManager;
    $this->_currency = $currency;
    $this->_productRepository = $productRepository;
    $this->_quoteRepository = $quoteRepository;
    $this->_cart = $cart;
    $this->cartRepositoryInterface = $cartRepositoryInterface;
    $this->cartManagementInterface = $cartManagementInterface;
    $this->customerFactory = $customerFactory;
    $this->quoteManagement = $quoteManagement;
    $this->_customerRepositoryInterface = $customerRepositoryInterface;
    $this->quoteFactory = $quoteFactory;
    $this->customerRepository = $customerRepositoryFactory->create();
    $this->_addressFactory = $addressFactory;
    $this->_sendemail = $sendEmail;
    parent::__construct($context, $data);
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.