Issues (3641)

Product/_support/Helper/ProductDataHelper.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 SprykerTest\Shared\Product\Helper;
9
10
use ArrayObject;
11
use Codeception\Module;
12
use Generated\Shared\DataBuilder\LocalizedAttributesBuilder;
13
use Generated\Shared\DataBuilder\ProductAbstractBuilder;
14
use Generated\Shared\DataBuilder\ProductConcreteBuilder;
15
use Generated\Shared\DataBuilder\StoreRelationBuilder;
16
use Generated\Shared\Transfer\LocaleTransfer;
17
use Generated\Shared\Transfer\LocalizedAttributesTransfer;
18
use Generated\Shared\Transfer\ProductAbstractTransfer;
19
use Generated\Shared\Transfer\ProductConcreteTransfer;
20
use Generated\Shared\Transfer\StoreRelationTransfer;
21
use Generated\Shared\Transfer\StoreTransfer;
22
use Orm\Zed\Product\Persistence\SpyProductAbstractStoreQuery;
23
use Orm\Zed\Store\Persistence\Map\SpyStoreTableMap;
24
use Spryker\Zed\Locale\Business\LocaleFacadeInterface;
25
use Spryker\Zed\Product\Business\ProductFacadeInterface;
26
use Spryker\Zed\Product\Persistence\ProductQueryContainerInterface;
27
use Spryker\Zed\Store\Business\StoreFacadeInterface;
28
use SprykerTest\Shared\Testify\Helper\DataCleanupHelperTrait;
29
use SprykerTest\Shared\Testify\Helper\LocatorHelperTrait;
30
31
class ProductDataHelper extends Module
32
{
33
    use DataCleanupHelperTrait;
34
    use LocatorHelperTrait;
35
36
    /**
37
     * @var string
38
     */
39
    protected const LOCALE_US = 'en_US';
40
41
    /**
42
     * @param array $productConcreteOverride
43
     * @param array $productAbstractOverride
44
     * @param string|null $locale
45
     *
46
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer
47
     */
48
    public function haveProduct(array $productConcreteOverride = [], array $productAbstractOverride = [], ?string $locale = null): ProductConcreteTransfer
49
    {
50
        $productAbstractTransfer = (new ProductAbstractBuilder($productAbstractOverride))->build();
51
52
        $productFacade = $this->getProductFacade();
53
        $abstractProductId = $productFacade->createProductAbstract($productAbstractTransfer);
54
55
        $productConcreteTransfer = (new ProductConcreteBuilder(['fkProductAbstract' => $abstractProductId]))
56
            ->seed($productConcreteOverride)
57
            ->build();
58
59
        $productConcreteTransfer->setAbstractSku($productAbstractTransfer->getSku());
60
        $productFacade->createProductConcrete($productConcreteTransfer);
61
62
        $this->debug(sprintf(
63
            'Inserted AbstractProduct: %d, Concrete Product: %d',
64
            $abstractProductId,
65
            $productConcreteTransfer->getIdProductConcrete(),
66
        ));
67
68
        $this->getDataCleanupHelper()->_addCleanup(function () use ($productConcreteTransfer): void {
69
            $this->cleanupProductConcrete($productConcreteTransfer->getIdProductConcrete());
70
            $this->cleanupProductAbstract($productConcreteTransfer->getFkProductAbstract());
71
        });
72
73
        return $productConcreteTransfer;
74
    }
75
76
    /**
77
     * @param array $productConcreteOverride
78
     *
79
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer
80
     */
81
    public function haveProductConcrete(array $productConcreteOverride = []): ProductConcreteTransfer
82
    {
83
        $productConcreteTransfer = (new ProductConcreteBuilder())
84
            ->seed($productConcreteOverride)
85
            ->build();
86
87
        $this->getProductFacade()->createProductConcrete($productConcreteTransfer);
88
89
        $this->debug(sprintf(
90
            'Inserted Concrete Product: %d',
91
            $productConcreteTransfer->getIdProductConcrete(),
92
        ));
93
94
        $this->getDataCleanupHelper()->_addCleanup(function () use ($productConcreteTransfer): void {
95
            $this->cleanupProductConcrete($productConcreteTransfer->getIdProductConcrete());
96
        });
97
98
        return $productConcreteTransfer;
99
    }
100
101
    /**
102
     * @param array $productAbstractOverride
103
     * @param bool $localized
104
     *
105
     * @return \Generated\Shared\Transfer\ProductAbstractTransfer
106
     */
107
    public function haveProductAbstract(array $productAbstractOverride = [], bool $localized = false): ProductAbstractTransfer
108
    {
109
        $productAbstractTransfer = new ProductAbstractBuilder($productAbstractOverride);
110
111
        if ($localized) {
112
            $localizedAttributes = (new LocalizedAttributesBuilder([
113
                LocalizedAttributesTransfer::NAME => uniqid('Product #', true),
114
                LocalizedAttributesTransfer::LOCALE => $this->getCurrentLocale(),
115
                LocalizedAttributesTransfer::ATTRIBUTES => $productConcreteOverride[ProductConcreteTransfer::ATTRIBUTES] ?? [],
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $productConcreteOverride seems to never exist and therefore isset should always be false.
Loading history...
116
            ]))->build()->toArray();
117
118
            $productAbstractTransfer->withLocalizedAttributes($localizedAttributes);
119
        }
120
121
        $productAbstractTransfer = $productAbstractTransfer->build();
122
123
        $productFacade = $this->getProductFacade();
124
        $abstractProductId = $productFacade->createProductAbstract($productAbstractTransfer);
125
126
        $this->debug(sprintf(
127
            'Inserted AbstractProduct: %d',
128
            $abstractProductId,
129
        ));
130
131
        $this->getDataCleanupHelper()->_addCleanup(function () use ($productAbstractTransfer): void {
132
            $this->cleanupProductAbstract($productAbstractTransfer->getIdProductAbstract());
133
        });
134
135
        return $productAbstractTransfer;
136
    }
137
138
    /**
139
     * @param array $productConcreteOverride
140
     * @param array $productAbstractOverride
141
     *
142
     * @return \Generated\Shared\Transfer\ProductConcreteTransfer
143
     */
144
    public function haveFullProduct(
145
        array $productConcreteOverride = [],
146
        array $productAbstractOverride = []
147
    ): ProductConcreteTransfer {
148
        $allStoresRelation = $this->getAllStoresRelation()->toArray();
149
150
        $localizedAttributes = (new LocalizedAttributesBuilder([
151
            LocalizedAttributesTransfer::NAME => uniqid('Product #', true),
152
            LocalizedAttributesTransfer::LOCALE => $this->getCurrentLocale(),
153
            LocalizedAttributesTransfer::ATTRIBUTES => $productConcreteOverride[ProductConcreteTransfer::ATTRIBUTES] ?? [],
154
        ]))->build()->toArray();
155
156
        /** @var \Generated\Shared\Transfer\ProductAbstractTransfer $productAbstractTransfer */
157
        $productAbstractTransfer = (new ProductAbstractBuilder($productAbstractOverride))
158
            ->withLocalizedAttributes($productAbstractOverride[ProductAbstractTransfer::LOCALIZED_ATTRIBUTES] ?? $localizedAttributes)
159
            ->withStoreRelation($allStoresRelation)
160
            ->build();
161
162
        $productFacade = $this->getProductFacade();
163
164
        $abstractProductId = $productFacade->createProductAbstract($productAbstractTransfer);
165
        /** @var \Generated\Shared\Transfer\ProductConcreteTransfer $productConcreteTransfer */
166
        $productConcreteTransfer = (new ProductConcreteBuilder(array_merge(['fkProductAbstract' => $abstractProductId], $productConcreteOverride)))
167
            ->withLocalizedAttributes($localizedAttributes)
168
            ->withStores($allStoresRelation)
169
            ->build();
170
        $productConcreteTransfer->setAbstractSku($productAbstractTransfer->getSku());
171
172
        $productFacade->createProductConcrete($productConcreteTransfer);
173
174
        $url = $productFacade->createProductUrl(
175
            $productAbstractTransfer->setIdProductAbstract($productConcreteTransfer->getFkProductAbstract()),
176
        );
177
178
        $this->debug(sprintf(
179
            'Inserted AbstractProduct: %d, Concrete Product: %d',
180
            $abstractProductId,
181
            $productConcreteTransfer->getIdProductConcrete(),
182
        ));
183
184
        $this->getDataCleanupHelper()->_addCleanup(function () use ($productConcreteTransfer): void {
185
            $this->cleanupProductConcrete($productConcreteTransfer->getIdProductConcrete());
186
            $this->cleanupProductAbstract($productConcreteTransfer->getFkProductAbstract());
187
        });
188
189
        return $productConcreteTransfer;
190
    }
191
192
    /**
193
     * @param int $idProductAbstract
194
     *
195
     * @return array<string>
196
     */
197
    public function getProductAbstractStoreNamesByIdProductAbstract(int $idProductAbstract): array
198
    {
199
        return SpyProductAbstractStoreQuery::create()
200
            ->filterByFkProductAbstract($idProductAbstract)
201
            ->innerJoinSpyStore()
202
            ->select(SpyStoreTableMap::COL_NAME)
203
            ->find()
204
            ->getData();
205
    }
206
207
    /**
208
     * @return \Generated\Shared\Transfer\StoreRelationTransfer
209
     */
210
    protected function getAllStoresRelation(): StoreRelationTransfer
211
    {
212
        $stores = $this->getStoreFacade()->getAllStores();
213
        $idStores = array_map(function (StoreTransfer $storeTransfer) {
214
            return $storeTransfer->getIdStore();
215
        }, $stores);
216
217
        return (new StoreRelationBuilder([
218
            StoreRelationTransfer::ID_STORES => $idStores,
219
            StoreRelationTransfer::STORES => new ArrayObject($stores),
220
        ]))->build();
221
    }
222
223
    /**
224
     * @return \Spryker\Zed\Store\Business\StoreFacadeInterface
225
     */
226
    protected function getStoreFacade(): StoreFacadeInterface
227
    {
228
        return $this->getLocator()->store()->facade();
229
    }
230
231
    /**
232
     * @return \Generated\Shared\Transfer\LocaleTransfer
233
     */
234
    protected function getCurrentLocale(): LocaleTransfer
235
    {
236
        if ((bool)getenv('SPRYKER_DYNAMIC_STORE_MODE') === false) {
237
            return $this->getLocaleFacade()->getCurrentLocale();
238
        }
239
240
        return $this->getLocaleFacade()->getLocale(static::LOCALE_US);
241
    }
242
243
    /**
244
     * @return \Spryker\Zed\Locale\Business\LocaleFacadeInterface
245
     */
246
    protected function getLocaleFacade(): LocaleFacadeInterface
247
    {
248
        return $this->getLocator()->locale()->facade();
249
    }
250
251
    /**
252
     * @param \Generated\Shared\Transfer\ProductAbstractTransfer $productAbstractTransfer
253
     * @param array<\Generated\Shared\Transfer\LocalizedAttributesTransfer> $localizedAttributes
254
     *
255
     * @return void
256
     */
257
    public function addLocalizedAttributesToProductAbstract(ProductAbstractTransfer $productAbstractTransfer, array $localizedAttributes): void
258
    {
259
        $productAbstractTransfer->setLocalizedAttributes(
260
            new ArrayObject($localizedAttributes),
261
        );
262
263
        $this->getProductFacade()->saveProductAbstract($productAbstractTransfer);
264
    }
265
266
    /**
267
     * @param \Generated\Shared\Transfer\ProductConcreteTransfer $productConcreteTransfer
268
     * @param array<\Generated\Shared\Transfer\LocalizedAttributesTransfer> $localizedAttributes
269
     *
270
     * @return void
271
     */
272
    public function addLocalizedAttributesToProductConcrete(ProductConcreteTransfer $productConcreteTransfer, array $localizedAttributes): void
273
    {
274
        $productConcreteTransfer->setLocalizedAttributes(
275
            new ArrayObject($localizedAttributes),
276
        );
277
278
        $this->getProductFacade()->saveProductConcrete($productConcreteTransfer);
279
    }
280
281
    /**
282
     * @return \Spryker\Zed\Product\Business\ProductFacadeInterface
283
     */
284
    private function getProductFacade(): ProductFacadeInterface
285
    {
286
        return $this->getLocator()->product()->facade();
287
    }
288
289
    /**
290
     * @return \Spryker\Zed\Product\Persistence\ProductQueryContainerInterface
291
     */
292
    private function getProductQuery(): ProductQueryContainerInterface
293
    {
294
        return $this->getLocator()->product()->queryContainer();
295
    }
296
297
    /**
298
     * @param int $idProductConcrete
299
     *
300
     * @return void
301
     */
302
    private function cleanupProductConcrete(int $idProductConcrete): void
303
    {
304
        $this->debug(sprintf('Deleting Concrete Product: %d', $idProductConcrete));
305
306
        $this->getProductQuery()
307
            ->queryProduct()
308
            ->findByIdProduct($idProductConcrete)
309
            ->delete();
310
    }
311
312
    /**
313
     * @param int $idProductAbstract
314
     *
315
     * @return void
316
     */
317
    private function cleanupProductAbstract(int $idProductAbstract): void
318
    {
319
        $this->debug(sprintf('Deleting Abstract Product: %d', $idProductAbstract));
320
321
        $this->getProductQuery()
322
            ->queryProductAbstract()
323
            ->findByIdProductAbstract($idProductAbstract)
324
            ->delete();
325
    }
326
}
327