Labels.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Shipping\Model\Shipping;
  7. use Magento\Framework\DataObject;
  8. use Magento\Framework\Exception\LocalizedException;
  9. use Magento\Sales\Model\Order\Shipment;
  10. use Magento\Sales\Model\Order\Address;
  11. use Magento\Shipping\Model\Shipment\Request;
  12. use Magento\Store\Model\ScopeInterface;
  13. use Magento\User\Model\User;
  14. /**
  15. * Shipping labels model
  16. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  17. */
  18. class Labels extends \Magento\Shipping\Model\Shipping
  19. {
  20. /**
  21. * @var \Magento\Backend\Model\Auth\Session
  22. */
  23. protected $_authSession;
  24. /**
  25. * @var \Magento\Shipping\Model\Shipment\Request
  26. */
  27. protected $_request;
  28. /**
  29. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  30. * @param \Magento\Shipping\Model\Config $shippingConfig
  31. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  32. * @param \Magento\Shipping\Model\CarrierFactory $carrierFactory
  33. * @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory
  34. * @param \Magento\Shipping\Model\Shipment\RequestFactory $shipmentRequestFactory
  35. * @param \Magento\Directory\Model\RegionFactory $regionFactory
  36. * @param \Magento\Framework\Math\Division $mathDivision
  37. * @param \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry
  38. * @param \Magento\Backend\Model\Auth\Session $authSession
  39. * @param \Magento\Shipping\Model\Shipment\Request $request
  40. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  41. */
  42. public function __construct(
  43. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  44. \Magento\Shipping\Model\Config $shippingConfig,
  45. \Magento\Store\Model\StoreManagerInterface $storeManager,
  46. \Magento\Shipping\Model\CarrierFactory $carrierFactory,
  47. \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory,
  48. \Magento\Shipping\Model\Shipment\RequestFactory $shipmentRequestFactory,
  49. \Magento\Directory\Model\RegionFactory $regionFactory,
  50. \Magento\Framework\Math\Division $mathDivision,
  51. \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry,
  52. \Magento\Backend\Model\Auth\Session $authSession,
  53. Request $request
  54. ) {
  55. $this->_authSession = $authSession;
  56. $this->_request = $request;
  57. parent::__construct(
  58. $scopeConfig,
  59. $shippingConfig,
  60. $storeManager,
  61. $carrierFactory,
  62. $rateResultFactory,
  63. $shipmentRequestFactory,
  64. $regionFactory,
  65. $mathDivision,
  66. $stockRegistry
  67. );
  68. }
  69. /**
  70. * Prepare and do request to shipment
  71. *
  72. * @param Shipment $orderShipment
  73. * @return \Magento\Framework\DataObject
  74. * @throws \Magento\Framework\Exception\LocalizedException
  75. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  76. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  77. */
  78. public function requestToShipment(Shipment $orderShipment)
  79. {
  80. $admin = $this->_authSession->getUser();
  81. $order = $orderShipment->getOrder();
  82. $shippingMethod = $order->getShippingMethod(true);
  83. $shipmentStoreId = $orderShipment->getStoreId();
  84. $shipmentCarrier = $this->_carrierFactory->create($order->getShippingMethod(true)->getCarrierCode());
  85. $baseCurrencyCode = $this->_storeManager->getStore($shipmentStoreId)->getBaseCurrencyCode();
  86. if (!$shipmentCarrier) {
  87. throw new LocalizedException(
  88. __('The "%1" carrier is invalid. Verify and try again.', $shippingMethod->getCarrierCode())
  89. );
  90. }
  91. $shipperRegionCode = $this->_scopeConfig->getValue(
  92. Shipment::XML_PATH_STORE_REGION_ID,
  93. ScopeInterface::SCOPE_STORE,
  94. $shipmentStoreId
  95. );
  96. if (is_numeric($shipperRegionCode)) {
  97. $shipperRegionCode = $this->_regionFactory->create()->load($shipperRegionCode)->getCode();
  98. }
  99. $originStreet1 = $this->_scopeConfig->getValue(
  100. Shipment::XML_PATH_STORE_ADDRESS1,
  101. ScopeInterface::SCOPE_STORE,
  102. $shipmentStoreId
  103. );
  104. $storeInfo = new DataObject(
  105. (array)$this->_scopeConfig->getValue(
  106. 'general/store_information',
  107. ScopeInterface::SCOPE_STORE,
  108. $shipmentStoreId
  109. )
  110. );
  111. if (!$admin->getFirstName()
  112. || !$admin->getLastName()
  113. || !$storeInfo->getName()
  114. || !$storeInfo->getPhone()
  115. || !$originStreet1
  116. || !$this->_scopeConfig->getValue(
  117. Shipment::XML_PATH_STORE_CITY,
  118. ScopeInterface::SCOPE_STORE,
  119. $shipmentStoreId
  120. )
  121. || !$this->_scopeConfig->getValue(
  122. Shipment::XML_PATH_STORE_ZIP,
  123. ScopeInterface::SCOPE_STORE,
  124. $shipmentStoreId
  125. )
  126. || !$this->_scopeConfig->getValue(
  127. Shipment::XML_PATH_STORE_COUNTRY_ID,
  128. ScopeInterface::SCOPE_STORE,
  129. $shipmentStoreId
  130. )
  131. ) {
  132. throw new LocalizedException(
  133. __(
  134. "Shipping labels can't be created. "
  135. . "Verify that the store information and settings are complete and try again."
  136. )
  137. );
  138. }
  139. /** @var $request \Magento\Shipping\Model\Shipment\Request */
  140. $request = $this->_shipmentRequestFactory->create();
  141. $request->setOrderShipment($orderShipment);
  142. $address = $order->getShippingAddress();
  143. $this->setShipperDetails($request, $admin, $storeInfo, $shipmentStoreId, $shipperRegionCode, $originStreet1);
  144. $this->setRecipientDetails($request, $address);
  145. $request->setShippingMethod($shippingMethod->getMethod());
  146. $request->setPackageWeight($order->getWeight());
  147. $request->setPackages($orderShipment->getPackages());
  148. $request->setBaseCurrencyCode($baseCurrencyCode);
  149. $request->setStoreId($shipmentStoreId);
  150. return $shipmentCarrier->requestToShipment($request);
  151. }
  152. /**
  153. * Set shipper details into request
  154. * @param \Magento\Shipping\Model\Shipment\Request $request
  155. * @param \Magento\User\Model\User $storeAdmin
  156. * @param \Magento\Framework\DataObject $store
  157. * @param $shipmentStoreId
  158. * @param $regionCode
  159. * @param $originStreet
  160. * @return void
  161. */
  162. protected function setShipperDetails(
  163. Request $request,
  164. User $storeAdmin,
  165. DataObject $store,
  166. $shipmentStoreId,
  167. $regionCode,
  168. $originStreet
  169. ) {
  170. $originStreet2 = $this->_scopeConfig->getValue(
  171. Shipment::XML_PATH_STORE_ADDRESS2,
  172. ScopeInterface::SCOPE_STORE,
  173. $shipmentStoreId
  174. );
  175. $request->setShipperContactPersonName($storeAdmin->getName());
  176. $request->setShipperContactPersonFirstName($storeAdmin->getFirstName());
  177. $request->setShipperContactPersonLastName($storeAdmin->getLastName());
  178. $request->setShipperContactCompanyName($store->getName());
  179. $request->setShipperContactPhoneNumber($store->getPhone());
  180. $request->setShipperEmail($storeAdmin->getEmail());
  181. $request->setShipperAddressStreet(trim($originStreet . ' ' . $originStreet2));
  182. $request->setShipperAddressStreet1($originStreet);
  183. $request->setShipperAddressStreet2($originStreet2);
  184. $request->setShipperAddressCity(
  185. $this->_scopeConfig->getValue(
  186. Shipment::XML_PATH_STORE_CITY,
  187. ScopeInterface::SCOPE_STORE,
  188. $shipmentStoreId
  189. )
  190. );
  191. $request->setShipperAddressStateOrProvinceCode($regionCode);
  192. $request->setShipperAddressPostalCode(
  193. $this->_scopeConfig->getValue(
  194. Shipment::XML_PATH_STORE_ZIP,
  195. ScopeInterface::SCOPE_STORE,
  196. $shipmentStoreId
  197. )
  198. );
  199. $request->setShipperAddressCountryCode(
  200. $this->_scopeConfig->getValue(
  201. Shipment::XML_PATH_STORE_COUNTRY_ID,
  202. ScopeInterface::SCOPE_STORE,
  203. $shipmentStoreId
  204. )
  205. );
  206. }
  207. /**
  208. * Set recipient details into request
  209. * @param \Magento\Shipping\Model\Shipment\Request $request
  210. * @param \Magento\Sales\Model\Order\Address $address
  211. * @return void
  212. */
  213. protected function setRecipientDetails(Request $request, Address $address)
  214. {
  215. $request->setRecipientContactPersonName(trim($address->getFirstname() . ' ' . $address->getLastname()));
  216. $request->setRecipientContactPersonFirstName($address->getFirstname());
  217. $request->setRecipientContactPersonLastName($address->getLastname());
  218. $request->setRecipientContactCompanyName($address->getCompany());
  219. $request->setRecipientContactPhoneNumber($address->getTelephone());
  220. $request->setRecipientEmail($address->getEmail());
  221. $request->setRecipientAddressStreet(trim($address->getStreetLine(1) . ' ' . $address->getStreetLine(2)));
  222. $request->setRecipientAddressStreet1($address->getStreetLine(1));
  223. $request->setRecipientAddressStreet2($address->getStreetLine(2));
  224. $request->setRecipientAddressCity($address->getCity());
  225. $request->setRecipientAddressStateOrProvinceCode($address->getRegionCode() ?: $address->getRegion());
  226. $request->setRecipientAddressRegionCode($address->getRegionCode());
  227. $request->setRecipientAddressPostalCode($address->getPostcode());
  228. $request->setRecipientAddressCountryCode($address->getCountryId());
  229. }
  230. }