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;
 }
Example #2
0
 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;
 }
Example #3
0
 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;
 }
Example #4
0
 /**
  * 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;
 }