/** * Registers capture notification. * * @param OrderPaymentInterface $payment * @param string|float $amount * @param bool|int $skipFraudDetection * @return OrderPaymentInterface */ public function registerCaptureNotification(OrderPaymentInterface $payment, $amount, $skipFraudDetection = false) { /** * @var $payment Payment */ $payment->setTransactionId($this->transactionManager->generateTransactionId($payment, Transaction::TYPE_CAPTURE, $payment->getAuthorizationTransaction())); $order = $payment->getOrder(); $amount = (double) $amount; $invoice = $this->getInvoiceForTransactionId($order, $payment->getTransactionId()); // register new capture if (!$invoice) { if ($payment->isSameCurrency() && $payment->isCaptureFinal($amount)) { $invoice = $order->prepareInvoice()->register(); $invoice->setOrder($order); $order->addRelatedObject($invoice); $payment->setCreatedInvoice($invoice); } else { $payment->setIsFraudDetected(!$skipFraudDetection); $this->updateTotals($payment, ['base_amount_paid_online' => $amount]); } } if (!$payment->getIsTransactionPending()) { if ($invoice && Invoice::STATE_OPEN == $invoice->getState()) { $invoice->setOrder($order); $invoice->pay(); $this->updateTotals($payment, ['base_amount_paid_online' => $amount]); $order->addRelatedObject($invoice); } } $message = $this->stateCommand->execute($payment, $amount, $order); $transaction = $payment->addTransaction(Transaction::TYPE_CAPTURE, $invoice, true); $message = $payment->prependMessage($message); $payment->addTransactionCommentsToOrder($transaction, $message); return $payment; }