Issues (3641)

CustomerOrderSaverWithMultiShippingAddress.php (1 issue)

1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace Spryker\Zed\Customer\Business\Checkout;
9
10
use Generated\Shared\Transfer\AddressTransfer;
11
use Generated\Shared\Transfer\CustomerTransfer;
12
use Generated\Shared\Transfer\ItemTransfer;
13
use Generated\Shared\Transfer\QuoteTransfer;
14
use Spryker\Service\Customer\CustomerServiceInterface;
15
use Spryker\Zed\Customer\Business\Customer\AddressInterface;
16
use Spryker\Zed\Customer\Business\Customer\CustomerInterface;
17
18
/**
19
 * @method \Spryker\Zed\Customer\Business\CustomerBusinessFactory getFactory()
20
 */
21
class CustomerOrderSaverWithMultiShippingAddress extends CustomerOrderSaver
0 ignored issues
show
Deprecated Code introduced by
The class Spryker\Zed\Customer\Bus...kout\CustomerOrderSaver has been deprecated: Use {@link \Spryker\Zed\Customer\Business\Checkout\CustomerOrderSaverWithMultiShippingAddress} instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

21
class CustomerOrderSaverWithMultiShippingAddress extends /** @scrutinizer ignore-deprecated */ CustomerOrderSaver
Loading history...
22
{
23
    /**
24
     * Keys are unique strings generated using address data. Values don't matter.
25
     *
26
     * @var array<bool>
27
     */
28
    protected $existingAddresses = [];
29
30
    /**
31
     * @var \Spryker\Service\Customer\CustomerServiceInterface
32
     */
33
    protected $customerService;
34
35
    /**
36
     * @param \Spryker\Zed\Customer\Business\Customer\CustomerInterface $customer
37
     * @param \Spryker\Zed\Customer\Business\Customer\AddressInterface $address
38
     * @param \Spryker\Service\Customer\CustomerServiceInterface $customerService
39
     */
40
    public function __construct(
41
        CustomerInterface $customer,
42
        AddressInterface $address,
43
        CustomerServiceInterface $customerService
44
    ) {
45
        parent::__construct($customer, $address);
46
47
        $this->customerService = $customerService;
48
    }
49
50
    /**
51
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
52
     * @param \Generated\Shared\Transfer\CustomerTransfer $customer
53
     *
54
     * @return void
55
     */
56
    protected function persistAddresses(QuoteTransfer $quoteTransfer, CustomerTransfer $customer)
57
    {
58
        $this->existingAddresses = [];
59
        $quoteTransfer = $this->persistBillingAddress($quoteTransfer, $customer);
60
61
        foreach ($quoteTransfer->getItems() as $itemTransfer) {
62
            $this->persistShippingAddress($itemTransfer, $customer);
63
        }
64
    }
65
66
    /**
67
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
68
     * @param \Generated\Shared\Transfer\CustomerTransfer $customer
69
     *
70
     * @return \Generated\Shared\Transfer\QuoteTransfer
71
     */
72
    protected function persistBillingAddress(QuoteTransfer $quoteTransfer, CustomerTransfer $customer): QuoteTransfer
73
    {
74
        $billingAddressTransfer = $quoteTransfer->requireBillingAddress()->getBillingAddress();
75
76
        if ($billingAddressTransfer === null || $billingAddressTransfer->getIsAddressSavingSkipped()) {
77
            return $quoteTransfer;
78
        }
79
80
        $billingAddressTransfer = $this->processNewUniqueCustomerAddress($billingAddressTransfer, $customer);
81
        $quoteTransfer->setBillingAddress($billingAddressTransfer);
82
83
        return $quoteTransfer;
84
    }
85
86
    /**
87
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
88
     * @param \Generated\Shared\Transfer\CustomerTransfer $customer
89
     *
90
     * @return void
91
     */
92
    protected function persistShippingAddress(ItemTransfer $itemTransfer, CustomerTransfer $customer): void
93
    {
94
        $shipmentTransfer = $itemTransfer->requireShipment()->getShipment();
95
        $shippingAddressTransfer = $shipmentTransfer->requireShippingAddress()->getShippingAddress();
96
97
        if ($shippingAddressTransfer->getIsAddressSavingSkipped()) {
98
            return;
99
        }
100
101
        $shippingAddressTransfer = $this->processNewUniqueCustomerAddress($shippingAddressTransfer, $customer);
102
        $shipmentTransfer->setShippingAddress($shippingAddressTransfer);
103
    }
104
105
    /**
106
     * @param \Generated\Shared\Transfer\AddressTransfer $addressTransfer
107
     * @param \Generated\Shared\Transfer\CustomerTransfer $customer
108
     *
109
     * @return \Generated\Shared\Transfer\AddressTransfer
110
     */
111
    protected function processNewUniqueCustomerAddress(
112
        AddressTransfer $addressTransfer,
113
        CustomerTransfer $customer
114
    ): AddressTransfer {
115
        if ($addressTransfer->getFkCustomer() === null) {
116
            $addressTransfer->setFkCustomer($customer->getIdCustomer());
117
        }
118
119
        $addressTransferKey = $this->customerService->getUniqueAddressKey($addressTransfer);
120
        if ($this->isAddressNewAndUnique($addressTransfer, $addressTransferKey)) {
121
            return $addressTransfer;
122
        }
123
124
        $this->processCustomerAddress($addressTransfer, $customer);
125
        $this->existingAddresses[$addressTransferKey] = true;
126
127
        return $addressTransfer;
128
    }
129
130
    /**
131
     * @param \Generated\Shared\Transfer\AddressTransfer $addressTransfer
132
     * @param string $addressTransferKey
133
     *
134
     * @return bool
135
     */
136
    protected function isAddressNewAndUnique(AddressTransfer $addressTransfer, string $addressTransferKey): bool
137
    {
138
        return $addressTransfer->getIdCustomerAddress() !== null
139
            || isset($this->existingAddresses[$addressTransferKey]);
140
    }
141
}
142