CartItemViewFactory::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file has been created by developers from BitBag.
5
 * Feel free to contact us once you face any issues or want to start
6
 * another great project.
7
 * You can find more information about us on https://bitbag.io and write us
8
 * an email on [email protected].
9
 */
10
11
declare(strict_types=1);
12
13
namespace BitBag\SyliusVueStorefrontPlugin\Factory\Cart;
14
15
use BitBag\SyliusVueStorefrontPlugin\View\Cart\CartItem\ProductOptionExtensionAttributeView;
16
use BitBag\SyliusVueStorefrontPlugin\View\Cart\CartItem\ProductOptionView;
17
use BitBag\SyliusVueStorefrontPlugin\View\Cart\CartItemView;
18
use Doctrine\Common\Collections\Collection;
19
use Sylius\Component\Core\Model\OrderItemInterface as SyliusOrderItemInterface;
20
use Sylius\Component\Product\Model\ProductOptionValueInterface;
21
22
final class CartItemViewFactory implements CartItemViewFactoryInterface
23
{
24
    /** @var string */
25
    private $cartItemViewClass;
26
27
    public function __construct(string $cartItemViewClass)
28
    {
29
        $this->cartItemViewClass = $cartItemViewClass;
30
    }
31
32
    public function create(SyliusOrderItemInterface $syliusOrderItem): CartItemView
33
    {
34
        return $this->createFromOrderItem($syliusOrderItem);
35
    }
36
37
    public function createList(Collection $syliusOrderItems): array
38
    {
39
        $cartItemsList = [];
40
41
        foreach ($syliusOrderItems as $syliusOrderItem) {
42
            $cartItemsList[] = $this->createFromOrderItem($syliusOrderItem);
43
        }
44
45
        return $cartItemsList;
46
    }
47
48
    private function createFromOrderItem(SyliusOrderItemInterface $syliusOrderItem): CartItemView
49
    {
50
        /** @var CartItemView $cartItemView */
51
        $cartItemView = new $this->cartItemViewClass();
52
        $cartItemView->item_id = $syliusOrderItem->getId();
53
        $cartItemView->sku = $syliusOrderItem->getVariant()->getCode();
54
        $cartItemView->qty = $syliusOrderItem->getQuantity();
55
        $cartItemView->qty_ordered = $syliusOrderItem->getQuantity();
56
        $cartItemView->name = $syliusOrderItem->getProductName();
57
        $cartItemView->price = $syliusOrderItem->getFullDiscountedUnitPrice();
58
        $cartItemView->price_incl_tax = $syliusOrderItem->getFullDiscountedUnitPrice();
59
        $cartItemView->row_total_incl_tax = $syliusOrderItem->getTotal();
60
        $cartItemView->quote_id = $syliusOrderItem->getOrder()->getTokenValue();
61
        $cartItemView->product_type = 'configurable';
62
63
        $productVariant = $syliusOrderItem->getVariant();
64
        $variantsCount = $productVariant->getProduct()->getVariants()->count();
65
66
        if ($variantsCount === 1) {
67
            $cartItemView->name = $syliusOrderItem->getProductName();
68
            $cartItemView->product_type = 'simple';
69
70
            return $cartItemView;
71
        }
72
73
        $cartItemView->product_option = new ProductOptionView();
74
        $cartItemView->product_option->extension_attributes = new ProductOptionExtensionAttributeView();
75
        $cartItemView->product_option->extension_attributes->bundle_options = [];
76
        $cartItemView->product_option->extension_attributes->configurable_item_options = [];
77
        $cartItemView->product_option->extension_attributes->custom_options = [];
78
79
        if ($productVariant) {
80
            $cartItemView->product_option->extension_attributes->configurable_item_options = $productVariant->getOptionValues()->map(
81
                static function (ProductOptionValueInterface $productOptionValue) {
82
                    return [
83
                        'option_value' => $productOptionValue->getId(),
84
                        'option_id' => (string) $productOptionValue->getOption()->getId(),
85
                    ];
86
                });
87
        }
88
89
        return $cartItemView;
90
    }
91
92
    public function createUpdateResponse(SyliusOrderItemInterface $syliusOrderItem): CartItemView
93
    {
94
        /** @var CartItemView $cartItemView */
95
        $cartItemView = new $this->cartItemViewClass();
96
        $cartItemView->item_id = $syliusOrderItem->getId();
97
        $cartItemView->sku = $syliusOrderItem->getVariant()->getCode();
98
        $cartItemView->qty = $syliusOrderItem->getQuantity();
99
        $cartItemView->name = $syliusOrderItem->getVariantName();
100
        $cartItemView->price = $syliusOrderItem->getUnitPrice();
101
        $cartItemView->quote_id = $syliusOrderItem->getOrder()->getTokenValue();
102
        $cartItemView->product_type = 'configurable';
103
104
        $productVariant = $syliusOrderItem->getVariant();
105
        $variantsCount = $productVariant->getProduct()->getVariants()->count();
106
107
        if ($variantsCount === 1) {
108
            $cartItemView->product_type = 'simple';
109
110
            return $cartItemView;
111
        }
112
113
        $cartItemView->product_option = new ProductOptionView();
114
        $cartItemView->product_option->extension_attributes = new ProductOptionExtensionAttributeView();
115
        $cartItemView->product_option->extension_attributes->bundle_options = [];
116
        $cartItemView->product_option->extension_attributes->configurable_item_options = [];
117
        $cartItemView->product_option->extension_attributes->custom_options = [];
118
119
        if ($productVariant) {
120
            $cartItemView->product_option->extension_attributes->configurable_item_options = $productVariant->getOptionValues()->map(
121
                static function (ProductOptionValueInterface $productOptionValue) {
122
                    return [
123
                        'option_value' => $productOptionValue->getId(),
124
                        'option_id' => (string) $productOptionValue->getOption()->getId(),
125
                    ];
126
                });
127
        }
128
129
        return $cartItemView;
130
    }
131
}
132