Exemplo n.º 1
0
 /**
  * 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;
 }