*/ class Mage_Tax_Model_Observer { /** * Put quote address tax information into order * * @param Varien_Event_Observer $observer */ public function salesEventConvertQuoteAddressToOrder(Varien_Event_Observer $observer) { $address = $observer->getEvent()->getAddress(); $order = $observer->getEvent()->getOrder(); $taxes = $address->getAppliedTaxes(); if (is_array($taxes)) { if (is_array($order->getAppliedTaxes())) { $taxes = array_merge($order->getAppliedTaxes(), $taxes); } $order->setAppliedTaxes($taxes); $order->setConvertingFromQuote(true); } } /** * Save order tax information * * @param Varien_Event_Observer $observer */ public function salesEventOrderAfterSave(Varien_Event_Observer $observer) { $order = $observer->getEvent()->getOrder(); if (!$order->getConvertingFromQuote() || $order->getAppliedTaxIsSaved()) { return; } $getTaxesForItems = $order->getQuote()->getTaxesForItems(); $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' => $quoteItemId, 'percent' => $rates['percent'], 'code' => $rates['rates'][0]['code'] ); } else { $percentDelta = $rates['percent']; $percentSum = 0; foreach ($rates['rates'] as $rate) { $ratesIdQuoteItemId[$rates['id']][] = array( 'id' => $quoteItemId, 'percent' => $rate['percent'], 'code' => $rate['code'] ); $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); $data = array( 'order_id' => $order->getId(), 'code' => $tax['code'], 'title' => $tax['title'], 'hidden' => $hidden, 'percent' => $tax['percent'], 'priority' => $tax['priority'], 'position' => $tax['position'], 'amount' => $row['amount'], 'base_amount' => $row['base_amount'], 'process' => $row['process'], 'base_real_amount' => $baseRealAmount, ); $result = Mage::getModel('tax/sales_order_tax')->setData($data)->save(); if (isset($ratesIdQuoteItemId[$id])) { foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) { if ($quoteItemId['code'] == $tax['code']) { $item = $order->getItemByQuoteItemId($quoteItemId['id']); if ($item) { $data = array( 'item_id' => $item->getId(), 'tax_id' => $result->getTaxId(), 'tax_percent' => $quoteItemId['percent'] ); Mage::getModel('tax/sales_order_tax_item')->setData($data)->save(); } } } } } } $order->setAppliedTaxIsSaved(true); } /** * Prepare select which is using to select index data for layered navigation * * @param Varien_Event_Observer $observer * @return Mage_Tax_Model_Observer */ public function prepareCatalogIndexPriceSelect(Varien_Event_Observer $observer) { $table = $observer->getEvent()->getTable(); $response = $observer->getEvent()->getResponseObject(); $select = $observer->getEvent()->getSelect(); $storeId = $observer->getEvent()->getStoreId(); $additionalCalculations = $response->getAdditionalCalculations(); $calculation = Mage::helper('tax')->getPriceTaxSql( $table . '.min_price', $table.'.tax_class_id' ); if (!empty($calculation)) { $additionalCalculations[] = $calculation; $response->setAdditionalCalculations($additionalCalculations); /** * Tax class presented in price index table */ //Mage::helper('tax')->joinTaxClass($select, $storeId, $table); } return $this; } /** * Add tax percent values to product collection items * * @param Varien_Event_Observer $observer * @return Mage_Tax_Model_Observer */ public function addTaxPercentToProductCollection($observer) { $helper = Mage::helper('tax'); $collection = $observer->getEvent()->getCollection(); $store = $collection->getStoreId(); if (!$helper->needPriceConversion($store)) { return $this; } if ($collection->requireTaxPercent()) { $request = Mage::getSingleton('tax/calculation')->getRateRequest(); foreach ($collection as $item) { if (null === $item->getTaxClassId()) { $item->setTaxClassId($item->getMinimalTaxClassId()); } if (!isset($classToRate[$item->getTaxClassId()])) { $request->setProductClassId($item->getTaxClassId()); $classToRate[$item->getTaxClassId()] = Mage::getSingleton('tax/calculation')->getRate($request); } $item->setTaxPercent($classToRate[$item->getTaxClassId()]); } } return $this; } /** * Refresh sales tax report statistics for last day * * @param Mage_Cron_Model_Schedule $schedule * @return Mage_Tax_Model_Observer */ public function aggregateSalesReportTaxData($schedule) { Mage::app()->getLocale()->emulate(0); $currentDate = Mage::app()->getLocale()->date(); $date = $currentDate->subHour(25); Mage::getResourceModel('tax/report_tax')->aggregate($date); Mage::app()->getLocale()->revert(); return $this; } /** * Reset extra tax amounts on quote addresses before recollecting totals * * @param Varien_Event_Observer $observer * @return Mage_Tax_Model_Observer */ public function quoteCollectTotalsBefore(Varien_Event_Observer $observer) { /* @var $quote Mage_Sales_Model_Quote */ $quote = $observer->getEvent()->getQuote(); foreach ($quote->getAllAddresses() as $address) { $address->setExtraTaxAmount(0); $address->setBaseExtraTaxAmount(0); } return $this; } }