/** * Returns all valid shipping methods for current quote. * (based on provided delivery address) * * @param Mage_Checkout_Model_Cart $mageCart * @return array */ public function getShippingMethods($mageCart) { $methods = array(); /** @var Mage_Sales_Model_Quote_Address $shippingAddress */ $shippingAddress = $mageCart->getQuote()->getShippingAddress(); $shippingAddress->collectTotals(); $shippingAddress->collectShippingRates(); $calc = Mage::getSingleton('tax/calculation'); $rates = $calc->getRatesForAllProductTaxClasses($calc->getRateOriginRequest()); $taxClassIdShipping = Mage::helper('tax')->getShippingTaxClass(Mage::helper("shopgate/config")->getConfig()->getStoreViewId()); $taxRateShipping = $taxClassIdShipping ? $rates[$taxClassIdShipping] : $taxClassIdShipping; /** @var Mage_Sales_Model_Quote_Address_Rate $_rate */ foreach ($shippingAddress->getShippingRatesCollection() as $_rate) { if ($_rate instanceof Mage_Shipping_Model_Rate_Result_Error || strpos($_rate->getCode(), 'error') !== false || $_rate->getCarrierInstance() == false) { /* skip errors so they dont get processed as valid shipping rates without any cost */ ShopgateLogger::getInstance()->log("Skipping Shipping Rate because of Error Type: '" . $_rate->getCode() . "'", ShopgateLogger::LOGTYPE_DEBUG); continue; } $shippingAddress->setShippingMethod($_rate->getCode()); $shippingAddress->setCollectShippingRates(true); $shippingAddress->collectTotals(); $method = new ShopgateShippingMethod(); $method->setId($_rate->getCode()); $method->setTitle($_rate->getMethodTitle()); $method->setShippingGroup($_rate->getCarrier()); $method->setDescription($_rate->getMethodDescription() ? $_rate->getMethodDescription() : ''); $method->setSortOrder($_rate->getCarrierInstance()->getSortOrder()); $method->setAmount($shippingAddress->getBaseShippingAmount()); $method->setAmountWithTax($shippingAddress->getBaseShippingInclTax()); $method->setTaxClass($taxClassIdShipping); $method->setTaxPercent(number_format($taxRateShipping, 2)); $methods[] = $method; } return $methods; }