Completed
Push — master ( 98b142...a3a13d )
by Paweł
02:49
created

ChoosePaymentMethodHandler::handle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 9.2
c 0
b 0
f 0
cc 1
eloc 11
nc 1
nop 1
1
<?php
2
3
namespace Sylius\ShopApiPlugin\Handler;
4
5
use SM\Factory\FactoryInterface;
6
use Sylius\Component\Core\Model\OrderInterface;
7
use Sylius\Component\Core\Model\PaymentMethodInterface;
8
use Sylius\Component\Core\OrderCheckoutTransitions;
9
use Sylius\Component\Core\Repository\OrderRepositoryInterface;
10
use Sylius\Component\Core\Repository\PaymentMethodRepositoryInterface;
11
use Sylius\ShopApiPlugin\Command\ChoosePaymentMethod;
12
use Webmozart\Assert\Assert;
13
14
final class ChoosePaymentMethodHandler
15
{
16
    /**
17
     * @var OrderRepositoryInterface
18
     */
19
    private $orderRepository;
20
21
    /**
22
     * @var PaymentMethodRepositoryInterface
23
     */
24
    private $paymentMethodRepository;
25
26
    /**
27
     * @var FactoryInterface
28
     */
29
    private $stateMachineFactory;
30
31
    /**
32
     * @param OrderRepositoryInterface $orderRepository
33
     * @param PaymentMethodRepositoryInterface $paymentMethodRepository
34
     * @param FactoryInterface $stateMachineFactory
35
     */
36
    public function __construct(
37
        OrderRepositoryInterface $orderRepository,
38
        PaymentMethodRepositoryInterface $paymentMethodRepository,
39
        FactoryInterface $stateMachineFactory
40
    ) {
41
        $this->orderRepository = $orderRepository;
42
        $this->paymentMethodRepository = $paymentMethodRepository;
43
        $this->stateMachineFactory = $stateMachineFactory;
44
    }
45
46
    /**
47
     * @param ChoosePaymentMethod $choosePaymentMethod
48
     */
49
    public function handle(ChoosePaymentMethod $choosePaymentMethod)
50
    {
51
        /** @var OrderInterface $cart */
52
        $cart = $this->orderRepository->findOneBy(['tokenValue' => $choosePaymentMethod->orderToken()]);
53
54
        Assert::notNull($cart, 'Cart has not been found.');
55
56
        $stateMachine = $this->stateMachineFactory->get($cart, OrderCheckoutTransitions::GRAPH);
57
58
        Assert::true($stateMachine->can(OrderCheckoutTransitions::TRANSITION_SELECT_PAYMENT), 'Order cannot have payment method assigned.');
59
60
        /** @var PaymentMethodInterface $paymentMethod */
61
        $paymentMethod = $this->paymentMethodRepository->findOneBy(['code' => $choosePaymentMethod->paymentMethod()]);
62
63
        Assert::notNull($paymentMethod, 'Payment method has not been found');
64
        Assert::true(isset($cart->getPayments()[$choosePaymentMethod->paymentIdentifier()]), 'Payment method has not been found.');
65
66
        $payment = $cart->getPayments()[$choosePaymentMethod->paymentIdentifier()];
67
68
        $payment->setMethod($paymentMethod);
69
        $stateMachine->apply(OrderCheckoutTransitions::TRANSITION_SELECT_PAYMENT);
70
    }
71
}
72