![]() 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/ |
<?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); } } } } } }