We just need to pass order id in generateShipment($orderId) function from template.
below code snippet is used for generating Shipment in Magento 2, After generating Shipment automatically send the Shipment mail to a customer who has placed the order.
<?php namespace Rbj\Shipment\Block; class Shipment extends \Magento\Framework\View\Element\Template { public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Magento\Sales\Api\OrderRepositoryInterface $orderRepository, \Magento\Sales\Model\Convert\OrderFactory $convertOrderFactory, \Magento\Framework\DB\TransactionFactory $transactionFactory, \Magento\Sales\Model\Order\Email\Sender\ShipmentSender $shipmentSender, \Magento\Framework\Message\ManagerInterface $messageManager, array $data = [] ) { $this->orderRepository = $orderRepository; $this->orderConverter = $convertOrderFactory->create(); $this->transactionFactory = $transactionFactory; $this->messageManager = $messageManager; $this->shipmentSender = $shipmentSender; parent::__construct($context, $data); } /** * Create Shipment Based on Order Object * @param \Magento\Sales\Model\Order $order * @return $this */ public function generateShipment($orderId) { try { $order = $this->orderRepository->get($orderId); if (!$order->getId()) { throw new \Magento\Framework\Exception\LocalizedException(__('The order no longer exists.')); } /* check shipment exist for order or not */ if ($order->canShip()) { // Initialize the order shipment object $shipment = $this->orderConverter->toShipment($order); foreach ($order->getAllItems() AS $orderItem) { // Check if order item has qty to ship or is order is virtual if (! $orderItem->getQtyToShip() || $orderItem->getIsVirtual()) { continue; } $qtyShipped = $orderItem->getQtyToShip(); // Create shipment item with qty $shipmentItem = $this->orderConverter->itemToShipmentItem($orderItem)->setQty($qtyShipped); // Add shipment item to shipment $shipment->addItem($shipmentItem); } // Register shipment $shipment->register(); $shipment->getOrder()->setIsInProcess(true); try { $transaction = $this->transactionFactory->create()->addObject($shipment) ->addObject($shipment->getOrder()) ->save(); echo $shipmentId = $shipment->getIncrementId(); } catch (\Exception $e) { $this->messageManager->addError(__('We can\'t generate shipment.')); } if ($shipment) { try { $this->shipmentSender->send($shipment); } catch (\Exception $e) { $this->messageManager->addError(__('We can\'t send the shipment right now.')); } } return $shipmentId; } } catch (\Exception $e) { $this->messageManager->addError($e->getMessage()); } return true; }
Call function from the template,
$orderId = 1; $shipment = $block->generateInvoice($orderId);
Now Check from Admin panel.
Sales -> Order, Order with Id 1 has generated Shipment.