/** * Check if no dummy order item can be refunded * * @param Mage_Sales_Model_Order_Item $item * @param array $invoiceQtysRefundLimits * @return bool */ protected function _canRefundNoDummyItem($item, $invoiceQtysRefundLimits = array()) { if ($item->getQtyToRefund() < 0) { return false; } if (isset($invoiceQtysRefundLimits[$item->getId()])) { return $invoiceQtysRefundLimits[$item->getId()] > 0; } return true; }
/** * Check if order item can be refunded * * @param Mage_Sales_Model_Order_Item $item * @param array $qtys * @return bool */ protected function _canRefundItem($item, $qtys = array()) { if ($item->isDummy()) { if ($item->getHasChildren()) { foreach ($item->getChildrenItems() as $child) { if (empty($qtys)) { if ($child->getQtyToRefund() > 0) { return true; } } else { if (isset($qtys[$child->getId()]) && $qtys[$child->getId()] > 0) { return true; } } } return false; } else { if ($item->getParentItem()) { $parent = $item->getParentItem(); if (empty($qtys)) { return $parent->getQtyToRefund() > 0; } else { return isset($qtys[$parent->getId()]) && $qtys[$parent->getId()] > 0; } } } } else { return $item->getQtyToRefund() > 0; } }
/** * Remove specific qty of order item from order * * @param Mage_Sales_Model_Order $order * @param Mage_Sales_Model_Order_Item $orderItem * @param null $qtyToReturn * @return $this */ public function returnOrderItem(Mage_Sales_Model_Order $order, Mage_Sales_Model_Order_Item $orderItem, $qtyToReturn = null) { if (is_null($qtyToReturn)) { $qtyToReturn = $orderItem->getQtyToRefund() + $orderItem->getQtyToCancel(); } if ($qtyToReturn > 0 && $orderItem->getQtyToCancel() > 0) { $qtyToCancel = min($qtyToReturn, $orderItem->getQtyToCancel()); $qtyToReturn -= $qtyToCancel; $this->cancelOrderItem($orderItem, $qtyToCancel); } if ($qtyToReturn > 0 && $orderItem->getQtyToRefund() > 0) { $creditMemo = $this->refundOrderItem($order, $orderItem, $qtyToReturn); } return $this; }
/** * update quantity to refund * * @param Mage_Sales_Model_Order_Item $item * @param array() $dataQty * @param int $keepQty * @return array() $dataQty */ private function _refundItem($item, $dataQty, $keepQty = 0) { $refundQty = $item->getQtyToRefund() - $keepQty; if ($refundQty > 0) { // set quantity to refund $dataQty[$item->getId()] = $refundQty; // search child to by refund as well $childItems = $item->getChildrenItems(); foreach ($childItems as $child) { $dataQty = $this->_refundItem($child, $dataQty, $keepQty); } } return $dataQty; }