123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Tax rate collection
- */
- namespace Magento\Tax\Model\ResourceModel\Calculation\Rate;
- class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
- {
- /**
- * Value of fetched from DB of rules per cycle
- */
- const TAX_RULES_CHUNK_SIZE = 1000;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- */
- protected $_storeManager;
- /**
- * @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\Store\Model\StoreManagerInterface $storeManager
- * @param mixed $connection
- * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
- */
- 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\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
- \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
- ) {
- $this->_storeManager = $storeManager;
- parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
- }
- /**
- * Resource initialization
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_init(
- \Magento\Tax\Model\Calculation\Rate::class,
- \Magento\Tax\Model\ResourceModel\Calculation\Rate::class
- );
- }
- /**
- * Join country table to result
- *
- * @return $this
- */
- public function joinCountryTable()
- {
- $this->_select->join(
- ['country_table' => $this->getTable('directory_country')],
- 'main_table.tax_country_id = country_table.country_id',
- ['country_name' => 'iso2_code']
- );
- return $this;
- }
- /**
- * Join Region Table
- *
- * @return $this
- */
- public function joinRegionTable()
- {
- $this->_select->joinLeft(
- ['region_table' => $this->getTable('directory_country_region')],
- 'main_table.tax_region_id = region_table.region_id',
- ['region_name' => 'code']
- );
- return $this;
- }
- /**
- * Join rate title for specified store
- *
- * @param \Magento\Store\Model\Store|string|int $store
- * @return $this
- */
- public function joinTitle($store = null)
- {
- $storeId = (int)$this->_storeManager->getStore($store)->getId();
- $this->_select->joinLeft(
- ['title_table' => $this->getTable('tax_calculation_rate_title')],
- $this->getConnection()->quoteInto(
- 'main_table.tax_calculation_rate_id = title_table.tax_calculation_rate_id AND title_table.store_id = ?',
- $storeId
- ),
- ['title' => 'value']
- );
- return $this;
- }
- /**
- * Joins store titles for rates
- *
- * @return $this
- */
- public function joinStoreTitles()
- {
- $storeCollection = $this->_storeManager->getStores(true);
- foreach ($storeCollection as $store) {
- $tableAlias = sprintf('title_table_%s', $store->getId());
- $joinCondition = implode(
- ' AND ',
- [
- "main_table.tax_calculation_rate_id = {$tableAlias}.tax_calculation_rate_id",
- $this->getConnection()->quoteInto($tableAlias . '.store_id = ?', $store->getId())
- ]
- );
- $this->_select->joinLeft(
- [$tableAlias => $this->getTable('tax_calculation_rate_title')],
- $joinCondition,
- [$tableAlias => 'value']
- );
- }
- return $this;
- }
- /**
- * Add rate filter
- *
- * @param int $rateId
- * @return $this
- */
- public function addRateFilter($rateId)
- {
- if (is_int($rateId) && $rateId > 0) {
- return $this->addFieldToFilter('main_table.tax_rate_id', $rateId);
- }
- return $this;
- }
- /**
- * Retrieve option array
- *
- * @return array
- */
- public function toOptionArray()
- {
- return $this->_toOptionArray('tax_calculation_rate_id', 'code');
- }
- /**
- * Retrieve option hash
- *
- * @return array
- */
- public function toOptionHash()
- {
- return $this->_toOptionHash('tax_calculation_rate_id', 'code');
- }
- /**
- * Convert items array to hash for select options
- * using fetchItem method
- *
- * @see fetchItem()
- *
- * @return array
- */
- public function toOptionHashOptimized()
- {
- $result = [];
- while ($item = $this->fetchItem()) {
- $result[$item->getData('tax_calculation_rate_id')] = $item->getData('code');
- }
- return $result;
- }
- /**
- * Get rates array without memory leak
- *
- * @return array
- */
- public function getOptionRates()
- {
- $size = self::TAX_RULES_CHUNK_SIZE;
- $page = 1;
- $rates = [];
- do {
- $offset = $size * ($page - 1);
- $this->getSelect()->reset();
- $this->getSelect()
- ->from(
- ['rates' => $this->getMainTable()],
- ['tax_calculation_rate_id', 'code']
- )
- ->limit($size, $offset);
- $rates = array_merge($rates, $this->toOptionArray());
- $this->clear();
- $page++;
- } while ($this->getSize() > $offset);
- return $rates;
- }
- }
|