/** * {@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(); }
/** * Get calculated taxes for each tax class * * This method returns array with format: * array( * $index => array( * 'tax_amount' => $taxAmount, * 'base_tax_amount' => $baseTaxAmount, * 'hidden_tax_amount' => $hiddenTaxAmount, * 'title' => $title, * 'percent' => $percent * ) * ) * * @param \Magento\Sales\Model\Order $source * @return array */ public function getCalculatedTaxes($source) { if ($this->_coreRegistry->registry('current_invoice')) { $current = $this->_coreRegistry->registry('current_invoice'); } elseif ($this->_coreRegistry->registry('current_creditmemo')) { $current = $this->_coreRegistry->registry('current_creditmemo'); } else { $current = $source; } $taxClassAmount = array(); if ($current && $source) { if ($current == $source) { // use the actuals $rates = $this->_getTaxRateSubtotals($source); foreach ($rates['items'] as $rate) { $taxClassId = $rate['tax_id']; $taxClassAmount[$taxClassId]['tax_amount'] = $rate['amount']; $taxClassAmount[$taxClassId]['base_tax_amount'] = $rate['base_amount']; $taxClassAmount[$taxClassId]['title'] = $rate['title']; $taxClassAmount[$taxClassId]['percent'] = $rate['percent']; } } else { // regenerate tax subtotals // Calculate taxes for shipping $shippingTaxAmount = $current->getShippingTaxAmount(); if ($shippingTaxAmount) { $shippingTax = $this->getShippingTax($current); $taxClassAmount = array_merge($taxClassAmount, $shippingTax); } /** @var $item \Magento\Sales\Model\Order\Item */ foreach ($current->getItemsCollection() as $item) { /** @var $taxCollection \Magento\Tax\Model\Resource\Sales\Order\Tax\Item */ $taxCollection = $this->_taxItemFactory->create(); $taxCollection->getTaxItemsByItemId($item->getOrderItemId() ? $item->getOrderItemId() : $item->getItemId()); foreach ($taxCollection as $tax) { $taxClassId = $tax['tax_id']; $percent = $tax['tax_percent']; $price = $item->getRowTotal(); $basePrice = $item->getBaseRowTotal(); if ($this->applyTaxAfterDiscount($item->getStoreId())) { $price = $price - $item->getDiscountAmount() + $item->getHiddenTaxAmount(); $basePrice = $basePrice - $item->getBaseDiscountAmount() + $item->getBaseHiddenTaxAmount(); } $taxAmount = $price * $percent / 100; $baseTaxAmount = $basePrice * $percent / 100; if (isset($taxClassAmount[$taxClassId])) { $taxClassAmount[$taxClassId]['tax_amount'] += $taxAmount; $taxClassAmount[$taxClassId]['base_tax_amount'] += $baseTaxAmount; } else { $taxClassAmount[$taxClassId]['tax_amount'] = $taxAmount; $taxClassAmount[$taxClassId]['base_tax_amount'] = $baseTaxAmount; $taxClassAmount[$taxClassId]['title'] = $tax['title']; $taxClassAmount[$taxClassId]['percent'] = $tax['percent']; } } } } foreach ($taxClassAmount as $key => $tax) { if ($tax['tax_amount'] == 0 && $tax['base_tax_amount'] == 0) { unset($taxClassAmount[$key]); } } $taxClassAmount = array_values($taxClassAmount); } return $taxClassAmount; }