CaptureStrategyCommand.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\AuthorizenetAcceptjs\Gateway\Command;
  8. use Magento\AuthorizenetAcceptjs\Gateway\SubjectReader;
  9. use Magento\Framework\Api\FilterBuilder;
  10. use Magento\Framework\Api\SearchCriteriaBuilder;
  11. use Magento\Payment\Gateway\Command\CommandPoolInterface;
  12. use Magento\Payment\Gateway\CommandInterface;
  13. use Magento\Payment\Gateway\Helper\ContextHelper;
  14. use Magento\Sales\Api\Data\OrderPaymentInterface;
  15. use Magento\Sales\Api\Data\TransactionInterface;
  16. use Magento\Sales\Api\TransactionRepositoryInterface;
  17. use Magento\Payment\Gateway\Data\PaymentDataObjectInterface;
  18. /**
  19. * Chooses the best method of capture based on the context of the payment
  20. */
  21. class CaptureStrategyCommand implements CommandInterface
  22. {
  23. private const SALE = 'sale';
  24. private const CAPTURE = 'settle';
  25. /**
  26. * @var CommandPoolInterface
  27. */
  28. private $commandPool;
  29. /**
  30. * @var TransactionRepositoryInterface
  31. */
  32. private $transactionRepository;
  33. /**
  34. * @var FilterBuilder
  35. */
  36. private $filterBuilder;
  37. /**
  38. * @var SearchCriteriaBuilder
  39. */
  40. private $searchCriteriaBuilder;
  41. /**
  42. * @var SubjectReader
  43. */
  44. private $subjectReader;
  45. /**
  46. * @param CommandPoolInterface $commandPool
  47. * @param TransactionRepositoryInterface $repository
  48. * @param FilterBuilder $filterBuilder
  49. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  50. * @param SubjectReader $subjectReader
  51. */
  52. public function __construct(
  53. CommandPoolInterface $commandPool,
  54. TransactionRepositoryInterface $repository,
  55. FilterBuilder $filterBuilder,
  56. SearchCriteriaBuilder $searchCriteriaBuilder,
  57. SubjectReader $subjectReader
  58. ) {
  59. $this->commandPool = $commandPool;
  60. $this->transactionRepository = $repository;
  61. $this->filterBuilder = $filterBuilder;
  62. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  63. $this->subjectReader = $subjectReader;
  64. }
  65. /**
  66. * @inheritdoc
  67. */
  68. public function execute(array $commandSubject): void
  69. {
  70. /** @var PaymentDataObjectInterface $paymentDO */
  71. $paymentDO = $this->subjectReader->readPayment($commandSubject);
  72. $command = $this->getCommand($paymentDO);
  73. $this->commandPool->get($command)
  74. ->execute($commandSubject);
  75. }
  76. /**
  77. * Get execution command name.
  78. *
  79. * @param PaymentDataObjectInterface $paymentDO
  80. * @return string
  81. */
  82. private function getCommand(PaymentDataObjectInterface $paymentDO): string
  83. {
  84. $payment = $paymentDO->getPayment();
  85. ContextHelper::assertOrderPayment($payment);
  86. // If auth transaction does not exist then execute authorize&capture command
  87. $captureExists = $this->captureTransactionExists($payment);
  88. if (!$payment->getAuthorizationTransaction() && !$captureExists) {
  89. return self::SALE;
  90. }
  91. return self::CAPTURE;
  92. }
  93. /**
  94. * Check if capture transaction already exists
  95. *
  96. * @param OrderPaymentInterface $payment
  97. * @return bool
  98. */
  99. private function captureTransactionExists(OrderPaymentInterface $payment): bool
  100. {
  101. $this->searchCriteriaBuilder->addFilters(
  102. [
  103. $this->filterBuilder
  104. ->setField('payment_id')
  105. ->setValue($payment->getId())
  106. ->create(),
  107. ]
  108. );
  109. $this->searchCriteriaBuilder->addFilters(
  110. [
  111. $this->filterBuilder
  112. ->setField('txn_type')
  113. ->setValue(TransactionInterface::TYPE_CAPTURE)
  114. ->create(),
  115. ]
  116. );
  117. $searchCriteria = $this->searchCriteriaBuilder->create();
  118. $count = $this->transactionRepository->getList($searchCriteria)
  119. ->getTotalCount();
  120. return $count > 0;
  121. }
  122. }