Issues (3641)

Cart/Plugin/SessionQuoteStorageStrategyPlugin.php (2 issues)

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\Client\Cart\Plugin;
9
10
use ArrayObject;
11
use Generated\Shared\Transfer\CartChangeTransfer;
12
use Generated\Shared\Transfer\CurrencyTransfer;
13
use Generated\Shared\Transfer\ItemReplaceTransfer;
14
use Generated\Shared\Transfer\ItemTransfer;
15
use Generated\Shared\Transfer\QuoteResponseTransfer;
16
use Generated\Shared\Transfer\QuoteTransfer;
17
use Spryker\Client\CartExtension\Dependency\Plugin\CartOperationQuoteStorageStrategyPluginInterface;
18
use Spryker\Client\CartExtension\Dependency\Plugin\QuoteResetLockQuoteStorageStrategyPluginInterface;
19
use Spryker\Client\CartExtension\Dependency\Plugin\QuoteStorageStrategyPluginInterface;
20
use Spryker\Client\CartExtension\Dependency\Plugin\ReplaceableQuoteItemStorageStrategyPluginInterface;
21
use Spryker\Client\Kernel\AbstractPlugin;
22
use Spryker\Shared\Quote\QuoteConfig;
23
24
/**
25
 * @method \Spryker\Client\Cart\CartClientInterface getClient()
26
 * @method \Spryker\Client\Cart\CartFactory getFactory()
27
 */
28
class SessionQuoteStorageStrategyPlugin extends AbstractPlugin implements QuoteStorageStrategyPluginInterface, QuoteResetLockQuoteStorageStrategyPluginInterface, CartOperationQuoteStorageStrategyPluginInterface, ReplaceableQuoteItemStorageStrategyPluginInterface
29
{
30
    /**
31
     * @return string
32
     */
33
    public function getStorageStrategy()
34
    {
35
        return QuoteConfig::STORAGE_STRATEGY_SESSION;
36
    }
37
38
    /**
39
     * Specification:
40
     *  - Adds items.
41
     *  - Makes zed request.
42
     *  - Stores quote in session internally after zed request.
43
     *  - Returns updated quote if quote is not locked.
44
     *  - Adds messenger error message and returns unchanged QuoteTransfer if quote is locked.
45
     *
46
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
47
     * @param array<string, mixed> $params
48
     *
49
     * @return \Generated\Shared\Transfer\QuoteTransfer
50
     */
51
    public function addItem(ItemTransfer $itemTransfer, array $params = [])
52
    {
53
        $cartChangeTransfer = $this->prepareCartChangeTransfer($itemTransfer);
54
        $cartChangeTransfer = $this->getFactory()
55
            ->createCartChangeRequestExpander()
56
            ->addItemsRequestExpand($cartChangeTransfer, $params);
57
58
        $quoteTransfer = $this->getCartZedStub()->addItem($cartChangeTransfer);
59
        $this->getQuoteClient()->setQuote($quoteTransfer);
60
61
        return $quoteTransfer;
62
    }
63
64
    /**
65
     * Specification:
66
     *  - Makes zed request.
67
     *  - Adds items to quote.
68
     *  - Recalculates quote totals.
69
     *  - Stores quote in session internally after zed request.
70
     *  - Returns update quote.
71
     *
72
     * @param array<\Generated\Shared\Transfer\ItemTransfer> $itemTransfers
73
     * @param array<string, mixed> $params
74
     *
75
     * @return \Generated\Shared\Transfer\QuoteTransfer
76
     */
77
    public function addItems(array $itemTransfers, array $params = [])
78
    {
79
        $cartChangeTransfer = $this->createCartChangeTransfer();
80
        foreach ($itemTransfers as $itemTransfer) {
81
            $cartChangeTransfer->addItem($itemTransfer);
82
        }
83
84
        $cartChangeTransfer = $this->getFactory()
85
            ->createCartChangeRequestExpander()
86
            ->addItemsRequestExpand($cartChangeTransfer, $params);
87
88
        $quoteTransfer = $this->getCartZedStub()->addItem($cartChangeTransfer);
89
        $this->getQuoteClient()->setQuote($quoteTransfer);
90
91
        return $quoteTransfer;
92
    }
93
94
    /**
95
     * Specification:
96
     *  - Adds multiple items.
97
     *  - Makes zed request.
98
     *  - Adds only items, that passed cart validation.
99
     *  - Stores quote in session internally after zed request.
100
     *  - Returns update quote if quote is not locked.
101
     *  - Adds messenger error message and returns unchanged QuoteTransfer if quote is locked.
102
     *
103
     * @param \Generated\Shared\Transfer\CartChangeTransfer $cartChangeTransfer
104
     * @param array<string, mixed> $params
105
     *
106
     * @return \Generated\Shared\Transfer\QuoteTransfer
107
     */
108
    public function addValidItems(CartChangeTransfer $cartChangeTransfer, array $params = []): QuoteTransfer
109
    {
110
        $cartChangeTransfer = $this->getFactory()
111
            ->createCartChangeRequestExpander()
112
            ->addItemsRequestExpand($cartChangeTransfer, $params);
113
114
        $quoteTransfer = $this->getCartZedStub()->addValidItems($cartChangeTransfer);
115
        $this->getQuoteClient()->setQuote($quoteTransfer);
116
117
        return $quoteTransfer;
118
    }
119
120
    /**
121
     * Specification:
122
     *  - Removes single items from quote.
123
     *  - Makes zed request.
124
     *  - Stores quote in session internally after zed request.
125
     *  - Returns update quote.
126
     *
127
     * @param string $sku
128
     * @param string|null $groupKey
129
     *
130
     * @return \Generated\Shared\Transfer\QuoteTransfer
131
     */
132
    public function removeItem($sku, $groupKey = null)
133
    {
134
        $itemTransfer = $this->findItem($sku, $groupKey);
135
        if (!$itemTransfer) {
136
            return $this->getQuote();
137
        }
138
139
        $cartChangeTransfer = $this->prepareCartChangeTransfer($itemTransfer);
140
        $cartChangeTransfer = $this->getFactory()
141
            ->createCartChangeRequestExpander()
142
            ->removeItemRequestExpand($cartChangeTransfer);
143
144
        $quoteTransfer = $this->getCartZedStub()->removeItem($cartChangeTransfer);
145
        $this->getQuoteClient()->setQuote($quoteTransfer);
146
147
        return $quoteTransfer;
148
    }
149
150
    /**
151
     * Specification:
152
     *  - Removes single items from quote.
153
     *  - Makes zed request.
154
     *  - Stores quote in session internally after zed request.
155
     *  - Returns update quote.
156
     *
157
     * @param \ArrayObject<int, \Generated\Shared\Transfer\ItemTransfer> $itemTransfers
158
     *
159
     * @return \Generated\Shared\Transfer\QuoteTransfer
160
     */
161
    public function removeItems(ArrayObject $itemTransfers)
162
    {
163
        $cartChangeTransfer = $this->createCartChangeTransfer();
164
        $cartChangeTransfer->setItems($itemTransfers);
165
        $cartChangeTransfer = $this->getFactory()
166
            ->createCartChangeRequestExpander()
167
            ->removeItemRequestExpand($cartChangeTransfer);
168
169
        $quoteTransfer = $this->getCartZedStub()->removeItem($cartChangeTransfer);
170
        $this->getQuoteClient()->setQuote($quoteTransfer);
171
172
        return $quoteTransfer;
173
    }
174
175
    /**
176
     * Specification:
177
     *  - Changes quantity for given item.
178
     *  - Makes zed request.
179
     *  - Stores quote in session internally after zed request.
180
     *  - Returns update quote.
181
     *
182
     * @param string $sku
183
     * @param string|null $groupKey
184
     * @param int $quantity
185
     *
186
     * @return \Generated\Shared\Transfer\QuoteTransfer
187
     */
188
    public function changeItemQuantity($sku, $groupKey = null, $quantity = 1)
189
    {
190
        if ($quantity === 0) {
191
            return $this->removeItem($sku, $groupKey);
192
        }
193
194
        $itemTransfer = $this->findItem($sku, $groupKey);
195
        if (!$itemTransfer) {
196
            return $this->getQuote();
197
        }
198
199
        $delta = abs($itemTransfer->getQuantity() - $quantity);
200
201
        if ($delta === 0) {
202
            return $this->getQuoteClient()->getQuote();
203
        }
204
205
        if ($itemTransfer->getQuantity() > $quantity) {
206
            return $this->decreaseItemQuantity($sku, $groupKey, $delta);
0 ignored issues
show
It seems like $delta can also be of type double; however, parameter $quantity of Spryker\Client\Cart\Plug...:decreaseItemQuantity() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

206
            return $this->decreaseItemQuantity($sku, $groupKey, /** @scrutinizer ignore-type */ $delta);
Loading history...
207
        }
208
209
        return $this->increaseItemQuantity($sku, $groupKey, $delta);
0 ignored issues
show
It seems like $delta can also be of type double; however, parameter $quantity of Spryker\Client\Cart\Plug...:increaseItemQuantity() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

209
        return $this->increaseItemQuantity($sku, $groupKey, /** @scrutinizer ignore-type */ $delta);
Loading history...
210
    }
211
212
    /**
213
     * Specification:
214
     * - Makes Zed request.
215
     * - Adds items to quote.
216
     * - Stores quote in session internally after success zed request.
217
     * - Returns response with updated quote.
218
     *
219
     * @param \Generated\Shared\Transfer\CartChangeTransfer $cartChangeTransfer
220
     *
221
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
222
     */
223
    public function addToCart(CartChangeTransfer $cartChangeTransfer): QuoteResponseTransfer
224
    {
225
        return $this->getFactory()
226
            ->createCartOperation()
227
            ->addToCart($cartChangeTransfer);
228
    }
229
230
    /**
231
     * Specification:
232
     * - Makes Zed request.
233
     * - Adds items to quote.
234
     * - Stores quote in session internally after success zed request.
235
     * - Returns response with updated quote.
236
     *
237
     * @param \Generated\Shared\Transfer\CartChangeTransfer $cartChangeTransfer
238
     *
239
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
240
     */
241
    public function removeFromCart(CartChangeTransfer $cartChangeTransfer): QuoteResponseTransfer
242
    {
243
        return $this->getFactory()
244
            ->createCartOperation()
245
            ->removeFromCart($cartChangeTransfer);
246
    }
247
248
    /**
249
     * Specification:
250
     * - Makes Zed request.
251
     * - Updates quantity for given items.
252
     * - Stores quote in session internally after successful zed request.
253
     * - Returns response with updated quote.
254
     *
255
     * @param \Generated\Shared\Transfer\CartChangeTransfer $cartChangeTransfer
256
     *
257
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
258
     */
259
    public function updateQuantity(CartChangeTransfer $cartChangeTransfer): QuoteResponseTransfer
260
    {
261
        return $this->getFactory()
262
            ->createCartOperation()
263
            ->updateQuantity($cartChangeTransfer);
264
    }
265
266
    /**
267
     * Specification:
268
     * - Makes Zed request.
269
     * - Removes `ItemReplaceTransfer::itemToBeReplaced` from the cart.
270
     * - Adds `ItemReplaceTransfer::newItem` to cart.
271
     * - Stores quote in session internally after zed request.
272
     * - Returns response with updated quote.
273
     *
274
     * @param \Generated\Shared\Transfer\ItemReplaceTransfer $itemReplaceTransfer
275
     *
276
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
277
     */
278
    public function replaceItem(ItemReplaceTransfer $itemReplaceTransfer): QuoteResponseTransfer
279
    {
280
        return $this->getFactory()
281
            ->createCartItemOperation()
282
            ->replaceItem($itemReplaceTransfer);
283
    }
284
285
    /**
286
     * Specification:
287
     *  - Decreases quantity for given item.
288
     *  - Makes zed request.
289
     *  - Stores quote in session internally after zed request.
290
     *  - Returns update quote.
291
     *
292
     * @param string $sku
293
     * @param string|null $groupKey
294
     * @param int $quantity
295
     *
296
     * @return \Generated\Shared\Transfer\QuoteTransfer
297
     */
298
    public function decreaseItemQuantity($sku, $groupKey = null, $quantity = 1)
299
    {
300
        $decreaseItemTransfer = $this->findItem($sku, $groupKey);
301
        if (!$decreaseItemTransfer) {
302
            return $this->getQuote();
303
        }
304
305
        $itemTransfer = clone $decreaseItemTransfer;
306
        $itemTransfer->setQuantity($quantity);
307
308
        $cartChangeTransfer = $this->prepareCartChangeTransfer($itemTransfer);
309
        $cartChangeTransfer = $this->getFactory()
310
            ->createCartChangeRequestExpander()
311
            ->removeItemRequestExpand($cartChangeTransfer);
312
313
        $quoteTransfer = $this->getCartZedStub()->removeItem($cartChangeTransfer);
314
        $this->getQuoteClient()->setQuote($quoteTransfer);
315
316
        return $quoteTransfer;
317
    }
318
319
    /**
320
     * Specification:
321
     *  - Increases quantity for given item.
322
     *  - Makes zed request.
323
     *  - Stores quote in session internally after zed request.
324
     *  - Returns update quote.
325
     *
326
     * @param string $sku
327
     * @param string|null $groupKey
328
     * @param int $quantity
329
     *
330
     * @return \Generated\Shared\Transfer\QuoteTransfer
331
     */
332
    public function increaseItemQuantity($sku, $groupKey = null, $quantity = 1)
333
    {
334
        $increaseItemTransfer = $this->findItem($sku, $groupKey);
335
        if (!$increaseItemTransfer) {
336
            return $this->getQuote();
337
        }
338
339
        $itemTransfer = clone $increaseItemTransfer;
340
        $itemTransfer->setQuantity($quantity);
341
342
        $cartChangeTransfer = $this->prepareCartChangeTransfer($itemTransfer);
343
344
        $quoteTransfer = $this->getCartZedStub()->addItem($cartChangeTransfer);
345
        $this->getQuoteClient()->setQuote($quoteTransfer);
346
347
        return $quoteTransfer;
348
    }
349
350
    /**
351
     * @deprecated Use {@link \Spryker\Client\Quote\QuoteClient::setQuote()} instead.
352
     *
353
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
354
     *
355
     * @return void
356
     */
357
    public function storeQuote(QuoteTransfer $quoteTransfer)
358
    {
359
        $this->getQuoteClient()->setQuote($quoteTransfer);
360
    }
361
362
    /**
363
     * Specification:
364
     *  - Makes zed request.
365
     *  - Reloads all items in cart anew, it recreates all items transfer, reads new prices, options, bundles.
366
     *  - Stores quote in session internally after zed request.
367
     *  - Returns update quote.
368
     *
369
     * @return void
370
     */
371
    public function reloadItems()
372
    {
373
        $quoteTransfer = $this->getQuote();
374
        $quoteTransfer = $this->getCartZedStub()->reloadItems($quoteTransfer);
375
        $this->getQuoteClient()->setQuote($quoteTransfer);
376
    }
377
378
    /**
379
     * Specification:
380
     *  - Makes zed request.
381
     *  - Reloads all items in cart anew, it recreates all items transfer, reads new prices, options, bundles.
382
     *  - Adds changes as notices to messages
383
     *  - Check error messages
384
     *  - Stores quote in session internally after zed request.
385
     *  - Returns update quote.
386
     *  - Returns with unchanged QuoteTransfer and 'isSuccessful=true' when cart is locked.
387
     *
388
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
389
     */
390
    public function validateQuote()
391
    {
392
        $quoteResponseTransfer = $this->getCartZedStub()->validateQuote($this->getQuote());
393
        $this->getQuoteClient()->setQuote($quoteResponseTransfer->getQuoteTransfer());
394
395
        return $quoteResponseTransfer;
396
    }
397
398
    /**
399
     * Specification:
400
     *  - Sets currency to quote.
401
     *  - Makes zed request.
402
     *  - Reloads all items in cart as new, it recreates all items transfer, reads new prices, options, bundles.
403
     *  - Stores quote in session internally after zed request.
404
     *  - Returns update quote.
405
     *
406
     * @param \Generated\Shared\Transfer\CurrencyTransfer $currencyTransfer
407
     *
408
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
409
     */
410
    public function setQuoteCurrency(CurrencyTransfer $currencyTransfer): QuoteResponseTransfer
411
    {
412
        $quoteTransfer = (new QuoteTransfer())->fromArray($this->getQuote()->modifiedToArray(), true);
413
        $quoteTransfer->setCurrency($currencyTransfer);
414
        if (count($quoteTransfer->getItems())) {
415
            $quoteTransfer = $this->getCartZedStub()->reloadItems($quoteTransfer);
416
        }
417
        $quoteResponseTransfer = new QuoteResponseTransfer();
418
        $quoteResponseTransfer->setIsSuccessful(false);
419
        $quoteResponseTransfer->setQuoteTransfer($quoteTransfer);
420
        if (count($this->getFactory()->getZedRequestClient()->getResponsesErrorMessages()) === 0) {
421
            $quoteResponseTransfer->setIsSuccessful(true);
422
            $this->getQuoteClient()->setQuote($quoteTransfer);
423
        }
424
425
        return $quoteResponseTransfer;
426
    }
427
428
    /**
429
     * Specification:
430
     * - Makes zed request.
431
     * - Executes QuoteLockPreResetPluginInterface plugins before unlock.
432
     * - Unlocks quote by setting `isLocked` transfer property to false.
433
     * - Reloads all items in cart as new, it recreates all items transfer, reads new prices, options, bundles.
434
     * - Stores quote in session internally after zed request.
435
     *
436
     * @api
437
     *
438
     * @return \Generated\Shared\Transfer\QuoteResponseTransfer
439
     */
440
    public function resetQuoteLock(): QuoteResponseTransfer
441
    {
442
        $quoteResponseTransfer = $this->getCartZedStub()
443
            ->resetQuoteLock($this->getQuote());
444
445
        $this->getQuoteClient()->setQuote($quoteResponseTransfer->getQuoteTransfer());
446
447
        return $quoteResponseTransfer;
448
    }
449
450
    /**
451
     * @param string $sku
452
     * @param string|null $groupKey
453
     *
454
     * @return \Generated\Shared\Transfer\ItemTransfer|null
455
     */
456
    protected function findItem($sku, $groupKey = null)
457
    {
458
        $quoteTransfer = $this->getQuote();
459
460
        return $this->getFactory()
461
            ->getQuoteItemFinderPlugin()
462
            ->findItem($quoteTransfer, $sku, $groupKey);
463
    }
464
465
    /**
466
     * @return \Generated\Shared\Transfer\CartChangeTransfer
467
     */
468
    protected function createCartChangeTransfer()
469
    {
470
        $quoteTransfer = $this->getQuoteClient()->getQuote();
471
        $items = $quoteTransfer->getItems();
472
473
        if (count($items) === 0) {
474
            $quoteTransfer->setItems(new ArrayObject());
475
        }
476
477
        $cartChangeTransfer = new CartChangeTransfer();
478
        $cartChangeTransfer->setQuote($quoteTransfer);
479
480
        return $cartChangeTransfer;
481
    }
482
483
    /**
484
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
485
     *
486
     * @return \Generated\Shared\Transfer\CartChangeTransfer
487
     */
488
    protected function prepareCartChangeTransfer(ItemTransfer $itemTransfer)
489
    {
490
        $cartChangeTransfer = $this->createCartChangeTransfer();
491
        $cartChangeTransfer->addItem($itemTransfer);
492
493
        return $cartChangeTransfer;
494
    }
495
496
    /**
497
     * @return \Spryker\Client\Cart\Zed\CartStubInterface
498
     */
499
    protected function getCartZedStub()
500
    {
501
        return $this->getFactory()->createZedStub();
502
    }
503
504
    /**
505
     * @return \Spryker\Client\Cart\Dependency\Client\CartToQuoteInterface
506
     */
507
    protected function getQuoteClient()
508
    {
509
        return $this->getFactory()->getQuoteClient();
510
    }
511
512
    /**
513
     * @return \Generated\Shared\Transfer\QuoteTransfer
514
     */
515
    protected function getQuote()
516
    {
517
        return $this->getQuoteClient()->getQuote();
518
    }
519
}
520