/** * {@inheritdoc} */ public function getOrderTaxDetails($orderId) { $order = $this->orderFactory->create()->load($orderId); if (!$order) { throw new NoSuchEntityException(NoSuchEntityException::MESSAGE_DOUBLE_FIELDS, ['fieldName' => 'orderId', 'fieldValue' => $orderId]); } $appliedTaxBuilder = $this->orderTaxDetailsBuilder->getAppliedTaxBuilder(); $orderItemAppliedTaxes = $this->orderItemTaxFactory->create()->getTaxItemsByOrderId($orderId); $itemsData = []; foreach ($orderItemAppliedTaxes as $itemAppliedTax) { //group applied taxes by item if (isset($itemAppliedTax['item_id'])) { //The taxable is a product $itemId = $itemAppliedTax['item_id']; if (!isset($itemsData[$itemId])) { $itemsData[$itemId] = [Item::KEY_ITEM_ID => $itemAppliedTax['item_id'], Item::KEY_TYPE => $itemAppliedTax['taxable_item_type'], Item::KEY_ASSOCIATED_ITEM_ID => null]; } $itemsData[$itemId]['applied_taxes'][$itemAppliedTax['code']] = $this->convertToAppliedTaxDataObject($appliedTaxBuilder, $itemAppliedTax); } elseif (isset($itemAppliedTax['associated_item_id'])) { //The taxable is associated with a product, e.g., weee, gift wrapping etc. $itemId = $itemAppliedTax['associated_item_id']; $key = $itemAppliedTax['taxable_item_type'] . $itemId; if (!isset($itemsData[$key])) { $itemsData[$key] = [Item::KEY_ITEM_ID => null, Item::KEY_TYPE => $itemAppliedTax['taxable_item_type'], Item::KEY_ASSOCIATED_ITEM_ID => $itemId]; } $itemsData[$key]['applied_taxes'][$itemAppliedTax['code']] = $this->convertToAppliedTaxDataObject($appliedTaxBuilder, $itemAppliedTax); } else { //The taxable is not associated with a product, e.g., shipping //Use item type as key $key = $itemAppliedTax['taxable_item_type']; if (!isset($itemsData[$key])) { $itemsData[$key] = [Item::KEY_TYPE => $itemAppliedTax['taxable_item_type'], Item::KEY_ITEM_ID => null, Item::KEY_ASSOCIATED_ITEM_ID => null]; } $itemsData[$key][Item::KEY_APPLIED_TAXES][$itemAppliedTax['code']] = $this->convertToAppliedTaxDataObject($appliedTaxBuilder, $itemAppliedTax); } } $itemBuilder = $this->orderTaxDetailsBuilder->getItemBuilder(); $items = []; foreach ($itemsData as $itemData) { $itemBuilder->setType($itemData[Item::KEY_TYPE]); $itemBuilder->setItemId($itemData[Item::KEY_ITEM_ID]); $itemBuilder->setAssociatedItemId($itemData[Item::KEY_ASSOCIATED_ITEM_ID]); $itemBuilder->setAppliedTaxes($itemData[Item::KEY_APPLIED_TAXES]); $items[] = $itemBuilder->create(); } $this->orderTaxDetailsBuilder->setItems($items); $orderAppliedTaxesDOs = $this->aggregateAppliedTaxes($appliedTaxBuilder, $items); $this->orderTaxDetailsBuilder->setAppliedTaxes($orderAppliedTaxesDOs); return $this->orderTaxDetailsBuilder->create(); }