/app/code/core/Mage/Adminhtml/controllers/Sales/Order/ShipmentController.php
PHP | 451 lines | 324 code | 34 blank | 93 comment | 49 complexity | 7b2ce7be829c6c31f145c4cfd4485296 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 shipment controller
- *
- * @category Mage
- * @package Mage_Adminhtml
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Mage_Adminhtml_Sales_Order_ShipmentController extends Mage_Adminhtml_Controller_Sales_Shipment
- {
- /**
- * Initialize shipment items QTY
- */
- protected function _getItemQtys()
- {
- $data = $this->getRequest()->getParam('shipment');
- if (isset($data['items'])) {
- $qtys = $data['items'];
- } else {
- $qtys = array();
- }
- return $qtys;
- }
- /**
- * Initialize shipment model instance
- *
- * @return Mage_Sales_Model_Order_Shipment
- */
- protected function _initShipment()
- {
- $this->_title($this->__('Sales'))->_title($this->__('Shipments'));
- $shipment = false;
- $shipmentId = $this->getRequest()->getParam('shipment_id');
- $orderId = $this->getRequest()->getParam('order_id');
- if ($shipmentId) {
- $shipment = Mage::getModel('sales/order_shipment')->load($shipmentId);
- } elseif ($orderId) {
- $order = Mage::getModel('sales/order')->load($orderId);
- /**
- * Check order existing
- */
- if (!$order->getId()) {
- $this->_getSession()->addError($this->__('The order no longer exists.'));
- return false;
- }
- /**
- * Check shipment is available to create separate from invoice
- */
- if ($order->getForcedDoShipmentWithInvoice()) {
- $this->_getSession()->addError($this->__('Cannot do shipment for the order separately from invoice.'));
- return false;
- }
- /**
- * Check shipment create availability
- */
- if (!$order->canShip()) {
- $this->_getSession()->addError($this->__('Cannot do shipment for the order.'));
- return false;
- }
- $savedQtys = $this->_getItemQtys();
- $shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($savedQtys);
- $tracks = $this->getRequest()->getPost('tracking');
- if ($tracks) {
- foreach ($tracks as $data) {
- if (empty($data['number'])) {
- Mage::throwException($this->__('Tracking number cannot be empty.'));
- }
- $track = Mage::getModel('sales/order_shipment_track')
- ->addData($data);
- $shipment->addTrack($track);
- }
- }
- }
- Mage::register('current_shipment', $shipment);
- return $shipment;
- }
- /**
- * Save shipment and order in one transaction
- * @param Mage_Sales_Model_Order_Shipment $shipment
- */
- protected function _saveShipment($shipment)
- {
- $shipment->getOrder()->setIsInProcess(true);
- $transactionSave = Mage::getModel('core/resource_transaction')
- ->addObject($shipment)
- ->addObject($shipment->getOrder())
- ->save();
- return $this;
- }
- /**
- * shipment information page
- */
- public function viewAction()
- {
- if ($shipment = $this->_initShipment()) {
- $this->_title($this->__('View Shipment'));
- $this->loadLayout();
- $this->getLayout()->getBlock('sales_shipment_view')
- ->updateBackButtonUrl($this->getRequest()->getParam('come_from'));
- $this->_setActiveMenu('sales/order')
- ->renderLayout();
- }
- else {
- $this->_forward('noRoute');
- }
- }
- /**
- * Start create shipment action
- */
- public function startAction()
- {
- /**
- * Clear old values for shipment qty's
- */
- $this->_redirect('*/*/new', array('order_id'=>$this->getRequest()->getParam('order_id')));
- }
- /**
- * Shipment create page
- */
- public function newAction()
- {
- if ($shipment = $this->_initShipment()) {
- $this->_title($this->__('New Shipment'));
- if ($comment = Mage::getSingleton('adminhtml/session')->getCommentText(true)) {
- $shipment->setCommentText($comment);
- }
- $this->loadLayout()
- ->_setActiveMenu('sales/order')
- ->renderLayout();
- } else {
- $this->_redirect('*/sales_order/view', array('order_id'=>$this->getRequest()->getParam('order_id')));
- }
- }
- /**
- * Save shipment
- * We can save only new shipment. Existing shipments are not editable
- */
- public function saveAction()
- {
- $data = $this->getRequest()->getPost('shipment');
- if (!empty($data['comment_text'])) {
- Mage::getSingleton('adminhtml/session')->setCommentText($data['comment_text']);
- }
- try {
- if ($shipment = $this->_initShipment()) {
- $shipment->register();
- $comment = '';
- if (!empty($data['comment_text'])) {
- $shipment->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 (!empty($data['send_email'])) {
- $shipment->setEmailSent(true);
- }
- $shipment->getOrder()->setCustomerNoteNotify(!empty($data['send_email']));
- $this->_saveShipment($shipment);
- $shipment->sendEmail(!empty($data['send_email']), $comment);
- $this->_getSession()->addSuccess($this->__('The shipment has been created.'));
- Mage::getSingleton('adminhtml/session')->getCommentText(true);
- $this->_redirect('*/sales_order/view', array('order_id' => $shipment->getOrderId()));
- return;
- } else {
- $this->_forward('noRoute');
- return;
- }
- } catch (Mage_Core_Exception $e) {
- $this->_getSession()->addError($e->getMessage());
- } catch (Exception $e) {
- $this->_getSession()->addError($this->__('Cannot save shipment.'));
- }
- $this->_redirect('*/*/new', array('order_id' => $this->getRequest()->getParam('order_id')));
- }
- /**
- * Send email with shipment data to customer
- */
- public function emailAction()
- {
- try {
- if ($shipment = $this->_initShipment()) {
- $shipment->sendEmail(true)
- ->setEmailSent(true)
- ->save();
- $this->_getSession()->addSuccess($this->__('The shipment has been sent.'));
- }
- } catch (Mage_Core_Exception $e) {
- $this->_getSession()->addError($e->getMessage());
- } catch (Exception $e) {
- $this->_getSession()->addError($this->__('Cannot send shipment information.'));
- }
- $this->_redirect('*/*/view', array(
- 'shipment_id' => $this->getRequest()->getParam('shipment_id')
- ));
- }
- /**
- * Add new tracking number action
- */
- public function addTrackAction()
- {
- try {
- $carrier = $this->getRequest()->getPost('carrier');
- $number = $this->getRequest()->getPost('number');
- $title = $this->getRequest()->getPost('title');
- if (empty($carrier)) {
- Mage::throwException($this->__('The carrier needs to be specified.'));
- }
- if (empty($number)) {
- Mage::throwException($this->__('Tracking number cannot be empty.'));
- }
- if ($shipment = $this->_initShipment()) {
- $track = Mage::getModel('sales/order_shipment_track')
- ->setNumber($number)
- ->setCarrierCode($carrier)
- ->setTitle($title);
- $shipment->addTrack($track)
- ->save();
- $this->loadLayout();
- $response = $this->getLayout()->getBlock('shipment_tracking')->toHtml();
- } else {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot initialize shipment for adding tracking number.'),
- );
- }
- } catch (Mage_Core_Exception $e) {
- $response = array(
- 'error' => true,
- 'message' => $e->getMessage(),
- );
- } catch (Exception $e) {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot add tracking number.'),
- );
- }
- if (is_array($response)) {
- $response = Mage::helper('core')->jsonEncode($response);
- }
- $this->getResponse()->setBody($response);
- }
- /**
- * Remove tracking number from shipment
- */
- public function removeTrackAction()
- {
- $trackId = $this->getRequest()->getParam('track_id');
- $shipmentId = $this->getRequest()->getParam('shipment_id');
- $track = Mage::getModel('sales/order_shipment_track')->load($trackId);
- if ($track->getId()) {
- try {
- if ($shipmentId = $this->_initShipment()) {
- $track->delete();
- $this->loadLayout();
- $response = $this->getLayout()->getBlock('shipment_tracking')->toHtml();
- } else {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot initialize shipment for delete tracking number.'),
- );
- }
- } catch (Exception $e) {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot delete tracking number.'),
- );
- }
- } else {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot load track with retrieving identifier.'),
- );
- }
- if (is_array($response)) {
- $response = Mage::helper('core')->jsonEncode($response);
- }
- $this->getResponse()->setBody($response);
- }
- /**
- * View shipment tracking information
- */
- public function viewTrackAction()
- {
- $trackId = $this->getRequest()->getParam('track_id');
- $shipmentId = $this->getRequest()->getParam('shipment_id');
- $track = Mage::getModel('sales/order_shipment_track')->load($trackId);
- if ($track->getId()) {
- try {
- $response = $track->getNumberDetail();
- } catch (Exception $e) {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot retrieve tracking number detail.'),
- );
- }
- } else {
- $response = array(
- 'error' => true,
- 'message' => $this->__('Cannot load track with retrieving identifier.'),
- );
- }
- if ( is_object($response)){
- $className = Mage::getConfig()->getBlockClassName('adminhtml/template');
- $block = new $className();
- $block->setType('adminhtml/template')
- ->setIsAnonymous(true)
- ->setTemplate('sales/order/shipment/tracking/info.phtml');
- $block->setTrackingInfo($response);
- $this->getResponse()->setBody($block->toHtml());
- } else {
- if (is_array($response)) {
- $response = Mage::helper('core')->jsonEncode($response);
- }
- $this->getResponse()->setBody($response);
- }
- }
- /**
- * Add comment to shipment history
- */
- public function addCommentAction()
- {
- try {
- $this->getRequest()->setParam(
- 'shipment_id',
- $this->getRequest()->getParam('id')
- );
- $data = $this->getRequest()->getPost('comment');
- if (empty($data['comment'])) {
- Mage::throwException($this->__('Comment text field cannot be empty.'));
- }
- $shipment = $this->_initShipment();
- $shipment->addComment(
- $data['comment'],
- isset($data['is_customer_notified']),
- isset($data['is_visible_on_front'])
- );
- $shipment->sendUpdateEmail(!empty($data['is_customer_notified']), $data['comment']);
- $shipment->save();
- $this->loadLayout(false);
- $response = $this->getLayout()->getBlock('shipment_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 shipment 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 ($child->getIsVirtual()) {
- continue;
- }
- if ((isset($qtys[$child->getId()]) && $qtys[$child->getId()] > 0)
- || (!isset($qtys[$child->getId()]) && $child->getQtyToShip())) {
- return true;
- }
- }
- return false;
- } else if($item->getParentItem()) {
- if ($item->getIsVirtual()) {
- return false;
- }
- if ((isset($qtys[$item->getParentItem()->getId()]) && $qtys[$item->getParentItem()->getId()] > 0)
- || (!isset($qtys[$item->getParentItem()->getId()]) && $item->getParentItem()->getQtyToShip())) {
- return true;
- }
- return false;
- }
- }
- }