*/ class Mage_Sales_Model_Order_Creditmemo_Item extends Mage_Core_Model_Abstract { protected $_eventPrefix = 'sales_creditmemo_item'; protected $_eventObject = 'creditmemo_item'; protected $_creditmemo = null; protected $_orderItem = null; /** * Initialize resource model */ function _construct() { $this->_init('sales/order_creditmemo_item'); } /** * Declare creditmemo instance * * @param Mage_Sales_Model_Order_Creditmemo $creditmemo * @return Mage_Sales_Model_Order_Creditmemo_Item */ public function setCreditmemo(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $this->_creditmemo = $creditmemo; return $this; } /** * Init mapping array of short fields to * its full names * * @return Varien_Object */ protected function _initOldFieldsMap() { $this->_oldFieldsMap = Mage::helper('sales')->getOldFieldMap('creditmemo_item'); return $this; } /** * Retrieve creditmemo instance * * @return Mage_Sales_Model_Order_Creditmemo */ public function getCreditmemo() { return $this->_creditmemo; } /** * Declare order item instance * * @param Mage_Sales_Model_Order_Item $item * @return Mage_Sales_Model_Order_Creditmemo_Item */ public function setOrderItem(Mage_Sales_Model_Order_Item $item) { $this->_orderItem = $item; $this->setOrderItemId($item->getId()); return $this; } /** * Retrieve order item instance * * @return Mage_Sales_Model_Order_Item */ public function getOrderItem() { if (is_null($this->_orderItem)) { if ($this->getCreditmemo()) { $this->_orderItem = $this->getCreditmemo()->getOrder()->getItemById($this->getOrderItemId()); } else { $this->_orderItem = Mage::getModel('sales/order_item') ->load($this->getOrderItemId()); } } return $this->_orderItem; } /** * Declare qty * * @param float $qty * @return Mage_Sales_Model_Order_Creditmemo_Item */ public function setQty($qty) { if ($this->getOrderItem()->getIsQtyDecimal()) { $qty = (float) $qty; } else { $qty = (int) $qty; } $qty = $qty > 0 ? $qty : 0; /** * Check qty availability */ if ($qty <= $this->getOrderItem()->getQtyToRefund() || $this->getOrderItem()->isDummy()) { $this->setData('qty', $qty); } else { Mage::throwException( Mage::helper('sales')->__('Invalid qty to refund item "%s"', $this->getName()) ); } return $this; } /** * Applying qty to order item * * @return Mage_Sales_Model_Order_Shipment_Item */ public function register() { $orderItem = $this->getOrderItem(); $orderItem->setQtyRefunded($orderItem->getQtyRefunded() + $this->getQty()); $orderItem->setTaxRefunded($orderItem->getTaxRefunded() + $this->getTaxAmount()); $orderItem->setBaseTaxRefunded($orderItem->getBaseTaxRefunded() + $this->getBaseTaxAmount()); $orderItem->setHiddenTaxRefunded($orderItem->getHiddenTaxRefunded() + $this->getHiddenTaxAmount()); $orderItem->setBaseHiddenTaxRefunded($orderItem->getBaseHiddenTaxRefunded() + $this->getBaseHiddenTaxAmount()); $orderItem->setAmountRefunded($orderItem->getAmountRefunded() + $this->getRowTotal()); $orderItem->setBaseAmountRefunded($orderItem->getBaseAmountRefunded() + $this->getBaseRowTotal()); $orderItem->setDiscountRefunded($orderItem->getDiscountRefunded() + $this->getDiscountAmount()); $orderItem->setBaseDiscountRefunded($orderItem->getBaseDiscountRefunded() + $this->getBaseDiscountAmount()); return $this; } public function cancel() { $this->getOrderItem()->setQtyRefunded( $this->getOrderItem()->getQtyRefunded()-$this->getQty() ); $this->getOrderItem()->setTaxRefunded( $this->getOrderItem()->getTaxRefunded() - $this->getOrderItem()->getBaseTaxAmount() * $this->getQty() / $this->getOrderItem()->getQtyOrdered() ); $this->getOrderItem()->setHiddenTaxRefunded( $this->getOrderItem()->getHiddenTaxRefunded() - $this->getOrderItem()->getHiddenTaxAmount() * $this->getQty() / $this->getOrderItem()->getQtyOrdered() ); return $this; } /** * Invoice item row total calculation * * @return Mage_Sales_Model_Order_Invoice_Item */ public function calcRowTotal() { $creditmemo = $this->getCreditmemo(); $orderItem = $this->getOrderItem(); $orderItemQtyInvoiced = $orderItem->getQtyInvoiced(); $rowTotal = $orderItem->getRowInvoiced() - $orderItem->getAmountRefunded(); $baseRowTotal = $orderItem->getBaseRowInvoiced() - $orderItem->getBaseAmountRefunded(); $rowTotalInclTax = $orderItem->getRowTotalInclTax(); $baseRowTotalInclTax = $orderItem->getBaseRowTotalInclTax(); if (!$this->isLast()) { $availableQty = $orderItemQtyInvoiced - $orderItem->getQtyRefunded(); $rowTotal = $creditmemo->roundPrice($rowTotal / $availableQty * $this->getQty()); $baseRowTotal = $creditmemo->roundPrice($baseRowTotal / $availableQty * $this->getQty(), 'base'); } $this->setRowTotal($rowTotal); $this->setBaseRowTotal($baseRowTotal); if ($rowTotalInclTax && $baseRowTotalInclTax) { $orderItemQty = $orderItem->getQtyOrdered(); $this->setRowTotalInclTax( $creditmemo->roundPrice($rowTotalInclTax / $orderItemQty * $this->getQty(), 'including') ); $this->setBaseRowTotalInclTax( $creditmemo->roundPrice($baseRowTotalInclTax / $orderItemQty * $this->getQty(), 'including_base') ); } return $this; } /** * Checking if the item is last * * @return bool */ public function isLast() { $orderItem = $this->getOrderItem(); if ((string)(float)$this->getQty() == (string)(float)$orderItem->getQtyToRefund() && !$orderItem->getQtyToInvoice()) { return true; } return false; } /** * Before object save * * @return Mage_Sales_Model_Order_Creditmemo_Item */ protected function _beforeSave() { parent::_beforeSave(); if (!$this->getParentId() && $this->getCreditmemo()) { $this->setParentId($this->getCreditmemo()->getId()); } return $this; } }