/vendor/magento/module-shipping/Model/Shipping/LabelGenerator.php

https://gitlab.com/yousafsyed/easternglamor · PHP · 191 lines · 121 code · 13 blank · 57 comment · 12 complexity · deb388b38b12c10655929bf0dc5ff602 MD5 · raw file

  1. <?php
  2. /**
  3. *
  4. * Copyright © 2016 Magento. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Shipping\Model\Shipping;
  8. use Magento\Framework\App\Filesystem\DirectoryList;
  9. use Magento\Framework\App\RequestInterface;
  10. /**
  11. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  12. */
  13. class LabelGenerator
  14. {
  15. /**
  16. * @var \Magento\Shipping\Model\CarrierFactory
  17. */
  18. protected $carrierFactory;
  19. /**
  20. * @var \Magento\Shipping\Model\Shipping\LabelsFactory
  21. */
  22. protected $labelFactory;
  23. /**
  24. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  25. */
  26. protected $scopeConfig;
  27. /**
  28. * @var \Magento\Sales\Model\Order\Shipment\TrackFactory
  29. */
  30. protected $trackFactory;
  31. /**
  32. * @var \Magento\Framework\Filesystem
  33. */
  34. protected $filesystem;
  35. /**
  36. * @param \Magento\Shipping\Model\CarrierFactory $carrierFactory
  37. * @param LabelsFactory $labelFactory
  38. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  39. * @param \Magento\Sales\Model\Order\Shipment\TrackFactory $trackFactory
  40. * @param \Magento\Framework\Filesystem $filesystem
  41. */
  42. public function __construct(
  43. \Magento\Shipping\Model\CarrierFactory $carrierFactory,
  44. \Magento\Shipping\Model\Shipping\LabelsFactory $labelFactory,
  45. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  46. \Magento\Sales\Model\Order\Shipment\TrackFactory $trackFactory,
  47. \Magento\Framework\Filesystem $filesystem
  48. ) {
  49. $this->carrierFactory = $carrierFactory;
  50. $this->labelFactory = $labelFactory;
  51. $this->scopeConfig = $scopeConfig;
  52. $this->trackFactory = $trackFactory;
  53. $this->filesystem = $filesystem;
  54. }
  55. /**
  56. * @param \Magento\Sales\Model\Order\Shipment $shipment
  57. * @param RequestInterface $request
  58. * @return void
  59. * @throws \Magento\Framework\Exception\LocalizedException
  60. */
  61. public function create(\Magento\Sales\Model\Order\Shipment $shipment, RequestInterface $request)
  62. {
  63. $order = $shipment->getOrder();
  64. $carrier = $this->carrierFactory->create($order->getShippingMethod(true)->getCarrierCode());
  65. if (!$carrier->isShippingLabelsAvailable()) {
  66. throw new \Magento\Framework\Exception\LocalizedException(__('Shipping labels is not available.'));
  67. }
  68. $shipment->setPackages($request->getParam('packages'));
  69. $response = $this->labelFactory->create()->requestToShipment($shipment);
  70. if ($response->hasErrors()) {
  71. throw new \Magento\Framework\Exception\LocalizedException(__($response->getErrors()));
  72. }
  73. if (!$response->hasInfo()) {
  74. throw new \Magento\Framework\Exception\LocalizedException(__('Response info is not exist.'));
  75. }
  76. $labelsContent = [];
  77. $trackingNumbers = [];
  78. $info = $response->getInfo();
  79. foreach ($info as $inf) {
  80. if (!empty($inf['tracking_number']) && !empty($inf['label_content'])) {
  81. $labelsContent[] = $inf['label_content'];
  82. $trackingNumbers[] = $inf['tracking_number'];
  83. }
  84. }
  85. $outputPdf = $this->combineLabelsPdf($labelsContent);
  86. $shipment->setShippingLabel($outputPdf->render());
  87. $carrierCode = $carrier->getCarrierCode();
  88. $carrierTitle = $this->scopeConfig->getValue(
  89. 'carriers/' . $carrierCode . '/title',
  90. \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
  91. $shipment->getStoreId()
  92. );
  93. if (!empty($trackingNumbers)) {
  94. $this->addTrackingNumbersToShipment($shipment, $trackingNumbers, $carrierCode, $carrierTitle);
  95. }
  96. }
  97. /**
  98. * @param \Magento\Sales\Model\Order\Shipment $shipment
  99. * @param array $trackingNumbers
  100. * @param string $carrierCode
  101. * @param string $carrierTitle
  102. *
  103. * @return void
  104. */
  105. private function addTrackingNumbersToShipment(
  106. \Magento\Sales\Model\Order\Shipment $shipment,
  107. $trackingNumbers,
  108. $carrierCode,
  109. $carrierTitle
  110. ) {
  111. foreach ($trackingNumbers as $number) {
  112. if (is_array($number)) {
  113. $this->addTrackingNumbersToShipment($shipment, $number, $carrierCode, $carrierTitle);
  114. } else {
  115. $shipment->addTrack(
  116. $this->trackFactory->create()
  117. ->setNumber($number)
  118. ->setCarrierCode($carrierCode)
  119. ->setTitle($carrierTitle)
  120. );
  121. }
  122. }
  123. }
  124. /**
  125. * Combine array of labels as instance PDF
  126. *
  127. * @param array $labelsContent
  128. * @return \Zend_Pdf
  129. */
  130. public function combineLabelsPdf(array $labelsContent)
  131. {
  132. $outputPdf = new \Zend_Pdf();
  133. foreach ($labelsContent as $content) {
  134. if (stripos($content, '%PDF-') !== false) {
  135. $pdfLabel = \Zend_Pdf::parse($content);
  136. foreach ($pdfLabel->pages as $page) {
  137. $outputPdf->pages[] = clone $page;
  138. }
  139. } else {
  140. $page = $this->createPdfPageFromImageString($content);
  141. if ($page) {
  142. $outputPdf->pages[] = $page;
  143. }
  144. }
  145. }
  146. return $outputPdf;
  147. }
  148. /**
  149. * Create \Zend_Pdf_Page instance with image from $imageString. Supports JPEG, PNG, GIF, WBMP, and GD2 formats.
  150. *
  151. * @param string $imageString
  152. * @return \Zend_Pdf_Page|false
  153. */
  154. public function createPdfPageFromImageString($imageString)
  155. {
  156. /** @var \Magento\Framework\Filesystem\Directory\Write $directory */
  157. $directory = $this->filesystem->getDirectoryWrite(
  158. DirectoryList::TMP
  159. );
  160. $directory->create();
  161. $image = @imagecreatefromstring($imageString);
  162. if (!$image) {
  163. return false;
  164. }
  165. $xSize = imagesx($image);
  166. $ySize = imagesy($image);
  167. $page = new \Zend_Pdf_Page($xSize, $ySize);
  168. imageinterlace($image, 0);
  169. $tmpFileName = $directory->getAbsolutePath(
  170. 'shipping_labels_' . uniqid(\Magento\Framework\Math\Random::getRandomNumber()) . time() . '.png'
  171. );
  172. imagepng($image, $tmpFileName);
  173. $pdfImage = \Zend_Pdf_Image::imageWithPath($tmpFileName);
  174. $page->drawImage($pdfImage, 0, 0, $xSize, $ySize);
  175. $directory->delete($directory->getRelativePath($tmpFileName));
  176. return $page;
  177. }
  178. }