Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/old/vendor/extmag/shiplab/Helper/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/vendor/extmag/shiplab/Helper/DataSave.php
<?php
/**
 * Copyright © Extmag. All rights reserved.
 */

namespace Extmag\Shiplab\Helper;

use Error;
use Exception;
use Extmag\Core\Helper\Registry;
use Extmag\Shiplab\Model\DimensionBoxRepository;
use Extmag\Shiplab\Model\Label;
use Extmag\Shiplab\Model\LabelFactory;
use Extmag\Shiplab\Model\LabelRepository;
use Extmag\Shiplab\Model\Logs;
use Extmag\Shiplab\Model\LogsFactory;
use Extmag\Shiplab\Model\LogsRepository;
use Extmag\Shiplab\Model\Pickup;
use Extmag\Shiplab\Model\PickupFactory;
use Extmag\Shiplab\Model\PickupRepository;
use Extmag\Shiplab\Model\ResourceModel\Label\Collection;
use Extmag\Shiplab\Model\ResourceModel\Label\CollectionFactory as LabelCollectionFactory;
use Extmag\Shiplab\Model\ResourceModel\Pickup\CollectionFactory as PickupCollectionFactory;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\DB\Transaction;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\MailException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Filesystem;
use Magento\Framework\Message\ManagerInterface;
use Magento\Sales\Api\CreditmemoRepositoryInterface;
use Magento\Sales\Api\Data\ShipmentTrackInterfaceFactory;
use Magento\Sales\Api\InvoiceRepositoryInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Api\ShipmentRepositoryInterface;
use Magento\Sales\Model\InvoiceOrder;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Shipment\Track;
use Magento\Sales\Model\Order\Shipment\TrackRepository;
use Magento\Sales\Model\ShipOrder;
use Magento\Shipping\Model\ShipmentNotifier;
use WebSocket\Client;
use Zend_Db_Expr;

class DataSave extends AbstractHelper
{
    public $errors = [];
    public $remoteServerError = [];
    /**
     * @var LabelCollection
     */
    public $labelCollection;
    /**
     * @var LogsFactory
     */
    protected $logs;
    /**
     * @var LogsRepository
     */
    protected $logsRepository;
    /**
     * @var OrderRepositoryInterface
     */
    protected $orderRepository;
    /**
     * @var LabelFactory
     */
    protected $labelFactory;
    /**
     * @var LabelRepository
     */
    protected $labelRepository;
    /**
     * @var ShipmentRepositoryInterface
     */
    protected $shipmentRepository;

    /**
     * @var CreditmemoRepositoryInterface
     */
    protected $creditMemoRepository;

    /**
     * @var Filesystem
     */
    protected $filesystem;

    /**
     * @var DirectoryList
     */
    protected $directoryList;

    /**
     * @var Url
     */
    protected $url;

    /**
     * @var RequestInterface
     */
    protected $request;

    /**
     * @var ManagerInterface
     */
    protected $messageManager;

    /**
     * @var Transaction
     */
    protected $transaction;

    /**
     * @var ShipmentNotifier
     */
    protected $shipmentNotifier;

    /**
     * @var InvoiceRepositoryInterface
     */
    protected $invoiceRepository;
    /**
     * @var Manager $manager
     */
    protected $manager;
    /**
     * @var PickupFactory
     */
    protected $pickupFactory;
    /**
     * @var PickupRepository
     */
    protected $pickupRepository;
    /**
     * @var PickupCollectionFactory
     */
    protected $pickupCollectionFactory;
    /**
     * @var Registry
     */
    protected $register;

    /**
     * @var ShipmentTrackInterfaceFactory
     */
    protected $trackFactory;
    protected $logger;
    /**
     * @var DimensionBoxRepository
     */
    protected $dimBoxRepository;
    /**
     * @var Thermal
     */
    protected $thermal;
    /**
     * @var Pdf
     */
    protected $pdf;
    /**
     * @var ShipOrder
     */
    protected $shipOrder;
    /**
     * @var InvoiceOrder
     */
    protected $invoiceOrder;
    private TrackRepository $trackRepository;

    /**
     * @param Context $context
     * @param LogsFactory $logs
     * @param LogsRepository $logsRepository
     * @param OrderRepositoryInterface $order
     * @param ShipmentRepositoryInterface $shipment
     * @param InvoiceRepositoryInterface $invoiceRepository
     * @param CreditmemoRepositoryInterface $refund
     * @param LabelFactory $labelFactory
     * @param LabelRepository $labelRepository
     * @param LabelCollectionFactory $labelCollection
     * @param PickupFactory $pickupFactory
     * @param PickupRepository $pickupRepository
     * @param PickupCollectionFactory $pickupCollectionFactory
     * @param Filesystem $filesystem
     * @param DirectoryList $directoryList
     * @param Url $url
     * @param ManagerInterface $messageManager
     * @param ShipmentNotifier $shipmentNotifier
     * @param Transaction $transaction
     * @param ShipmentTrackInterfaceFactory $trackFactory
     * @param Manager $manager
     * @param Registry $register
     * @param DimensionBoxRepository $dimBoxRepository
     * @param Thermal $thermal
     * @param Pdf $pdf
     * @param ShipOrder $shipOrder
     * @param InvoiceOrder $invoiceOrder
     * @param TrackRepository $trackRepository
     */
    public function __construct(
        Context                       $context,
        LogsFactory                   $logs,
        LogsRepository                $logsRepository,
        OrderRepositoryInterface      $order,
        ShipmentRepositoryInterface   $shipment,
        InvoiceRepositoryInterface    $invoiceRepository,
        CreditmemoRepositoryInterface $refund,
        LabelFactory                  $labelFactory,
        LabelRepository               $labelRepository,
        LabelCollectionFactory        $labelCollection,
        PickupFactory                 $pickupFactory,
        PickupRepository              $pickupRepository,
        PickupCollectionFactory       $pickupCollectionFactory,
        Filesystem                    $filesystem,
        DirectoryList                 $directoryList,
        Url                           $url,
        ManagerInterface              $messageManager,
        ShipmentNotifier              $shipmentNotifier,
        Transaction                   $transaction,
        ShipmentTrackInterfaceFactory $trackFactory,
        Manager                       $manager,
        Registry                      $register,
        DimensionBoxRepository        $dimBoxRepository,
        Thermal                       $thermal,
        Pdf                           $pdf,
        ShipOrder                     $shipOrder,
        InvoiceOrder                  $invoiceOrder,
        TrackRepository               $trackRepository
    ) {
        parent::__construct($context);
        $this->request = $context->getRequest();
        $this->logger = $context->getLogger();
        $this->logs = $logs;
        $this->logsRepository = $logsRepository;
        $this->orderRepository = $order;
        $this->labelFactory = $labelFactory;
        $this->labelRepository = $labelRepository;
        $this->shipmentRepository = $shipment;
        $this->creditMemoRepository = $refund;
        $this->labelCollection = $labelCollection;
        $this->filesystem = $filesystem;
        $this->directoryList = $directoryList;
        $this->url = $url;
        $this->messageManager = $messageManager;
        $this->transaction = $transaction;
        $this->shipmentNotifier = $shipmentNotifier;
        $this->invoiceRepository = $invoiceRepository;
        $this->manager = $manager;
        $this->trackFactory = $trackFactory;
        $this->pickupFactory = $pickupFactory;
        $this->pickupRepository = $pickupRepository;
        $this->pickupCollectionFactory = $pickupCollectionFactory;
        $this->register = $register;
        $this->dimBoxRepository = $dimBoxRepository;
        $this->thermal = $thermal;
        $this->pdf = $pdf;
        $this->shipOrder = $shipOrder;
        $this->invoiceOrder = $invoiceOrder;
        $this->trackRepository = $trackRepository;
    }

    /**
     * @param $item
     * @return array|int|mixed|null
     */
    public function saveTrack($item)
    {
        try {
            if (!empty($item['ShipmentIdentification'])) {
                $context = explode(":", $item['Context']);
                /**
                 * @var Collection $collection
                 */
                $collection = $this->labelCollection->create();
                $collection->addFieldToFilter('master_id', $item['ShipmentIdentification']);
                $collection->addFieldToFilter('order_sub_id', $context[3]);
                $collection->addFieldToFilter('status', 1);
                if ($collection->count() > 0) {
                    /**
                     * @var Label $label
                     */
                    $label = $collection->getFirstItem();
                    if ($label->getTrackStatus() == 0) {
                        $label->setTrackFirstTime(new Zend_Db_Expr('NOW()'));
                    }

                    if (!empty($item['Tracks'])) {
                        if ($item['TrackingFinalStatus'] == 1) {
                            $label->setTrackStatus(2);
                        } else {
                            $label->setTrackStatus(1);
                        }

                        $label->setTrackResponse(json_encode($item['Tracks']));
                    }

                    $label->setTrackLastTime(new Zend_Db_Expr('NOW()'));

                    $this->labelRepository->save($label);

                    return $label->getId();
                }
            }
        } catch (Exception $e) {
            $this->logger->info($e->getMessage());
        }

        return 0;
    }

    /**
     * @param string $carrierCode
     * @param        $typeRequest
     * @param        $response
     *
     * @return array
     */
    public function save($carrierCode, $typeRequest, $response)
    {
        $returnData = [];
        $result = $response['result'] ?? null;

        try {
            if (is_array($result)) {
                $itemsIds = [];
                foreach ($result as $item) {
                    if (empty($item['Context'])) {
                        $this->_logger->info("Context is not found", $item);
                    } else {
                        $context = explode(":", $item['Context']);
                    }

                    if (!empty($item['Status']) && $item['Status'] == 1) {
                        if ($item['Type'] == 'Ship') {
                            $labelId = $this->saveLabel($item);
                            if ($labelId) {
                                $itemsIds[] = $labelId;
                            }
                        } elseif ($item['Type'] == 'PickupCreation') {
                            $pickupId = $this->savePickup($item);
                            if ($pickupId) {
                                $itemsIds[] = $pickupId;
                            }
                        } elseif ($item['Type'] == 'Track') {
                            $itemsIds[] = $this->saveTrack($item);
                        }

                        /**
                         * @var Logs $log
                         */
                        $log = $this->logs->create();
                        $log->setRow(
                            'success',
                            $typeRequest,
                            strtolower($item['Carrier']),
                            __($item['Type'] . ". Tracking Number " . ($item['ShipmentIdentification'] ?? "Undefined")),
                            $context[0] ?? "undefined",
                            $context[1] ?? "0",
                            $response['request'] ?? "",
                            $response['result'] ?? ""
                        );
                        $this->logsRepository->save($log);
                    } elseif (!empty($item['Errors']) && is_array($item['Errors'])) {
                        foreach ($item['Errors'] as $error) {
                            $this->errors[] = $error['Code'] . ' ' . $error['Description'];
                            /**
                             * @var Logs $log
                             */
                            $log = $this->logs->create();
                            $log->setRow(
                                'error',
                                $typeRequest,
                                strtolower($item['Carrier']),
                                $error['Code'] . ' ' . $error['Description'],
                                $context[0] ?? "undefined",
                                $context[1] ?? "0",
                                $response['request'] ?? "",
                                $response['result'] ?? ""
                            );
                            $this->logsRepository->save($log);
                            $returnData['error'][] = $log->getId();
                        }
                    }
                }

                $returnData['success'] = $itemsIds;
            } else {
                /**
                 * @var Logs $log
                 */
                $log = $this->logs->create();
                $log->setRow(
                    'error',
                    $typeRequest,
                    $carrierCode,
                    'The response is bad.',
                    '',
                    '',
                    $response['request'] ?? "",
                    $response['result'] ?? ""
                );
                $this->logsRepository->save($log);
                $this->remoteServerError[] = __("The response is bad.");
                $returnData['error'][] = $log->getId();
            }
        } catch (Exception | Error $e) {
            $this->messageManager->addErrorMessage($e->getMessage());
            $this->manager->warning($e->getMessage() . ' :  ' . $e->getTraceAsString());
        }

        return $returnData;
    }

    /**
     * @param $item
     *
     * @return bool|int|mixed|null
     * @throws LocalizedException
     */
    protected function savePickup($item)
    {
        $requestData = $this->getPreSavedPickup($item['Context']);
        if (!empty($requestData) && !empty($item['PRN']) && !empty($item['Carrier'])) {
            /**
             * @var Pickup $model
             */
            $model = $this->pickupFactory->create();
            $model->setCarrierCode(strtolower($item['Carrier']));
            $model->setLabelIds(implode(",", $requestData['label_ids']));
            $model->setMasterId($item['PRN']);
            $model->setRequest(json_encode($requestData));
            if (!empty($item['ResponseOptions'])) {
                $model->setResponse(json_encode($item['ResponseOptions']));
            }

            $this->pickupRepository->save($model);

            foreach ($requestData['label_ids'] as $label_id) {
                $label = $this->labelRepository->getById($label_id);
                $label->setIsPickup(1);
                $this->labelRepository->save($label);
            }

            return $model->getId() ?? false;
        }

        return false;
    }

    /**
     * @param $item
     * @return bool|int|mixed|null
     */
    protected function saveLabel($item)
    {
        try {
            $context = explode(":", $item['Context']);
            if (count($context) > 5) {
                $order = $this->orderRepository->get($context[1] ?? -100);
                $orderId = $order->getId();
                $orderIncrementId = $order->getIncrementId();
                $storeId = $order->getStoreId();

                if ($context[2] == 'shipment') {
                    $orderSub = $this->shipmentRepository->get($context[3]);
                } elseif ($context[2] == 'refund') {
                    $orderSub = $this->creditMemoRepository->get($context[3]);
                } else {
                    $orderSub = $this->orderRepository->get($context[3]);
                }

                $requestData = $this->getPreSaved($item['Context']);
                if (!empty($requestData) && !empty($item['Labels'])
                    && is_array($item['Labels'])
                    && !empty($item['ShipmentIdentification'])
                    && !empty($item['Carrier'])
                ) {
                    /**
                     * @var Collection $collection
                     */
                    $collection = $this->labelCollection->create();
                    $collection
                        ->addFieldToFilter('master_id', $item['ShipmentIdentification'])
                        ->addFieldToFilter('order_sub_id', $context[3]);
                    if ($collection->count() > 0) {
                        $model = $collection->getFirstItem();
                    } else {
                        $model = $this->labelFactory->create();
                        /**
                         * @var Label $model
                         */
                        $model->setCarrierCode(strtolower($item['Carrier']));
                        $model->setOrderId($orderId);
                        $model->setOrderIncrementId($orderIncrementId);
                        $model->setStoreId($storeId);
                        $model->setOrderSubType($context[2]);
                        $model->setOrderSubId($context[3]);
                        $model->setOrderSubIncrementId($orderSub->getIncrementId());
                        $model->setTypeDirection($context[0]);
                        $model->setMasterId($item['ShipmentIdentification']);

                        $model->setStatus(1);
                        $model->setIsPrinted(0);
                        $model->setIsPickup($requestData['pickup_with_label'] ?? 0);
                    }

                    if (!empty($item['TotalCharge'])) {
                        $model->setPrice($item['TotalCharge']);
                        $model->setCurrency($item['Currency']);
                    }

                    $trackingNumbers = $model->getTrackingNumbers();
                    $media = $this->filesystem->getDirectoryWrite($this->directoryList::MEDIA);
                    foreach ($item['Labels'] as $label) {
                        $ext = $this->manager->normalizeExtension($label['Format']);
                        $trackingNumbers[] = $label['TrackingNumber'];
                        $model->setExtension($ext);
                        if ($ext != 'link' && $ext != 'virtual') {
                            if ($this->manager->isThermalLabel($ext)) {
                                $labelData = $label['Data'];
                            } else {
                                $labelData = base64_decode($label['Data']);
                            }
                            $media->writeFile(
                                $this->url->getExtmagMediaPath(
                                    $item['Carrier'],
                                    'label',
                                    $ext
                                ) . $label['TrackingNumber'] . "." . $ext,
                                $labelData
                            );
                        } else {
                            $model->setLink($label['Data']);
                        }
                    }

                    $model->setTrackingNumber(implode(",", $trackingNumbers));

                    if (!empty($item['HVR'])) {
                        $media->writeFile(
                            $this->url->getExtmagMediaPath(
                                $item['Carrier'],
                                'hvr',
                                null
                            ) . $item['ShipmentIdentification'] . "." . $this->manager->normalizeExtension(
                                $item['HVR']['Format']
                            ),
                            base64_decode($item['HVR']['Data'])
                        );
                    }

                    if (!empty($item['Form']) && is_array($item['Form'])) {
                        foreach ($item['Form'] as $form) {
                            if ($form['Type'] == 'invoice') {
                                $media->writeFile(
                                    $this->url->getExtmagMediaPath(
                                        $item['Carrier'],
                                        'invoice',
                                        null
                                    ) . $item['ShipmentIdentification'] . "." . $this->manager->normalizeExtension(
                                        $form['Format']
                                    ),
                                    base64_decode($form['Data'])
                                );
                            }
                        }
                    }

                    if (!empty($item['CODTurnInPage'])) {
                        $media->writeFile(
                            $this->url->getExtmagMediaPath(
                                $item['Carrier'],
                                'turn_in_copy',
                                null
                            ) . $item['ShipmentIdentification'] . "." . $this->manager->normalizeExtension(
                                $item['CODTurnInPage']['Format']
                            ),
                            base64_decode($item['CODTurnInPage']['Data'])
                        );
                    }

                    if (!empty($item['DGPaperImage'])) {
                        $media->writeFile(
                            $this->url->getExtmagMediaPath(
                                $item['Carrier'],
                                'dg_paper',
                                null
                            ) . $item['ShipmentIdentification'] . "." . $this->manager->normalizeExtension(
                                $item['DGPaperImage']['Format']
                            ),
                            base64_decode($item['DGPaperImage']['Data'])
                        );
                    }

                    if (!empty($item['ArchiveDoc'])) {
                        foreach ($item['ArchiveDoc'] as $key => $itemArchive) {
                            $media->writeFile(
                                $this->url->getExtmagMediaPath(
                                    $item['Carrier'],
                                    'archive',
                                    $this->manager->normalizeExtension($itemArchive['Format'])
                                ) . $item['ShipmentIdentification'] . ($key == 0 ? '' : "-" . ($key + 1))
                                . "." . $this->manager->normalizeExtension($itemArchive['Format']),
                                base64_decode($itemArchive['Data'])
                            );
                        }
                    }

                    foreach ($requestData['packages'] as $key => $package) {
                        if (!empty($trackingNumbers[$key]) && !empty($requestData['packages'][$key])) {
                            $requestData['packages'][$key]['tracking_number'] = $trackingNumbers[$key];
                        }
                    }

                    $model->setRequest($requestData);
                    if (!empty($item['ResponseOptions'])) {
                        $model->setResponse(json_encode($item['ResponseOptions']));
                    }

                    $this->labelRepository->save($model);
                    $isSetOrderStatus = $this->manager->getConfig(
                        $item['Carrier'] . '_other/general/set_order_status',
                        $storeId,
                        $context[0]
                    );
                    if ($isSetOrderStatus != '') {
                        $order->setStatus($isSetOrderStatus);
                        $this->orderRepository->save($order);
                    }

                    if ($model->getId()) {
                        // The success endpoint of saving labels
                        $this->calcPackageBoxes($requestData);

                        /* Auto Print */
                        if ($this->manager->getStoreConfig('extmag_printers/local/type') == 'network'
                            && $this->manager->getStoreConfig('extmag_printers/local/auto_print') == 1
                        ) {
                            try {
                                $address = $this->manager->getStoreConfig('extmag_printers/local/network_host');
                                $port = $this->manager->getStoreConfig('extmag_printers/local/network_port');

                                $client = new Client("ws://" . $address . ":" . $port . "/ws");
                                foreach ($trackingNumbers as $trackingNumber) {
                                    $msg = null;
                                    if ($this->manager->isThermalLabel($model->getExtension()) !== true) {
                                        $pdfData = $this->pdf->getPdfPages($model, 'label', null, $trackingNumber);
                                        if (!empty($pdfData)) {
                                            $msg = json_encode(
                                                [
                                                    'data' => base64_encode($pdfData->Output('', 'S')),
                                                    'category' => $model->getCarrierCode(),
                                                    'ext' => 'pdf',
                                                ]
                                            );
                                        }
                                    } elseif ($this->manager->isThermalLabel($model->getExtension()) === true) {
                                        $trackingNumbers = $model->getTrackingNumbers();
                                        foreach ($trackingNumbers as $track) {
                                            if (empty($trackingNumber) || $trackingNumber == $track) {
                                                $thermalData = $this->thermal->getLabelData(
                                                    $model->getCarrierCode(),
                                                    $track,
                                                    $model->getExtension()
                                                );
                                                if (!empty($thermalData)) {
                                                    $msg = json_encode([
                                                        'data' => $thermalData,
                                                        'category' => $model->getCarrierCode(),
                                                        'ext' => $model->getExtension(),
                                                    ]);
                                                }
                                            }
                                        }
                                    }
                                    if (!empty($msg)) {
                                        $client->send($msg);
                                    }
                                }

                                $lastMessage = '{"queue_end": "1"}';
                                $client->send($lastMessage);
                                $response = $client->receive();
                                $this->logger->info($response);
                                $client->close();
                                if (!empty($response['Status']) && $response['Status'] != 'error') {
                                    $model->setIsPrinted(1);
                                    $this->labelRepository->save($model);
                                }
                            } catch (Exception $e) {
                                $this->messageManager->addErrorMessage(__("Print Error") . ': ' . $e->getMessage());
                                $this->logger->info($e->getMessage(), $e->getTrace());
                            }
                        }

                        /* END Auto Print */

                        return $model->getId();
                    }

                    return false;
                }
            }
        } catch (Exception | Error $e) {
            $this->messageManager->addErrorMessage($e->getMessage());
            $this->manager->warning($e->getMessage() . ' :  ' . $e->getTraceAsString());
        }

        return false;
    }

    /**
     * @param $requestData
     *
     * @throws LocalizedException
     */
    protected function calcPackageBoxes($requestData)
    {
        $packages = $requestData['packages'] ?? null;
        if (!empty($packages) && !empty($requestData['route']) && $requestData['route'] == 'shipment') {
            foreach ($packages as $package) {
                if (!empty($package['box_id'])) {
                    try {
                        $box = $this->dimBoxRepository->getById($package['box_id']);
                        $box->setQty($box->getQty() - 1);
                        $this->dimBoxRepository->save($box);
                    } catch (NoSuchEntityException $e) {
                        $this->manager->warning($e->getMessage());
                    }
                }
            }
        }
    }

    /**
     * @param $context
     *
     * @return mixed|null
     */
    protected function getPreSaved($context)
    {
        return $this->register->getValue($context);
    }

    /**
     * @param $context
     *
     * @return mixed|null
     */
    public function getPreSavedPickup($context)
    {
        return $this->register->getValue('pickup' . $context);
    }

    /**
     * @param $data
     */
    public function preSave($data)
    {
        $context = $data['context'];
        $this->register->setValue($context, $data);
    }

    /**
     * @param $data
     */
    public function preSavePickup($data)
    {
        $context = $data['context'];
        $this->register->setValue('pickup' . $context, $data);
    }

    /**
     * @param array $labelIds
     *
     * @throws LocalizedException
     * @throws MailException
     */
    public function createInvoiceAndShipment(array $labelIds)
    {
        foreach ($labelIds as $labelId) {
            $label = $this->labelRepository->getById($labelId);
            if (!empty($label) && $label->getTypeDirection() != 'refund') {
                $requestData = json_decode($label->getRequest(), true);
                if ($label->getOrderSubType() == 'order') {
                    /**
                     * @var Order $order
                     */
                    $order = $this->orderRepository->get($label->getOrderId());
                    if (!empty($order)) {
                        if (!empty($requestData['can_create_invoice']) && $order->canInvoice()) {
                            $this->invoiceOrder->execute($order->getId());
                        }

                        if ($order->canShip()) {
                            if (!empty($requestData['can_create_shipment'])) {
                                try {
                                    // Save created Order Shipment
                                    $orderShipment = $this->shipmentRepository->get(
                                        $this->shipOrder->execute($order->getId())
                                    );
                                    $label->setOrderSubType('shipment');
                                    $label->setOrderSubId($orderShipment->getId());
                                    $label->setOrderSubIncrementId($orderShipment->getIncrementId());
                                    $this->labelRepository->save($label);
                                } catch (Exception $e) {
                                    $this->messageManager->addErrorMessage(__($e->getMessage()));
                                    continue;
                                }
                            }
                        } elseif ($label->getOrderSubType() == 'shipment') {
                            $orderShipment = $order->getShipmentsCollection()->addFieldToFilter(
                                'entity_id',
                                $label->getOrderSubId()
                            )->getFirstItem();
                        } else {
                            $orderShipment = $order->getShipmentsCollection()->getFirstItem();
                        }
                    }
                } elseif ($label->getOrderSubType() == 'shipment') {
                    $orderShipment = $this->shipmentRepository->get($label->getOrderSubId());
                }

                if (!empty($orderShipment)) {
                    if ($label->getMasterId()) {
                        /**
                         * @var Track $track
                         */
                        $track = $this->trackFactory->create();
                        $track->setNumber($label->getMasterId());
                        $track->setCarrierCode($label->getCarrierCode());
                        $track->setTitle($label->getCarrierFullName());
                        $track->setParentId($orderShipment->getId());
                        $track->setOrderId($orderShipment->getOrderId());
                        $this->trackRepository->save($track);
                    }

                    if (1 ==
                        $this->manager->getConfig(
                            $label->getCarrierCode() . "_other/general/send_tracking_number",
                            $label->getStoreId(),
                            $label->getTypeDirection(),
                            $requestData['ship_to_country_code']
                        )
                    ) {
                        // Send Shipment Email
                        $this->shipmentNotifier->notify($orderShipment);
                    }
                }
            }
        }
    }
}

Spamworldpro Mini