Completed
Push — master ( a42644...fb7144 )
by Oleksandr
10s
created

QuoteHydrator::hydrateQuoteWithShipment()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 28
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 28
rs 8.8571
c 1
b 0
f 0
cc 3
eloc 17
nc 3
nop 1
1
<?php
2
3
/**
4
 * MIT License
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Yves\Payone\Handler\ExpressCheckout;
9
10
use Generated\Shared\Transfer\AddressTransfer;
11
use Generated\Shared\Transfer\CustomerTransfer;
12
use Generated\Shared\Transfer\PaymentDetailTransfer;
13
use Generated\Shared\Transfer\PaymentTransfer;
14
use Generated\Shared\Transfer\PayonePaymentTransfer;
15
use Generated\Shared\Transfer\PayonePaypalExpressCheckoutGenericPaymentResponseTransfer;
16
use Generated\Shared\Transfer\PayonePaypalExpressCheckoutTransfer;
17
use Generated\Shared\Transfer\QuoteTransfer;
18
use Generated\Shared\Transfer\ShipmentMethodTransfer;
19
use Generated\Shared\Transfer\ShipmentTransfer;
20
use Spryker\Shared\Kernel\Store;
21
use SprykerEco\Shared\Payone\PayoneApiConstants;
22
use SprykerEco\Shared\Payone\PayoneConstants;
23
use SprykerEco\Yves\Payone\Dependency\Client\PayoneToCalculationInterface;
24
use SprykerEco\Yves\Payone\Dependency\Client\PayoneToCustomerInterface;
25
use SprykerEco\Yves\Payone\Dependency\Client\PayoneToShipmentInterface;
26
27
class QuoteHydrator implements QuoteHydratorInterface
28
{
29
    /**
30
     * @const string CARRIER_NAME
31
     */
32
    const CARRIER_NAME = 'Paypal';
33
34
    /**
35
     * @const int DEFAULT_SHIPPING_PRICE
36
     */
37
    const DEFAULT_SHIPPING_PRICE = 0;
38
39
    /**
40
     * @var \SprykerEco\Yves\Payone\Dependency\Client\PayoneToCustomerInterface
41
     */
42
    protected $customerClient;
43
44
    /**
45
     * @var \SprykerEco\Yves\Payone\Dependency\Client\PayoneToShipmentInterface
46
     */
47
    protected $shipmentClient;
48
49
    /**
50
     * @var \SprykerEco\Yves\Payone\Dependency\Client\PayoneToCalculationInterface
51
     */
52
    protected $calculationClient;
53
54
    /**
55
     * @param \SprykerEco\Yves\Payone\Dependency\Client\PayoneToShipmentInterface $shipmentClient
56
     * @param \SprykerEco\Yves\Payone\Dependency\Client\PayoneToCustomerInterface $customerClient
57
     * @param \SprykerEco\Yves\Payone\Dependency\Client\PayoneToCalculationInterface $calculationClient
58
     */
59
    public function __construct(
60
        PayoneToShipmentInterface $shipmentClient,
61
        PayoneToCustomerInterface $customerClient,
62
        PayoneToCalculationInterface $calculationClient
63
    ) {
64
        $this->shipmentClient = $shipmentClient;
65
        $this->customerClient = $customerClient;
66
        $this->calculationClient = $calculationClient;
67
    }
68
69
    /**
70
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
71
     * @param \Generated\Shared\Transfer\PayonePaypalExpressCheckoutGenericPaymentResponseTransfer $details
72
     *
73
     * @return \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
74
     */
75
    public function getHydratedQuote(
76
        QuoteTransfer $quoteTransfer,
77
        PayonePaypalExpressCheckoutGenericPaymentResponseTransfer $details
78
    ) {
79
        $quoteTransfer = $this->hydrateQuoteWithPayment($quoteTransfer);
80
        $quoteTransfer = $this->hydrateQuoteWithShipment($quoteTransfer);
81
        $quoteTransfer = $this->hydrateQuoteWithAddresses($quoteTransfer, $details);
82
        if (!$this->customerClient->isLoggedIn()) {
83
            $quoteTransfer = $this->hydrateQuoteWithCustomer($quoteTransfer, $details);
84
            $quoteTransfer->setIsGuestExpressCheckout(true);
85
        }
86
        return $this->calculationClient->recalculate($quoteTransfer);
87
    }
88
89
    /**
90
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
91
     *
92
     * @return \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
93
     */
94
    protected function hydrateQuoteWithPayment(QuoteTransfer $quoteTransfer)
95
    {
96
        $paymentTransfer = new PaymentTransfer();
97
        $payone = new PayonePaymentTransfer();
98
        $paymentDetailTransfer = new PaymentDetailTransfer();
99
        $paymentDetailTransfer
100
            ->setAmount($quoteTransfer->getTotals()->getGrandTotal())
101
            ->setType(PayoneApiConstants::E_WALLET_TYPE_PAYPAL)
102
            ->setCurrency(Store::getInstance()->getCurrencyIsoCode())
103
            ->setWorkOrderId(
104
                $quoteTransfer->getPayment()->getPayonePaypalExpressCheckout()->getWorkOrderId()
105
            );
106
        $payone->setPaymentMethod(PayoneApiConstants::PAYMENT_METHOD_PAYPAL_EXPRESS_CHECKOUT);
107
        $payone->setPaymentDetail($paymentDetailTransfer);
108
109
        $paymentTransfer->setPayone($payone);
110
        $paymentTransfer->setPaymentSelection(PayoneConstants::PAYMENT_METHOD_PAYPAL_EXPRESS_CHECKOUT_STATE_MACHINE);
111
        $paymentTransfer->setPaymentMethod(PayoneApiConstants::PAYMENT_METHOD_PAYPAL_EXPRESS_CHECKOUT);
112
        $paymentTransfer->setPaymentProvider(PayoneConstants::PROVIDER_NAME);
113
        $paypalExpressCheckoutPayment = new PayonePaypalExpressCheckoutTransfer();
114
        $paymentTransfer->setPayonePaypalExpressCheckout($paypalExpressCheckoutPayment);
115
        $quoteTransfer->setPayment($paymentTransfer);
116
117
        return $quoteTransfer;
118
    }
119
120
    /**
121
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
122
     *
123
     * @return \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
124
     */
125
    protected function hydrateQuoteWithShipment($quoteTransfer)
126
    {
127
        if ($quoteTransfer->getShipment()) {
128
            return $quoteTransfer;
129
        }
130
131
        $shipmentTransfer = new ShipmentTransfer();
132
133
        $methods = $this->shipmentClient->getAvailableMethods($quoteTransfer)->getMethods();
134
135
        if ($shippingMethod = reset($methods)) {
136
            $shippingMethod->setStoreCurrencyPrice(static::DEFAULT_SHIPPING_PRICE);
137
            $shipmentTransfer->setMethod($shippingMethod);
138
            $shipmentTransfer->setShipmentSelection($shippingMethod->getIdShipmentMethod());
139
            $quoteTransfer->setShipment($shipmentTransfer);
140
141
            return $quoteTransfer;
142
        }
143
144
        $shipmentTransfer->setMethod(
145
            (new ShipmentMethodTransfer())
146
                ->setCarrierName(static::CARRIER_NAME)
147
                ->setStoreCurrencyPrice(static::DEFAULT_SHIPPING_PRICE)
148
        );
149
        $quoteTransfer->setShipment($shipmentTransfer);
150
151
        return $quoteTransfer;
152
    }
153
154
    /**
155
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
156
     * @param \Generated\Shared\Transfer\PayonePaypalExpressCheckoutGenericPaymentResponseTransfer $details
157
     *
158
     * @return \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
159
     */
160
    protected function hydrateQuoteWithCustomer(
161
        QuoteTransfer $quoteTransfer,
162
        PayonePaypalExpressCheckoutGenericPaymentResponseTransfer $details
163
    ) {
164
        $customerEmail = $details->getEmail();
165
        $customerTransfer = new CustomerTransfer();
166
        $customerTransfer->setEmail($customerEmail);
167
        $customerTransfer = $this->customerClient->getCustomerByEmail($customerTransfer);
168
169
        if (!empty($customerTransfer->getFirstName())) {
170
            $quoteTransfer->setCustomer($customerTransfer);
171
            return $quoteTransfer;
172
        }
173
        $customerTransfer->setIsGuest(true);
174
        $customerTransfer->setFirstName($details->getShippingFirstName());
175
        $customerTransfer->setLastName($details->getShippingLastName());
176
        $customerTransfer->setCompany($details->getShippingCompany());
177
        $customerTransfer->setEmail($customerEmail);
178
        $quoteTransfer->setCustomer($customerTransfer);
179
180
        return $quoteTransfer;
181
    }
182
183
    /**
184
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
185
     * @param \Generated\Shared\Transfer\PayonePaypalExpressCheckoutGenericPaymentResponseTransfer $details
186
     *
187
     * @return \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
188
     */
189
    protected function hydrateQuoteWithAddresses(
190
        QuoteTransfer $quoteTransfer,
191
        PayonePaypalExpressCheckoutGenericPaymentResponseTransfer $details
192
    ) {
193
        $address = new AddressTransfer();
194
195
        if ($this->customerClient->isLoggedIn()) {
196
            $address->setEmail($quoteTransfer->getCustomer()->getEmail());
197
        } else {
198
            $address->setEmail($details->getEmail());
199
        }
200
201
        $address->setFirstName($details->getShippingFirstName());
202
        $address->setLastName($details->getShippingLastName());
203
        $address->setCompany($details->getShippingCompany());
204
        $address->setAddress1($details->getShippingStreet());
205
        $address->setAddress2($details->getShippingAddressAdition());
206
        $address->setCity($details->getShippingCity());
207
        $address->setState($details->getShippingState());
208
        $address->setIso2Code($details->getShippingCountry());
209
        $address->setZipCode($details->getShippingZip());
210
        $quoteTransfer->setBillingAddress($address);
211
        $quoteTransfer->setShippingAddress($address);
212
        $quoteTransfer->setBillingSameAsShipping(true);
213
214
        return $quoteTransfer;
215
    }
216
}
217