TokensConfigProvider.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Vault\Model\Ui\Adminhtml;
  7. use Magento\Framework\Api\FilterBuilder;
  8. use Magento\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\Framework\App\ObjectManager;
  10. use Magento\Framework\Exception\InputException;
  11. use Magento\Framework\Exception\NoSuchEntityException;
  12. use Magento\Framework\Intl\DateTimeFactory;
  13. use Magento\Framework\Session\SessionManagerInterface;
  14. use Magento\Payment\Helper\Data;
  15. use Magento\Sales\Api\OrderRepositoryInterface;
  16. use Magento\Store\Model\StoreManagerInterface;
  17. use Magento\Vault\Api\Data\PaymentTokenInterface;
  18. use Magento\Vault\Api\PaymentTokenManagementInterface;
  19. use Magento\Vault\Api\PaymentTokenRepositoryInterface;
  20. use Magento\Vault\Model\Ui\TokenUiComponentInterface;
  21. use Magento\Vault\Model\Ui\TokenUiComponentProviderInterface;
  22. use Magento\Vault\Model\VaultPaymentInterface;
  23. /**
  24. * Class ConfigProvider
  25. * @api
  26. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  27. *
  28. * @api
  29. * @since 100.1.0
  30. */
  31. class TokensConfigProvider
  32. {
  33. /**
  34. * @var PaymentTokenRepositoryInterface
  35. */
  36. private $paymentTokenRepository;
  37. /**
  38. * @var FilterBuilder
  39. */
  40. private $filterBuilder;
  41. /**
  42. * @var SearchCriteriaBuilder
  43. */
  44. private $searchCriteriaBuilder;
  45. /**
  46. * @var SessionManagerInterface
  47. */
  48. private $session;
  49. /**
  50. * @var StoreManagerInterface
  51. */
  52. private $storeManager;
  53. /**
  54. * @var TokenUiComponentProviderInterface[]
  55. */
  56. private $tokenUiComponentProviders;
  57. /**
  58. * @var DateTimeFactory
  59. */
  60. private $dateTimeFactory;
  61. /**
  62. * @var Data
  63. */
  64. private $paymentDataHelper;
  65. /**
  66. * @var OrderRepositoryInterface
  67. */
  68. private $orderRepository;
  69. /**
  70. * @var PaymentTokenManagementInterface
  71. */
  72. private $paymentTokenManagement;
  73. /**
  74. * Constructor
  75. *
  76. * @param SessionManagerInterface $session
  77. * @param PaymentTokenRepositoryInterface $paymentTokenRepository
  78. * @param FilterBuilder $filterBuilder
  79. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  80. * @param StoreManagerInterface $storeManager
  81. * @param DateTimeFactory $dateTimeFactory
  82. * @param TokenUiComponentProviderInterface[] $tokenUiComponentProviders
  83. */
  84. public function __construct(
  85. SessionManagerInterface $session,
  86. PaymentTokenRepositoryInterface $paymentTokenRepository,
  87. FilterBuilder $filterBuilder,
  88. SearchCriteriaBuilder $searchCriteriaBuilder,
  89. StoreManagerInterface $storeManager,
  90. DateTimeFactory $dateTimeFactory,
  91. array $tokenUiComponentProviders = []
  92. ) {
  93. $this->paymentTokenRepository = $paymentTokenRepository;
  94. $this->filterBuilder = $filterBuilder;
  95. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  96. $this->session = $session;
  97. $this->storeManager = $storeManager;
  98. $this->tokenUiComponentProviders = $tokenUiComponentProviders;
  99. $this->dateTimeFactory = $dateTimeFactory;
  100. }
  101. /**
  102. * @param string $vaultPaymentCode
  103. * @return TokenUiComponentInterface[]
  104. * @since 100.1.0
  105. */
  106. public function getTokensComponents($vaultPaymentCode)
  107. {
  108. $result = [];
  109. $customerId = $this->session->getCustomerId();
  110. $vaultPayment = $this->getVaultPayment($vaultPaymentCode);
  111. if ($vaultPayment === null) {
  112. return $result;
  113. }
  114. $vaultProviderCode = $vaultPayment->getProviderCode();
  115. $componentProvider = $this->getComponentProvider($vaultProviderCode);
  116. if ($componentProvider === null) {
  117. return $result;
  118. }
  119. if ($customerId) {
  120. $this->searchCriteriaBuilder->addFilters(
  121. [
  122. $this->filterBuilder->setField(PaymentTokenInterface::CUSTOMER_ID)
  123. ->setValue($customerId)
  124. ->create(),
  125. ]
  126. );
  127. } else {
  128. try {
  129. $this->searchCriteriaBuilder->addFilters(
  130. [
  131. $this->filterBuilder->setField(PaymentTokenInterface::ENTITY_ID)
  132. ->setValue($this->getPaymentTokenEntityId())
  133. ->create(),
  134. ]
  135. );
  136. } catch (InputException $e) {
  137. return $result;
  138. } catch (NoSuchEntityException $e) {
  139. return $result;
  140. }
  141. }
  142. $this->searchCriteriaBuilder->addFilters(
  143. [
  144. $this->filterBuilder->setField(PaymentTokenInterface::PAYMENT_METHOD_CODE)
  145. ->setValue($vaultProviderCode)
  146. ->create(),
  147. ]
  148. );
  149. $this->searchCriteriaBuilder->addFilters(
  150. [
  151. $this->filterBuilder->setField(PaymentTokenInterface::IS_ACTIVE)
  152. ->setValue(1)
  153. ->create(),
  154. ]
  155. );
  156. $this->searchCriteriaBuilder->addFilters(
  157. [
  158. $this->filterBuilder->setField(PaymentTokenInterface::EXPIRES_AT)
  159. ->setConditionType('gt')
  160. ->setValue(
  161. $this->dateTimeFactory->create(
  162. 'now',
  163. new \DateTimeZone('UTC')
  164. )->format('Y-m-d 00:00:00')
  165. )
  166. ->create(),
  167. ]
  168. );
  169. $searchCriteria = $this->searchCriteriaBuilder->create();
  170. foreach ($this->paymentTokenRepository->getList($searchCriteria)->getItems() as $token) {
  171. $result[] = $componentProvider->getComponentForToken($token);
  172. }
  173. return $result;
  174. }
  175. /**
  176. * @param string $vaultProviderCode
  177. * @return TokenUiComponentProviderInterface|null
  178. */
  179. private function getComponentProvider($vaultProviderCode)
  180. {
  181. $componentProvider = isset($this->tokenUiComponentProviders[$vaultProviderCode])
  182. ? $this->tokenUiComponentProviders[$vaultProviderCode]
  183. : null;
  184. return $componentProvider instanceof TokenUiComponentProviderInterface
  185. ? $componentProvider
  186. : null;
  187. }
  188. /**
  189. * Get active vault payment by code
  190. * @param string $vaultPaymentCode
  191. * @return VaultPaymentInterface|null
  192. */
  193. private function getVaultPayment($vaultPaymentCode)
  194. {
  195. $storeId = $this->storeManager->getStore()->getId();
  196. $vaultPayment = $this->getPaymentDataHelper()->getMethodInstance($vaultPaymentCode);
  197. return $vaultPayment->isActive($storeId) ? $vaultPayment : null;
  198. }
  199. /**
  200. * Returns payment token entity id by order payment id
  201. * @return int|null
  202. */
  203. private function getPaymentTokenEntityId()
  204. {
  205. $paymentToken = $this->getPaymentTokenManagement()->getByPaymentId($this->getOrderPaymentEntityId());
  206. if ($paymentToken === null) {
  207. throw new NoSuchEntityException(__('No payment tokens are available for the specified order payment.'));
  208. }
  209. return $paymentToken->getEntityId();
  210. }
  211. /**
  212. * Returns order payment entity id
  213. * Using 'getReordered' for Reorder action
  214. * Using 'getOrder' for Edit action
  215. * @return int
  216. */
  217. private function getOrderPaymentEntityId()
  218. {
  219. $orderId = $this->session->getReordered()
  220. ?: $this->session->getOrder()->getEntityId();
  221. $order = $this->getOrderRepository()->get($orderId);
  222. return (int) $order->getPayment()->getEntityId();
  223. }
  224. /**
  225. * Get payment data helper instance
  226. * @return Data
  227. * @deprecated 100.1.0
  228. */
  229. private function getPaymentDataHelper()
  230. {
  231. if ($this->paymentDataHelper === null) {
  232. $this->paymentDataHelper = ObjectManager::getInstance()->get(Data::class);
  233. }
  234. return $this->paymentDataHelper;
  235. }
  236. /**
  237. * Returns order repository instance
  238. * @return OrderRepositoryInterface
  239. * @deprecated 100.2.0
  240. */
  241. private function getOrderRepository()
  242. {
  243. if ($this->orderRepository === null) {
  244. $this->orderRepository = ObjectManager::getInstance()
  245. ->get(OrderRepositoryInterface::class);
  246. }
  247. return $this->orderRepository;
  248. }
  249. /**
  250. * Returns payment token management instance
  251. * @return PaymentTokenManagementInterface
  252. * @deprecated 100.2.0
  253. */
  254. private function getPaymentTokenManagement()
  255. {
  256. if ($this->paymentTokenManagement === null) {
  257. $this->paymentTokenManagement = ObjectManager::getInstance()
  258. ->get(PaymentTokenManagementInterface::class);
  259. }
  260. return $this->paymentTokenManagement;
  261. }
  262. }