Skip to content

Commit 1b19a4f

Browse files
Merge pull request #28 from Itonomy/feature/CMP-99-refactor-method-service
Refactor MethodService
2 parents e702ee1 + ca51be1 commit 1b19a4f

File tree

6 files changed

+349
-130
lines changed

6 files changed

+349
-130
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace CM\Payments\Api\Service\Method;
4+
5+
use CM\Payments\Client\Model\Response\PaymentMethod;
6+
use Magento\Checkout\Api\Data\PaymentDetailsExtensionInterface;
7+
8+
interface ExtendMethodInterface
9+
{
10+
/**
11+
* Extend CM.com payment methods with additional data
12+
*
13+
* @param string $paymentMethodCode
14+
* @param PaymentMethod $paymentMethod
15+
* @param PaymentDetailsExtensionInterface $paymentDetailsExtension
16+
*
17+
* @return PaymentDetailsExtensionInterface
18+
*/
19+
public function extend(
20+
string $paymentMethodCode,
21+
PaymentMethod $paymentMethod,
22+
PaymentDetailsExtensionInterface
23+
$paymentDetailsExtension
24+
): PaymentDetailsExtensionInterface;
25+
}

Api/Service/MethodServiceInterface.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@ interface MethodServiceInterface
4444
ConfigProvider::CODE_PAYPAL => 'PAYPAL'
4545
];
4646

47-
/**
48-
* @param CartInterface $quote
49-
* @return array
50-
*/
51-
public function getAvailablePaymentMethods(CartInterface $quote): array;
52-
5347
/**
5448
* @param CartInterface $quote
5549
* @param PaymentDetailsInterface $paymentDetails

Service/Method/Ideal.php

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
3+
namespace CM\Payments\Service\Method;
4+
5+
use CM\Payments\Api\Data\IssuerInterface;
6+
use CM\Payments\Api\Data\IssuerInterfaceFactory;
7+
use CM\Payments\Api\Data\PaymentMethodAdditionalDataInterface;
8+
use CM\Payments\Api\Data\PaymentMethodAdditionalDataInterfaceFactory;
9+
use CM\Payments\Api\Service\Method\ExtendMethodInterface;
10+
use CM\Payments\Client\Model\Response\Method\IdealIssuer;
11+
use CM\Payments\Client\Model\Response\PaymentMethod;
12+
use CM\Payments\Model\ConfigProvider;
13+
use Magento\Checkout\Api\Data\PaymentDetailsExtensionInterface;
14+
15+
class Ideal implements ExtendMethodInterface
16+
{
17+
/**
18+
* @var PaymentMethodAdditionalDataInterfaceFactory
19+
*/
20+
private $paymentMethodAdditionalDataFactory;
21+
/**
22+
* @var IssuerInterfaceFactory
23+
*/
24+
private $issuerFactory;
25+
26+
/**
27+
* Ideal constructor.
28+
* @param PaymentMethodAdditionalDataInterfaceFactory $paymentMethodAdditionalDataFactory
29+
* @param IssuerInterfaceFactory $issuerFactory
30+
*/
31+
public function __construct(
32+
PaymentMethodAdditionalDataInterfaceFactory $paymentMethodAdditionalDataFactory,
33+
IssuerInterfaceFactory $issuerFactory
34+
) {
35+
$this->paymentMethodAdditionalDataFactory = $paymentMethodAdditionalDataFactory;
36+
$this->issuerFactory = $issuerFactory;
37+
}
38+
39+
/**
40+
* @inheritDoc
41+
*/
42+
public function extend(
43+
string $paymentMethodCode,
44+
PaymentMethod $paymentMethod,
45+
PaymentDetailsExtensionInterface $paymentDetailsExtension
46+
): PaymentDetailsExtensionInterface {
47+
if ($paymentMethodCode !== ConfigProvider::CODE_IDEAL || empty($paymentMethod->getIdealIssuers())) {
48+
return $paymentDetailsExtension;
49+
}
50+
51+
$issuers = [];
52+
foreach ($this->sortIdealIssuers($paymentMethod->getIdealIssuers()) as $issuer) {
53+
/** @var IssuerInterface $issuerObject */
54+
$issuerObject = $this->issuerFactory->create();
55+
$issuerObject->setCode($issuer->getId());
56+
$issuerObject->setTitle($issuer->getName());
57+
$issuers[] = $issuerObject;
58+
}
59+
60+
/** @var PaymentMethodAdditionalDataInterface $paymentMethodAdditionalData */
61+
$paymentMethodAdditionalData = $this->paymentMethodAdditionalDataFactory->create();
62+
$paymentMethodAdditionalData->setIssuers($issuers);
63+
$paymentDetailsExtension->setData($paymentMethodCode, $paymentMethodAdditionalData);
64+
65+
return $paymentDetailsExtension;
66+
}
67+
68+
/**
69+
* Sort ideal issuers asc by name
70+
*
71+
* @param IdealIssuer[] $issuerList
72+
* @return IdealIssuer[]
73+
*/
74+
private function sortIdealIssuers(array $issuerList): array
75+
{
76+
usort($issuerList, function ($a, $b) {
77+
return strcmp($a->getName(), $b->getName());
78+
});
79+
80+
return $issuerList;
81+
}
82+
}

Service/MethodService.php

Lines changed: 81 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88

99
namespace CM\Payments\Service;
1010

11-
use CM\Payments\Api\Data\IssuerInterface;
12-
use CM\Payments\Api\Data\IssuerInterfaceFactory;
13-
use CM\Payments\Api\Data\PaymentMethodAdditionalDataInterface;
1411
use CM\Payments\Api\Data\PaymentMethodAdditionalDataInterfaceFactory;
12+
use CM\Payments\Api\Service\Method\ExtendMethodInterface;
1513
use CM\Payments\Api\Service\MethodServiceInterface;
1614
use CM\Payments\Api\Service\OrderRequestBuilderInterface;
1715
use CM\Payments\Client\Api\OrderInterface as OrderClientInterface;
18-
use CM\Payments\Client\Model\Response\Method\IdealIssuer;
16+
use CM\Payments\Client\Model\Response\OrderCreate;
17+
use CM\Payments\Client\Model\Response\PaymentMethod;
1918
use CM\Payments\Client\Request\OrderGetMethodsRequestFactory;
2019
use CM\Payments\Config\Config as ConfigService;
2120
use CM\Payments\Logger\CMPaymentsLogger;
@@ -24,6 +23,7 @@
2423
use Magento\Checkout\Api\Data\PaymentDetailsExtensionInterfaceFactory;
2524
use Magento\Checkout\Api\Data\PaymentDetailsInterface;
2625
use Magento\Framework\Exception\LocalizedException;
26+
use Magento\Framework\Exception\NoSuchEntityException;
2727
use Magento\Quote\Api\Data\CartInterface;
2828

2929
class MethodService implements MethodServiceInterface
@@ -54,9 +54,9 @@ class MethodService implements MethodServiceInterface
5454
private $paymentMethodAdditionalDataFactory;
5555

5656
/**
57-
* @var IssuerInterfaceFactory
57+
* @var ExtendMethodInterface[]
5858
*/
59-
private $issuerFactory;
59+
private $methods;
6060

6161
/**
6262
* @var PaymentDetailsExtensionInterfaceFactory
@@ -76,7 +76,7 @@ class MethodService implements MethodServiceInterface
7676
* @param OrderRequestBuilderInterface $orderRequestBuilder
7777
* @param OrderGetMethodsRequestFactory $orderGetMethodsRequestFactory
7878
* @param PaymentMethodAdditionalDataInterfaceFactory $paymentMethodAdditionalDataFactory
79-
* @param IssuerInterfaceFactory $issuerFactory
79+
* @param ExtendMethodInterface[] $methods
8080
* @param PaymentDetailsExtensionInterfaceFactory $paymentDetailsExtensionFactory
8181
* @param CMPaymentsLogger $cmPaymentsLogger
8282
*/
@@ -86,7 +86,7 @@ public function __construct(
8686
OrderRequestBuilderInterface $orderRequestBuilder,
8787
OrderGetMethodsRequestFactory $orderGetMethodsRequestFactory,
8888
PaymentMethodAdditionalDataInterfaceFactory $paymentMethodAdditionalDataFactory,
89-
IssuerInterfaceFactory $issuerFactory,
89+
array $methods,
9090
PaymentDetailsExtensionInterfaceFactory $paymentDetailsExtensionFactory,
9191
CMPaymentsLogger $cmPaymentsLogger
9292
) {
@@ -95,7 +95,7 @@ public function __construct(
9595
$this->orderRequestBuilder = $orderRequestBuilder;
9696
$this->orderGetMethodsRequestFactory = $orderGetMethodsRequestFactory;
9797
$this->paymentMethodAdditionalDataFactory = $paymentMethodAdditionalDataFactory;
98-
$this->issuerFactory = $issuerFactory;
98+
$this->methods = $methods;
9999
$this->paymentDetailsExtensionFactory = $paymentDetailsExtensionFactory;
100100
$this->logger = $cmPaymentsLogger;
101101
}
@@ -107,121 +107,103 @@ public function addMethodAdditionalData(
107107
CartInterface $quote,
108108
PaymentDetailsInterface $paymentDetails
109109
): PaymentDetailsInterface {
110-
$availablePaymentMethods = $paymentDetails->getPaymentMethods();
111-
$availableProfileMethods = $this->getAvailablePaymentMethods($quote);
112-
$issuers = [];
113-
114-
$paymentDetailsExtension = $paymentDetails->getExtensionAttributes();
115-
if ($paymentDetailsExtension == null) {
116-
/** @var PaymentDetailsExtensionInterface $paymentDetailsExtension */
117-
$paymentDetailsExtension = $this->paymentDetailsExtensionFactory->create();
118-
}
119-
120-
foreach ($availablePaymentMethods as $id => $paymentMethod) {
121-
if (strpos($paymentMethod->getCode(), ConfigProvider::CODE . '_') === false) {
122-
continue;
123-
}
124-
125-
if (!isset($availableProfileMethods[$paymentMethod->getCode()])) {
126-
unset($availablePaymentMethods[$id]);
127-
}
128-
129-
if ($paymentMethod->getCode() == ConfigProvider::CODE_IDEAL) {
130-
if (isset($availableProfileMethods[$paymentMethod->getCode()])) {
131-
$methodData = $availableProfileMethods[$paymentMethod->getCode()];
132-
if (!empty($methodData['ideal_details']['issuers'])) {
133-
foreach ($methodData['ideal_details']['issuers'] as $issuer) {
134-
/** @var IssuerInterface $issuerObject */
135-
$issuerObject = $this->issuerFactory->create();
136-
$issuerObject->addData($issuer);
137-
$issuers[] = $issuerObject;
138-
}
139-
}
140-
}
141-
142-
/** @var PaymentMethodAdditionalDataInterface $paymentMethodAdditionalData */
143-
$paymentMethodAdditionalData = $this->paymentMethodAdditionalDataFactory->create();
144-
$paymentMethodAdditionalData->setIssuers($issuers);
145-
$paymentDetailsExtension->setData($paymentMethod->getCode(), $paymentMethodAdditionalData);
110+
try {
111+
$availablePaymentMethods = $paymentDetails->getPaymentMethods();
112+
$cmOrder = $this->createCmOrder($quote);
113+
if (empty($cmOrder->getOrderKey())) {
114+
throw new LocalizedException(
115+
__("The Methods were not requested properly because of CM Order creation problem.")
116+
);
146117
}
147-
}
148118

149-
$paymentDetails->setExtensionAttributes($paymentDetailsExtension);
150-
$paymentDetails->setPaymentMethods($availablePaymentMethods);
151-
152-
return $paymentDetails;
153-
}
154-
155-
/**
156-
* @inheritDoc
157-
*/
158-
public function getAvailablePaymentMethods(CartInterface $quote): array
159-
{
160-
$availableMethods = [];
161-
try {
162-
$orderCreateRequest = $this->orderRequestBuilder->createByQuote($quote, true);
163-
$response = $this->orderClient->create(
164-
$orderCreateRequest
119+
$cmPaymentMethods = $this->orderClient->getMethods(
120+
$cmOrder->getOrderKey()
165121
);
122+
$cmPaymentMethods = $this->getMappedCmPaymentMethods($cmPaymentMethods);
166123

167-
if (!empty($response->getOrderKey())) {
168-
$quote->setData('cm_order_key', $response->getOrderKey());
169-
170-
$availableProfileMethods = $this->orderClient->getMethods(
171-
$response->getOrderKey()
172-
);
173-
174-
foreach ($availableProfileMethods as $availableProfileMethod) {
175-
$availableProfileMethodCode = $availableProfileMethod->getMethod();
124+
$paymentDetailsExtension = $paymentDetails->getExtensionAttributes();
125+
if ($paymentDetailsExtension == null) {
126+
/** @var PaymentDetailsExtensionInterface $paymentDetailsExtension */
127+
$paymentDetailsExtension = $this->paymentDetailsExtensionFactory->create();
128+
}
176129

177-
if (!isset(self::METHODS_MAPPING[$availableProfileMethodCode])) {
178-
continue;
179-
}
130+
foreach ($availablePaymentMethods as $id => $paymentMethod) {
131+
if (! $this->isCmPaymentsMethod($paymentMethod->getCode())) {
132+
continue;
133+
}
180134

181-
$mappedMethodCode = self::METHODS_MAPPING[$availableProfileMethodCode];
182-
if ($this->configService->isPaymentMethodActive($mappedMethodCode)) {
183-
$methodData = [];
184-
if (!empty($availableProfileMethod->getIdealIssuers())) {
185-
$methodData['ideal_details']['issuers']
186-
= $this->prepareIdealIssuers($availableProfileMethod->getIdealIssuers());
187-
}
135+
if (!isset($cmPaymentMethods[$paymentMethod->getCode()])) {
136+
unset($availablePaymentMethods[$id]);
137+
}
188138

189-
$availableMethods[$mappedMethodCode] = $methodData;
139+
foreach ($this->methods as $method) {
140+
if (isset($cmPaymentMethods[$paymentMethod->getCode()])) {
141+
$paymentDetailsExtension = $method->extend(
142+
$paymentMethod->getCode(),
143+
$cmPaymentMethods[$paymentMethod->getCode()],
144+
$paymentDetailsExtension
145+
);
190146
}
191147
}
192-
} else {
193-
throw new LocalizedException(
194-
__("The Methods were not requested properly because of CM Order creation problem.")
195-
);
196148
}
149+
150+
$paymentDetails->setExtensionAttributes($paymentDetailsExtension);
151+
$paymentDetails->setPaymentMethods($availablePaymentMethods);
197152
} catch (LocalizedException $e) {
198-
$this->logger->info(
153+
$this->logger->error(
199154
'CM Get Available Methods request',
200155
[
201156
'error' => $e->getMessage(),
202157
]
203158
);
204159
}
205160

206-
return $availableMethods;
161+
return $paymentDetails;
207162
}
208163

209164
/**
210-
* @param IdealIssuer[] $issuerList
211-
* @return array
165+
* @param PaymentMethod[] $cmPaymentMethods
166+
* @return array<string, PaymentMethod>
167+
*
168+
* @throws NoSuchEntityException
212169
*/
213-
private function prepareIdealIssuers(array $issuerList): array
170+
private function getMappedCmPaymentMethods(array $cmPaymentMethods): array
214171
{
215-
$issuers = $resultIssuerList = [];
216-
foreach ($issuerList as $issuer) {
217-
$issuers[$issuer->getId()] = $issuer->getName();
218-
}
219-
asort($issuers, SORT_NATURAL | SORT_FLAG_CASE);
172+
$methods = [];
173+
foreach ($cmPaymentMethods as $cmPaymentMethod) {
174+
if (!isset(self::METHODS_MAPPING[$cmPaymentMethod->getMethod()])) {
175+
continue;
176+
}
220177

221-
foreach ($issuers as $code => $title) {
222-
$resultIssuerList[] = ['code' => $code, 'title' => $title];
178+
$mappedMethodCode = self::METHODS_MAPPING[$cmPaymentMethod->getMethod()];
179+
if ($this->configService->isPaymentMethodActive($mappedMethodCode)) {
180+
$methods[$mappedMethodCode] = $cmPaymentMethod;
181+
}
223182
}
224183

225-
return $resultIssuerList;
184+
return $methods;
185+
}
186+
187+
/**
188+
* @param CartInterface $quote
189+
* @return OrderCreate
190+
* @throws LocalizedException
191+
*/
192+
private function createCmOrder(CartInterface $quote): OrderCreate
193+
{
194+
$orderCreateRequest = $this->orderRequestBuilder->createByQuote($quote, true);
195+
$cmOrder = $this->orderClient->create(
196+
$orderCreateRequest
197+
);
198+
return $cmOrder;
199+
}
200+
201+
/**
202+
* @param string $paymentMethodCode
203+
* @return bool
204+
*/
205+
private function isCmPaymentsMethod(string $paymentMethodCode): bool
206+
{
207+
return strpos($paymentMethodCode, ConfigProvider::CODE . '_') !== false;
226208
}
227209
}

0 commit comments

Comments
 (0)