| Current Path : /home/rtorresani/www/vendor/magento/module-reports/Model/ResourceModel/Product/ |
| Current File : //home/rtorresani/www/vendor/magento/module-reports/Model/ResourceModel/Product/Collection.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Reports\Model\ResourceModel\Product;
use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
use Magento\Framework\DataObject;
/**
* Products Report collection.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
* @api
* @since 100.0.2
*/
class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
{
const SELECT_COUNT_SQL_TYPE_CART = 1;
/**
* Product entity identifier
*
* @var int
*/
protected $_productEntityId;
/**
* Product entity table name
*
* @var string
*/
protected $_productEntityTableName;
/**
* Product entity attribute set identifier
*
* @var int
*/
protected $_productEntityAttributeSetId;
/**
* Select count
*
* @var int
*/
protected $_selectCountSqlType = 0;
/**
* @var \Magento\Reports\Model\Event\TypeFactory
*/
protected $_eventTypeFactory;
/**
* @var \Magento\Catalog\Model\Product\Type
*/
protected $_productType;
/**
* @var \Magento\Quote\Model\ResourceModel\Quote\Collection
*/
protected $quoteResource;
/**
* @var DataObject
*/
private $_totals;
/**
* Collection constructor.
*
* @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
* @param \Magento\Framework\Event\ManagerInterface $eventManager
* @param \Magento\Eav\Model\Config $eavConfig
* @param \Magento\Framework\App\ResourceConnection $resource
* @param \Magento\Eav\Model\EntityFactory $eavEntityFactory
* @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
* @param \Magento\Framework\Validator\UniversalFactory $universalFactory
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Framework\Module\Manager $moduleManager
* @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory
* @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
* @param \Magento\Customer\Model\Session $customerSession
* @param \Magento\Framework\Stdlib\DateTime $dateTime
* @param \Magento\Customer\Api\GroupManagementInterface $groupManagement
* @param \Magento\Catalog\Model\ResourceModel\Product $product
* @param \Magento\Reports\Model\Event\TypeFactory $eventTypeFactory
* @param \Magento\Catalog\Model\Product\Type $productType
* @param \Magento\Quote\Model\ResourceModel\Quote\Collection $quoteResource
* @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
* @param ProductLimitationFactory|null $productLimitationFactory
* @param \Magento\Framework\EntityManager\MetadataPool|null $metadataPool
* @param \Magento\Catalog\Model\Indexer\Category\Product\TableMaintainer|null $tableMaintainer
* @param \Magento\Catalog\Model\Indexer\Product\Price\PriceTableResolver|null $priceTableResolver
* @param \Magento\Framework\Indexer\DimensionFactory|null $dimensionFactory
*
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
\Magento\Framework\Data\Collection\EntityFactory $entityFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
\Magento\Framework\Event\ManagerInterface $eventManager,
\Magento\Eav\Model\Config $eavConfig,
\Magento\Framework\App\ResourceConnection $resource,
\Magento\Eav\Model\EntityFactory $eavEntityFactory,
\Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
\Magento\Framework\Validator\UniversalFactory $universalFactory,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Module\Manager $moduleManager,
\Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Catalog\Model\Product\OptionFactory $productOptionFactory,
\Magento\Catalog\Model\ResourceModel\Url $catalogUrl,
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
\Magento\Customer\Model\Session $customerSession,
\Magento\Framework\Stdlib\DateTime $dateTime,
\Magento\Customer\Api\GroupManagementInterface $groupManagement,
\Magento\Catalog\Model\ResourceModel\Product $product,
\Magento\Reports\Model\Event\TypeFactory $eventTypeFactory,
\Magento\Catalog\Model\Product\Type $productType,
\Magento\Quote\Model\ResourceModel\Quote\Collection $quoteResource,
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
ProductLimitationFactory $productLimitationFactory = null,
\Magento\Framework\EntityManager\MetadataPool $metadataPool = null,
\Magento\Catalog\Model\Indexer\Category\Product\TableMaintainer $tableMaintainer = null,
\Magento\Catalog\Model\Indexer\Product\Price\PriceTableResolver $priceTableResolver = null,
\Magento\Framework\Indexer\DimensionFactory $dimensionFactory = null
) {
$this->setProductEntityId($product->getEntityIdField());
$this->setProductEntityTableName($product->getEntityTable());
$this->setProductAttributeSetId($product->getEntityType()->getDefaultAttributeSetId());
parent::__construct(
$entityFactory,
$logger,
$fetchStrategy,
$eventManager,
$eavConfig,
$resource,
$eavEntityFactory,
$resourceHelper,
$universalFactory,
$storeManager,
$moduleManager,
$catalogProductFlatState,
$scopeConfig,
$productOptionFactory,
$catalogUrl,
$localeDate,
$customerSession,
$dateTime,
$groupManagement,
$connection,
$productLimitationFactory,
$metadataPool,
$tableMaintainer,
$priceTableResolver,
$dimensionFactory
);
$this->_eventTypeFactory = $eventTypeFactory;
$this->_productType = $productType;
$this->quoteResource = $quoteResource;
}
/**
* Set Type for COUNT SQL Select.
*
* @codeCoverageIgnore
*
* @param int $type
* @return $this
*/
public function setSelectCountSqlType($type)
{
$this->_selectCountSqlType = $type;
return $this;
}
/**
* Set product entity id.
*
* @codeCoverageIgnore
*
* @param string $entityId
* @return $this
*/
public function setProductEntityId($entityId)
{
$this->_productEntityId = (int)$entityId;
return $this;
}
/**
* Get product entity id.
*
* @codeCoverageIgnore
*
* @return int
*/
public function getProductEntityId()
{
return $this->_productEntityId;
}
/**
* Set product entity table name.
*
* @codeCoverageIgnore
*
* @param string $value
* @return $this
*/
public function setProductEntityTableName($value)
{
$this->_productEntityTableName = $value;
return $this;
}
/**
* Get product entity table name.
*
* @codeCoverageIgnore
*
* @return string
*/
public function getProductEntityTableName()
{
return $this->_productEntityTableName;
}
/**
* Get product attribute set id.
*
* @codeCoverageIgnore
*
* @return int
*/
public function getProductAttributeSetId()
{
return $this->_productEntityAttributeSetId;
}
/**
* Set product attribute set id.
*
* @codeCoverageIgnore
*
* @param int $value
* @return $this
*/
public function setProductAttributeSetId($value)
{
$this->_productEntityAttributeSetId = $value;
return $this;
}
/**
* Join fields
*
* @return $this
*/
protected function _joinFields()
{
$this->_totals = new \Magento\Framework\DataObject();
$this->addAttributeToSelect('entity_id')->addAttributeToSelect('name')->addAttributeToSelect('price');
return $this;
}
/**
* Get select count sql
*
* @return \Magento\Framework\DB\Select
*/
public function getSelectCountSql()
{
if ($this->_selectCountSqlType == self::SELECT_COUNT_SQL_TYPE_CART) {
$countSelect = clone $this->quoteResource->getSelect();
$countSelect->reset()->from(
['quote_item_table' => $this->getTable('quote_item')],
['COUNT(DISTINCT quote_item_table.product_id)']
)->join(
['quote_table' => $this->getTable('quote')],
'quote_table.entity_id = quote_item_table.quote_id AND quote_table.is_active = 1',
[]
);
return $countSelect;
}
$countSelect = clone $this->getSelect();
$countSelect->reset(\Magento\Framework\DB\Select::ORDER);
$countSelect->reset(\Magento\Framework\DB\Select::LIMIT_COUNT);
$countSelect->reset(\Magento\Framework\DB\Select::LIMIT_OFFSET);
$countSelect->reset(\Magento\Framework\DB\Select::COLUMNS);
$countSelect->reset(\Magento\Framework\DB\Select::GROUP);
$countSelect->reset(\Magento\Framework\DB\Select::HAVING);
$countSelect->columns("count(DISTINCT e.entity_id)");
return $countSelect;
}
/**
* Set order
*
* @param string $attribute
* @param string $dir
* @return $this
*/
public function setOrder($attribute, $dir = self::SORT_ORDER_DESC)
{
if (in_array($attribute, ['carts'])) {
$this->getSelect()->order($attribute . ' ' . $dir);
} else {
parent::setOrder($attribute, $dir);
}
return $this;
}
/**
* Add views count.
*
* @param string $from
* @param string $to
* @return $this
*/
public function addViewsCount($from = '', $to = '')
{
/**
* Getting event type id for catalog_product_view event
*/
$eventTypes = $this->_eventTypeFactory->create()->getCollection();
$productViewEvent = null;
foreach ($eventTypes as $eventType) {
if ($eventType->getEventName() == 'catalog_product_view') {
$productViewEvent = (int)$eventType->getId();
break;
}
}
$this->getSelect()->reset()->from(
['report_table_views' => $this->getTable('report_event')],
['views' => 'COUNT(report_table_views.event_id)']
)->join(
['e' => $this->getProductEntityTableName()],
'e.entity_id = report_table_views.object_id'
)->where(
'report_table_views.event_type_id = ?',
$productViewEvent
)->group(
'e.entity_id'
)->order(
'views ' . self::SORT_ORDER_DESC
)->having(
'COUNT(report_table_views.event_id) > ?',
0
);
if ($from != '' && $to != '') {
$this->getSelect()->where('logged_at >= ?', $from)->where('logged_at <= ?', $to);
}
return $this;
}
/**
* Prepare between sql
*
* @param string $fieldName Field name with table suffix ('created_at' or 'main_table.created_at')
* @param string $from
* @param string $to
* @return string Formatted sql string
*/
protected function _prepareBetweenSql($fieldName, $from, $to)
{
return sprintf(
'(%s BETWEEN %s AND %s)',
$fieldName,
$this->getConnection()->quote($from),
$this->getConnection()->quote($to)
);
}
/**
* Add store restrictions to product collection
*
* @param array $storeIds
* @param array $websiteIds
* @return $this
*/
public function addStoreRestrictions($storeIds, $websiteIds)
{
if (!is_array($storeIds)) {
$storeIds = [$storeIds];
}
if (!is_array($websiteIds)) {
$websiteIds = [$websiteIds];
}
$filters = $this->_productLimitationFilters;
if (isset($filters['store_id'])) {
if (!in_array($filters['store_id'], $storeIds)) {
$this->addStoreFilter($filters['store_id']);
} else {
$this->addStoreFilter($this->getStoreId());
}
} else {
$this->addWebsiteFilter($websiteIds);
}
return $this;
}
}