diff --git a/app/code/community/Svea/Checkout/Helper/Data.php b/app/code/community/Svea/Checkout/Helper/Data.php index 4151ca7..aa36289 100644 --- a/app/code/community/Svea/Checkout/Helper/Data.php +++ b/app/code/community/Svea/Checkout/Helper/Data.php @@ -80,8 +80,8 @@ public function replaceQuote() $newQuote->merge($oldQuote) ->collectTotals() ->save(); - $session->replaceQuote($newQuote); $oldQuote->setIsActive(0); + $session->setQuoteId($newQuote->getId()); return $newQuote; } diff --git a/app/code/community/Svea/Checkout/Model/Checkout/Api/BuildOrder.php b/app/code/community/Svea/Checkout/Model/Checkout/Api/BuildOrder.php index b9185c7..11f763e 100644 --- a/app/code/community/Svea/Checkout/Model/Checkout/Api/BuildOrder.php +++ b/app/code/community/Svea/Checkout/Model/Checkout/Api/BuildOrder.php @@ -94,9 +94,9 @@ public function createSveaOrderFromQuote($quote, $test = false) { $sveaOrder = $this->setupCommunication(); - if ($test === false) { + /*if ($test === false) { $quote = $this->checkQuote($sveaOrder, $quote); - } + }*/ $this->_setupOrderConfig($sveaOrder, $quote) ->setLocales($sveaOrder, $quote) ->_presetValues($quote,$sveaOrder) @@ -116,7 +116,7 @@ public function createSveaOrderFromQuote($quote, $test = false) * @return mixed */ protected function checkQuote($sveaOrder, $quote) { - $sveaId = (int)$quote->getPaymentReference(); + /*$sveaId = (int)$quote->getPaymentReference(); if ($sveaId) { try { $orderResponse = $sveaOrder->setCheckoutOrderId($sveaId)->getOrder($sveaId); @@ -127,7 +127,7 @@ protected function checkQuote($sveaOrder, $quote) { if (isset($orderResponse) && $orderResponse['Status'] != 'Created'){ $quote = Mage::helper('sveacheckout')->replaceQuote(); } - } + }*/ return $quote; } diff --git a/app/code/community/Svea/Checkout/Model/Payment/Acknowledge.php b/app/code/community/Svea/Checkout/Model/Payment/Acknowledge.php index d33970f..7919076 100755 --- a/app/code/community/Svea/Checkout/Model/Payment/Acknowledge.php +++ b/app/code/community/Svea/Checkout/Model/Payment/Acknowledge.php @@ -30,40 +30,26 @@ public function acknowledge($quote, $mode, $sveaId) $adapter->beginTransaction(); try { - $magentoOrders = Mage::getModel('sales/order') - ->getCollection() - ->addAttributeToFilter('quote_id', $quote->getId()) - ->addAttributeToSelect('payment_reference'); - - $indicationOfError = false; - if ($magentoOrders->count() >= 2) { - $indicationOfError = true; - } - - $orderThatMatch = []; - foreach ($magentoOrders as $order) { - if ($order->getPaymentReference() == $sveaId) { - $orderThatMatch[] = $order; - } - } - - if (sizeof($orderThatMatch) >= 2) { - foreach ($orderThatMatch as $k => $order) { - if ($order->getStatus() == 'canceled') { - unset($orderThatMatch[$k]); - } + $svea = Mage::getModel('sveacheckout/Checkout_Api_BuildOrder'); + $sveaOrder = $svea->setupCommunication(); + $sveaData = new Varien_Object( $sveaOrder->setCheckoutOrderId((int)$quote->getPaymentReference())->getOrder() ); + $sveaReference = $sveaData->getData('ClientOrderNumber'); + + $useForReference = Mage::getStoreConfig('payment/sveacheckout_dev_settings/reference'); + if (in_array($useForReference , ['suffixed-increment-id','suffixed-order-id'])) { + $reference = $sveaReference; + $separator = '_'; + $lastChar = strrpos ($reference , $separator,0); + $reference = substr($reference,0, $lastChar); + if ($useForReference == 'suffixed-increment-id') { + $magentoOrder = Mage::getModel('sales/order')->load($reference, 'increment_id'); + } else { + $magentoOrder = Mage::getModel('sales/order')->load($reference, 'entity_id'); } - } - - if (sizeof($orderThatMatch) >= 2) { - - throw new Mage_Core_Exception("There were multiple orders that matched SveaOrder with ID {$sveaId}."); - } elseif($indicationOfError && sizeof($orderThatMatch)) { - $magentoOrder = $orderThatMatch[0]->load(); - } - - if(!isset($magentoOrder)) { - $magentoOrder = Mage::getModel('sales/order')->load($quote->getId(), 'quote_id'); + } elseif ($useForReference == 'plain-increment-id') { + $magentoOrder = Mage::getModel('sales/order')->load($sveaReference, 'increment_id'); + } else { + $magentoOrder = Mage::getModel('sales/order')->load($sveaReference, 'entity_id'); } if(!isset($magentoOrder)) { @@ -90,7 +76,7 @@ public function acknowledge($quote, $mode, $sveaId) $magentoOrder->setCustomerEmail($sveaData->getData('EmailAddress')); } - $statusText = Mage::getStoreConfig('payment/SveaCheckout/order_status_after_acknowledge'); + $statusText = Mage::getStoreConfig('payment/SveaCheckout/order_status_after_acknowledge'); $message = $helper->__("Order was acknowledged by Svea."); $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo); diff --git a/app/code/community/Svea/Checkout/Model/Payment/CreateOrder.php b/app/code/community/Svea/Checkout/Model/Payment/CreateOrder.php index 86fb6e6..83486f7 100755 --- a/app/code/community/Svea/Checkout/Model/Payment/CreateOrder.php +++ b/app/code/community/Svea/Checkout/Model/Payment/CreateOrder.php @@ -47,7 +47,7 @@ public function createOrder($quote, $orderData, $orderQueueItem) $order->setPaymentReference($quote->getPaymentReference()) ->save(); - $quote->setIsActive(0)->save(); + $type = Mage_Sales_Model_Order_Payment_Transaction::TYPE_ORDER; $id = $orderData->getData('OrderId'); Mage::helper('sveacheckout/transaction')->createTransaction( diff --git a/app/code/community/Svea/Checkout/controllers/IndexController.php b/app/code/community/Svea/Checkout/controllers/IndexController.php index 9865211..1de705b 100644 --- a/app/code/community/Svea/Checkout/controllers/IndexController.php +++ b/app/code/community/Svea/Checkout/controllers/IndexController.php @@ -36,7 +36,6 @@ protected function _getPaymentSettings() { ]; } - /** * Handles return to payment window with failed payment. * @@ -44,7 +43,7 @@ protected function _getPaymentSettings() { * * @return Mage_Sales_Model_Quote */ - protected function _restoreQuote($id) + protected function _restoreQuote($id, $cancelOrderReference = null) { $svea = Mage::getModel('sveacheckout/Checkout_Api_BuildOrder'); $session = Mage::getSingleton('checkout/session'); @@ -53,30 +52,40 @@ protected function _restoreQuote($id) $hasOrder = Mage::getModel('sales/order')->getCollection() ->addAttributeToSelect('id') ->addAttributeToFilter('quote_id', $id) - ->getSize(); - - if ( - !$hasOrder - && $oldQuote->getIsActive() - && $oldQuote->hasItems() - && !$oldQuote->getHasError() + ->getSize() > 0; + if ( + !$hasOrder && + $oldQuote->getIsActive() && + $oldQuote->hasItems() && + !$oldQuote->getHasError() ) { return $oldQuote; - } else { - $sveaOrderId = null; + } elseif($hasOrder && $cancelOrderReference) { + $order = Mage::getModel('sales/order')->load($cancelOrderReference, 'increment_id'); + if ( + 'new' == $order->getState() + && $order->canCancel() + && ($order->getPayment() && !sizeof($order->getPayment()->getAdditionalInformation())) + ) { + $order->cancel() + ->save(); + Mage::helper('sveacheckout/Debug')->writeToLog( + 'cancelled duplicate order id'. $order->getId() + ); + } } $quote = Mage::getModel('sales/quote')->setStore(Mage::app()->getStore()); + $quote->merge($oldQuote) ->setIsActive(1) ->setReservedOrderId(null) ->setPaymentReference($sveaOrderId) ->collectTotals() + ->unsLastRealOrderId() ->save(); - $session->replaceQuote($quote) - ->unsLastRealOrderId(); $sveaOrder = $svea->createSveaOrderFromQuote($quote); //Create a new order in Sveas end, to reset URIs. @@ -132,11 +141,30 @@ public function indexAction() if (isset($requestParams['reactivate']) && isset($requestParams['quoteId'])) { $quoteId =(int)$requestParams['quoteId']; - $this->_restoreQuote($quoteId); + $cancelOrderId = null; + $quote = Mage::getModel('sales/quote')->load($quoteId); + + $reservedOrderId = $quote->getReservedOrderId(); + if ($reservedOrderId && $reservedOrderId !== $quoteId) { + $orderExists = Mage::getModel('sales/order')->getCollection() + ->addAttributeToFilter('increment_id', $reservedOrderId)->getSize(); + $cancelOrderReference = $orderExists ? $reservedOrderId : null; + } + + $quote = $this->_restoreQuote($quoteId, $cancelOrderReference); + return $this->_redirect('sveacheckout/index'); } else { $quote = $session->getQuote(); + $svea = Mage::getModel('sveacheckout/Checkout_Api_BuildOrder'); + if ($quote->getPaymentReference() > 0) { + $sveaOrderId = $quote->getData('payment_reference'); + $sveaOrder = $svea->createSveaOrderFromQuote($quote); + $sveaOrder = $sveaOrder->setCheckoutOrderId((int)$sveaOrderId)->getOrder(); + $quote->setReservedOrderId(null)->save(); + $session->unsLastRealOrderId(); + } } if (!$quote->hasItems() || $quote->getHasError()) { @@ -180,8 +208,9 @@ public function indexAction() return $this->_redirect('checkout/onepage'); } - $svea = Mage::getModel('sveacheckout/Checkout_Api_BuildOrder'); + $svea = Mage::getModel('sveacheckout/Checkout_Api_BuildOrder'); $sveaOrder = $svea->createSveaOrderFromQuote($quote); + try { $response = $this->_getSveaResponse($sveaOrder); @@ -270,6 +299,11 @@ protected function _getSveaResponse($sveaOrder) $response = $this->_invalidateQuote($sveaOrder, $quote); } + if ($response['Status'] == 'Cancelled') { + + $response = $this->_invalidateQuote($sveaOrder, $quote); + } + if ($svea->sveaOrderHasErrors($sveaOrder, $quote, $response)) { $message = sprintf( $this->__('Error code 205-q%d - Could not load Svea Ekonomi checkout%s'), diff --git a/app/code/community/Svea/Checkout/controllers/PushController.php b/app/code/community/Svea/Checkout/controllers/PushController.php index 4409e21..75c4fbb 100755 --- a/app/code/community/Svea/Checkout/controllers/PushController.php +++ b/app/code/community/Svea/Checkout/controllers/PushController.php @@ -93,6 +93,30 @@ public function indexAction() if ('final' == strtolower($responseObject->getData('Status'))) { Mage::getModel('sveacheckout/payment_acknowledge') ->acknowledge($quote, $request->getParam('mode'), $request->getParam('sveaId')); + + /** + * Cancel Duplicates. + */ + $orders = Mage::getModel('sales/order')->getCollection() + ->addAttributeToFilter('quote_id', $quoteId); + if (count($orders) > 1) { + foreach ($orders as $order) { + if ($order->getPayment()->getMethod() != 'sveacheckout') { + break; + } + + if ( + 'new' == $order->getState() + && $order->canCancel() + && ($order->getPayment() && !sizeof($order->getPayment()->getAdditionalInformation())) + ) { + $order->cancel()->save(); + Mage::helper('sveacheckout/Debug')->writeToLog( + 'cancelled duplicate order id'. $order->getId() + ); + } + } + } } if ($this->getResponse()->getHttpResponseCode() == 200) { diff --git a/app/code/community/Svea/Checkout/controllers/ValidationController.php b/app/code/community/Svea/Checkout/controllers/ValidationController.php index d92684d..41d4e0c 100755 --- a/app/code/community/Svea/Checkout/controllers/ValidationController.php +++ b/app/code/community/Svea/Checkout/controllers/ValidationController.php @@ -57,29 +57,17 @@ public function indexAction() ->save(); $responseObject = new Varien_Object($response); - if ($orderQueueItem->getState() == $orderQueueItem::SVEA_QUEUE_STATE_OK) { - return $this->reportAndReturn(208, "QueueItem {$quoteId} already handled.", $orderQueueItem->getOrderId()); - } - - if ($svea->sveaOrderHasErrors($sveaOrder, $quote, $response)) { - - Mage::throwException("Quote " . intval($quoteId) . " is not valid"); - } if (!($quote->getPayment()->getMethod())) { $payment = $quote->getPayment(); $payment->setMethod('sveacheckout'); } - if ( - !$orderQueueItem->getData('order_id') - && $orderQueueItem->getData('state') != $orderQueueItem::SVEA_QUEUE_STATE_NEW - && $orderQueueItem->getData('state') != $orderQueueItem::SVEA_QUEUE_STATE_OK - ) { - $createdOrder = Mage::getModel('sveacheckout/Payment_CreateOrder') - ->createOrder($quote, $responseObject, $orderQueueItem); - } + + $createdOrder = Mage::getModel('sveacheckout/Payment_CreateOrder') + ->createOrder($quote, $responseObject, $orderQueueItem); + if (isset($createdOrder) && true !== $createdOrder) { diff --git a/app/design/adminhtml/default/default/template/sveacheckout/queue.phtml b/app/design/adminhtml/default/default/template/sveacheckout/queue.phtml index bb81972..376bd06 100644 --- a/app/design/adminhtml/default/default/template/sveacheckout/queue.phtml +++ b/app/design/adminhtml/default/default/template/sveacheckout/queue.phtml @@ -2,12 +2,24 @@ getQueueData(); $helper = Mage::helper('sveacheckout/renderer'); - foreach ($data['details'] as $key => $detail) :?> + foreach ($data['details'] as $key => $detail) : + $shippingAddress = (isset($billingAddress['IsGeneric']) && $billingAddress['IsGeneric']) + ? $shippingAddress['AddressLines'] + : $detail['ShippingAddress']; + unset($shippingAddress['AddressLines']); + unset($shippingAddress['IsGeneric']); + + $billingAddress = (isset($billingAddress['IsGeneric']) && $billingAddress['IsGeneric']) + ? $billingAddress['AddressLines'] + : $detail['BillingAddress']; + unset($billingAddress['AddressLines']); + unset($billingAddress['IsGeneric']); + ?>

- +
@@ -15,14 +27,14 @@
- ", $detail['ShippingAddress']) ?> + ", $shippingAddress) ?>
- +
@@ -30,7 +42,7 @@
- ", $detail['BillingAddress']) ?> + ", $billingAddress) ?>