/** * Process order, create/update/cancel/delete order depending on config and order state * * @param \WirecardCEE_Stdlib_Return_ReturnAbstract $return * * @return Order|null * @throws \Exception */ public function processOrder(\WirecardCEE_Stdlib_Return_ReturnAbstract $return) { $quoteId = $return->mage_quoteId; /** @var Quote $quote */ $quote = $this->_objectManager->create('\\Magento\\Quote\\Model\\Quote'); $quote->load($quoteId); if (!$quote->getId()) { throw new \Exception('Quote not found'); } $orderIncrementId = $return->mage_orderId; /** @var Order $order */ $order = $this->_objectManager->create('\\Magento\\Sales\\Model\\Order'); $order->loadByIncrementId($orderIncrementId); $orderExists = (bool) $order->getId(); if ($return->mage_orderCreation == 'before') { if (!$orderExists) { throw new \Exception('Order not found'); } switch ($return->getPaymentState()) { case \WirecardCEE_QPay_ReturnFactory::STATE_SUCCESS: case \WirecardCEE_QPay_ReturnFactory::STATE_PENDING: /* after a pending payment, order might have been processed manually */ /* just save transaction but dont update order */ if ($this->isOrderProcessed($order)) { $this->saveTransaction(Transaction::TYPE_PAYMENT, '', $order, $return); } else { $this->confirmOrder($order, $return, false); } break; case \WirecardCEE_QPay_ReturnFactory::STATE_CANCEL: case \WirecardCEE_QPay_ReturnFactory::STATE_FAILURE: // ev. set review state //$order->setState(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW); if (!$this->isOrderProcessed($order)) { $this->failedOrder($order, $return); } break; } } else { if ($return->mage_orderCreation == 'after') { switch ($return->getPaymentState()) { case \WirecardCEE_QPay_ReturnFactory::STATE_SUCCESS: case \WirecardCEE_QPay_ReturnFactory::STATE_PENDING: $fraudDetected = false; if (!$orderExists) { $order = $this->submitOrder($quote); $fraudDetected = !$this->_dataHelper->compareQuoteChecksum($quote, $return->quoteHash); $orderExists = true; } /* after a pending payment, order might have been processed manually */ /* just save transaction but dont update order */ if ($this->isOrderProcessed($order)) { $this->saveTransaction(Transaction::TYPE_PAYMENT, '', $order, $return); } else { $this->confirmOrder($order, $return, $fraudDetected); } break; case \WirecardCEE_QPay_ReturnFactory::STATE_CANCEL: case \WirecardCEE_QPay_ReturnFactory::STATE_FAILURE: if ($orderExists && !$this->isOrderProcessed($order)) { $this->deleteOrder($order); } break; } } else { throw new \Exception('Unknown order creation type'); } } if ($orderExists) { $order->save(); return $order; } return null; }