Beispiel #1
0
 /**
  * {@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();
 }
Beispiel #2
0
 /**
  * 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;
 }