/**
  * @param Mage_Sales_Model_Quote     $quote
  * @param Adyen_Subscription_Model_Subscription $subscription
  *
  * @return Mage_Sales_Model_Order
  * @throws Adyen_Subscription_Exception|Exception
  */
 public function createOrder(Mage_Sales_Model_Quote $quote, Adyen_Subscription_Model_Subscription $subscription)
 {
     Mage::dispatchEvent('adyen_subscription_quote_createorder_before', array('subscription' => $subscription, 'quote' => $quote));
     try {
         if (!$subscription->canCreateOrder()) {
             Mage::helper('adyen_subscription')->logOrderCron("Not allowed to create order from quote");
             Adyen_Subscription_Exception::throwException(Mage::helper('adyen_subscription')->__('Not allowed to create order from quote'));
         }
         foreach ($quote->getAllItems() as $item) {
             /** @var Mage_Sales_Model_Quote_Item $item */
             $item->getProduct()->setData('is_created_from_subscription_item', $item->getData('subscription_item_id'));
         }
         $quote->collectTotals();
         $service = Mage::getModel('sales/service_quote', $quote);
         $service->submitAll();
         $order = $service->getOrder();
         // Save order addresses at subscription when they're currently quote addresses
         $subscriptionBillingAddress = Mage::getModel('adyen_subscription/subscription_address')->getSubscriptionAddress($subscription, self::ADDRESS_TYPE_BILLING);
         if ($subscriptionBillingAddress->getSource() == self::ADDRESS_SOURCE_QUOTE) {
             $subscriptionBillingAddress->initAddress($subscription, $order->getBillingAddress())->save();
         }
         $subscriptionShippingAddress = Mage::getModel('adyen_subscription/subscription_address')->getSubscriptionAddress($subscription, self::ADDRESS_TYPE_SHIPPING);
         if ($subscriptionShippingAddress->getSource() == self::ADDRESS_SOURCE_QUOTE) {
             $subscriptionShippingAddress->initAddress($subscription, $order->getShippingAddress())->save();
         }
         $orderAdditional = $subscription->getOrderAdditional($order, true)->save();
         $quoteAdditional = $subscription->getActiveQuoteAdditional()->setOrder($order)->save();
         $subscription->setErrorMessage(null);
         $subscriptionHistory = null;
         //Save history
         if ($subscription->getStatus() == $subscription::STATUS_ORDER_ERROR || $subscription->getStatus() == $subscription::STATUS_PAYMENT_ERROR) {
             $subscription->setStatus($subscription::STATUS_ACTIVE);
             $subscriptionHistory = Mage::getModel('adyen_subscription/subscription_history');
             $subscriptionHistory->createHistoryFromSubscription($subscription);
         }
         $subscription->setScheduledAt($subscription->calculateNextScheduleDate());
         $transaction = Mage::getModel('core/resource_transaction');
         $transaction->addObject($subscription)->addObject($orderAdditional)->addObject($quoteAdditional)->addObject($order);
         if ($subscriptionHistory) {
             $transaction->addObject($subscriptionHistory);
         }
         $transaction->save();
         Mage::helper('adyen_subscription')->logOrderCron(sprintf("Successful created order (#%s) for subscription (#%s)", $order->getId(), $subscription->getId()));
         $order = $service->getOrder();
         Mage::dispatchEvent('adyen_subscription_quote_createorder_after', array('subscription' => $subscription, 'quote' => $quote, 'order' => $order));
         return $order;
     } catch (Mage_Payment_Exception $e) {
         Mage::helper('adyen_subscription')->logOrderCron(sprintf("Error in subscription (#%s) creating order from quote (#%s) error is: %s", $subscription->getId(), $quote->getId(), $e->getMessage()));
         if (isset($order)) {
             $order->delete();
         }
         $subscription->setStatus($subscription::STATUS_PAYMENT_ERROR);
         $subscription->setErrorMessage($e->getMessage());
         $subscription->save();
         Mage::dispatchEvent('adyen_subscription_quote_createorder_fail', array('subscription' => $subscription, 'status' => $subscription::STATUS_PAYMENT_ERROR, 'error' => $e->getMessage()));
         throw $e;
     } catch (Exception $e) {
         Mage::helper('adyen_subscription')->logOrderCron(sprintf("Error in subscription (#%s) creating order from quote (#%s) error is: %s", $subscription->getId(), $quote->getId(), $e->getMessage()));
         if (isset($order)) {
             $order->delete();
         }
         $subscription->setStatus($subscription::STATUS_ORDER_ERROR);
         $subscription->setErrorMessage($e->getMessage());
         $subscription->save();
         Mage::dispatchEvent('adyen_subscription_quote_createorder_fail', array('subscription' => $subscription, 'status' => $subscription->getStatus(), 'error' => $e->getMessage()));
         throw $e;
     }
 }
Esempio n. 2
0
 /**
  * @param Mage_Sales_Model_Quote     $quote
  * @param Adyen_Subscription_Model_Subscription $subscription
  *
  * @return Mage_Sales_Model_Order
  * @throws Adyen_Subscription_Exception|Exception
  */
 public function createOrder(Mage_Sales_Model_Quote $quote, Adyen_Subscription_Model_Subscription $subscription)
 {
     Mage::dispatchEvent('adyen_subscription_quote_createorder_before', array('subscription' => $subscription, 'quote' => $quote));
     try {
         $subscription->getResource()->beginTransaction();
         if (!$subscription->canCreateOrder()) {
             Mage::helper('adyen_subscription')->logOrderCron("Not allowed to create order from quote");
             Adyen_Subscription_Exception::throwException(Mage::helper('adyen_subscription')->__('Not allowed to create order from quote'));
         }
         /**
          * only go into the visible items because bundles should use default final price
          */
         foreach ($quote->getAllVisableItems() as $item) {
             /** @var Mage_Sales_Model_Quote_Item $item */
             $item->getProduct()->setData('is_created_from_subscription_item', $item->getData('subscription_item_id'));
         }
         $quote->collectTotals();
         $service = Mage::getModel('sales/service_quote', $quote);
         $service->submitAll();
         $order = $service->getOrder();
         if (!$order instanceof Mage_Sales_Model_Order) {
             Adyen_Subscription_Exception::throwException(Mage::helper('adyen_subscription')->__("Couldn't create order from quote, probably no visible items"));
         }
         // Save order addresses at subscription when they're currently quote addresses
         $subscriptionBillingAddress = Mage::getModel('adyen_subscription/subscription_address')->getSubscriptionAddress($subscription, self::ADDRESS_TYPE_BILLING);
         if ($subscriptionBillingAddress->getSource() == self::ADDRESS_SOURCE_QUOTE) {
             $subscriptionBillingAddress->initAddress($subscription, $order->getBillingAddress())->save();
         }
         $subscriptionShippingAddress = Mage::getModel('adyen_subscription/subscription_address')->getSubscriptionAddress($subscription, self::ADDRESS_TYPE_SHIPPING);
         if ($subscriptionShippingAddress->getSource() == self::ADDRESS_SOURCE_QUOTE) {
             $subscriptionShippingAddress->initAddress($subscription, $order->getShippingAddress())->save();
         }
         $subscription->getOrderAdditional($order, true)->save();
         $subscription->getActiveQuoteAdditional()->setOrder($order)->save();
         $subscription->setActive();
         $subscription->setScheduledAt($subscription->calculateNextScheduleDate());
         $subscription->save();
         Mage::helper('adyen_subscription')->logOrderCron(sprintf("Successful created order (%s) for subscription (%s)", $order->getId(), $subscription->getId()));
         $order->save();
         $subscription->getResource()->commit();
     } catch (Adyen_Payment_Exception $e) {
         // 1. rollback everything
         $subscription->getResource()->rollBack();
         // 2. log the error to the debuglog
         Mage::helper('adyen_subscription')->logOrderCron(sprintf("Error in subscription (%s) creating order from quote (%s) error is: %s", $subscription->getId(), $quote->getId(), $e->getMessage()));
         // 3. save the error on the subscription
         $subscription->setStatus($subscription::STATUS_PAYMENT_ERROR);
         $subscription->setErrorMessage($e->getMessage());
         $subscription->save();
         // 4. dispatch the failure event
         Mage::dispatchEvent('adyen_subscription_quote_createorder_fail', array('subscription' => $subscription, 'status' => $subscription->getStatus(), 'error' => $e->getMessage()));
         throw $e;
     } catch (Exception $e) {
         // 1. rollback everything
         $subscription->getResource()->rollBack();
         // 2. log the error to the debuglog
         Mage::helper('adyen_subscription')->logOrderCron(sprintf("Error in subscription (%s) creating order from quote (%s) error is: %s", $subscription->getId(), $quote->getId(), $e->getMessage()));
         // 3. save the error on the subscription
         $subscription->setStatus($subscription::STATUS_ORDER_ERROR);
         $subscription->setErrorMessage($e->getMessage());
         $subscription->save();
         // 4. dispatch the failure event
         Mage::dispatchEvent('adyen_subscription_quote_createorder_fail', array('subscription' => $subscription, 'quote' => $quote, 'status' => $subscription->getStatus(), 'error' => $e->getMessage()));
         throw $e;
     }
     Mage::dispatchEvent('adyen_subscription_quote_createorder_after', array('subscription' => $subscription, 'quote' => $quote, 'order' => $order));
     return $order;
 }