Guest User

Untitled

a guest
Jan 15th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.34 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Bamboo\ExtendOrderApi\Plugin\Sales\Order;
  4.  
  5. use Magento\Framework\Api\DataObjectHelper;
  6. use Magento\Quote\Model\Quote\Address\ToOrderAddress as ToOrderAddressConverter;
  7. use Magento\Quote\Model\Quote\Payment\ToOrderPayment as ToOrderPaymentConverter;
  8. use Magento\Quote\Model\Quote\Address\ToOrder as ToOrderConverter;
  9.  
  10. /**
  11. * Class OrderSave
  12. * @package Bamboo\ExtendOrderApi\Plugin\Sales\Order
  13. */
  14. class OrderSave
  15. {
  16. /**
  17. * @var \Amasty\Orderattr\Model\OrderAttributesManagement
  18. */
  19. protected $orderAttributesManagement;
  20.  
  21. /**
  22. * @var \Magento\Framework\App\State
  23. */
  24. public $state;
  25.  
  26. /**
  27. * @var \Magento\Sales\Model\OrderFactory
  28. */
  29. protected $orderRepository;
  30.  
  31. /**
  32. * @var \Magento\Quote\Model\QuoteFactory
  33. */
  34. protected $quoteFactory;
  35.  
  36. /**
  37. * @var \Magento\Quote\Model\Quote\Item\ToOrderItem
  38. */
  39. protected $toOrderItem;
  40.  
  41. /**
  42. * @var \Makarovsoft\Oicomments\Model\ItemsFactory
  43. */
  44. protected $itemNotesFactory;
  45.  
  46. /**
  47. * @var DataObjectHelper
  48. */
  49. protected $dataObjectHelper;
  50.  
  51. /**
  52. * @var ToOrderConverter
  53. */
  54. protected $quoteAddressToOrder;
  55.  
  56. /**
  57. * @var ToOrderAddressConverter
  58. */
  59. protected $quoteAddressToOrderAddress;
  60.  
  61. /**
  62. * @var ToOrderPaymentConverter
  63. */
  64. protected $quotePaymentToOrderPayment;
  65.  
  66. /**
  67. * @var ToOrderPaymentConverter
  68. */
  69. protected $currentOrder;
  70.  
  71. /**
  72. * @var ToOrderPaymentConverter
  73. */
  74. protected $currentQuote;
  75.  
  76. /**
  77. * OrderSave constructor.
  78. * @param \Amasty\Orderattr\Model\OrderAttributesManagement $orderAttributesManagement
  79. * @param \Magento\Framework\App\State $state
  80. * @param \Magento\Sales\Model\OrderFactory $orderFactory
  81. * @param \Magento\Quote\Model\QuoteFactory $quoteFactory
  82. * @param \Magento\Quote\Model\Quote\Item\ToOrderItem $toOrderItem
  83. * @param \Makarovsoft\Oicomments\Model\ItemsFactory $itemNotesFactory
  84. */
  85. public function __construct(
  86. \Amasty\Orderattr\Model\OrderAttributesManagement $orderAttributesManagement,
  87. \Magento\Framework\App\State $state,
  88. \Magento\Sales\Model\OrderFactory $orderFactory,
  89. \Magento\Quote\Model\QuoteFactory $quoteFactory,
  90. \Magento\Quote\Model\Quote\Item\ToOrderItem $toOrderItem,
  91. \Makarovsoft\Oicomments\Model\ItemsFactory $itemNotesFactory,
  92. DataObjectHelper $dataObjectHelper,
  93. ToOrderConverter $quoteAddressToOrder,
  94. ToOrderAddressConverter $quoteAddressToOrderAddress,
  95. ToOrderPaymentConverter $quotePaymentToOrderPayment
  96. ) {
  97. $this->orderAttributesManagement = $orderAttributesManagement;
  98. $this->state = $state;
  99. $this->orderFactory = $orderFactory;
  100. $this->quoteFactory = $quoteFactory;
  101. $this->toOrderItem = $toOrderItem;
  102. $this->itemNotesFactory = $itemNotesFactory;
  103. $this->dataObjectHelper = $dataObjectHelper;
  104. $this->quoteAddressToOrder = $quoteAddressToOrder;
  105. $this->quoteAddressToOrderAddress = $quoteAddressToOrderAddress;
  106. $this->quotePaymentToOrderPayment = $quotePaymentToOrderPayment;
  107. }
  108.  
  109. /**
  110. * @param \Magento\Sales\Api\OrderRepositoryInterface $subject
  111. * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
  112. *
  113. * @return \Magento\Sales\Api\Data\OrderInterface
  114. */
  115. public function afterSave(
  116. \Magento\Sales\Api\OrderRepositoryInterface $subject,
  117. \Magento\Sales\Api\Data\OrderInterface $resultOrder
  118. ) {
  119. if ($this->state->getAreaCode() !== \Magento\Framework\App\Area::AREA_ADMINHTML) {
  120. $this->saveCustomOrderAttributes($resultOrder);
  121. }
  122.  
  123. $this->currentOrder = $this->getOrder($resultOrder->getId());
  124. $this->currentQuote = $this->getQuote($this->currentOrder->getQuoteId());
  125.  
  126. $this->updateOrderItemsNotes($resultOrder);
  127.  
  128. if ($this->hasOrderItemsAttributesChanges($resultOrder)) {
  129. $this->updateOrderItemsAttributes($resultOrder);
  130. $this->recalculateTotals();
  131. $this->updateOrderItems($resultOrder);
  132. }
  133.  
  134. return $resultOrder;
  135. }
  136.  
  137. /**
  138. * Save custom order attributes
  139. *
  140. * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
  141. *
  142. * @return void
  143. */
  144. public function saveCustomOrderAttributes($resultOrder)
  145. {
  146. if (!$resultOrder->getExtensionAttributes()) {
  147. return false;
  148. }
  149.  
  150. $data = [];
  151. $isApiCall = false;
  152. if ($resultOrder->getExtensionAttributes()->getSapOrderId()) {
  153. $isApiCall = true;
  154. $data['sap_order_id'] = $resultOrder->getExtensionAttributes()->getSapOrderId();
  155. } else {
  156. $data['sap_order_id'] = $resultOrder->getSapOrderId();
  157. }
  158.  
  159. if ($resultOrder->getExtensionAttributes()->getPoJob()) {
  160. $isApiCall = true;
  161. $data['po_job'] = $resultOrder->getExtensionAttributes()->getPoJob();
  162. } else {
  163. $data['po_job'] = $resultOrder->getPoJob();
  164. }
  165.  
  166. if ($resultOrder->getExtensionAttributes()->getSpecialInstructions()) {
  167. $isApiCall = true;
  168. $data['special_instructions'] = $resultOrder->getExtensionAttributes()->getSpecialInstructions();
  169. } else {
  170. $data['special_instructions'] = $resultOrder->getSpecialInstructions();
  171. }
  172.  
  173. if ($resultOrder->getExtensionAttributes()->getProjectName()) {
  174. $isApiCall = true;
  175. $data['project_name'] = $resultOrder->getExtensionAttributes()->getProjectName();
  176. } else {
  177. $data['project_name'] = $resultOrder->getProjectName();
  178. }
  179.  
  180. if ($resultOrder->getExtensionAttributes()->getCustomQuoteId()) {
  181. $isApiCall = true;
  182. $data['custom_quote_id'] = $resultOrder->getExtensionAttributes()->getCustomQuoteId();
  183. } else {
  184. $data['custom_quote_id'] = $resultOrder->getCustomQuoteId();
  185. }
  186.  
  187. if ($resultOrder->getExtensionAttributes()->getCrossStreet()) {
  188. $isApiCall = true;
  189. $data['cross_street'] = $resultOrder->getExtensionAttributes()->getCrossStreet();
  190. } else {
  191. $data['cross_street'] = $resultOrder->getCrossStreet();
  192. }
  193.  
  194. // If in $resultOrder->getExtensionAttributes() is any attribute from listed above, then this is update was called through API
  195. if ($isApiCall === true) {
  196. $this->orderAttributesManagement->saveOrderAttributes($resultOrder->getId(), $data);
  197. } else {
  198. $this->orderAttributesManagement->saveOrderAttributes($resultOrder, null);
  199. }
  200. }
  201.  
  202. /**
  203. * Get current order model with all attributes
  204. *
  205. * @param int $id
  206. *
  207. * @return \Magento\Sales\Model\Order
  208. */
  209. public function getOrder($id)
  210. {
  211. return $this->orderFactory->create()->load($id);
  212. }
  213.  
  214. /**
  215. * Get quote model with all attributes
  216. *
  217. * @param int $id
  218. *
  219. * @return \Magento\Quote\Model\Quote
  220. */
  221. public function getQuote($id)
  222. {
  223. return $this->quoteFactory->create()->load($id);
  224. }
  225.  
  226. /**
  227. * Update Order Items custom attribute - Item Notes
  228. *
  229. * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
  230. *
  231. * @return void
  232. */
  233. public function updateOrderItemsNotes($resultOrder)
  234. {
  235. foreach ($resultOrder->getItems() as $item) {
  236. if (!$item->getExtensionAttributes() || !$item->getExtensionAttributes()->getItemNotes()) {
  237. continue;
  238. }
  239.  
  240. $orderItem = $this->currentOrder->getItemById($item->getId());
  241. $configurableProductTypeCode = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
  242. if (!$orderItem || $orderItem->getProductType() !== $configurableProductTypeCode) {
  243. continue;
  244. }
  245.  
  246. $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
  247. if (!$quoteItem) {
  248. continue;
  249. }
  250.  
  251. $itemNotesModel = $this->getItemNotes($quoteItem);
  252. if ($itemNotesModel->getComment() !== $item->getExtensionAttributes()->getItemNotes()) {
  253. $this->saveItemNotes($itemNotesModel, $quoteItem, $item->getExtensionAttributes()->getItemNotes());
  254. }
  255. }
  256. }
  257.  
  258.  
  259. /**
  260. * Get Item Notes attribute model
  261. *
  262. * @param \Magento\Quote\Model\Quote\Item $quoteItem
  263. *
  264. * @return \Makarovsoft\Oicomments\Model\Items
  265. */
  266. public function getItemNotes($quoteItem)
  267. {
  268. return $this->itemNotesFactory->create()->load($quoteItem->getId(), 'quote_id');
  269. }
  270.  
  271.  
  272. /**
  273. * Save Item Notes attribute
  274. *
  275. * @param \Makarovsoft\Oicomments\Model\Items $itemNotesModel
  276. * @param \Magento\Quote\Model\Quote\Item $quoteItem
  277. * @param string $itemNotesValue
  278. *
  279. * @return void
  280. */
  281. public function saveItemNotes($itemNotesModel, $quoteItem, $itemNotesValue)
  282. {
  283. $itemNotesModel->addData([
  284. 'quote_id' => $quoteItem->getId(),
  285. 'order_id' => $quoteItem->getQuoteId(),
  286. 'comment' => $itemNotesValue
  287. ]);
  288.  
  289. $itemNotesModel->save();
  290. }
  291.  
  292. /**
  293. * Check if Order Items Attributes was changed
  294. *
  295. * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
  296. *
  297. * @return bool
  298. */
  299. public function hasOrderItemsAttributesChanges($resultOrder)
  300. {
  301. foreach ($resultOrder->getItems() as $item) {
  302. $orderItem = $this->currentOrder->getItemById($item->getId());
  303. $configurableProductTypeCode = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
  304. if (!$orderItem || $orderItem->getProductType() !== $configurableProductTypeCode) {
  305. continue;
  306. }
  307.  
  308. $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
  309. if (!$quoteItem) {
  310. continue;
  311. }
  312.  
  313. if ($orderItem->getQtyOrdered() != $quoteItem->getQty()) {
  314. return true;
  315. }
  316.  
  317. if ($orderItem->getPrice() != $quoteItem->getPrice()) {
  318. return true;
  319. }
  320. }
  321.  
  322. return false;
  323. }
  324.  
  325. /**
  326. * Update Order Items Attributes
  327. *
  328. * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
  329. *
  330. * @return void
  331. */
  332. public function updateOrderItemsAttributes($resultOrder)
  333. {
  334.  
  335. foreach ($resultOrder->getItems() as $item) {
  336. $orderItem = $this->currentOrder->getItemById($item->getId());
  337. $configurableProductTypeCode = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
  338. if (!$orderItem || $orderItem->getProductType() !== $configurableProductTypeCode) {
  339. continue;
  340. }
  341.  
  342. $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
  343. if (!$quoteItem) {
  344. continue;
  345. }
  346.  
  347. $isQuoteItemChanged = false;
  348. if ($orderItem->getQtyOrdered() != $quoteItem->getQty()) {
  349. $quoteItem->setQty((double) $orderItem->getQtyOrdered());
  350. $isQuoteItemChanged = true;
  351. }
  352.  
  353. if ($orderItem->getPrice() != $quoteItem->getPrice()) {
  354. $quoteItem->setCustomPrice($orderItem->getPrice());
  355. $quoteItem->setOriginalCustomPrice($orderItem->getPrice());
  356. $quoteItem->getProduct()->setIsSuperMode(true);
  357. $isQuoteItemChanged = true;
  358. }
  359.  
  360. if ($isQuoteItemChanged) {
  361. $quoteItem->save();
  362. }
  363.  
  364. $convertedOrderItem = $this->toOrderItem->convert($quoteItem);
  365. $orderItem->addData($convertedOrderItem->getData());
  366. }
  367. }
  368.  
  369. /**
  370. * Recalculate Totals with updated attributes values
  371. *
  372. * @return void
  373. */
  374. public function recalculateTotals()
  375. {
  376. /** Recalculating of quote totals. */
  377. $this->currentQuote->getShippingAddress()->setCollectShippingRates(true);
  378. $this->currentQuote->setTotalsCollectedFlag(false)->collectTotals();
  379. $this->currentQuote->save();
  380.  
  381. /** Convert quote to order */
  382. $this->dataObjectHelper->mergeDataObjects(
  383. \Magento\Sales\Api\Data\OrderInterface::class,
  384. $this->currentOrder,
  385. $this->quoteAddressToOrder->convert($this->currentQuote->getShippingAddress(), [])
  386. );
  387.  
  388. /** Convert quote shipping address to order shipping address */
  389. $shippingAddress = $this->quoteAddressToOrderAddress->convert(
  390. $this->currentQuote->getShippingAddress(),
  391. ['address_type' => 'shipping', 'email' => $this->currentQuote->getCustomerEmail()]
  392. );
  393.  
  394. $this->currentOrder->getShippingAddress()->setData(array_merge(
  395. $this->currentOrder->getShippingAddress()->getData(),
  396. $shippingAddress->getData()
  397. ))->save();
  398.  
  399. $this->currentOrder->setShippingMethod($this->currentQuote->getShippingAddress()->getShippingMethod());
  400.  
  401. /** Convert quote payment to order payment */
  402. $payment = $this->quotePaymentToOrderPayment->convert($this->currentQuote->getPayment());
  403. $this->currentOrder->getPayment()->setData(array_merge(
  404. $this->currentOrder->getPayment()->getData(),
  405. $payment->getData()
  406. ));
  407.  
  408. $this->currentOrder->save();
  409. }
  410.  
  411. /**
  412. * Update order items
  413. *
  414. * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
  415. *
  416. * @return void
  417. */
  418. private function updateOrderItems($resultOrder)
  419. {
  420. foreach ($resultOrder->getItems() as $item) {
  421. $orderItem = $this->currentOrder->getItemById($item->getId());
  422. $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
  423. if (!$orderItem->getId() || !$quoteItem->getId()) {
  424. continue;
  425. }
  426.  
  427. /** Set parent item if exists. */
  428. $parentItem = $quoteItem->getParentItemId()
  429. ? $this->currentOrder->getItemByQuoteItemId($quoteItem->getParentItemId())
  430. : null;
  431.  
  432. /** Convert quote item to order item. */
  433. $convertedOrderItem = $this->toOrderItem->convert(
  434. $quoteItem,
  435. ['parent_item' => $parentItem]
  436. );
  437.  
  438. $orderItem->setData(array_merge($orderItem->getData(), $convertedOrderItem->getData()))->save();
  439. }
  440. }
  441. }
Add Comment
Please, Sign In to add comment