/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreditmemoController.php
PHP | 445 lines | 312 code | 34 blank | 99 comment | 53 complexity | 0fb67bdb198d35106d8e98b27d99b01c MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, GPL-2.0, WTFPL
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category Mage
- * @package Mage_Adminhtml
- * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- /**
- * Adminhtml sales order creditmemo controller
- *
- * @category Mage
- * @package Mage_Adminhtml
- * @author Magento Core Team <core@magentocommerce.com>
- */
- 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()
- {
- if ($creditmemo = $this->_initCreditmemo()) {
- 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()
- {
- if ($invoice = $this->_initCreditmemo()) {
- 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->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;
- }
- }
- }