/** * Get full information about taxes applied to order * * @return array */ public function getFullTaxInfo() { $source = $this->getSource(); if (!$source instanceof \Magento\Sales\Model\Order\Invoice && !$source instanceof \Magento\Sales\Model\Order\Creditmemo) { $source = $this->getOrder(); } $taxClassAmount = []; if (empty($source)) { return $taxClassAmount; } $taxClassAmount = $this->_taxHelper->getCalculatedTaxes($source); if (empty($taxClassAmount)) { $rates = $this->_taxOrderFactory->create()->getCollection()->loadByOrder($source)->toArray(); $taxClassAmount = $this->_taxCalculation->reproduceProcess($rates['items']); } return $taxClassAmount; }
/** * Get full information about taxes applied to order * * @return array */ public function getFullTaxInfo() { /** @var $source \Magento\Sales\Model\Order */ $source = $this->getOrder(); $taxClassAmount = array(); if ($source instanceof \Magento\Sales\Model\Order) { $taxClassAmount = $this->_taxHelper->getCalculatedTaxes($source); if (empty($taxClassAmount)) { $rates = $this->_taxOrderFactory->create()->getCollection()->loadByOrder($source)->toArray(); $taxClassAmount = $this->_taxCalculation->reproduceProcess($rates['items']); } } return $taxClassAmount; }
/** * @param \Magento\Sales\Api\Data\OrderInterface $order * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function saveOrderTax(\Magento\Sales\Api\Data\OrderInterface $order) { $extensionAttribute = $order->getExtensionAttributes(); if (!$extensionAttribute || !$extensionAttribute->getConvertingFromQuote() || $order->getAppliedTaxIsSaved()) { return; } /** @var \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxInterface[]|null $taxes */ $taxes = $extensionAttribute->getAppliedTaxes(); if ($taxes == null) { $taxes = []; } /** @var \Magento\Tax\Api\Data\OrderTaxDetailsItemInterface[]|null $taxesForItems */ $taxesForItems = $extensionAttribute->getItemAppliedTaxes(); if ($taxesForItems == null) { $taxesForItems = []; } $ratesIdQuoteItemId = []; foreach ($taxesForItems as $taxesArray) { foreach ($taxesArray['applied_taxes'] as $rates) { if (isset($rates['extension_attributes'])) { /** @var \Magento\Tax\Api\Data\AppliedTaxRateInterface[] $taxRates */ $taxRates = $rates['extension_attributes']->getRates(); if (is_array($taxRates)) { if (count($taxRates) == 1) { $ratesIdQuoteItemId[$rates['id']][] = ['id' => $taxesArray['item_id'], 'percent' => $rates['percent'], 'code' => $taxRates[0]['code'], 'associated_item_id' => $taxesArray['associated_item_id'], 'item_type' => $taxesArray['type'], 'amount' => $rates['amount'], 'base_amount' => $rates['base_amount'], 'real_amount' => $rates['amount'], 'real_base_amount' => $rates['base_amount']]; } else { $percentSum = 0; foreach ($taxRates as $rate) { $realAmount = $rates['amount'] * $rate['percent'] / $rates['percent']; $realBaseAmount = $rates['base_amount'] * $rate['percent'] / $rates['percent']; $ratesIdQuoteItemId[$rates['id']][] = ['id' => $taxesArray['item_id'], 'percent' => $rate['percent'], 'code' => $rate['code'], 'associated_item_id' => $taxesArray['associated_item_id'], 'item_type' => $taxesArray['type'], 'amount' => $rates['amount'], 'base_amount' => $rates['base_amount'], 'real_amount' => $realAmount, 'real_base_amount' => $realBaseAmount]; $percentSum += $rate['percent']; } } } } } } foreach ($taxes as $row) { $id = $row['id']; if (isset($row['extension_attributes'])) { /** @var \Magento\Tax\Api\Data\AppliedTaxRateInterface[] $taxRates */ $taxRates = $row['extension_attributes']->getRates(); if (is_array($taxRates)) { foreach ($taxRates as $tax) { if ($row['percent'] == null) { $baseRealAmount = $row['base_amount']; } else { if ($row['percent'] == 0 || $tax['percent'] == 0) { continue; } $baseRealAmount = $row['base_amount'] / $row['percent'] * $tax['percent']; } $hidden = isset($row['hidden']) ? $row['hidden'] : 0; $priority = isset($tax['priority']) ? $tax['priority'] : 0; $position = isset($tax['position']) ? $tax['position'] : 0; $process = isset($row['process']) ? $row['process'] : 0; $data = ['order_id' => $order->getEntityId(), 'code' => $tax['code'], 'title' => $tax['title'], 'hidden' => $hidden, 'percent' => $tax['percent'], 'priority' => $priority, 'position' => $position, 'amount' => $row['amount'], 'base_amount' => $row['base_amount'], 'process' => $process, 'base_real_amount' => $baseRealAmount]; /** @var $orderTax \Magento\Tax\Model\Sales\Order\Tax */ $orderTax = $this->orderTaxFactory->create(); $result = $orderTax->setData($data)->save(); if (isset($ratesIdQuoteItemId[$id])) { foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) { if ($quoteItemId['code'] == $tax['code']) { $itemId = null; $associatedItemId = null; if (isset($quoteItemId['id'])) { //This is a product item $item = $order->getItemByQuoteItemId($quoteItemId['id']); $itemId = $item->getId(); } elseif (isset($quoteItemId['associated_item_id'])) { //This item is associated with a product item $item = $order->getItemByQuoteItemId($quoteItemId['associated_item_id']); $associatedItemId = $item->getId(); } $data = ['item_id' => $itemId, 'tax_id' => $result->getTaxId(), 'tax_percent' => $quoteItemId['percent'], 'associated_item_id' => $associatedItemId, 'amount' => $quoteItemId['amount'], 'base_amount' => $quoteItemId['base_amount'], 'real_amount' => $quoteItemId['real_amount'], 'real_base_amount' => $quoteItemId['real_base_amount'], 'taxable_item_type' => $quoteItemId['item_type']]; /** @var $taxItem \Magento\Sales\Model\Order\Tax\Item */ $taxItem = $this->taxItemFactory->create(); $taxItem->setData($data)->save(); } } } } } } } $order->setAppliedTaxIsSaved(true); return $this; }
/** * Save order tax information * * @param \Magento\Framework\Event\Observer $observer * @return void */ public function salesEventOrderAfterSave(\Magento\Framework\Event\Observer $observer) { $order = $observer->getEvent()->getOrder(); if (!$order->getConvertingFromQuote() || $order->getAppliedTaxIsSaved()) { return; } $getTaxesForItems = $order->getItemAppliedTaxes(); $taxes = $order->getAppliedTaxes(); $ratesIdQuoteItemId = array(); if (!is_array($getTaxesForItems)) { $getTaxesForItems = array(); } foreach ($getTaxesForItems as $quoteItemId => $taxesArray) { foreach ($taxesArray as $rates) { if (count($rates['rates']) == 1) { $ratesIdQuoteItemId[$rates['id']][] = array('id' => $rates['item_id'], 'percent' => $rates['percent'], 'code' => $rates['rates'][0]['code'], 'associated_item_id' => $rates['associated_item_id'], 'item_type' => $rates['item_type'], 'amount' => $rates['amount'], 'base_amount' => $rates['base_amount'], 'real_amount' => $rates['amount'], 'real_base_amount' => $rates['base_amount']); } else { $percentDelta = $rates['percent']; $percentSum = 0; foreach ($rates['rates'] as $rate) { $real_amount = $rates['amount'] * $rate['percent'] / $rates['percent']; $real_base_amount = $rates['base_amount'] * $rate['percent'] / $rates['percent']; $ratesIdQuoteItemId[$rates['id']][] = array('id' => $rates['item_id'], 'percent' => $rate['percent'], 'code' => $rate['code'], 'associated_item_id' => $rates['associated_item_id'], 'item_type' => $rates['item_type'], 'amount' => $rates['amount'], 'base_amount' => $rates['base_amount'], 'real_amount' => $real_amount, 'real_base_amount' => $real_base_amount); $percentSum += $rate['percent']; } if ($percentDelta != $percentSum) { $delta = $percentDelta - $percentSum; foreach ($ratesIdQuoteItemId[$rates['id']] as &$rateTax) { if ($rateTax['id'] == $quoteItemId) { $rateTax['percent'] = $rateTax['percent'] / $percentSum * $delta + $rateTax['percent']; } } } } } } foreach ($taxes as $id => $row) { foreach ($row['rates'] as $tax) { if (is_null($row['percent'])) { $baseRealAmount = $row['base_amount']; } else { if ($row['percent'] == 0 || $tax['percent'] == 0) { continue; } $baseRealAmount = $row['base_amount'] / $row['percent'] * $tax['percent']; } $hidden = isset($row['hidden']) ? $row['hidden'] : 0; $priority = isset($tax['priority']) ? $tax['priority'] : 0; $position = isset($tax['position']) ? $tax['position'] : 0; $process = isset($row['process']) ? $row['process'] : 0; $data = array('order_id' => $order->getId(), 'code' => $tax['code'], 'title' => $tax['title'], 'hidden' => $hidden, 'percent' => $tax['percent'], 'priority' => $priority, 'position' => $position, 'amount' => $row['amount'], 'base_amount' => $row['base_amount'], 'process' => $process, 'base_real_amount' => $baseRealAmount); /** @var $orderTax \Magento\Tax\Model\Sales\Order\Tax */ $orderTax = $this->_orderTaxFactory->create(); $result = $orderTax->setData($data)->save(); if (isset($ratesIdQuoteItemId[$id])) { foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) { if ($quoteItemId['code'] == $tax['code']) { $itemId = null; $associatedItemId = null; if (isset($quoteItemId['id'])) { //This is a product item $item = $order->getItemByQuoteItemId($quoteItemId['id']); $itemId = $item->getId(); } elseif (isset($quoteItemId['associated_item_id'])) { //This item is associated with a product item $item = $order->getItemByQuoteItemId($quoteItemId['associated_item_id']); $associatedItemId = $item->getId(); } $data = array('item_id' => $itemId, 'tax_id' => $result->getTaxId(), 'tax_percent' => $quoteItemId['percent'], 'associated_item_id' => $associatedItemId, 'amount' => $quoteItemId['amount'], 'base_amount' => $quoteItemId['base_amount'], 'real_amount' => $quoteItemId['real_amount'], 'real_base_amount' => $quoteItemId['real_base_amount'], 'taxable_item_type' => $quoteItemId['item_type']); /** @var $taxItem \Magento\Tax\Model\Sales\Order\Tax\Item */ $taxItem = $this->_taxItemFactory->create(); $taxItem->setData($data)->save(); } } } } } $order->setAppliedTaxIsSaved(true); }