metadata = $metadata; $this->searchResultFactory = $searchResultFactory; $this->collectionProcessor = $collectionProcessor ?: ObjectManager::getInstance() ->get(\Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class); $this->orderExtensionFactory = $orderExtensionFactory ?: ObjectManager::getInstance() ->get(\Magento\Sales\Api\Data\OrderExtensionFactory::class); $this->orderTaxManagement = $orderTaxManagement ?: ObjectManager::getInstance() ->get(OrderTaxManagementInterface::class); $this->paymentAdditionalInfoFactory = $paymentAdditionalInfoFactory ?: ObjectManager::getInstance() ->get(PaymentAdditionalInfoInterfaceFactory::class); $this->serializer = $serializer ?: ObjectManager::getInstance() ->get(JsonSerializer::class); } /** * Load entity * * @param int $id * @return \Magento\Sales\Api\Data\OrderInterface * @throws \Magento\Framework\Exception\InputException * @throws \Magento\Framework\Exception\NoSuchEntityException */ public function get($id) { if (!$id) { throw new InputException(__('An ID is needed. Set the ID and try again.')); } if (!isset($this->registry[$id])) { /** @var OrderInterface $entity */ $entity = $this->metadata->getNewInstance()->load($id); if (!$entity->getEntityId()) { throw new NoSuchEntityException( __("The entity that was requested doesn't exist. Verify the entity and try again.") ); } $this->setOrderTaxDetails($entity); $this->setShippingAssignments($entity); $this->setPaymentAdditionalInfo($entity); $this->registry[$id] = $entity; } return $this->registry[$id]; } /** * Set order tax details to extension attributes. * * @param OrderInterface $order * @return void */ private function setOrderTaxDetails(OrderInterface $order) { $extensionAttributes = $order->getExtensionAttributes(); $orderTaxDetails = $this->orderTaxManagement->getOrderTaxDetails($order->getEntityId()); $appliedTaxes = $orderTaxDetails->getAppliedTaxes(); $extensionAttributes->setAppliedTaxes($appliedTaxes); if (!empty($appliedTaxes)) { $extensionAttributes->setConvertingFromQuote(true); } $items = $orderTaxDetails->getItems(); $extensionAttributes->setItemAppliedTaxes($items); $order->setExtensionAttributes($extensionAttributes); } /** * Set additional info to the order. * * @param OrderInterface $order * @return void */ private function setPaymentAdditionalInfo(OrderInterface $order): void { $extensionAttributes = $order->getExtensionAttributes(); $paymentAdditionalInformation = $order->getPayment()->getAdditionalInformation(); $objects = []; foreach ($paymentAdditionalInformation as $key => $value) { /** @var PaymentAdditionalInfoInterface $additionalInformationObject */ $additionalInformationObject = $this->paymentAdditionalInfoFactory->create(); $additionalInformationObject->setKey($key); if (!is_string($value)) { $value = $this->serializer->serialize($value); } $additionalInformationObject->setValue($value); $objects[] = $additionalInformationObject; } $extensionAttributes->setPaymentAdditionalInfo($objects); $order->setExtensionAttributes($extensionAttributes); } /** * Find entities by criteria * * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria * @return \Magento\Sales\Api\Data\OrderSearchResultInterface */ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria) { /** @var \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create(); $this->collectionProcessor->process($searchCriteria, $searchResult); $searchResult->setSearchCriteria($searchCriteria); foreach ($searchResult->getItems() as $order) { $this->setShippingAssignments($order); $this->setOrderTaxDetails($order); $this->setPaymentAdditionalInfo($order); } return $searchResult; } /** * Register entity to delete * * @param \Magento\Sales\Api\Data\OrderInterface $entity * @return bool */ public function delete(\Magento\Sales\Api\Data\OrderInterface $entity) { $this->metadata->getMapper()->delete($entity); unset($this->registry[$entity->getEntityId()]); return true; } /** * Delete entity by Id * * @param int $id * @return bool */ public function deleteById($id) { $entity = $this->get($id); return $this->delete($entity); } /** * Perform persist operations for one entity * * @param \Magento\Sales\Api\Data\OrderInterface $entity * @return \Magento\Sales\Api\Data\OrderInterface */ public function save(\Magento\Sales\Api\Data\OrderInterface $entity) { /** @var \Magento\Sales\Api\Data\OrderExtensionInterface $extensionAttributes */ $extensionAttributes = $entity->getExtensionAttributes(); if ($entity->getIsNotVirtual() && $extensionAttributes && $extensionAttributes->getShippingAssignments()) { $shippingAssignments = $extensionAttributes->getShippingAssignments(); if (!empty($shippingAssignments)) { $shipping = array_shift($shippingAssignments)->getShipping(); $entity->setShippingAddress($shipping->getAddress()); $entity->setShippingMethod($shipping->getMethod()); } } $this->metadata->getMapper()->save($entity); $this->registry[$entity->getEntityId()] = $entity; return $this->registry[$entity->getEntityId()]; } /** * Set shipping assignments to extension attributes. * * @param OrderInterface $order * @return void */ private function setShippingAssignments(OrderInterface $order) { /** @var OrderExtensionInterface $extensionAttributes */ $extensionAttributes = $order->getExtensionAttributes(); if ($extensionAttributes === null) { $extensionAttributes = $this->orderExtensionFactory->create(); } elseif ($extensionAttributes->getShippingAssignments() !== null) { return; } /** @var ShippingAssignmentInterface $shippingAssignment */ $shippingAssignments = $this->getShippingAssignmentBuilderDependency(); $shippingAssignments->setOrderId($order->getEntityId()); $extensionAttributes->setShippingAssignments($shippingAssignments->create()); $order->setExtensionAttributes($extensionAttributes); } /** * Get the new ShippingAssignmentBuilder dependency for application code * * @return ShippingAssignmentBuilder * @deprecated 100.0.4 */ private function getShippingAssignmentBuilderDependency() { if (!$this->shippingAssignmentBuilder instanceof ShippingAssignmentBuilder) { $this->shippingAssignmentBuilder = \Magento\Framework\App\ObjectManager::getInstance()->get( \Magento\Sales\Model\Order\ShippingAssignmentBuilder::class ); } return $this->shippingAssignmentBuilder; } /** * Helper function that adds a FilterGroup to the collection. * * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup * @param \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult * @return void * @deprecated 101.0.0 * @throws \Magento\Framework\Exception\InputException */ protected function addFilterGroupToCollection( \Magento\Framework\Api\Search\FilterGroup $filterGroup, \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult ) { $fields = []; $conditions = []; foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $conditions[] = [$condition => $filter->getValue()]; $fields[] = $filter->getField(); } if ($fields) { $searchResult->addFieldToFilter($fields, $conditions); } } }