123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Shipping table rates
- *
- * @author Magento Core Team <core@magentocommerce.com>
- */
- namespace Magento\OfflineShipping\Model\ResourceModel\Carrier;
- use Magento\Framework\Filesystem;
- use Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate\Import;
- use Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate\RateQuery;
- use Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate\RateQueryFactory;
- /**
- * @SuppressWarnings(PHPMD.TooManyFields)
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- *
- * @api
- * @since 100.0.2
- */
- class Tablerate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
- {
- /**
- * Import table rates website ID
- *
- * @var int
- */
- protected $_importWebsiteId = 0;
- /**
- * Errors in import process
- *
- * @var array
- */
- protected $_importErrors = [];
- /**
- * Count of imported table rates
- *
- * @var int
- */
- protected $_importedRows = 0;
- /**
- * Array of unique table rate keys to protect from duplicates
- *
- * @var array
- */
- protected $_importUniqueHash = [];
- /**
- * Array of countries keyed by iso2 code
- *
- * @var array
- */
- protected $_importIso2Countries;
- /**
- * Array of countries keyed by iso3 code
- *
- * @var array
- */
- protected $_importIso3Countries;
- /**
- * Associative array of countries and regions
- * [country_id][region_code] = region_id
- *
- * @var array
- */
- protected $_importRegions;
- /**
- * Import Table Rate condition name
- *
- * @var string
- */
- protected $_importConditionName;
- /**
- * Array of condition full names
- *
- * @var array
- */
- protected $_conditionFullNames = [];
- /**
- * @var \Magento\Framework\App\Config\ScopeConfigInterface
- * @since 100.1.0
- */
- protected $coreConfig;
- /**
- * @var \Psr\Log\LoggerInterface
- * @since 100.1.0
- */
- protected $logger;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- * @since 100.1.0
- */
- protected $storeManager;
- /**
- * @var \Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate
- * @since 100.1.0
- */
- protected $carrierTablerate;
- /**
- * Filesystem instance
- *
- * @var \Magento\Framework\Filesystem
- * @since 100.1.0
- */
- protected $filesystem;
- /**
- * @var Import
- */
- private $import;
- /**
- * @var RateQueryFactory
- */
- private $rateQueryFactory;
- /**
- * Tablerate constructor.
- * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
- * @param \Psr\Log\LoggerInterface $logger
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $coreConfig
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\OfflineShipping\Model\Carrier\Tablerate $carrierTablerate
- * @param Filesystem $filesystem
- * @param RateQueryFactory $rateQueryFactory
- * @param Import $import
- * @param null $connectionName
- */
- public function __construct(
- \Magento\Framework\Model\ResourceModel\Db\Context $context,
- \Psr\Log\LoggerInterface $logger,
- \Magento\Framework\App\Config\ScopeConfigInterface $coreConfig,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\OfflineShipping\Model\Carrier\Tablerate $carrierTablerate,
- \Magento\Framework\Filesystem $filesystem,
- Import $import,
- RateQueryFactory $rateQueryFactory,
- $connectionName = null
- ) {
- parent::__construct($context, $connectionName);
- $this->coreConfig = $coreConfig;
- $this->logger = $logger;
- $this->storeManager = $storeManager;
- $this->carrierTablerate = $carrierTablerate;
- $this->filesystem = $filesystem;
- $this->import = $import;
- $this->rateQueryFactory = $rateQueryFactory;
- }
- /**
- * Define main table and id field name
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_init('shipping_tablerate', 'pk');
- }
- /**
- * Return table rate array or false by rate request
- *
- * @param \Magento\Quote\Model\Quote\Address\RateRequest $request
- * @return array|bool
- */
- public function getRate(\Magento\Quote\Model\Quote\Address\RateRequest $request)
- {
- $connection = $this->getConnection();
- $select = $connection->select()->from($this->getMainTable());
- /** @var RateQuery $rateQuery */
- $rateQuery = $this->rateQueryFactory->create(['request' => $request]);
- $rateQuery->prepareSelect($select);
- $bindings = $rateQuery->getBindings();
- $result = $connection->fetchRow($select, $bindings);
- // Normalize destination zip code
- if ($result && $result['dest_zip'] == '*') {
- $result['dest_zip'] = '';
- }
- return $result;
- }
- /**
- * @param array $condition
- * @return $this
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- private function deleteByCondition(array $condition)
- {
- $connection = $this->getConnection();
- $connection->beginTransaction();
- $connection->delete($this->getMainTable(), $condition);
- $connection->commit();
- return $this;
- }
- /**
- * @param array $fields
- * @param array $values
- * @throws \Magento\Framework\Exception\LocalizedException
- * @return void
- */
- private function importData(array $fields, array $values)
- {
- $connection = $this->getConnection();
- $connection->beginTransaction();
- try {
- if (count($fields) && count($values)) {
- $this->getConnection()->insertArray($this->getMainTable(), $fields, $values);
- $this->_importedRows += count($values);
- }
- } catch (\Magento\Framework\Exception\LocalizedException $e) {
- $connection->rollBack();
- throw new \Magento\Framework\Exception\LocalizedException(__('Unable to import data'), $e);
- } catch (\Exception $e) {
- $connection->rollBack();
- $this->logger->critical($e);
- throw new \Magento\Framework\Exception\LocalizedException(
- __('Something went wrong while importing table rates.')
- );
- }
- $connection->commit();
- }
- /**
- * Upload table rate file and import data from it
- *
- * @param \Magento\Framework\DataObject $object
- * @throws \Magento\Framework\Exception\LocalizedException
- * @return \Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate
- * @todo: this method should be refactored as soon as updated design will be provided
- * @see https://wiki.corp.x.com/display/MCOMS/Magento+Filesystem+Decisions
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- */
- public function uploadAndImport(\Magento\Framework\DataObject $object)
- {
- /**
- * @var \Magento\Framework\App\Config\Value $object
- */
- if (empty($_FILES['groups']['tmp_name']['tablerate']['fields']['import']['value'])) {
- return $this;
- }
- $filePath = $_FILES['groups']['tmp_name']['tablerate']['fields']['import']['value'];
- $websiteId = $this->storeManager->getWebsite($object->getScopeId())->getId();
- $conditionName = $this->getConditionName($object);
- $file = $this->getCsvFile($filePath);
- try {
- // delete old data by website and condition name
- $condition = [
- 'website_id = ?' => $websiteId,
- 'condition_name = ?' => $conditionName,
- ];
- $this->deleteByCondition($condition);
- $columns = $this->import->getColumns();
- $conditionFullName = $this->_getConditionFullName($conditionName);
- foreach ($this->import->getData($file, $websiteId, $conditionName, $conditionFullName) as $bunch) {
- $this->importData($columns, $bunch);
- }
- } catch (\Exception $e) {
- $this->logger->critical($e);
- throw new \Magento\Framework\Exception\LocalizedException(
- __('Something went wrong while importing table rates.')
- );
- } finally {
- $file->close();
- }
- if ($this->import->hasErrors()) {
- $error = __(
- 'We couldn\'t import this file because of these errors: %1',
- implode(" \n", $this->import->getErrors())
- );
- throw new \Magento\Framework\Exception\LocalizedException($error);
- }
- }
- /**
- * @param \Magento\Framework\DataObject $object
- * @return mixed|string
- * @since 100.1.0
- */
- public function getConditionName(\Magento\Framework\DataObject $object)
- {
- if ($object->getData('groups/tablerate/fields/condition_name/inherit') == '1') {
- $conditionName = (string)$this->coreConfig->getValue('carriers/tablerate/condition_name', 'default');
- } else {
- $conditionName = $object->getData('groups/tablerate/fields/condition_name/value');
- }
- return $conditionName;
- }
- /**
- * @param string $filePath
- * @return \Magento\Framework\Filesystem\File\ReadInterface
- */
- private function getCsvFile($filePath)
- {
- $pathInfo = pathinfo($filePath);
- $dirName = isset($pathInfo['dirname']) ? $pathInfo['dirname'] : '';
- $fileName = isset($pathInfo['basename']) ? $pathInfo['basename'] : '';
- $directoryRead = $this->filesystem->getDirectoryReadByPath($dirName);
- return $directoryRead->openFile($fileName);
- }
- /**
- * Return import condition full name by condition name code
- *
- * @param string $conditionName
- * @return string
- */
- protected function _getConditionFullName($conditionName)
- {
- if (!isset($this->_conditionFullNames[$conditionName])) {
- $name = $this->carrierTablerate->getCode('condition_name_short', $conditionName);
- $this->_conditionFullNames[$conditionName] = $name;
- }
- return $this->_conditionFullNames[$conditionName];
- }
- /**
- * Save import data batch
- *
- * @param array $data
- * @return \Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate
- */
- protected function _saveImportData(array $data)
- {
- if (!empty($data)) {
- $columns = [
- 'website_id',
- 'dest_country_id',
- 'dest_region_id',
- 'dest_zip',
- 'condition_name',
- 'condition_value',
- 'price',
- ];
- $this->getConnection()->insertArray($this->getMainTable(), $columns, $data);
- $this->_importedRows += count($data);
- }
- return $this;
- }
- }
|