63 \
Magento\Directory\Model\CountryFactory $countryFactory,
64 \
Magento\Tax\Model\Calculation\RateFactory $taxRateFactory,
68 $this->_publicStores = $storeCollection->setLoadDefault(
false);
69 $this->_regionCollection = $regionCollection;
70 $this->_countryFactory = $countryFactory;
71 $this->_taxRateFactory = $taxRateFactory;
87 3 =>
__(
'Zip/Post Code'),
89 5 =>
__(
'Zip/Post is Range'),
90 6 =>
__(
'Range From'),
104 if (!isset($file[
'tmp_name'])) {
105 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Invalid file upload attempt.'));
107 $ratesRawData = $this->csvProcessor->getData($file[
'tmp_name']);
109 $fileFields = $ratesRawData[0];
111 $invalidFields = array_diff_key($fileFields, $validFields);
112 $ratesData = $this->
_filterRateData($ratesRawData, $invalidFields, $validFields);
116 foreach ($ratesData as $rowIndex => $dataRow) {
118 if ($rowIndex == 0) {
121 $regionsCache = $this->_importRate($dataRow, $regionsCache, $storesCache);
135 $fileFieldsNum = count($fileFields);
139 $titleFieldName = $fileFields[
$index];
142 $filteredFields[
$index] = $titleFieldName;
146 return $filteredFields;
159 protected function _filterRateData(array $rateRawData, array $invalidFields, array $validFields)
161 $validFieldsNum = count($validFields);
162 foreach ($rateRawData as $rowIndex => $dataRow) {
164 if (count($dataRow) <= 1) {
165 unset($rateRawData[$rowIndex]);
169 foreach ($dataRow as $fieldIndex => $fieldValue) {
170 if (isset($invalidFields[$fieldIndex])) {
171 unset($rateRawData[$rowIndex][$fieldIndex]);
175 if (count($rateRawData[$rowIndex]) != $validFieldsNum) {
176 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Invalid file format.'));
194 $validFieldsNum = count($validFields);
197 foreach ($this->_publicStores as
$store) {
215 $isStoreCodeValid =
false;
216 foreach ($this->_publicStores as
$store) {
218 $isStoreCodeValid =
true;
222 return $isStoreCodeValid;
234 protected function _importRate(array $rateData, array $regionsCache, array $storesCache)
237 $countryCode = $rateData[1];
238 $country = $this->_countryFactory->create()->loadByCode($countryCode,
'iso2_code');
239 if (!$country->getId()) {
240 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Country code is invalid: %1', $countryCode));
245 $regionCode = $rateData[2];
246 if (!empty($regionsCache[$countryCode][$regionCode])) {
247 $regionId = $regionsCache[$countryCode][$regionCode] ==
'*' ? 0 : $regionsCache[$countryCode][$regionCode];
249 $postCode = empty($rateData[3]) ? null : $rateData[3];
251 'code' => $rateData[0],
252 'tax_country_id' => $rateData[1],
253 'tax_region_id' => $regionId,
254 'tax_postcode' => $postCode,
255 'rate' => $rateData[4],
256 'zip_is_range' => $rateData[5],
257 'zip_from' => $rateData[6],
258 'zip_to' => $rateData[7],
263 $rateModel = $this->_taxRateFactory->create()->loadByCode($modelData[
'code']);
264 $rateModel->addData($modelData);
268 foreach ($storesCache as $fileFieldIndex =>
$storeId) {
269 $rateTitles[
$storeId] = $rateData[$fileFieldIndex];
272 $rateModel->setTitle($rateTitles);
276 return $regionsCache;
288 if (!isset($regionsCache[$countryCode])) {
289 $regionsCache[$countryCode] = [];
291 $regionsCache[$countryCode][
'*'] =
'*';
293 $regionCollection->addCountryFilter($countryCode);
294 if ($regionCollection->getSize()) {
295 foreach ($regionCollection as $region) {
296 $regionsCache[$countryCode][$region->getCode()] = $region->getRegionId();
300 return $regionsCache;
_addCountryRegionsToCache($countryCode, array $regionsCache)
_filterFileFields(array $fileFields)
__construct(\Magento\Store\Model\ResourceModel\Store\Collection $storeCollection, \Magento\Directory\Model\ResourceModel\Region\Collection $regionCollection, \Magento\Directory\Model\CountryFactory $countryFactory, \Magento\Tax\Model\Calculation\RateFactory $taxRateFactory, \Magento\Framework\File\Csv $csvProcessor)
_isStoreCodeValid($storeCode)
_filterRateData(array $rateRawData, array $invalidFields, array $validFields)
_composeStoreCache($validFields)