1

I have added this piece of code in tablerates

$s_price = $request->getPackageValueWithDiscount();
$request->setPackageValue($s_price);

But it only works if you have added a shipping address but if, the check box for same as billing address is checked (Deliver to this address), shipping cost is calculating on price before discount, any help how can be this fixed.

Code looks like

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    if (!$this->getConfigFlag('active')) {
        return false;
    }

    // exclude Virtual products price from Package value if pre-configured
    if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
        foreach ($request->getAllItems() as $item) {
            if ($item->getParentItem()) {
                continue;
            }
            if ($item->getHasChildren() && $item->isShipSeparately()) {
                foreach ($item->getChildren() as $child) {
                    if ($child->getProduct()->isVirtual()) {
                        $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                    }
                }
            } elseif ($item->getProduct()->isVirtual()) {
                $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
            }
        }
    }

    // Free shipping by qty

    $s_price = $request->getPackageValueWithDiscount();
    $request->setPackageValue($s_price);

    $freeQty = 0;
    if ($request->getAllItems()) {
        $freePackageValue = 0;
        foreach ($request->getAllItems() as $item) {
            if ($item->getProduct()->isVirtual() || $item->getParentItem()) {
                continue;
            }

            if ($item->getHasChildren() && $item->isShipSeparately()) {
                foreach ($item->getChildren() as $child) {
                    if ($child->getFreeShipping() && !$child->getProduct()->isVirtual()) {
                        $freeShipping = is_numeric($child->getFreeShipping()) ? $child->getFreeShipping() : 0;
                        $freeQty += $item->getQty() * ($child->getQty() - $freeShipping);
                    }
                }
            } elseif ($item->getFreeShipping()) {
                $freeShipping = is_numeric($item->getFreeShipping()) ? $item->getFreeShipping() : 0;
                $freeQty += $item->getQty() - $freeShipping;
                $freePackageValue += $item->getBaseRowTotal();
            }
        }
        $oldValue = $request->getPackageValue();
        $request->setPackageValue($oldValue - $freePackageValue);
    }

    if ($freePackageValue) {
        $request->setPackageValue($request->getPackageValue() - $freePackageValue);
    }
    if (!$request->getConditionName()) {
        $conditionName = $this->getConfigData('condition_name');
        $request->setConditionName($conditionName ? $conditionName : $this->_default_condition_name);
    }

     // Package weight and qty free shipping
    $oldWeight = $request->getPackageWeight();
    $oldQty = $request->getPackageQty();

    $request->setPackageWeight($request->getFreeMethodWeight());
    $request->setPackageQty($oldQty - $freeQty);

    $result = Mage::getModel('shipping/rate_result');
    $rate = $this->getRate($request);

    $request->setPackageWeight($oldWeight);
    $request->setPackageQty($oldQty);

    if (!empty($rate) && $rate['price'] >= 0) {
        $method = Mage::getModel('shipping/rate_result_method');

        $method->setCarrier('tablerate');
        $method->setCarrierTitle($this->getConfigData('title'));

        $method->setMethod('bestway');
        $method->setMethodTitle($this->getConfigData('name'));

        if ($request->getFreeShipping() === true || ($request->getPackageQty() == $freeQty)) {
            $shippingPrice = 0;
        } else {
            $shippingPrice = $this->getFinalPriceWithHandlingFee($rate['price']);
        }

        $method->setPrice($shippingPrice);
        $method->setCost($rate['cost']);

        $result->append($method);
    } elseif (empty($rate) && $request->getFreeShipping() === true) {
        /**
         * was applied promotion rule for whole cart
         * other shipping methods could be switched off at all
         * we must show table rate method with 0$ price, if grand_total more, than min table condition_value
         * free setPackageWeight() has already was taken into account
         */
        $request->setPackageValue($freePackageValue);
        $request->setPackageQty($freeQty);
        $rate = $this->getRate($request);
        if (!empty($rate) && $rate['price'] >= 0) {
            $method = Mage::getModel('shipping/rate_result_method');

            $method->setCarrier('tablerate');
            $method->setCarrierTitle($this->getConfigData('title'));

            $method->setMethod('bestway');
            $method->setMethodTitle($this->getConfigData('name'));

            $method->setPrice(0);
            $method->setCost(0);

            $result->append($method);
        }
    } else {
        $error = Mage::getModel('shipping/rate_result_error');
        $error->setCarrier('tablerate');
        $error->setCarrierTitle($this->getConfigData('title'));
        $error->setErrorMessage($this->getConfigData('specificerrmsg'));
        $result->append($error);
    }

    return $result;
}

I'm using IWD onepage checkout extension and it's probably to this extension magento default checkout works well but not and this extension

closed as off-topic by Fabian Schmengler, Raphael at Digital Pianism, Qaisar Satti, Rajeev K Tomy, Amit Bera Apr 19 '16 at 4:42

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions about third-party modules are generally off-topic because the scope of functionality and code are not available. For more information, see this meta post/answer." – Fabian Schmengler, Raphael at Digital Pianism, Qaisar Satti, Rajeev K Tomy, Amit Bera
If this question can be reworded to fit the rules in the help center, please edit the question.