/** * {@inheritdoc} */ public function build($type) { if ($this->isPaymentExists() && $this->transactionId !== null) { $transaction = $this->transactionRepository->getByTransactionId($this->transactionId, $this->payment->getId(), $this->order->getId()); if (!$transaction) { $transaction = $this->transactionRepository->create()->setTxnId($this->transactionId); } $transaction->setPaymentId($this->payment->getId())->setPayment($this->payment)->setOrderId($this->order->getId())->setOrder($this->order)->setTxnType($type)->isFailsafe($this->failSafe); if ($this->payment->hasIsTransactionClosed()) { $transaction->setIsClosed((int) $this->payment->getIsTransactionClosed()); } if ($this->transactionAdditionalInfo) { foreach ($this->transactionAdditionalInfo as $key => $value) { $transaction->setAdditionalInformation($key, $value); } } $this->transactionAdditionalInfo = []; $this->payment->setLastTransId($transaction->getTxnId()); $this->payment->setCreatedTransaction($transaction); $this->order->addRelatedObject($transaction); if ($this->document && $this->document instanceof AbstractModel) { $this->document->setTransactionId($transaction->getTxnId()); } return $this->linkWithParentTransaction($transaction); } return null; }
/** * Create transaction, * prepare its insertion into hierarchy and add its information to payment and comments * * To add transactions and related information, * the following information should be set to payment before processing: * - transaction_id * - is_transaction_closed (optional) - whether transaction should be closed or open (closed by default) * - parent_transaction_id (optional) * - should_close_parent_transaction (optional) - whether to close parent transaction (closed by default) * * If the sales document is specified, it will be linked to the transaction as related for future usage. * Currently transaction ID is set into the sales object * This method writes the added transaction ID into last_trans_id field of the payment object * * To make sure transaction object won't cause trouble before saving, use $failsafe = true * * @param string $type * @param \Magento\Sales\Model\AbstractModel $salesDocument * @param bool $failsafe * @return null|Transaction * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function _addTransaction($type, $salesDocument = null, $failsafe = false) { if ($this->getSkipTransactionCreation()) { $this->unsTransactionId(); return null; } // look for set transaction ids $transactionId = $this->getTransactionId(); if (null !== $transactionId) { // set transaction parameters $transaction = false; if ($this->getOrder()->getId()) { $transaction = $this->_lookupTransaction($transactionId); } if (!$transaction) { $transaction = $this->_transactionFactory->create()->setTxnId($transactionId); } $transaction->setOrderPaymentObject($this)->setTxnType($type)->isFailsafe($failsafe); if ($this->hasIsTransactionClosed()) { $transaction->setIsClosed((int) $this->getIsTransactionClosed()); } //set transaction addition information if ($this->_transactionAdditionalInfo) { foreach ($this->_transactionAdditionalInfo as $key => $value) { $transaction->setAdditionalInformation($key, $value); } $this->_transactionAdditionalInfo = []; } // link with sales entities $this->setLastTransId($transactionId); $this->setCreatedTransaction($transaction); $this->getOrder()->addRelatedObject($transaction); if ($salesDocument && $salesDocument instanceof \Magento\Sales\Model\AbstractModel) { $salesDocument->setTransactionId($transactionId); } // link with parent transaction $parentTransactionId = $this->getParentTransactionId(); if ($parentTransactionId) { $transaction->setParentTxnId($parentTransactionId); if ($this->getShouldCloseParentTransaction()) { $parentTransaction = $this->_lookupTransaction($parentTransactionId); if ($parentTransaction) { if (!$parentTransaction->getIsClosed()) { $parentTransaction->isFailsafe($failsafe)->close(false); } $this->getOrder()->addRelatedObject($parentTransaction); } } } return $transaction; } return null; }