Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace Bamboo\ExtendOrderApi\Plugin\Sales\Order;
- use Magento\Framework\Api\DataObjectHelper;
- use Magento\Quote\Model\Quote\Address\ToOrderAddress as ToOrderAddressConverter;
- use Magento\Quote\Model\Quote\Payment\ToOrderPayment as ToOrderPaymentConverter;
- use Magento\Quote\Model\Quote\Address\ToOrder as ToOrderConverter;
- /**
- * Class OrderSave
- * @package Bamboo\ExtendOrderApi\Plugin\Sales\Order
- */
- class OrderSave
- {
- /**
- * @var \Amasty\Orderattr\Model\OrderAttributesManagement
- */
- protected $orderAttributesManagement;
- /**
- * @var \Magento\Framework\App\State
- */
- public $state;
- /**
- * @var \Magento\Sales\Model\OrderFactory
- */
- protected $orderRepository;
- /**
- * @var \Magento\Quote\Model\QuoteFactory
- */
- protected $quoteFactory;
- /**
- * @var \Magento\Quote\Model\Quote\Item\ToOrderItem
- */
- protected $toOrderItem;
- /**
- * @var \Makarovsoft\Oicomments\Model\ItemsFactory
- */
- protected $itemNotesFactory;
- /**
- * @var DataObjectHelper
- */
- protected $dataObjectHelper;
- /**
- * @var ToOrderConverter
- */
- protected $quoteAddressToOrder;
- /**
- * @var ToOrderAddressConverter
- */
- protected $quoteAddressToOrderAddress;
- /**
- * @var ToOrderPaymentConverter
- */
- protected $quotePaymentToOrderPayment;
- /**
- * @var ToOrderPaymentConverter
- */
- protected $currentOrder;
- /**
- * @var ToOrderPaymentConverter
- */
- protected $currentQuote;
- /**
- * OrderSave constructor.
- * @param \Amasty\Orderattr\Model\OrderAttributesManagement $orderAttributesManagement
- * @param \Magento\Framework\App\State $state
- * @param \Magento\Sales\Model\OrderFactory $orderFactory
- * @param \Magento\Quote\Model\QuoteFactory $quoteFactory
- * @param \Magento\Quote\Model\Quote\Item\ToOrderItem $toOrderItem
- * @param \Makarovsoft\Oicomments\Model\ItemsFactory $itemNotesFactory
- */
- public function __construct(
- \Amasty\Orderattr\Model\OrderAttributesManagement $orderAttributesManagement,
- \Magento\Framework\App\State $state,
- \Magento\Sales\Model\OrderFactory $orderFactory,
- \Magento\Quote\Model\QuoteFactory $quoteFactory,
- \Magento\Quote\Model\Quote\Item\ToOrderItem $toOrderItem,
- \Makarovsoft\Oicomments\Model\ItemsFactory $itemNotesFactory,
- DataObjectHelper $dataObjectHelper,
- ToOrderConverter $quoteAddressToOrder,
- ToOrderAddressConverter $quoteAddressToOrderAddress,
- ToOrderPaymentConverter $quotePaymentToOrderPayment
- ) {
- $this->orderAttributesManagement = $orderAttributesManagement;
- $this->state = $state;
- $this->orderFactory = $orderFactory;
- $this->quoteFactory = $quoteFactory;
- $this->toOrderItem = $toOrderItem;
- $this->itemNotesFactory = $itemNotesFactory;
- $this->dataObjectHelper = $dataObjectHelper;
- $this->quoteAddressToOrder = $quoteAddressToOrder;
- $this->quoteAddressToOrderAddress = $quoteAddressToOrderAddress;
- $this->quotePaymentToOrderPayment = $quotePaymentToOrderPayment;
- }
- /**
- * @param \Magento\Sales\Api\OrderRepositoryInterface $subject
- * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
- *
- * @return \Magento\Sales\Api\Data\OrderInterface
- */
- public function afterSave(
- \Magento\Sales\Api\OrderRepositoryInterface $subject,
- \Magento\Sales\Api\Data\OrderInterface $resultOrder
- ) {
- if ($this->state->getAreaCode() !== \Magento\Framework\App\Area::AREA_ADMINHTML) {
- $this->saveCustomOrderAttributes($resultOrder);
- }
- $this->currentOrder = $this->getOrder($resultOrder->getId());
- $this->currentQuote = $this->getQuote($this->currentOrder->getQuoteId());
- $this->updateOrderItemsNotes($resultOrder);
- if ($this->hasOrderItemsAttributesChanges($resultOrder)) {
- $this->updateOrderItemsAttributes($resultOrder);
- $this->recalculateTotals();
- $this->updateOrderItems($resultOrder);
- }
- return $resultOrder;
- }
- /**
- * Save custom order attributes
- *
- * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
- *
- * @return void
- */
- public function saveCustomOrderAttributes($resultOrder)
- {
- if (!$resultOrder->getExtensionAttributes()) {
- return false;
- }
- $data = [];
- $isApiCall = false;
- if ($resultOrder->getExtensionAttributes()->getSapOrderId()) {
- $isApiCall = true;
- $data['sap_order_id'] = $resultOrder->getExtensionAttributes()->getSapOrderId();
- } else {
- $data['sap_order_id'] = $resultOrder->getSapOrderId();
- }
- if ($resultOrder->getExtensionAttributes()->getPoJob()) {
- $isApiCall = true;
- $data['po_job'] = $resultOrder->getExtensionAttributes()->getPoJob();
- } else {
- $data['po_job'] = $resultOrder->getPoJob();
- }
- if ($resultOrder->getExtensionAttributes()->getSpecialInstructions()) {
- $isApiCall = true;
- $data['special_instructions'] = $resultOrder->getExtensionAttributes()->getSpecialInstructions();
- } else {
- $data['special_instructions'] = $resultOrder->getSpecialInstructions();
- }
- if ($resultOrder->getExtensionAttributes()->getProjectName()) {
- $isApiCall = true;
- $data['project_name'] = $resultOrder->getExtensionAttributes()->getProjectName();
- } else {
- $data['project_name'] = $resultOrder->getProjectName();
- }
- if ($resultOrder->getExtensionAttributes()->getCustomQuoteId()) {
- $isApiCall = true;
- $data['custom_quote_id'] = $resultOrder->getExtensionAttributes()->getCustomQuoteId();
- } else {
- $data['custom_quote_id'] = $resultOrder->getCustomQuoteId();
- }
- if ($resultOrder->getExtensionAttributes()->getCrossStreet()) {
- $isApiCall = true;
- $data['cross_street'] = $resultOrder->getExtensionAttributes()->getCrossStreet();
- } else {
- $data['cross_street'] = $resultOrder->getCrossStreet();
- }
- // If in $resultOrder->getExtensionAttributes() is any attribute from listed above, then this is update was called through API
- if ($isApiCall === true) {
- $this->orderAttributesManagement->saveOrderAttributes($resultOrder->getId(), $data);
- } else {
- $this->orderAttributesManagement->saveOrderAttributes($resultOrder, null);
- }
- }
- /**
- * Get current order model with all attributes
- *
- * @param int $id
- *
- * @return \Magento\Sales\Model\Order
- */
- public function getOrder($id)
- {
- return $this->orderFactory->create()->load($id);
- }
- /**
- * Get quote model with all attributes
- *
- * @param int $id
- *
- * @return \Magento\Quote\Model\Quote
- */
- public function getQuote($id)
- {
- return $this->quoteFactory->create()->load($id);
- }
- /**
- * Update Order Items custom attribute - Item Notes
- *
- * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
- *
- * @return void
- */
- public function updateOrderItemsNotes($resultOrder)
- {
- foreach ($resultOrder->getItems() as $item) {
- if (!$item->getExtensionAttributes() || !$item->getExtensionAttributes()->getItemNotes()) {
- continue;
- }
- $orderItem = $this->currentOrder->getItemById($item->getId());
- $configurableProductTypeCode = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
- if (!$orderItem || $orderItem->getProductType() !== $configurableProductTypeCode) {
- continue;
- }
- $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
- if (!$quoteItem) {
- continue;
- }
- $itemNotesModel = $this->getItemNotes($quoteItem);
- if ($itemNotesModel->getComment() !== $item->getExtensionAttributes()->getItemNotes()) {
- $this->saveItemNotes($itemNotesModel, $quoteItem, $item->getExtensionAttributes()->getItemNotes());
- }
- }
- }
- /**
- * Get Item Notes attribute model
- *
- * @param \Magento\Quote\Model\Quote\Item $quoteItem
- *
- * @return \Makarovsoft\Oicomments\Model\Items
- */
- public function getItemNotes($quoteItem)
- {
- return $this->itemNotesFactory->create()->load($quoteItem->getId(), 'quote_id');
- }
- /**
- * Save Item Notes attribute
- *
- * @param \Makarovsoft\Oicomments\Model\Items $itemNotesModel
- * @param \Magento\Quote\Model\Quote\Item $quoteItem
- * @param string $itemNotesValue
- *
- * @return void
- */
- public function saveItemNotes($itemNotesModel, $quoteItem, $itemNotesValue)
- {
- $itemNotesModel->addData([
- 'quote_id' => $quoteItem->getId(),
- 'order_id' => $quoteItem->getQuoteId(),
- 'comment' => $itemNotesValue
- ]);
- $itemNotesModel->save();
- }
- /**
- * Check if Order Items Attributes was changed
- *
- * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
- *
- * @return bool
- */
- public function hasOrderItemsAttributesChanges($resultOrder)
- {
- foreach ($resultOrder->getItems() as $item) {
- $orderItem = $this->currentOrder->getItemById($item->getId());
- $configurableProductTypeCode = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
- if (!$orderItem || $orderItem->getProductType() !== $configurableProductTypeCode) {
- continue;
- }
- $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
- if (!$quoteItem) {
- continue;
- }
- if ($orderItem->getQtyOrdered() != $quoteItem->getQty()) {
- return true;
- }
- if ($orderItem->getPrice() != $quoteItem->getPrice()) {
- return true;
- }
- }
- return false;
- }
- /**
- * Update Order Items Attributes
- *
- * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
- *
- * @return void
- */
- public function updateOrderItemsAttributes($resultOrder)
- {
- foreach ($resultOrder->getItems() as $item) {
- $orderItem = $this->currentOrder->getItemById($item->getId());
- $configurableProductTypeCode = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
- if (!$orderItem || $orderItem->getProductType() !== $configurableProductTypeCode) {
- continue;
- }
- $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
- if (!$quoteItem) {
- continue;
- }
- $isQuoteItemChanged = false;
- if ($orderItem->getQtyOrdered() != $quoteItem->getQty()) {
- $quoteItem->setQty((double) $orderItem->getQtyOrdered());
- $isQuoteItemChanged = true;
- }
- if ($orderItem->getPrice() != $quoteItem->getPrice()) {
- $quoteItem->setCustomPrice($orderItem->getPrice());
- $quoteItem->setOriginalCustomPrice($orderItem->getPrice());
- $quoteItem->getProduct()->setIsSuperMode(true);
- $isQuoteItemChanged = true;
- }
- if ($isQuoteItemChanged) {
- $quoteItem->save();
- }
- $convertedOrderItem = $this->toOrderItem->convert($quoteItem);
- $orderItem->addData($convertedOrderItem->getData());
- }
- }
- /**
- * Recalculate Totals with updated attributes values
- *
- * @return void
- */
- public function recalculateTotals()
- {
- /** Recalculating of quote totals. */
- $this->currentQuote->getShippingAddress()->setCollectShippingRates(true);
- $this->currentQuote->setTotalsCollectedFlag(false)->collectTotals();
- $this->currentQuote->save();
- /** Convert quote to order */
- $this->dataObjectHelper->mergeDataObjects(
- \Magento\Sales\Api\Data\OrderInterface::class,
- $this->currentOrder,
- $this->quoteAddressToOrder->convert($this->currentQuote->getShippingAddress(), [])
- );
- /** Convert quote shipping address to order shipping address */
- $shippingAddress = $this->quoteAddressToOrderAddress->convert(
- $this->currentQuote->getShippingAddress(),
- ['address_type' => 'shipping', 'email' => $this->currentQuote->getCustomerEmail()]
- );
- $this->currentOrder->getShippingAddress()->setData(array_merge(
- $this->currentOrder->getShippingAddress()->getData(),
- $shippingAddress->getData()
- ))->save();
- $this->currentOrder->setShippingMethod($this->currentQuote->getShippingAddress()->getShippingMethod());
- /** Convert quote payment to order payment */
- $payment = $this->quotePaymentToOrderPayment->convert($this->currentQuote->getPayment());
- $this->currentOrder->getPayment()->setData(array_merge(
- $this->currentOrder->getPayment()->getData(),
- $payment->getData()
- ));
- $this->currentOrder->save();
- }
- /**
- * Update order items
- *
- * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
- *
- * @return void
- */
- private function updateOrderItems($resultOrder)
- {
- foreach ($resultOrder->getItems() as $item) {
- $orderItem = $this->currentOrder->getItemById($item->getId());
- $quoteItem = $this->currentQuote->getItemById($orderItem->getQuoteItemId());
- if (!$orderItem->getId() || !$quoteItem->getId()) {
- continue;
- }
- /** Set parent item if exists. */
- $parentItem = $quoteItem->getParentItemId()
- ? $this->currentOrder->getItemByQuoteItemId($quoteItem->getParentItemId())
- : null;
- /** Convert quote item to order item. */
- $convertedOrderItem = $this->toOrderItem->convert(
- $quoteItem,
- ['parent_item' => $parentItem]
- );
- $orderItem->setData(array_merge($orderItem->getData(), $convertedOrderItem->getData()))->save();
- }
- }
- }
Add Comment
Please, Sign In to add comment