/**
  * Authorizes payment.
  *
  * @param OrderPaymentInterface $payment
  * @param bool $isOnline
  * @param string|float $amount
  * @return OrderPaymentInterface
  */
 public function authorize(OrderPaymentInterface $payment, $isOnline, $amount)
 {
     // check for authorization amount to be equal to grand total
     /**
      * @var $payment Payment
      */
     $payment->setShouldCloseParentTransaction(false);
     $isSameCurrency = $payment->isSameCurrency();
     if (!$isSameCurrency || !$payment->isCaptureFinal($amount)) {
         $payment->setIsFraudDetected(true);
     }
     // update totals
     $amount = $payment->formatAmount($amount, true);
     $payment->setBaseAmountAuthorized($amount);
     // do authorization
     $order = $payment->getOrder();
     if ($isOnline) {
         // invoke authorization on gateway
         $method = $payment->getMethodInstance();
         $method->setStore($order->getStoreId());
         $method->authorize($payment, $amount);
     }
     $message = $this->stateCommand->execute($payment, $amount, $order);
     // update transactions, order state and add comments
     $transaction = $payment->addTransaction(Transaction::TYPE_AUTH);
     $message = $payment->prependMessage($message);
     $payment->addTransactionCommentsToOrder($transaction, $message);
     return $payment;
 }
 /**
  * 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;
 }
 /**
  * Totals updater utility method
  * Updates self totals by keys in data array('key' => $delta)
  *
  * @param OrderPaymentInterface $payment
  * @param array $data
  * @return void
  */
 protected function updateTotals(OrderPaymentInterface $payment, $data)
 {
     foreach ($data as $key => $amount) {
         if (null !== $amount) {
             $was = $payment->getDataUsingMethod($key);
             $payment->setDataUsingMethod($key, $was + $amount);
         }
     }
 }
 /** @inheritdoc */
 public function getBusCodeForPaymentMethod(\Magento\Sales\Api\Data\OrderPaymentInterface $payment)
 {
     $result = null;
     $mage = $payment->getMethod();
     if ($mage == self::M_PAY_BRAINTREE) {
         $result = self::B_PAY_BRAINTREE;
     } elseif ($mage == self::M_PAY_CHECK_MONEY) {
         $result = self::B_PAY_CHECK_MONEY;
     } elseif ($mage == self::M_PAY_INTERNAL_MONEY) {
         $result = self::B_PAY_INTERNAL_MONEY;
     }
     return $result;
 }
 /**
  * Load vault payment extension attribute to order/payment entity
  *
  * @param OrderPaymentInterface $payment
  * @param \Closure $proceed
  * @return OrderPaymentExtensionInterface
  */
 public function aroundGetExtensionAttributes(OrderPaymentInterface $payment, \Closure $proceed)
 {
     /** @var OrderPaymentExtensionInterface $paymentExtension */
     $paymentExtension = $proceed();
     if ($paymentExtension === null) {
         $paymentExtension = $this->paymentExtensionFactory->create();
     }
     $paymentToken = $paymentExtension->getVaultPaymentToken();
     if ($paymentToken === null) {
         $paymentToken = $this->paymentTokenManagement->getByPaymentId($payment->getEntityId());
         $paymentExtension->setVaultPaymentToken($paymentToken);
         $payment->setExtensionAttributes($paymentExtension);
     }
     return $paymentExtension;
 }
 /**
  * Run command
  *
  * @param OrderPaymentInterface $payment
  * @param string|float|int $amount
  * @param OrderInterface $order
  * @return string
  */
 public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order)
 {
     $state = Order::STATE_PROCESSING;
     $status = false;
     $formattedAmount = $order->getBaseCurrency()->formatTxt($amount);
     if ($payment->getIsTransactionPending()) {
         $message = __('The order amount of %1 is pending approval on the payment gateway.', $formattedAmount);
         $state = Order::STATE_PAYMENT_REVIEW;
         if ($payment->getIsFraudDetected()) {
             $status = Order::STATUS_FRAUD;
         }
     } else {
         $message = __('Ordered amount of %1', $formattedAmount);
     }
     $this->setOrderStateAndStatus($order, $status, $state);
     return $message;
 }
 /**
  * Run command
  *
  * @param OrderPaymentInterface $payment
  * @param string|float|int $amount
  * @param OrderInterface $order
  * @return string
  */
 public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order)
 {
     $state = SalesOrder::STATE_PROCESSING;
     $status = false;
     $formattedAmount = $order->getBaseCurrency()->formatTxt($amount);
     if ($payment->getIsTransactionPending()) {
         $message = __('An amount of %1 will be captured after being approved at the payment gateway.', $formattedAmount);
         $state = SalesOrder::STATE_PAYMENT_REVIEW;
         if ($payment->getIsFraudDetected()) {
             $status = SalesOrder::STATUS_FRAUD;
         }
     } else {
         // normal online capture: invoice is marked as "paid"
         $message = __('Captured amount of %1 online', $formattedAmount);
     }
     $this->setOrderStateAndStatus($order, $status, $state);
     return $message;
 }
 /**
  * @param OrderPaymentInterface $payment
  * @param string|float $amount
  * @return OrderPaymentInterface
  */
 public function order(OrderPaymentInterface $payment, $amount)
 {
     /**
      * @var $payment Payment
      */
     // update totals
     $amount = $payment->formatAmount($amount, true);
     // do ordering
     $order = $payment->getOrder();
     $method = $payment->getMethodInstance();
     $method->setStore($order->getStoreId());
     $method->order($payment, $amount);
     if ($payment->getSkipOrderProcessing()) {
         return $payment;
     }
     $message = $this->stateCommand->execute($payment, $amount, $order);
     // update transactions, order state and add comments
     $transaction = $payment->addTransaction(Transaction::TYPE_ORDER);
     $message = $payment->prependMessage($message);
     $payment->addTransactionCommentsToOrder($transaction, $message);
     return $payment;
 }
 /**
  * Decrease captured amount for partial payments.
  *
  * @param \Magento\Sales\Model\Order\Payment\Processor $subject
  * @param \Closure $proceed
  * @param \Magento\Sales\Api\Data\OrderPaymentInterface $payment
  * @param \Magento\Sales\Api\Data\InvoiceInterface|null $invoice
  * @return \Magento\Sales\Api\Data\OrderPaymentInterface
  */
 public function aroundCapture(\Magento\Sales\Model\Order\Payment\Processor $subject, \Closure $proceed, \Magento\Sales\Api\Data\OrderPaymentInterface $payment, \Magento\Sales\Api\Data\InvoiceInterface $invoice = null)
 {
     if ($invoice) {
         /* try to find related record in quote registry */
         $order = $payment->getOrder();
         $quoteId = $order->getQuoteId();
         $found = $this->_repoPartialQuote->getById($quoteId);
         if ($found) {
             /* decrease amount in invoice */
             $partialBase = $found->getBasePartialAmount();
             $partial = $found->getPartialAmount();
             $grandTotalBase = $invoice->getBaseGrandTotal();
             $grandTotal = $invoice->getGrandTotal();
             $grandTotalBase -= $partialBase;
             $grandTotal -= $partial;
             $invoice->setBaseGrandTotal($grandTotalBase);
             $invoice->setGrandTotal($grandTotal);
         }
     }
     $result = $proceed($payment, $invoice);
     return $result;
 }
 /**
  * @param OrderPaymentInterface $payment
  * @param string|float $amount
  * @param OrderInterface $order
  * @return \Magento\Framework\Phrase
  */
 public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order)
 {
     $state = Order::STATE_PROCESSING;
     $status = false;
     $formattedAmount = $order->getBaseCurrency()->formatTxt($amount);
     if ($payment->getIsTransactionPending()) {
         $state = Order::STATE_PAYMENT_REVIEW;
         $message = __('We will authorize %1 after the payment is approved at the payment gateway.', $formattedAmount);
     } else {
         if ($payment->getIsFraudDetected()) {
             $state = Order::STATE_PROCESSING;
             $message = __('Order is suspended as its authorizing amount %1 is suspected to be fraudulent.', $formattedAmount);
         } else {
             $message = __('Authorized amount of %1', $formattedAmount);
         }
     }
     if ($payment->getIsFraudDetected()) {
         $status = Order::STATUS_FRAUD;
     }
     $this->setOrderStateAndStatus($order, $status, $state);
     return $message;
 }
 /**
  * Run command
  *
  * @param OrderPaymentInterface $payment
  * @param string|float|int $amount
  * @param OrderInterface $order
  * @return string
  */
 public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order)
 {
     /**
      * @var $payment Payment
      */
     $state = Order::STATE_PROCESSING;
     $status = false;
     $formattedAmount = $order->getBaseCurrency()->formatTxt($amount);
     if ($payment->getIsTransactionPending()) {
         $message = __('An amount of %1 will be captured after being approved at the payment gateway.', $formattedAmount);
         $state = Order::STATE_PAYMENT_REVIEW;
     } else {
         $message = __('Registered notification about captured amount of %1.', $formattedAmount);
     }
     if ($payment->getIsFraudDetected()) {
         $state = Order::STATE_PAYMENT_REVIEW;
         $message = __('Order is suspended as its capture amount %1 is suspected to be fraudulent.', $formattedAmount);
         $status = Order::STATUS_FRAUD;
     }
     $this->setOrderStateAndStatus($order, $status, $state);
     return $message;
 }
Example #12
0
 /**
  * Update transaction ids for further processing
  * If no transactions were set before invoking, may generate an "offline" transaction id
  *
  * @param OrderPaymentInterface $payment
  * @param string $type
  * @param bool|Transaction $transactionBasedOn
  * @return string|null
  */
 public function generateTransactionId(OrderPaymentInterface $payment, $type, $transactionBasedOn = false)
 {
     if (!$payment->getParentTransactionId() && !$payment->getTransactionId() && $transactionBasedOn) {
         $payment->setParentTransactionId($transactionBasedOn->getTxnId());
     }
     // generate transaction id for an offline action or payment method that didn't set it
     if (($parentTxnId = $payment->getParentTransactionId()) && !$payment->getTransactionId()) {
         return "{$parentTxnId}-{$type}";
     }
     return $payment->getTransactionId();
 }
Example #13
0
 /**
  * Links transaction with parent transaction
  *
  * @param TransactionInterface $transaction
  * @return TransactionInterface
  */
 protected function linkWithParentTransaction(TransactionInterface $transaction)
 {
     $parentTransactionId = $this->payment->getParentTransactionId();
     if ($parentTransactionId) {
         $transaction->setParentTxnId($parentTransactionId);
         if ($this->payment->getShouldCloseParentTransaction()) {
             $parentTransaction = $this->transactionRepository->getByTransactionId($parentTransactionId, $this->payment->getid(), $this->order->getId());
             if ($parentTransaction) {
                 if (!$parentTransaction->getIsClosed()) {
                     $parentTransaction->isFailsafe($this->failSafe)->close(false);
                 }
                 $this->order->addRelatedObject($parentTransaction);
             }
         }
     }
     return $transaction;
 }
Example #14
0
 /**
  * @param \Magento\Sales\Api\Data\OrderPaymentInterface $payment
  * @return Payment
  */
 public function setPayment(\Magento\Sales\Api\Data\OrderPaymentInterface $payment)
 {
     if (!$this->getIsMultiPayment() && ($previousPayment = $this->getPayment())) {
         $payment->setEntityId($previousPayment->getEntityId());
     }
     $this->addPayment($payment);
     return $payment;
 }
Example #15
0
 /**
  * Get transaction with type order
  *
  * @param OrderPaymentInterface $payment
  *
  * @return false|\Magento\Sales\Api\Data\TransactionInterface
  */
 protected function getOrderTransaction($payment)
 {
     return $this->transactionRepository->getByTransactionType(Transaction::TYPE_ORDER, $payment->getId(), $payment->getOrder()->getId());
 }
 /**
  * Check if capture transaction already exists
  *
  * @param OrderPaymentInterface $payment
  * @return bool
  */
 private function isExistsCaptureTransaction(OrderPaymentInterface $payment)
 {
     $filters[] = $this->filterBuilder->setField('payment_id')->setValue($payment->getId())->create();
     $filters[] = $this->filterBuilder->setField('txn_type')->setValue(TransactionInterface::TYPE_CAPTURE)->create();
     $searchCriteria = $this->searchCriteriaBuilder->addFilters($filters)->create();
     $count = $this->transactionRepository->getList($searchCriteria)->getTotalCount();
     return (bool) $count;
 }
Example #17
0
 /**
  * Check if payment was used vault token
  *
  * @param OrderPaymentInterface $payment
  * @return bool
  */
 private function isExistsVaultToken(OrderPaymentInterface $payment)
 {
     $extensionAttributes = $payment->getExtensionAttributes();
     return (bool) $extensionAttributes->getVaultPaymentToken();
 }
Example #18
0
 /**
  * {@inheritdoc}
  */
 public function setPayment(\Magento\Sales\Api\Data\OrderPaymentInterface $payment = null)
 {
     $payment->setOrder($this)->setParentId($this->getId());
     if (!$payment->getId()) {
         $this->setData(OrderInterface::PAYMENT, $payment);
         $this->setDataChanges(true);
     }
     return $payment;
 }
 /**
  * @return string
  */
 public function getMethodTitle()
 {
     return $this->orderPayment->getMethodInstance()->getTitle();
 }
Example #20
0
 /**
  * Get vault payment token entity
  *
  * @param \Braintree\Transaction $transaction
  * @param OrderPaymentInterface $payment
  * @return PaymentTokenInterface|null
  */
 protected function getVaultPaymentToken(Transaction $transaction, OrderPaymentInterface $payment)
 {
     // Check token existing in gateway response
     $token = $transaction->creditCardDetails->token;
     if (empty($token)) {
         return null;
     }
     $order = $payment->getOrder();
     /** @var PaymentTokenInterface $paymentToken */
     $paymentToken = $this->paymentTokenFactory->create();
     $paymentToken->setGatewayToken($token);
     $paymentToken->setCustomerId($order->getCustomerId());
     $paymentToken->setPaymentMethodCode($payment->getMethod());
     $paymentToken->setCreatedAt($order->getCreatedAt());
     $paymentToken->setTokenDetails($this->convertDetailsToJSON(['type' => $this->getCreditCardType($transaction->creditCardDetails->cardType), 'maskedCC' => $transaction->creditCardDetails->last4, 'expirationDate' => $transaction->creditCardDetails->expirationDate]));
     return $paymentToken;
 }
 /**
  * @param PaymentTokenInterface $token
  * @param OrderPaymentInterface $payment
  * @return bool
  */
 public function saveTokenWithPaymentLink(PaymentTokenInterface $token, OrderPaymentInterface $payment)
 {
     $tokenDuplicate = $this->getByPublicHash($token->getPublicHash(), $token->getCustomerId());
     if (!empty($tokenDuplicate)) {
         if ($token->getIsVisible() || $tokenDuplicate->getIsVisible()) {
             $token->setEntityId($tokenDuplicate->getEntityId());
             $token->setIsVisible(true);
         } elseif ($token->getIsVisible() === $tokenDuplicate->getIsVisible()) {
             $token->setEntityId($tokenDuplicate->getEntityId());
         } else {
             $token->setPublicHash($this->encryptor->getHash($token->getPublicHash() . $token->getGatewayToken()));
         }
     }
     $this->paymentTokenRepository->save($token);
     $result = $this->addLinkToOrderPayment($token->getEntityId(), $payment->getEntityId());
     return $result;
 }
 /**
  * @param PaymentTokenInterface $token
  * @param OrderPaymentInterface $payment
  * @return bool
  */
 public function saveTokenWithPaymentLink(PaymentTokenInterface $token, OrderPaymentInterface $payment)
 {
     $tokenDuplicate = $this->getByPublicHash($token->getPublicHash(), $token->getCustomerId());
     if (!empty($tokenDuplicate)) {
         $token->setEntityId($tokenDuplicate->getEntityId());
         $token->setIsVisible($token->getIsActive());
     }
     $this->paymentTokenRepository->save($token);
     $result = $this->addLinkToOrderPayment($token->getEntityId(), $payment->getEntityId());
     return $result;
 }
 /**
  * @param OrderPaymentInterface $payment
  * @return \Magento\Sales\Api\Data\OrderPaymentExtensionInterface
  */
 private function getPaymentExtensionAttributes(OrderPaymentInterface $payment)
 {
     $extensionAttributes = $payment->getExtensionAttributes();
     if ($extensionAttributes === null) {
         $extensionAttributes = $this->paymentExtensionFactory->create();
         $payment->setExtensionAttributes($extensionAttributes);
     }
     return $extensionAttributes;
 }