*/ class Mage_XmlConnect_Paypal_MepController extends Mage_XmlConnect_Controller_Action { /** * Store MEP checkout model instance * * @var Mage_XmlConnect_Model_Paypal_Mep_Checkout */ protected $_checkout = null; /** * Store Quote mdoel instance * * @var Mage_Sales_Model_Quote */ protected $_quote = false; /** * Make sure customer is logged in * * @return null */ public function preDispatch() { parent::preDispatch(); if (!Mage::getSingleton('customer/session')->isLoggedIn() && !Mage::getSingleton('checkout/session')->getQuote()->isAllowedGuestCheckout() ) { $this->setFlag('', self::FLAG_NO_DISPATCH, true); $this->_message( $this->__('Customer not logged in.'), self::MESSAGE_STATUS_ERROR, array('logged_in' => '0') ); return; } } /** * Start MEP Checkout * * @return null */ public function indexAction() { try { if (is_object(Mage::getConfig()->getNode('modules/Enterprise_GiftCardAccount'))) { $giftcardInfoBlock = $this->getLayout()->addBlock( 'enterprise_giftcardaccount/checkout_onepage_payment_additional', 'giftcard_info' ); if (intval($giftcardInfoBlock->getAppliedGiftCardAmount())) { $this->_message( $this->__('Paypal MEP doesn\'t support checkout with any discount.'), self::MESSAGE_STATUS_ERROR ); return; } } $this->_initCheckout(); $this->_checkout->initCheckout(); $this->_message($this->__('Checkout has been initialized.'), self::MESSAGE_STATUS_SUCCESS); return; } catch (Mage_Core_Exception $e) { $this->_message($e->getMessage(), self::MESSAGE_STATUS_ERROR); } catch (Exception $e) { $this->_message($this->__('Unable to start MEP Checkout.'), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } } /** * Save shipping address to current quote using onepage model * * @return null */ public function saveShippingAddressAction() { if (!$this->getRequest()->isPost()) { $this->_message($this->__('Specified invalid data.'), self::MESSAGE_STATUS_ERROR); return; } try { $this->_initCheckout(); $data = $this->getRequest()->getPost('shipping', array()); array_walk_recursive($data, create_function('&$val', '$val = trim($val);')); if (!empty($data['region']) && isset($data['country_id'])) { $region = Mage::getModel('directory/region')->loadByCode($data['region'], $data['country_id']); if ($region && $region->getId()) { $data['region_id'] = $region->getId(); } } $result = $this->_checkout->saveShipping($data); if (!isset($result['error'])) { $this->_message( $this->__('Shipping address has been set.'), self::MESSAGE_STATUS_SUCCESS ); } else { if (!is_array($result['message'])) { $result['message'] = array($result['message']); } $this->_message(implode('. ', $result['message']), self::MESSAGE_STATUS_ERROR); } } catch (Mage_Core_Exception $e) { $this->_message($e->getMessage(), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } catch (Exception $e) { $this->_message($this->__('Unable to save shipping address.'), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } } /** * Get shipping methods for current quote * * @return null */ public function shippingMethodsAction() { try { $this->_initCheckout(); $this->loadLayout(false); $this->renderLayout(); } catch (Mage_Core_Exception $e) { $this->_message($e->getMessage(), self::MESSAGE_STATUS_ERROR); } catch (Exception $e) { $this->_message($this->__('Unable to get shipping methods list.'), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } } /** * Shipping method save action * * @return null */ public function saveShippingMethodAction() { if (!$this->getRequest()->isPost()) { $this->_message($this->__('Specified invalid data.'), self::MESSAGE_STATUS_ERROR); return; } try { $this->_initCheckout(); $data = $this->getRequest()->getPost('shipping_method', ''); $this->_getQuote()->getShippingAddress()->setShippingMethod($data)->setCollectShippingRates(true)->save(); $result = $this->_checkout->saveShippingMethod($data); if (!isset($result['error'])) { /** @var $message Mage_XmlConnect_Model_Simplexml_Element */ $message = Mage::getModel('xmlconnect/simplexml_element', ''); $message->addChild('status', self::MESSAGE_STATUS_SUCCESS); $message->addChild('text', $this->__('Shipping method has been set.')); if ($this->_getQuote()->isVirtual()) { $quoteAddress = $this->_getQuote()->getBillingAddress(); } else { $quoteAddress = $this->_getQuote()->getShippingAddress(); } $taxAmount = Mage::helper('core')->currency($quoteAddress->getBaseTaxAmount(), false, false); $message->addChild('tax_amount', Mage::helper('xmlconnect')->formatPriceForXml($taxAmount)); $this->_getQuote()->collectTotals()->save(); $this->getResponse()->setBody($message->asNiceXml()); } else { if (!is_array($result['message'])) { $result['message'] = array($result['message']); } $this->_message(implode('. ', $result['message']), self::MESSAGE_STATUS_ERROR); } } catch (Mage_Core_Exception $e) { $this->_message($e->getMessage(), self::MESSAGE_STATUS_ERROR); } catch (Exception $e) { $this->_message($this->__('Unable to save shipping method.'), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } } /** * Shopping cart totals * * @return null */ public function cartTotalsAction() { try { $this->_initCheckout(); $this->loadLayout(false); $this->renderLayout(); return; } catch (Mage_Core_Exception $e) { $this->_message($e->getMessage(), self::MESSAGE_STATUS_ERROR); } catch (Exception $e) { $this->_message($this->__('Unable to collect cart totals.'), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } } /** * Submit the order * * @return null */ public function saveOrderAction() { if (!$this->getRequest()->isPost()) { $this->_message($this->__('Specified invalid data.'), self::MESSAGE_STATUS_ERROR); return; } try { /** * Init checkout */ $this->_initCheckout(); /** * Set payment data */ $data = $this->getRequest()->getPost('payment', array()); if (Mage::getSingleton('customer/session')->isLoggedIn()) { $data['payer'] = Mage::getSingleton('customer/session')->getCustomer()->getEmail(); } $this->_checkout->savePayment($data); /** * Place order */ $this->_checkout->saveOrder(); /** * Format success report */ /** @var $message Mage_XmlConnect_Model_Simplexml_Element */ $message = Mage::getModel('xmlconnect/simplexml_element', ''); $message->addChild('status', self::MESSAGE_STATUS_SUCCESS); $orderId = $this->_checkout->getLastOrderId(); $text = $this->__('Thank you for your purchase! '); $text .= $this->__('Your order # is: %s. ', $orderId); $text .= $this->__('You will receive an order confirmation email with details of your order and a link to track its progress.'); $message->addChild('text', $text); $message->addChild('order_id', $orderId); $this->getResponse()->setBody($message->asNiceXml()); return; } catch (Mage_Core_Exception $e) { $this->_message($e->getMessage(), self::MESSAGE_STATUS_ERROR); } catch (Exception $e) { $this->_message($this->__('Unable to place the order.'), self::MESSAGE_STATUS_ERROR); Mage::logException($e); } } /** * Instantiate quote and checkout * * @throws Mage_Core_Exception * @return null */ protected function _initCheckout() { $quote = $this->_getQuote(); if (!$quote->hasItems() || $quote->getHasError()) { Mage::throwException($this->__('Unable to initialize MEP Checkout.')); } if (!$quote->validateMinimumAmount()) { $error = Mage::getStoreConfig('sales/minimum_order/error_message'); Mage::throwException($error); } $this->_getCheckoutSession()->setCartWasUpdated(false); $this->_checkout = Mage::getSingleton('xmlconnect/paypal_mep_checkout', array('quote' => $quote)); } /** * Return checkout session object * * @return Mage_Checkout_Model_Session */ protected function _getCheckoutSession() { return Mage::getSingleton('checkout/session'); } /** * Return checkout quote object * * @return Mage_Sale_Model_Quote */ protected function _getQuote() { if (!$this->_quote) { $this->_quote = $this->_getCheckoutSession()->getQuote(); } return $this->_quote; } }