Ejemplo n.º 1
0
 /**
  * Cancel payment
  * Cancelaltion, is when the order can no longer be modified. While an order payment might be voided a new
  * invoice can always be generated. Cancellation of an order prevents any future change from being made to it.
  *
  * If REFUND is available do a refund, otherwise do a DEPOSITREVERSAL
  * Dont make APPROVEREVERSAL (decision by PM)
  *
  * @param \Magento\Framework\DataObject|InfoInterface|\Magento\Sales\Model\Order\Payment $payment
  *
  * @return $this
  * @throws \Exception
  * @api
  * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  */
 public function cancel(\Magento\Payment\Model\InfoInterface $payment)
 {
     if (!$this->_dataHelper->isBackendAvailable()) {
         return $this;
     }
     $orderNumber = $payment->getAdditionalInformation('orderNumber');
     if (!strlen($orderNumber)) {
         /* dont throw an exception here, might be a pending payment */
         $this->_logger->debug(__METHOD__ . ':No order number found.');
         return $this;
     }
     $orderDetails = $this->getOrderDetails($orderNumber);
     $backendClient = $this->_dataHelper->getBackendClient();
     $log = sprintf("%s", $orderNumber);
     /* if refund op is available order already has been closed */
     /* otherwise revert each single payment */
     if (in_array('REFUND', $orderDetails->getOrder()->getOperationsAllowed())) {
         $log .= sprintf(" action:REFUND %s", $orderDetails->getOrder()->getAmount());
         $ret = $backendClient->refund($orderNumber, $orderDetails->getOrder()->getAmount(), $orderDetails->getOrder()->getCurrency());
         if ($ret->hasFailed()) {
             throw new \Exception($ret->getError()->getMessage());
         }
     } else {
         foreach ($orderDetails->getOrder()->getPayments() as $payment) {
             /** @var \WirecardCEE_QPay_Response_Toolkit_Order_Payment $payment */
             if (in_array('DEPOSITREVERSAL', $payment->getOperationsAllowed())) {
                 $log .= " action:DEPOSITREVERSAL APPROVEREVERSAL";
                 $ret = $backendClient->depositReversal($orderNumber, $payment->getPaymentNumber());
                 if ($ret->hasFailed()) {
                     throw new \Exception($ret->getError()->getMessage());
                 }
             }
         }
     }
     $this->_logger->debug(__METHOD__ . ":{$log}");
     return $this;
 }
Ejemplo n.º 2
0
 /**
  * Confirm the payment of an order
  *
  * @param \Magento\Sales\Model\Order $order
  * @param \WirecardCEE_Stdlib_Return_ReturnAbstract $return
  * @param bool $fraudDetected
  *
  * @return Order
  *
  * @throws \Magento\Framework\Exception\LocalizedException
  */
 public function confirmOrder($order, $return, $fraudDetected)
 {
     /** @var \Magento\Sales\Model\Order\Payment $payment */
     $payment = $order->getPayment();
     /** @var \Wirecard\CheckoutPage\Model\AbstractPayment $paymentInstance */
     $paymentInstance = $payment->getMethodInstance();
     $additionalInformation = array();
     foreach ($return->getReturned() as $fieldName => $fieldValue) {
         $additionalInformation[htmlentities($fieldName)] = htmlentities($fieldValue);
     }
     $payment->setAdditionalInformation($additionalInformation);
     if ($fraudDetected) {
         $order->setStatus(\Magento\Sales\Model\Order::STATUS_FRAUD);
         $message = $this->_dataHelper->__('fraud attemmpt detected, cart has been modified during checkout!');
         $this->_logger->debug(__METHOD__ . ':' . $message);
         $order->addStatusHistoryComment($message);
     }
     $doCapture = false;
     if (!$this->isOrderProcessed($order)) {
         if ($return->getPaymentState() == \WirecardCEE_QPay_ReturnFactory::STATE_PENDING) {
             /** @var \WirecardCEE_QPay_Return_Pending $return */
             $order->setState(\Magento\Sales\Model\Order::STATE_PENDING_PAYMENT);
             $message = $this->_dataHelper->__('The payment authorization is pending.');
         } else {
             /** @var \WirecardCEE_QPay_Return_Success $return */
             $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING);
             $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING);
             $message = $this->_dataHelper->__('The payment has been successfully completed.');
             // invoice payment
             if ($order->canInvoice()) {
                 $invoice = $order->prepareInvoice();
                 $invoice->register();
                 /* capture invoice if toolkit is not availble */
                 if (!$this->_dataHelper->isBackendAvailable()) {
                     $doCapture = true;
                 } else {
                     $hasBackedOps = false;
                     $orderDetails = $paymentInstance->getOrderDetails($payment->getAdditionalInformation('orderNumber'));
                     foreach ($orderDetails->getOrder()->getPayments() as $wdPayment) {
                         /** @var \WirecardCEE_QPay_Response_Toolkit_Order_Payment $wdPayment */
                         $this->_logger->debug(__METHOD__ . ':payment-state:' . $wdPayment->getState() . ' allowed operations:' . implode(',', $wdPayment->getOperationsAllowed()));
                         if (count($wdPayment->getOperationsAllowed())) {
                             $hasBackedOps = true;
                             break;
                         }
                     }
                     if (count($orderDetails->getOrder()->getOperationsAllowed())) {
                         $this->_logger->debug(__METHOD__ . ':order allowed operations: ' . implode(',', $orderDetails->getOrder()->getOperationsAllowed()));
                         $hasBackedOps = true;
                     }
                     /* no backend ops allowed anymore, assume final state of payment, capture invoice */
                     if (!$hasBackedOps) {
                         $doCapture = true;
                     }
                 }
                 if ($doCapture && !$fraudDetected) {
                     $invoice->capture();
                 }
                 $order->addRelatedObject($invoice);
             }
             $this->_orderSender->send($order);
         }
         $type = $doCapture ? Transaction::TYPE_CAPTURE : Transaction::TYPE_AUTH;
         $this->saveTransaction($type, $message, $order, $return);
     }
     $order->save();
     return $order;
 }