public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); $allowedAmount = $order->getShippingAmount() - $order->getShippingRefunded(); $baseAllowedAmount = $order->getBaseShippingAmount() - $order->getBaseShippingRefunded(); /** * Check if shipping amount was specified (from invoice or another source). * Using has magic method to allow setting 0 as shipping amount. */ if ($creditmemo->hasBaseShippingAmount()) { $baseShippingAmount = Mage::app()->getStore()->roundPrice($creditmemo->getBaseShippingAmount()); if ($baseShippingAmount < $baseAllowedAmount) { $shippingAmount = $allowedAmount * $baseShippingAmount / $baseAllowedAmount; $shippingAmount = Mage::app()->getStore()->roundPrice($shippingAmount); } elseif ($baseShippingAmount == $baseAllowedAmount) { $shippingAmount = $allowedAmount; } else { $baseAllowedAmount = $order->formatBasePrice($baseAllowedAmount); Mage::throwException(Mage::helper('sales')->__('Maximum shipping amount allowed to refound is: %s', $baseAllowedAmount)); } } else { $baseShippingAmount = $baseAllowedAmount; $shippingAmount = $allowedAmount; } $creditmemo->setShippingAmount($shippingAmount); $creditmemo->setBaseShippingAmount($baseShippingAmount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $shippingAmount); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseShippingAmount); return $this; }
public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); $allowedAmount = $order->getShippingAmount() - $order->getShippingRefunded(); $baseAllowedAmount = $order->getBaseShippingAmount() - $order->getBaseShippingRefunded(); $shipping = $order->getShippingAmount(); $baseShipping = $order->getBaseShippingAmount(); $shippingInclTax = $order->getShippingInclTax(); $baseShippingInclTax = $order->getBaseShippingInclTax(); $isShippingInclTax = Mage::getSingleton('tax/config')->displaySalesShippingInclTax($order->getStoreId()); /** * Check if shipping amount was specified (from invoice or another source). * Using has magic method to allow setting 0 as shipping amount. */ if ($creditmemo->hasBaseShippingAmount()) { $baseShippingAmount = Mage::app()->getStore()->roundPrice($creditmemo->getBaseShippingAmount()); if ($isShippingInclTax && $baseShippingInclTax != 0) { $part = $baseShippingAmount / $baseShippingInclTax; $shippingInclTax = Mage::app()->getStore()->roundPrice($shippingInclTax * $part); $baseShippingInclTax = $baseShippingAmount; $baseShippingAmount = Mage::app()->getStore()->roundPrice($baseShipping * $part); } if ($baseShippingAmount <= $baseAllowedAmount) { if ($baseShipping != 0) { $shipping = $shipping * $baseShippingAmount / $baseShipping; } $shipping = Mage::app()->getStore()->roundPrice($shipping); $baseShipping = $baseShippingAmount; } else { $baseAllowedAmount = $order->formatBasePrice($baseAllowedAmount); Mage::throwException(Mage::helper('sales')->__('Maximum shipping amount allowed to refund is: %s', $baseAllowedAmount)); } } else { if ($baseShipping != 0) { $shippingInclTax = Mage::app()->getStore()->roundPrice($shippingInclTax * $allowedAmount / $shipping); $baseShippingInclTax = Mage::app()->getStore()->roundPrice($baseShippingInclTax * $baseAllowedAmount / $baseShipping); } $shipping = $allowedAmount; $baseShipping = $baseAllowedAmount; } $creditmemo->setShippingAmount($shipping); $creditmemo->setBaseShippingAmount($baseShipping); $creditmemo->setShippingInclTax($shippingInclTax); $creditmemo->setBaseShippingInclTax($baseShippingInclTax); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $shipping); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseShipping); return $this; }
public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); $allowedAmount = $order->getShippingAmount() - $order->getShippingRefunded(); $baseAllowedAmount = $order->getBaseShippingAmount() - $order->getBaseShippingRefunded(); $shipping = $order->getShippingAmount(); $baseShipping = $order->getBaseShippingAmount(); $shippingInclTax = $order->getShippingInclTax(); $baseShippingInclTax = $order->getBaseShippingInclTax(); $isShippingInclTax = Mage::getSingleton('tax/config')->displaySalesShippingInclTax($order->getStoreId()); /** * Check if shipping amount was specified (from invoice or another source). * Using has magic method to allow setting 0 as shipping amount. */ if ($creditmemo->hasBaseShippingAmount()) { $baseShippingAmount = Mage::app()->getStore()->roundPrice($creditmemo->getBaseShippingAmount()); if ($isShippingInclTax && $baseShippingInclTax != 0) { $part = $baseShippingAmount / $baseShippingInclTax; $shippingInclTax = Mage::app()->getStore()->roundPrice($shippingInclTax * $part); $baseShippingInclTax = $baseShippingAmount; $baseShippingAmount = Mage::app()->getStore()->roundPrice($baseShipping * $part); } /* * Rounded allowed shipping refund amount is the highest acceptable shipping refund amount. * Shipping refund amount shouldn't cause errors, if it doesn't exceed that limit. * Note: ($x < $y + 0.0001) means ($x <= $y) for floats */ if ($baseShippingAmount < Mage::app()->getStore()->roundPrice($baseAllowedAmount) + 0.0001) { /* * Shipping refund amount should be equated to allowed refund amount, * if it exceeds that limit. * Note: ($x > $y - 0.0001) means ($x >= $y) for floats */ if ($baseShippingAmount > $baseAllowedAmount - 0.0001) { $shipping = $allowedAmount; $baseShipping = $baseAllowedAmount; } else { if ($baseShipping != 0) { $shipping = $shipping * $baseShippingAmount / $baseShipping; } $shipping = Mage::app()->getStore()->roundPrice($shipping); $baseShipping = $baseShippingAmount; } } else { $baseAllowedAmount = $order->getBaseCurrency()->format($baseAllowedAmount, null, false); Mage::throwException(Mage::helper('sales')->__('Maximum shipping amount allowed to refund is: %s', $baseAllowedAmount)); } } else { if ($baseShipping != 0) { $shippingInclTax = Mage::app()->getStore()->roundPrice($shippingInclTax * $allowedAmount / $shipping); $baseShippingInclTax = Mage::app()->getStore()->roundPrice($baseShippingInclTax * $baseAllowedAmount / $baseShipping); } $shipping = $allowedAmount; $baseShipping = $baseAllowedAmount; } $creditmemo->setShippingAmount($shipping); $creditmemo->setBaseShippingAmount($baseShipping); $creditmemo->setShippingInclTax($shippingInclTax); $creditmemo->setBaseShippingInclTax($baseShippingInclTax); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $shipping); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseShipping); return $this; }
/** * Initialize creditmemo state based on requested parameters * * @param Mage_Sales_Model_Order_Creditmemo $creditmemo * @param array $data */ protected function _initCreditmemoData($creditmemo, $data) { if (isset($data['shipping_amount'])) { $creditmemo->setBaseShippingAmount((double) $data['shipping_amount']); } if (isset($data['adjustment_positive'])) { $creditmemo->setAdjustmentPositive($data['adjustment_positive']); } if (isset($data['adjustment_negative'])) { $creditmemo->setAdjustmentNegative($data['adjustment_negative']); } }
/** * The grand total is explicitly set from the totalCredit value in the payload * Compute any adjustments necessary to make the credit memo total up properly * * @param Mage_Sales_Model_Order_Creditmemo $creditmemo * @return Mage_Sales_Model_Order_Creditmemo */ protected function _fixupTotals(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $creditmemo->setBaseShippingAmount(0.0)->setShippingAmount(0.0)->setBaseTaxAmount(0.0)->setTaxAmount(0.0); // totalCredit is passed as a negative number but the credit memo uses // positive numbers for refunds so use abs() to get rid of negative numbers $grandTotal = abs($this->_payload->getTotalCredit()); $subTotal = $creditmemo->getBaseSubtotal(); $creditmemo->setBaseGrandTotal($grandTotal); $creditmemo->setGrandTotal($grandTotal); if ($grandTotal < $subTotal) { $creditmemo->setAdjustmentNegative($subTotal - $grandTotal); } elseif ($grandTotal > $subTotal) { $creditmemo->setAdjustmentPositive($grandTotal - $subTotal); } return $creditmemo; }