request = $request; } /** * Capture command * * @param array $commandSubject * * @return null|Command\ResultInterface * @throws KlarnaException * @throws \Klarna\Core\Model\Api\Exception * @throws \Magento\Framework\Exception\LocalizedException * @throws \Magento\Framework\Exception\NoSuchEntityException */ public function execute(array $commandSubject) { $requestData = $this->request->getPost(); /** @var \Magento\Payment\Model\InfoInterface $payment */ $payment = $commandSubject['payment']->getPayment(); $amount = $commandSubject['amount']; $klarnaOrder = $this->getKlarnaOrder($payment->getOrder()); if (!$klarnaOrder->getId() || !$klarnaOrder->getReservationId()) { throw new KlarnaException(__('Unable to capture payment for this order.')); } /** @var \Magento\Sales\Model\Order $order */ $order = $payment->getOrder(); // if tracking info is presented but invalid, stop capture if (isset($requestData['tracking']) && !$this->isTrackingInfoValid($requestData['tracking'])) { return null; } /** @var \Magento\Store\Model\Store $store */ $response = $this->getOmApi($order) ->capture($klarnaOrder->getReservationId(), $amount, $payment->getInvoice()); if (!$response->getIsSuccessful()) { $errorMessage = __('Payment capture failed, please try again.'); if ($response->getErrorCode() === 'CAPTURE_NOT_ALLOWED') { //TODO: Implement https://developers.klarna.com/api/#get-all-captures-for-one-order $errorMessage = __('Payment capture not allowed.'); } $errorMessage = $this->getFullErrorMessage($response, $errorMessage, 'capture'); throw new KlarnaException($errorMessage); } if (!$response->getTransactionId()) { return null; } $payment->setTransactionId($response->getTransactionId()); if ($this->isProcessingShipment($requestData, $response)) { $this->addShippingInfoToCapture( $response->getCaptureId(), $klarnaOrder->getReservationId(), $requestData['tracking'], $order, $payment->getInvoice() ); } return null; } /** * Add shipping info to capture * * @param string $captureId * @param string $klarnaOrderId * @param array $trackingData * @param OrderInterface $order * @param InvoiceInterface $invoice * * @return void */ private function addShippingInfoToCapture($captureId, $klarnaOrderId, $trackingData, $order, $invoice) { $response = $this->getOmApi($order) ->addShippingInfo($klarnaOrderId, $captureId, $trackingData); if ($response->getIsSuccessful()) { $invoice->addComment("Shipping info sent to Klarna API", false, false); return; } foreach ($response->getErrorMessages() as $message) { $invoice->addComment($message, false, false); } } /** * Check if we are also processing a shipment with this invoice * * @param array $requestData * @param DataObject $response * @return bool */ private function isProcessingShipment($requestData, $response) { if (isset($requestData['invoice']['do_shipment']) && $requestData['invoice']['do_shipment'] == true && $response->getCaptureId() && isset($requestData['tracking']) && $this->isTrackingInfoValid($requestData['tracking'])) { return true; } return false; } /** * vaidate tracking info * * @param array $trackingInfo * @return bool */ private function isTrackingInfoValid($trackingInfo) { foreach ($trackingInfo as $var) { if (empty($var['carrier_code']) || empty($var['title']) || empty($var['number'])) { return false; } } return true; } }