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); $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor ?: ObjectManager::getInstance()->get(JoinProcessorInterface::class); $this->shippingAssignmentBuilder = $shippingAssignmentBuilder ?: ObjectManager::getInstance()->get(ShippingAssignmentBuilder::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(); if ($extensionAttributes === null) { $extensionAttributes = $this->orderExtensionFactory->create(); } $orderTaxDetails = $this->orderTaxManagement->getOrderTaxDetails($order->getEntityId()); $appliedTaxes = $orderTaxDetails->getAppliedTaxes(); $extensionAttributes->setAppliedTaxes($appliedTaxes); $extensionAttributes->setConvertingFromQuote(false); $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(); if ($extensionAttributes === null) { $extensionAttributes = $this->orderExtensionFactory->create(); } $paymentAdditionalInformation = []; $payment = $order->getPayment(); if ($payment) { $paymentAdditionalInformation = $payment->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->extensionAttributesJoinProcessor->process($searchResult); $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 OrderInterface $entity * @return OrderInterface * @throws InputException * @throws NoSuchEntityException * @throws \Magento\Framework\Exception\AlreadyExistsException */ public function save(\Magento\Sales\Api\Data\OrderInterface $entity) { /** @var \Magento\Sales\Api\Data\OrderExtensionInterface $extensionAttributes */ $extensionAttributes = $entity->getExtensionAttributes(); if ($entity->getIsNotVirtual() && $extensionAttributes) { $shippingAssignments = $extensionAttributes->getShippingAssignments(); if (!empty($shippingAssignments)) { $shipping = array_shift($shippingAssignments)->getShipping(); $shippingAddress = $shipping->getAddress(); $shippingEmail = ($shippingAddress !== null) ? $shippingAddress->getEmail() : null; $shippingMethod = $shipping->getMethod(); $entity->setShippingAddress($shippingAddress); $entity->setShippingMethod($shippingMethod); if (!$entity->getCustomerEmail() && $shippingEmail) { $entity->setCustomerEmail($shippingEmail); } } } $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; } $this->shippingAssignmentBuilder->setOrder($order); $extensionAttributes->setShippingAssignments($this->shippingAssignmentBuilder->create()); $order->setExtensionAttributes($extensionAttributes); } /** * 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); } } /** * @inheritDoc */ public function _resetState(): void { $this->registry = []; } }