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