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
|
|
|
|