ProductDataSet   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 9

Importance

Changes 0
Metric Value
wmc 3
lcom 2
cbo 9
dl 0
loc 94
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getIdentifier() 0 4 1
A configureOptions() 0 52 1
B createQueryBuilder() 0 33 1
1
<?php
2
/*
3
 * WellCommerce Open-Source E-Commerce Platform
4
 *
5
 * This file is part of the WellCommerce package.
6
 *
7
 * (c) Adam Piotrowski <[email protected]>
8
 *
9
 * For the full copyright and license information,
10
 * please view the LICENSE file that was distributed with this source code.
11
 */
12
13
namespace WellCommerce\Bundle\CatalogBundle\DataSet\Front;
14
15
use Doctrine\ORM\Query\Expr;
16
use Doctrine\ORM\QueryBuilder;
17
use WellCommerce\Bundle\AppBundle\Entity\CurrencyRate;
18
use WellCommerce\Bundle\CatalogBundle\Entity\Category;
19
use WellCommerce\Bundle\CatalogBundle\Entity\Producer;
20
use WellCommerce\Bundle\CatalogBundle\Entity\ProducerTranslation;
21
use WellCommerce\Bundle\CatalogBundle\Entity\Product;
22
use WellCommerce\Bundle\CatalogBundle\Entity\ProductTranslation;
23
use WellCommerce\Bundle\CoreBundle\DataSet\AbstractDataSet;
24
use WellCommerce\Component\DataSet\Cache\CacheOptions;
25
use WellCommerce\Component\DataSet\Configurator\DataSetConfiguratorInterface;
26
27
/**
28
 * Class ProductDataSet
29
 *
30
 * @author Adam Piotrowski <[email protected]>
31
 */
32
class ProductDataSet extends AbstractDataSet
33
{
34
    public function getIdentifier(): string
35
    {
36
        return 'front.product';
37
    }
38
    
39
    public function configureOptions(DataSetConfiguratorInterface $configurator)
40
    {
41
        $configurator->setColumns([
42
            'id'                   => 'product.id',
43
            'sku'                  => 'product.sku',
44
            'barcode'              => 'product.barcode',
45
            'enabled'              => 'product.enabled',
46
            'name'                 => 'product_translation.name',
47
            'shortDescription'     => 'product_translation.shortDescription',
48
            'description'          => 'product_translation.description',
49
            'route'                => 'IDENTITY(product_translation.route)',
50
            'weight'               => 'product.weight',
51
            'netPrice'             => 'product.sellPrice.netAmount',
52
            'price'                => 'product.sellPrice.grossAmount',
53
            'discountedPrice'      => 'product.sellPrice.discountedGrossAmount',
54
            'discountedNetPrice'   => 'product.sellPrice.discountedNetAmount',
55
            'isDiscountValid'      => 'IF_ELSE(:date BETWEEN IF_NULL(product.sellPrice.validFrom, :date) AND IF_NULL(product.sellPrice.validTo, :date) AND product.sellPrice.discountedGrossAmount > 0, 1, 0)',
56
            'finalPrice'           => 'IF_ELSE(:date BETWEEN IF_NULL(product.sellPrice.validFrom, :date) AND IF_NULL(product.sellPrice.validTo, :date) AND product.sellPrice.discountedGrossAmount > 0, product.sellPrice.discountedGrossAmount, product.sellPrice.grossAmount) * currency_rate.exchangeRate',
57
            'currency'             => 'product.sellPrice.currency',
58
            'tax'                  => 'sell_tax.value',
59
            'stock'                => 'product.stock',
60
            'producerId'           => 'IDENTITY(product.producer)',
61
            'producerName'         => 'producers_translation.name',
62
            'producerCollectionId' => 'IDENTITY(product.producerCollection)',
63
            'category'             => 'categories.id',
64
            'filteredCategory'     => 'filtered_categories.id',
65
            'categoryName'         => 'categories_translation.name',
66
            'categoryRoute'        => 'IDENTITY(categories_translation.route)',
67
            'shop'                 => 'product_shops.id',
68
            'photo'                => 'photos.path',
69
            'status'               => 'IDENTITY(distinction.status)',
70
            'variantOption'        => 'IDENTITY(variant_option.attributeValue)',
71
            'distinctions'         => 'product.id',
72
            'hierarchy'            => 'product.hierarchy',
73
            'isStatusValid'        => 'IF_ELSE(:date BETWEEN IF_NULL(distinction.validFrom, :date) AND IF_NULL(distinction.validTo, :date), 1, 0)',
74
            'popularity'           => 'product.popularity',
75
        ]);
76
        
77
        $configurator->setColumnTransformers([
78
            'route'         => $this->manager->createTransformer('route'),
79
            'categoryRoute' => $this->manager->createTransformer('route'),
80
            'distinctions'  => $this->manager->createTransformer('distinctions'),
81
        ]);
82
        
83
        $configurator->setCacheOptions(new CacheOptions(true, 3600, [
84
            Product::class,
85
            ProductTranslation::class,
86
            Producer::class,
87
            ProducerTranslation::class,
88
            Category::class,
89
        ]));
90
    }
91
    
92
    protected function createQueryBuilder(): QueryBuilder
93
    {
94
        $queryBuilder = $this->repository->getQueryBuilder();
95
        $queryBuilder->groupBy('product.id');
96
        $queryBuilder->leftJoin('product.translations', 'product_translation');
97
        $queryBuilder->leftJoin('product.categories', 'categories');
98
        $queryBuilder->leftJoin('product.categories', 'filtered_categories');
99
        $queryBuilder->leftJoin('product.producer', 'producers');
100
        $queryBuilder->leftJoin('product.sellPriceTax', 'sell_tax');
101
        $queryBuilder->leftJoin('categories.translations', 'categories_translation');
102
        $queryBuilder->leftJoin('producers.translations', 'producers_translation');
103
        $queryBuilder->leftJoin('product.productPhotos', 'gallery', Expr\Join::WITH, 'gallery.mainPhoto = :mainPhoto');
104
        $queryBuilder->leftJoin('gallery.photo', 'photos');
105
        $queryBuilder->leftJoin('product.distinctions', 'distinction', Expr\Join::WITH, 'distinction.status = :status');
106
        $queryBuilder->leftJoin('product.shops', 'product_shops');
107
        $queryBuilder->leftJoin('product.variants', 'variant', Expr\Join::WITH, 'variant.enabled = :variantEnabled');
108
        $queryBuilder->leftJoin('variant.options', 'variant_option');
109
        $queryBuilder->leftJoin(
110
            CurrencyRate::class,
111
            'currency_rate',
112
            Expr\Join::WITH,
113
            'currency_rate.currencyFrom = product.sellPrice.currency AND currency_rate.currencyTo = :targetCurrency'
114
        );
115
        $queryBuilder->where($queryBuilder->expr()->eq('product_shops.id', $this->getShopStorage()->getCurrentShopIdentifier()));
116
        $queryBuilder->andWhere($queryBuilder->expr()->eq('product.enabled', true));
117
        $queryBuilder->setParameter('mainPhoto', 1);
118
        $queryBuilder->setParameter('status', 0);
119
        $queryBuilder->setParameter('variantEnabled', 1);
120
        $queryBuilder->setParameter('targetCurrency', $this->getRequestHelper()->getCurrentCurrency());
121
        $queryBuilder->setParameter('date', (new \DateTime())->setTime(0, 0, 1));
122
        
123
        return $queryBuilder;
124
    }
125
}
126