*/ class Mage_Adminhtml_Sales_Order_CreditmemoController extends Mage_Adminhtml_Controller_Sales_Creditmemo { /** * Get requested items qtys and return to stock flags */ protected function _getItemData() { $data = $this->getRequest()->getParam('creditmemo'); if (!$data) { $data = Mage::getSingleton('adminhtml/session')->getFormData(true); } if (isset($data['items'])) { $qtys = $data['items']; } else { $qtys = array(); } return $qtys; } /** * Check if creditmeno can be created for order * @param Mage_Sales_Model_Order $order * @return bool */ protected function _canCreditmemo($order) { /** * Check order existing */ if (!$order->getId()) { $this->_getSession()->addError($this->__('The order no longer exists.')); return false; } /** * Check creditmemo create availability */ if (!$order->canCreditmemo()) { $this->_getSession()->addError($this->__('Cannot create credit memo for the order.')); return false; } return true; } /** * Initialize requested invoice instance * @param unknown_type $order */ protected function _initInvoice($order) { $invoiceId = $this->getRequest()->getParam('invoice_id'); if ($invoiceId) { $invoice = Mage::getModel('sales/order_invoice') ->load($invoiceId) ->setOrder($order); if ($invoice->getId()) { return $invoice; } } return false; } /** * Initialize creditmemo model instance * * @return Mage_Sales_Model_Order_Creditmemo */ protected function _initCreditmemo($update = false) { $this->_title($this->__('Sales'))->_title($this->__('Credit Memos')); $creditmemo = false; $creditmemoId = $this->getRequest()->getParam('creditmemo_id'); $orderId = $this->getRequest()->getParam('order_id'); if ($creditmemoId) { $creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId); } elseif ($orderId) { $data = $this->getRequest()->getParam('creditmemo'); $order = Mage::getModel('sales/order')->load($orderId); $invoice = $this->_initInvoice($order); if (!$this->_canCreditmemo($order)) { return false; } $savedData = $this->_getItemData(); $qtys = array(); $backToStock = array(); foreach ($savedData as $orderItemId =>$itemData) { if (isset($itemData['qty'])) { $qtys[$orderItemId] = $itemData['qty']; } if (isset($itemData['back_to_stock'])) { $backToStock[$orderItemId] = true; } } $data['qtys'] = $qtys; $service = Mage::getModel('sales/service_order', $order); if ($invoice) { $creditmemo = $service->prepareInvoiceCreditmemo($invoice, $data); } else { $creditmemo = $service->prepareCreditmemo($data); } /** * Process back to stock flags */ foreach ($creditmemo->getAllItems() as $creditmemoItem) { $orderItem = $creditmemoItem->getOrderItem(); $parentId = $orderItem->getParentItemId(); if (isset($backToStock[$orderItem->getId()])) { $creditmemoItem->setBackToStock(true); } elseif ($orderItem->getParentItem() && isset($backToStock[$parentId]) && $backToStock[$parentId]) { $creditmemoItem->setBackToStock(true); } elseif (empty($savedData)) { $creditmemoItem->setBackToStock(Mage::helper('cataloginventory')->isAutoReturnEnabled()); } else { $creditmemoItem->setBackToStock(false); } } } $args = array('creditmemo' => $creditmemo, 'request' => $this->getRequest()); Mage::dispatchEvent('adminhtml_sales_order_creditmemo_register_before', $args); Mage::register('current_creditmemo', $creditmemo); return $creditmemo; } /** * Save creditmemo and related order, invoice in one transaction * @param Mage_Sales_Model_Order_Creditmemo $creditmemo */ protected function _saveCreditmemo($creditmemo) { $transactionSave = Mage::getModel('core/resource_transaction') ->addObject($creditmemo) ->addObject($creditmemo->getOrder()); if ($creditmemo->getInvoice()) { $transactionSave->addObject($creditmemo->getInvoice()); } $transactionSave->save(); return $this; } /** * creditmemo information page */ public function viewAction() { $creditmemo = $this->_initCreditmemo(); if ($creditmemo) { if ($creditmemo->getInvoice()) { $this->_title($this->__("View Memo for #%s", $creditmemo->getInvoice()->getIncrementId())); } else { $this->_title($this->__("View Memo")); } $this->loadLayout(); $this->getLayout()->getBlock('sales_creditmemo_view') ->updateBackButtonUrl($this->getRequest()->getParam('come_from')); $this->_setActiveMenu('sales/order') ->renderLayout(); } else { $this->_forward('noRoute'); } } /** * Start create creditmemo action */ public function startAction() { /** * Clear old values for creditmemo qty's */ $this->_redirect('*/*/new', array('_current'=>true)); } /** * creditmemo create page */ public function newAction() { if ($creditmemo = $this->_initCreditmemo()) { if ($creditmemo->getInvoice()) { $this->_title($this->__("New Memo for #%s", $creditmemo->getInvoice()->getIncrementId())); } else { $this->_title($this->__("New Memo")); } if ($comment = Mage::getSingleton('adminhtml/session')->getCommentText(true)) { $creditmemo->setCommentText($comment); } $this->loadLayout() ->_setActiveMenu('sales/order') ->renderLayout(); } else { $this->_forward('noRoute'); } } /** * Update items qty action */ public function updateQtyAction() { try { $creditmemo = $this->_initCreditmemo(true); $this->loadLayout(); $response = $this->getLayout()->getBlock('order_items')->toHtml(); } catch (Mage_Core_Exception $e) { $response = array( 'error' => true, 'message' => $e->getMessage() ); $response = Mage::helper('core')->jsonEncode($response); } catch (Exception $e) { $response = array( 'error' => true, 'message' => $this->__('Cannot update the item\'s quantity.') ); $response = Mage::helper('core')->jsonEncode($response); } $this->getResponse()->setBody($response); } /** * Save creditmemo * We can save only new creditmemo. Existing creditmemos are not editable */ public function saveAction() { $data = $this->getRequest()->getPost('creditmemo'); if (!empty($data['comment_text'])) { Mage::getSingleton('adminhtml/session')->setCommentText($data['comment_text']); } try { $creditmemo = $this->_initCreditmemo(); if ($creditmemo) { if (($creditmemo->getGrandTotal() <=0) && (!$creditmemo->getAllowZeroGrandTotal())) { Mage::throwException( $this->__('Credit memo\'s total must be positive.') ); } $comment = ''; if (!empty($data['comment_text'])) { $creditmemo->addComment( $data['comment_text'], isset($data['comment_customer_notify']), isset($data['is_visible_on_front']) ); if (isset($data['comment_customer_notify'])) { $comment = $data['comment_text']; } } if (isset($data['do_refund'])) { $creditmemo->setRefundRequested(true); } if (isset($data['do_offline'])) { $creditmemo->setOfflineRequested((bool)(int)$data['do_offline']); } $creditmemo->register(); if (!empty($data['send_email'])) { $creditmemo->setEmailSent(true); } $creditmemo->getOrder()->setCustomerNoteNotify(!empty($data['send_email'])); $this->_saveCreditmemo($creditmemo); $creditmemo->sendEmail(!empty($data['send_email']), $comment); $this->_getSession()->addSuccess($this->__('The credit memo has been created.')); Mage::getSingleton('adminhtml/session')->getCommentText(true); $this->_redirect('*/sales_order/view', array('order_id' => $creditmemo->getOrderId())); return; } else { $this->_forward('noRoute'); return; } } catch (Mage_Core_Exception $e) { $this->_getSession()->addError($e->getMessage()); Mage::getSingleton('adminhtml/session')->setFormData($data); } catch (Exception $e) { Mage::logException($e); $this->_getSession()->addError($this->__('Cannot save the credit memo.')); } $this->_redirect('*/*/new', array('_current' => true)); } /** * Cancel creditmemo action */ public function cancelAction() { $creditmemo = $this->_initCreditmemo(); if ($creditmemo) { try { $creditmemo->cancel(); $this->_saveCreditmemo($creditmemo); $this->_getSession()->addSuccess($this->__('The credit memo has been canceled.')); } catch (Mage_Core_Exception $e) { $this->_getSession()->addError($e->getMessage()); } catch (Exception $e) { $this->_getSession()->addError($this->__('Unable to cancel the credit memo.')); } $this->_redirect('*/*/view', array('creditmemo_id'=>$creditmemo->getId())); } else { $this->_forward('noRoute'); } } /** * Void creditmemo action */ public function voidAction() { $creditmemo = $this->_initCreditmemo(); if ($creditmemo) { try { $creditmemo->void(); $this->_saveCreditmemo($creditmemo); $this->_getSession()->addSuccess($this->__('The credit memo has been voided.')); } catch (Mage_Core_Exception $e) { $this->_getSession()->addError($e->getMessage()); } catch (Exception $e) { $this->_getSession()->addError($this->__('Unable to void the credit memo.')); } $this->_redirect('*/*/view', array('creditmemo_id'=>$creditmemo->getId())); } else { $this->_forward('noRoute'); } } /** * Add comment to creditmemo history */ public function addCommentAction() { try { $this->getRequest()->setParam( 'creditmemo_id', $this->getRequest()->getParam('id') ); $data = $this->getRequest()->getPost('comment'); if (empty($data['comment'])) { Mage::throwException($this->__('The Comment Text field cannot be empty.')); } $creditmemo = $this->_initCreditmemo(); $creditmemo->addComment( $data['comment'], isset($data['is_customer_notified']), isset($data['is_visible_on_front']) ); $creditmemo->getCommentsCollection()->save(); $creditmemo->sendUpdateEmail(!empty($data['is_customer_notified']), $data['comment']); $this->loadLayout(); $response = $this->getLayout()->getBlock('creditmemo_comments')->toHtml(); } catch (Mage_Core_Exception $e) { $response = array( 'error' => true, 'message' => $e->getMessage() ); $response = Mage::helper('core')->jsonEncode($response); } catch (Exception $e) { $response = array( 'error' => true, 'message' => $this->__('Cannot add new comment.') ); $response = Mage::helper('core')->jsonEncode($response); } $this->getResponse()->setBody($response); } /** * Decides if we need to create dummy invoice item or not * for eaxample we don't need create dummy parent if all * children are not in process * * @deprecated after 1.4, Mage_Sales_Model_Service_Order used * @param Mage_Sales_Model_Order_Item $item * @param array $qtys * @return bool */ protected function _needToAddDummy($item, $qtys) { if ($item->getHasChildren()) { foreach ($item->getChildrenItems() as $child) { if (isset($qtys[$child->getId()]) && isset($qtys[$child->getId()]['qty']) && $qtys[$child->getId()]['qty'] > 0) { return true; } } return false; } else if($item->getParentItem()) { if (isset($qtys[$item->getParentItem()->getId()]) && isset($qtys[$item->getParentItem()->getId()]['qty']) && $qtys[$item->getParentItem()->getId()]['qty'] > 0) { return true; } return false; } } /** * Create pdf for current creditmemo */ public function printAction() { $this->_initCreditmemo(); parent::printAction(); } }