123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model\ResourceModel\Sale;
- use Magento\Framework\Data\Collection\EntityFactory;
- use Magento\Store\Model\StoreManagerInterface;
- use Magento\Framework\Data\Collection\Db\FetchStrategyInterface;
- use Magento\Framework\Event\ManagerInterface;
- use Psr\Log\LoggerInterface as Logger;
- /**
- * Sales Collection
- */
- class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
- {
- /**
- * Totals data
- *
- * @var array
- */
- protected $_totals = ['lifetime' => 0, 'base_lifetime' => 0, 'base_avgsale' => 0, 'num_orders' => 0];
- /**
- * Customer Id
- *
- * @var int
- */
- protected $_customerId;
- /**
- * Order state value
- *
- * @var null|string|array
- */
- protected $_state = null;
- /**
- * Order state condition
- *
- * @var string
- */
- protected $_orderStateCondition = null;
- /**
- * @var \Magento\Store\Model\ResourceModel\Store\CollectionFactory
- */
- protected $_storeCollectionFactory;
- /**
- * @var StoreManagerInterface
- */
- protected $_storeManager;
- /**
- * @param EntityFactory $entityFactory
- * @param Logger $logger
- * @param FetchStrategyInterface $fetchStrategy
- * @param ManagerInterface $eventManager
- * @param \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory
- * @param StoreManagerInterface $storeManager
- */
- public function __construct(
- EntityFactory $entityFactory,
- Logger $logger,
- FetchStrategyInterface $fetchStrategy,
- ManagerInterface $eventManager,
- \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory,
- StoreManagerInterface $storeManager
- ) {
- $this->_storeCollectionFactory = $storeCollectionFactory;
- $this->_storeManager = $storeManager;
- parent::__construct(
- $entityFactory,
- $logger,
- $fetchStrategy,
- $eventManager
- );
- }
- /**
- * {@inheritdoc}
- */
- protected function _construct()
- {
- parent::_construct();
- $this->_init(\Magento\Sales\Model\Order::class, \Magento\Sales\Model\ResourceModel\Order::class);
- }
- /**
- * Set filter by customer Id
- *
- * @param int $customerId
- * @return $this
- */
- public function setCustomerIdFilter($customerId)
- {
- $this->_customerId = (int)$customerId;
- return $this;
- }
- /**
- * Add filter by stores
- *
- * @param array $storeIds
- * @return $this
- */
- public function addStoreFilter($storeIds)
- {
- return $this->addFieldToFilter('store_id', ['in' => $storeIds]);
- }
- /**
- * Set filter by order state
- *
- * @param string|array $state
- * @param bool $exclude
- * @return $this
- */
- public function setOrderStateFilter($state, $exclude = false)
- {
- $this->_orderStateCondition = $exclude ? 'NOT IN' : 'IN';
- $this->_state = !is_array($state) ? [$state] : $state;
- return $this;
- }
- /**
- * Before load action
- *
- * @return $this
- */
- protected function _beforeLoad()
- {
- $this->getSelect()
- ->columns(
- [
- 'store_id',
- 'lifetime' => new \Zend_Db_Expr('SUM(base_grand_total)'),
- 'base_lifetime' => new \Zend_Db_Expr('SUM(base_grand_total * base_to_global_rate)'),
- 'avgsale' => new \Zend_Db_Expr('AVG(base_grand_total)'),
- 'base_avgsale' => new \Zend_Db_Expr('AVG(base_grand_total * base_to_global_rate)'),
- 'num_orders' => new \Zend_Db_Expr('COUNT(base_grand_total)')
- ]
- )
- ->group('store_id');
- if ($this->_customerId) {
- $this->addFieldToFilter('customer_id', $this->_customerId);
- }
- if ($this->_state !== null) {
- $condition = '';
- switch ($this->_orderStateCondition) {
- case 'IN':
- $condition = 'in';
- break;
- case 'NOT IN':
- $condition = 'nin';
- break;
- }
- $this->addFieldToFilter('state', [$condition => $this->_state]);
- }
- $this->_eventManager->dispatch('sales_sale_collection_query_before', ['collection' => $this]);
- return $this;
- }
- /**
- * Load data
- *
- * @param bool $printQuery
- * @param bool $logQuery
- * @return $this
- */
- public function load($printQuery = false, $logQuery = false)
- {
- if ($this->isLoaded()) {
- return $this;
- }
- $this->_beforeLoad();
- $this->_renderFilters()->_renderOrders()->_renderLimit();
- $this->printLogQuery($printQuery, $logQuery);
- $data = $this->getData();
- $this->resetData();
- $stores = $this->_storeCollectionFactory->create()->setWithoutDefaultFilter()->load()->toOptionHash();
- $this->_items = [];
- foreach ($data as $v) {
- $storeObject = new \Magento\Framework\DataObject($v);
- $storeId = $v['store_id'];
- $storeName = isset($stores[$storeId]) ? $stores[$storeId] : null;
- $storeObject->setStoreName(
- $storeName
- )->setWebsiteId(
- $this->_storeManager->getStore($storeId)->getWebsiteId()
- )->setAvgNormalized(
- $v['avgsale'] * $v['num_orders']
- );
- $this->_items[$storeId] = $storeObject;
- foreach (array_keys($this->_totals) as $key) {
- $this->_totals[$key] += $storeObject->getData($key);
- }
- }
- if ($this->_totals['num_orders']) {
- $this->_totals['avgsale'] = $this->_totals['base_lifetime'] / $this->_totals['num_orders'];
- }
- $this->_setIsLoaded();
- $this->_afterLoad();
- return $this;
- }
- /**
- * Retrieve totals data converted into \Magento\Framework\DataObject
- *
- * @return \Magento\Framework\DataObject
- */
- public function getTotals()
- {
- return new \Magento\Framework\DataObject($this->_totals);
- }
- }
|