public function calculateAdjustment(Varien_Event_Observer $observer) { $store = $observer->getStore(); $request = $observer->getRequest(); $allItems = $observer->getAllItems(); $adjustments = $observer->getAdjustments(); if (!$request->getFreeShipping()) { $itemAdjustments = $adjustments->getItems(); $defaultAdjustment = Mage::helper('Lokey_PerItemShipping')->getDefaultAdjustment($store); foreach ($allItems as $item) { // Skip child items in main loop if ($item->getParentItem()) { continue; } $qty = (double) ($item->getFreeShipping() === true ? 0 : $item->getQty() - $item->getFreeShipping()); // Skip free shipping items if ($qty <= 0.0) { continue; } $product = Mage::getModel('catalog/product')->setStoreId($store->getId())->load($item->getProductId()); $adjustment = Mage::helper('Lokey_PerItemShipping')->getAdjustmentAmount($product, $defaultAdjustment); // Skip virtual products if ($product->getTypeInstance()->isVirtual()) { continue; } if ($item->getHasChildren()) { foreach ($item->getChildren() as $childItem) { $childQty = (double) ($childItem->getFreeShipping() === true ? 0 : $childItem->getQty() - $childItem->getFreeShipping()); // Skip free shipping items if ($childQty <= 0.0) { continue; } $childProduct = Mage::getModel('catalog/product')->setStoreId($store->getId())->load($childItem->getProductId()); $childAdjustment = Mage::helper('Lokey_PerItemShipping')->getAdjustmentAmount($childProduct, $defaultAdjustment); // Skip virtual products if ($childProduct->getTypeInstance()->isVirtual()) { continue; } if (Mage::helper('Lokey_PerItemShipping')->getUseQty($childProduct)) { $adjustment += $childAdjustment * $childQty; } else { $adjustment += $childAdjustment; } } } if (!isset($itemAdjustments[$item->getId()])) { $itemAdjustments[$item->getId()] = 0.0; } if (Mage::helper('Lokey_PerItemShipping')->getUseQty($product)) { $itemAdjustments[$item->getId()] += $adjustment * $qty; } else { $itemAdjustments[$item->getId()] += $adjustment; } } $adjustments->setItems($itemAdjustments); } return $this; }
public function calculateAdjustment(Varien_Event_Observer $observer) { $store = $observer->getStore(); $request = $observer->getRequest(); $allItems = $observer->getAllItems(); $adjustments = $observer->getAdjustments(); $groupAdjustments = array(); $itemAdjustments = $adjustments->getItems(); foreach ($allItems as $item) { $qty = $item->getQty(); if ($item->getParentItem()) { $qty *= $item->getParentItem()->getQty(); } $qty -= $item->getFreeShipping(); $qty = max($qty, 0); if ($request->getFreeShipping() || $qty === 0) { continue; } $product = Mage::getModel('catalog/product')->setStoreId($store->getId())->load($item->getProductId()); $group = Mage::helper('Lokey_PerGroupShipping/Data')->getAdjustmentGroupByProduct($product); if (!$product->getTypeInstance()->isVirtual() && $group->getId()) { $adjustment = max(round($group->getAmount(), 2), 0.0); switch ($group->getType()) { case Lokey_PerGroupShipping_Model_System_Config_Source_AdjustmentType::ORDER: $groupAdjustments[$group->getId()] = $adjustment; break; case Lokey_PerGroupShipping_Model_System_Config_Source_AdjustmentType::LINE: if (!isset($itemAdjustments[$item->getId()])) { $itemAdjustments[$item->getId()] = 0.0; } $itemAdjustments[$item->getId()] += $adjustment; break; case Lokey_PerGroupShipping_Model_System_Config_Source_AdjustmentType::UNIT: default: if (!isset($itemAdjustments[$item->getId()])) { $itemAdjustments[$item->getId()] = 0.0; } $itemAdjustments[$item->getId()] += $adjustment * $qty; break; } } } foreach ($groupAdjustments as $groupAdjustment) { $adjustments->setOrder($adjustments->getOrder() + $groupAdjustment); } $adjustments->setItems($itemAdjustments); return $this; }