Magento – How to get order data from sales_order_shipment_save_after event

event-observermagento-2.1orderssales-order

I am using sales_order_shipment_save_after event events for update update order status after shipment.

namespace Tenx\SalesExt\Observer;
use Magento\Framework\Event\ObserverInterface;


/**
 * Webkul Marketplace AdminhtmlCustomerSaveAfterObserver Observer.
 */
class SalesOrderShipmentSaveAfter implements ObserverInterface {




    public function execute(\Magento\Framework\Event\Observer $observer) {

        $shipment = $observer->getEvent()->getShipment();
        $order = $shipment->getOrder();
        $entity = $order->getId();
        $increment_id = $order->getIncrementId();
        if(!$order->getId()){
            return;
        }
           try {

            $data = array();
            $main = array();

            $payment_code = $order->getPayment()->getMethodInstance()->getCode();
            $payment_title = $order->getPayment()->getMethodInstance()->getTitle();







            if(isset($payment_code)){

                if($payment_code == 'cashondelivery'){

                    $this->_resources = \Magento\Framework\App\ObjectManager::getInstance()
                                ->get('Magento\Framework\App\ResourceConnection');
                        $connection = $this->_resources->getConnection();

                        $tableName = $this->_resources->getTableName('sales_order');


                        $sql1 = "Update $tableName SET state = 'pending_payment', status = 'processing_shipped' where entity_id ='" . $entity . "' and increment_id='" . $increment_id . "'";

                        $connection->query($sql1);

                }
                else{
                    echo "payemt method not cod";
                }

            }

            } 


}
}

I am getting order id and increment id but I am getting error unknown function getOrder(). Can anyone help me?

Best Answer

sales_order_shipment_save_after is dispatched when SHIPMENT is saved not the order and therefore, since this is dynamic event in shipment model, you will not get an order by simply calling getOrder on event object.

Nevertheless you can try to get an order directly from shipment if it is set

$shipment->getOrder();

If this will result in a null value then you could try

$shipment->getOrderId()

Order id must be set and so you can load appropriate order with usage of OrderRepository class.