/** * @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; } }
/** * @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; }