Completed
Push — master ( 438703...4400e9 )
by Oleksandr
16s queued 12s
created

getPaymentMethodRequestBuilder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
c 0
b 0
f 0
dl 0
loc 11
rs 10
cc 2
nc 2
nop 1
1
<?php
2
3
/**
4
 * MIT License
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
namespace SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\Handler;
9
10
use Generated\Shared\Transfer\OrderTransfer;
11
use SprykerEco\Zed\Heidelpay\Business\Payment\PaymentWriterInterface;
12
use SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\Exception\FinalizeNotSupportedException;
13
use SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\FinalizeTransactionInterface;
14
15
class FinalizeTransactionHandler implements FinalizeTransactionHandlerInterface
16
{
17
    public const ERROR_MESSAGE_FINALIZE_TRANSACTION_NOT_SUPPORTED =
18
        'Attempt to call finalize transaction on payment method \'%s\' ' .
19
        'that does not support it';
20
21
    /**
22
     * @var \SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\FinalizeTransactionInterface
23
     */
24
    protected $transaction;
25
26
    /**
27
     * @var \SprykerEco\Zed\Heidelpay\Business\Payment\Type\PaymentWithFinalizeInterface[]
28
     */
29
    protected $paymentMethodAdapterCollection;
30
31
    /**
32
     * @var \SprykerEco\Zed\Heidelpay\Business\Payment\Request\AdapterRequestFromOrderBuilderInterface[]
33
     */
34
    protected $requestBuilderCollection;
35
36
    /**
37
     * @var \SprykerEco\Zed\Heidelpay\Business\Payment\PaymentWriterInterface
38
     */
39
    protected $paymentWriter;
40
41
    /**
42
     * @param \SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\FinalizeTransactionInterface $transaction
43
     * @param array $paymentMethodAdapterCollection
44
     * @param \SprykerEco\Zed\Heidelpay\Business\Payment\Request\AdapterRequestFromOrderBuilderInterface[] $requestBuilderCollection
45
     * @param \SprykerEco\Zed\Heidelpay\Business\Payment\PaymentWriterInterface $paymentWriter
46
     */
47
    public function __construct(
48
        FinalizeTransactionInterface $transaction,
49
        array $paymentMethodAdapterCollection,
50
        array $requestBuilderCollection,
51
        PaymentWriterInterface $paymentWriter
52
    ) {
53
        $this->transaction = $transaction;
54
        $this->paymentMethodAdapterCollection = $paymentMethodAdapterCollection;
55
        $this->requestBuilderCollection = $requestBuilderCollection;
56
        $this->paymentWriter = $paymentWriter;
57
    }
58
59
    /**
60
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
61
     *
62
     * @return void
63
     */
64
    public function finalize(OrderTransfer $orderTransfer)
65
    {
66
        $finalizeRequestTransfer = $this->buildFinalizeRequest($orderTransfer);
67
        $paymentAdapter = $this->getPaymentMethodAdapter($orderTransfer);
68
69
        $finalizeResponseTransfer = $this->transaction->executeTransaction($finalizeRequestTransfer, $paymentAdapter);
70
71
        if ($finalizeResponseTransfer->getIdTransactionUnique() === null) {
72
            return;
73
        }
74
75
        $this->paymentWriter->updateHeidelpayPaymentWithResponse($finalizeResponseTransfer);
76
        $orderTransfer->getHeidelpayPayment()->setIdPaymentReference(
77
            $finalizeResponseTransfer->getIdTransactionUnique()
78
        );
79
    }
80
81
    /**
82
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
83
     *
84
     * @throws \SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\Exception\FinalizeNotSupportedException
85
     *
86
     * @return \Generated\Shared\Transfer\HeidelpayRequestTransfer
87
     */
88
    protected function buildFinalizeRequest(OrderTransfer $orderTransfer)
89
    {
90
        $requestBuilder = $this->getPaymentMethodRequestBuilder($orderTransfer);
91
92
        return $requestBuilder->buildFinalizeRequestFromOrder($orderTransfer);
93
    }
94
95
    /**
96
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
97
     *
98
     * @throws \SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\Exception\FinalizeNotSupportedException
99
     *
100
     * @return \SprykerEco\Zed\Heidelpay\Business\Payment\Type\PaymentWithFinalizeInterface
101
     */
102
    protected function getPaymentMethodAdapter(OrderTransfer $orderTransfer)
103
    {
104
        $paymentMethodCode = $this->getPaymentMethodCode($orderTransfer);
105
106
        if (!isset($this->paymentMethodAdapterCollection[$paymentMethodCode])) {
107
            throw new FinalizeNotSupportedException(
108
                sprintf(static::ERROR_MESSAGE_FINALIZE_TRANSACTION_NOT_SUPPORTED, $paymentMethodCode)
109
            );
110
        }
111
112
        return $this->paymentMethodAdapterCollection[$paymentMethodCode];
113
    }
114
115
    /**
116
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
117
     *
118
     * @throws \SprykerEco\Zed\Heidelpay\Business\Payment\Transaction\Exception\FinalizeNotSupportedException
119
     *
120
     * @return \SprykerEco\Zed\Heidelpay\Business\Payment\Request\AdapterRequestFromOrderBuilderInterface
121
     */
122
    protected function getPaymentMethodRequestBuilder(OrderTransfer $orderTransfer)
123
    {
124
        $paymentMethodCode = $this->getPaymentMethodCode($orderTransfer);
125
126
        if (!isset($this->requestBuilderCollection[$paymentMethodCode])) {
127
            throw new FinalizeNotSupportedException(
128
                sprintf(static::ERROR_MESSAGE_FINALIZE_TRANSACTION_NOT_SUPPORTED, $paymentMethodCode)
129
            );
130
        }
131
132
        return $this->requestBuilderCollection[$paymentMethodCode];
133
    }
134
135
    /**
136
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
137
     *
138
     * @return string
139
     */
140
    protected function getPaymentMethodCode(OrderTransfer $orderTransfer)
141
    {
142
        return $orderTransfer->getHeidelpayPayment()->getPaymentMethod();
143
    }
144
}
145