Instantly share code, notes, and snippets.

@fahu fahu/CreateShipment.php
Last active Jul 16, 2018

Embed
What would you like to do?
How to create a shipment programmatically in Magento 2
<?php
class CreateShipment extends \Magento\Backend\App\Action
{
/**
* The OrderRepository is used to load, save and delete orders.
*
* @var \Magento\Sales\Model\OrderRepository
*/
protected $orderRepository;
/**
* The ShipmentFactory is used to create a new Shipment.
*
* @var Order\ShipmentFactory
*/
protected $shipmentFactory;
/**
* The ShipmentRepository is used to load, save and delete shipments.
*
* @var Order\ShipmentRepository
*/
protected $shipmentRepository;
/**
* The ShipmentNotifier class is used to send a notification email to the customer.
*
* @var ShipmentNotifier
*/
protected $shipmentNotifier;
/**
* All specified parameters in the constructor will be injected via dependency injection.
*
* @param \Magento\Backend\App\Action\Context $context
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Sales\Model\OrderRepository $orderRepository,
\Magento\Sales\Model\Order\ShipmentRepository $shipmentRepository,
\Magento\Sales\Model\Order\ShipmentFactory $shipmentFactory,
\Magento\Shipping\Model\ShipmentNotifier $shipmentNotifier,
) {
parent::__construct($context);
$this->orderRepository = $orderRepository;
$this->shipmentFactory = $shipmentFactory;
$this->shipmentRepository = $shipmentRepository;
$this->shipmentNotifier = $shipmentNotifier;
}
/**
* Since our class extends the Magento Action class it *must* have an execute() function.
* This function is automatically called as soon as the request is sent.
* @return void
*/
public function execute()
{
// we are assuming that the order ID passed to this action via the request parameter.
$orderId = $this->getRequest()->getParam('order_id', 0);
if ($orderId <= 0) {
echo 'Order not found.';
return;
}
try {
// load order from database
$order = $this->orderRepository->get($orderId);
if ($order == null) {
echo "Order not loaded from database."
return;
}
$this->createShipment($order);
} catch (\Exception $exception) {
echo 'Error: ' . $exception->getMessage();
}
}
/**
* Creates a new shipment for the specified order.
*
* @param \Magento\Sales\Model\Order $order
*/
protected function createShipment($order)
{
// check if it's possible to ship the items
if ($order->canShip()) {
// create the shipment
$shipment = $this->shipmentFactory->create($order);
// save the newly created shipment
$this->shipmentRepository->save($shipment);
// send shipping confirmation e-mail to customer
$this->shipmentNotifier->notify($shipment);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment