mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-08 01:37:36 +00:00
270 lines
7.8 KiB
PHP
270 lines
7.8 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
/**
|
|
* Catalog rules resource model
|
|
*
|
|
* @author Magento Core Team <core@magentocommerce.com>
|
|
*/
|
|
namespace Magento\CatalogRule\Model\ResourceModel;
|
|
|
|
use Magento\Catalog\Model\Product;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\EntityManager\EntityManager;
|
|
use Magento\Framework\Model\AbstractModel;
|
|
use Magento\Framework\Pricing\PriceCurrencyInterface;
|
|
|
|
/**
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class Rule extends \Magento\Rule\Model\ResourceModel\AbstractResource
|
|
{
|
|
/**
|
|
* Store number of seconds in a day
|
|
*/
|
|
public const SECONDS_IN_DAY = 86400;
|
|
|
|
/**
|
|
* @var \Psr\Log\LoggerInterface
|
|
*/
|
|
protected $_logger;
|
|
|
|
/**
|
|
* @var \Magento\CatalogRule\Helper\Data
|
|
*/
|
|
protected $_catalogRuleData = null;
|
|
|
|
/**
|
|
* Core event manager proxy
|
|
*
|
|
* @var \Magento\Framework\Event\ManagerInterface
|
|
*/
|
|
protected $_eventManager = null;
|
|
|
|
/**
|
|
* @var \Magento\Eav\Model\Config
|
|
*/
|
|
protected $_eavConfig;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Stdlib\DateTime\DateTime
|
|
*/
|
|
protected $_coreDate;
|
|
|
|
/**
|
|
* @var \Magento\Catalog\Model\Product\ConditionFactory
|
|
*/
|
|
protected $_conditionFactory;
|
|
|
|
/**
|
|
* @var \Magento\Store\Model\StoreManagerInterface
|
|
*/
|
|
protected $_storeManager;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Stdlib\DateTime
|
|
*/
|
|
protected $dateTime;
|
|
|
|
/**
|
|
* @var PriceCurrencyInterface
|
|
*/
|
|
protected $priceCurrency;
|
|
|
|
/**
|
|
* @var EntityManager
|
|
*/
|
|
protected $entityManager;
|
|
|
|
/**
|
|
* Rule constructor.
|
|
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
|
|
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
|
|
* @param Product\ConditionFactory $conditionFactory
|
|
* @param \Magento\Framework\Stdlib\DateTime\DateTime $coreDate
|
|
* @param \Magento\Eav\Model\Config $eavConfig
|
|
* @param \Magento\Framework\Event\ManagerInterface $eventManager
|
|
* @param \Magento\CatalogRule\Helper\Data $catalogRuleData
|
|
* @param \Psr\Log\LoggerInterface $logger
|
|
* @param \Magento\Framework\Stdlib\DateTime $dateTime
|
|
* @param PriceCurrencyInterface $priceCurrency
|
|
* @param string|null $connectionName
|
|
* @param EntityManager|null $entityManager
|
|
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
|
|
*/
|
|
public function __construct(
|
|
\Magento\Framework\Model\ResourceModel\Db\Context $context,
|
|
\Magento\Store\Model\StoreManagerInterface $storeManager,
|
|
\Magento\Catalog\Model\Product\ConditionFactory $conditionFactory,
|
|
\Magento\Framework\Stdlib\DateTime\DateTime $coreDate,
|
|
\Magento\Eav\Model\Config $eavConfig,
|
|
\Magento\Framework\Event\ManagerInterface $eventManager,
|
|
\Magento\CatalogRule\Helper\Data $catalogRuleData,
|
|
\Psr\Log\LoggerInterface $logger,
|
|
\Magento\Framework\Stdlib\DateTime $dateTime,
|
|
PriceCurrencyInterface $priceCurrency,
|
|
$connectionName = null,
|
|
?EntityManager $entityManager = null
|
|
) {
|
|
$this->_storeManager = $storeManager;
|
|
$this->_conditionFactory = $conditionFactory;
|
|
$this->_coreDate = $coreDate;
|
|
$this->_eavConfig = $eavConfig;
|
|
$this->_eventManager = $eventManager;
|
|
$this->_catalogRuleData = $catalogRuleData;
|
|
$this->_logger = $logger;
|
|
$this->dateTime = $dateTime;
|
|
$this->priceCurrency = $priceCurrency;
|
|
$this->entityManager = $entityManager ?? ObjectManager::getInstance()->get(EntityManager::class);
|
|
$this->_associatedEntitiesMap = ObjectManager::getInstance()
|
|
// phpstan:ignore this is a virtual class
|
|
->get(\Magento\CatalogRule\Model\ResourceModel\Rule\AssociatedEntityMap::class)
|
|
->getData();
|
|
parent::__construct($context, $connectionName);
|
|
}
|
|
|
|
/**
|
|
* Initialize main table and table id field
|
|
*
|
|
* @return void
|
|
* @codeCoverageIgnore
|
|
*/
|
|
protected function _construct()
|
|
{
|
|
$this->_init('catalogrule', 'rule_id');
|
|
}
|
|
|
|
/**
|
|
* Get catalog rules product price for specific date, website and customer group
|
|
*
|
|
* @param \DateTimeInterface $date
|
|
* @param int $wId
|
|
* @param int $gId
|
|
* @param int $pId
|
|
* @return float|false
|
|
*/
|
|
public function getRulePrice($date, $wId, $gId, $pId)
|
|
{
|
|
$data = $this->getRulePrices($date, $wId, $gId, [$pId]);
|
|
if (isset($data[$pId])) {
|
|
return $data[$pId];
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Retrieve product prices by catalog rule for specific date, website and customer group
|
|
*
|
|
* Collect data with product Id => price pairs
|
|
*
|
|
* @param \DateTimeInterface $date
|
|
* @param int $websiteId
|
|
* @param int $customerGroupId
|
|
* @param array $productIds
|
|
* @return array
|
|
*/
|
|
public function getRulePrices(\DateTimeInterface $date, $websiteId, $customerGroupId, $productIds)
|
|
{
|
|
$connection = $this->getConnection();
|
|
$select = $connection->select()
|
|
->from($this->getTable('catalogrule_product_price'), ['product_id', 'rule_price'])
|
|
->where('rule_date = ?', $date->format('Y-m-d'))
|
|
->where('website_id = ?', $websiteId)
|
|
->where('customer_group_id = ?', $customerGroupId)
|
|
->where('product_id IN(?)', $productIds, \Zend_Db::INT_TYPE);
|
|
|
|
return $connection->fetchPairs($select);
|
|
}
|
|
|
|
/**
|
|
* Get active rule data based on few filters
|
|
*
|
|
* @param int|string $date
|
|
* @param int $websiteId
|
|
* @param int $customerGroupId
|
|
* @param int $productId
|
|
* @return array
|
|
*/
|
|
public function getRulesFromProduct($date, $websiteId, $customerGroupId, $productId)
|
|
{
|
|
$connection = $this->getConnection();
|
|
if (is_string($date)) {
|
|
$date = strtotime($date);
|
|
}
|
|
$select = $connection->select()
|
|
->from($this->getTable('catalogrule_product'))
|
|
->where('website_id = ?', $websiteId)
|
|
->where('customer_group_id = ?', $customerGroupId)
|
|
->where('product_id = ?', $productId)
|
|
->where('from_time = 0 or from_time < ?', $date)
|
|
->where('to_time = 0 or to_time > ?', $date);
|
|
|
|
return $connection->fetchAll($select);
|
|
}
|
|
|
|
/**
|
|
* Load an object
|
|
*
|
|
* @param \Magento\Framework\Model\AbstractModel $object
|
|
* @param mixed $value
|
|
* @param string $field
|
|
* @return $this
|
|
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
|
|
*/
|
|
public function load(\Magento\Framework\Model\AbstractModel $object, $value, $field = null)
|
|
{
|
|
$this->entityManager->load($object, $value);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function save(\Magento\Framework\Model\AbstractModel $object)
|
|
{
|
|
$this->entityManager->save($object);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Delete the object
|
|
*
|
|
* @param \Magento\Framework\Model\AbstractModel $object
|
|
* @return $this
|
|
* @throws \Exception
|
|
*/
|
|
public function delete(AbstractModel $object)
|
|
{
|
|
$this->entityManager->delete($object);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get product ids matching specified rules
|
|
*
|
|
* @param array $ruleIds
|
|
* @return array
|
|
*/
|
|
public function getProductIdsByRuleIds(array $ruleIds): array
|
|
{
|
|
$connection = $this->getConnection();
|
|
$select = $connection->select()
|
|
->from(
|
|
$this->getTable('catalogrule_product'),
|
|
['product_id']
|
|
)
|
|
->where(
|
|
'rule_id IN (?)',
|
|
array_map('intval', $ruleIds)
|
|
)
|
|
->distinct(
|
|
true
|
|
);
|
|
return array_map('intval', $connection->fetchCol($select));
|
|
}
|
|
}
|