77
88use Magento \CatalogImportExport \Model \Import \Product as ImportProduct ;
99use Magento \CatalogImportExport \Model \Import \Product \RowValidatorInterface as ValidatorInterface ;
10+ use Magento \ImportExport \Model \Import \ErrorProcessing \ProcessingErrorAggregatorInterface ;
1011use Magento \Framework \App \Resource ;
1112
1213/**
@@ -45,6 +46,12 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
4546
4647 const ENTITY_TYPE_CODE = 'advanced_pricing ' ;
4748
49+ const VALIDATOR_MAIN = 'validator ' ;
50+
51+ const VALIDATOR_WEBSITE = 'validator_website ' ;
52+
53+ const VALIDATOR_GROUP_PRICE = 'validator_group_price ' ;
54+
4855 /**
4956 * Validation failure message template definitions
5057 *
@@ -61,6 +68,31 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
6168 ValidatorInterface::ERROR_INVALID_GROUP_PRICE_SITE => 'Group Price data website is invalid ' ,
6269 ValidatorInterface::ERROR_INVALID_GROUP_PRICE_GROUP => 'Group Price customer group is invalid ' ,
6370 ValidatorInterface::ERROR_GROUP_PRICE_DATA_INCOMPLETE => 'Group Price data is incomplete ' ,
71+ ValidatorInterface::ERROR_INVALID_ATTRIBUTE_DECIMAL =>
72+ 'Value for \'%s \' attribute contains incorrect value, acceptable values are in decimal format ' ,
73+ ];
74+
75+ /**
76+ * If we should check column names
77+ *
78+ * @var bool
79+ */
80+ protected $ needColumnCheck = true ;
81+
82+ /**
83+ * Valid column names
84+ *
85+ * @array
86+ */
87+ protected $ validColumnNames = [
88+ self ::COL_SKU ,
89+ self ::COL_TIER_PRICE_WEBSITE ,
90+ self ::COL_TIER_PRICE_CUSTOMER_GROUP ,
91+ self ::COL_TIER_PRICE_QTY ,
92+ self ::COL_TIER_PRICE ,
93+ self ::COL_GROUP_PRICE_WEBSITE ,
94+ self ::COL_GROUP_PRICE_CUSTOMER_GROUP ,
95+ self ::COL_GROUP_PRICE ,
6496 ];
6597
6698 /**
@@ -96,9 +128,9 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
96128 protected $ _importProduct ;
97129
98130 /**
99- * @var AdvancedPricing\Validator
131+ * @var array
100132 */
101- protected $ _validator ;
133+ protected $ _validators = [] ;
102134
103135 /**
104136 * @var array
@@ -110,16 +142,6 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
110142 */
111143 protected $ _oldSkus ;
112144
113- /**
114- * @var AdvancedPricing\Validator\Website
115- */
116- protected $ websiteValidator ;
117-
118- /**
119- * @var AdvancedPricing\Validator\GroupPrice
120- */
121- protected $ groupPriceValidator ;
122-
123145 /**
124146 * Permanent entity columns.
125147 *
@@ -141,12 +163,15 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
141163
142164 /**
143165 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
144- * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
145166 * @param \Magento\Framework\Json\Helper\Data $jsonHelper
146167 * @param \Magento\ImportExport\Helper\Data $importExportData
147- * @param \Magento\ImportExport\Model\Resource\Helper $resourceHelper
148168 * @param \Magento\ImportExport\Model\Resource\Import\Data $importData
169+ * @param \Magento\Eav\Model\Config $config
149170 * @param \Magento\Framework\App\Resource $resource
171+ * @param \Magento\ImportExport\Model\Resource\Helper $resourceHelper
172+ * @param \Magento\Framework\Stdlib\StringUtils $string
173+ * @param ProcessingErrorAggregatorInterface $errorAggregator
174+ * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
150175 * @param \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory $resourceFactory
151176 * @param \Magento\Catalog\Model\Product $productModel
152177 * @param \Magento\Catalog\Helper\Data $catalogData
@@ -155,14 +180,18 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
155180 * @param AdvancedPricing\Validator $validator
156181 * @param AdvancedPricing\Validator\Website $websiteValidator
157182 * @param AdvancedPricing\Validator\GroupPrice $groupPriceValidator
183+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
158184 */
159185 public function __construct (
160- \Magento \Framework \Stdlib \DateTime \TimezoneInterface $ localeDate ,
161186 \Magento \Framework \Json \Helper \Data $ jsonHelper ,
162187 \Magento \ImportExport \Helper \Data $ importExportData ,
163- \Magento \ImportExport \Model \Resource \Helper $ resourceHelper ,
164188 \Magento \ImportExport \Model \Resource \Import \Data $ importData ,
189+ \Magento \Eav \Model \Config $ config ,
165190 \Magento \Framework \App \Resource $ resource ,
191+ \Magento \ImportExport \Model \Resource \Helper $ resourceHelper ,
192+ \Magento \Framework \Stdlib \StringUtils $ string ,
193+ ProcessingErrorAggregatorInterface $ errorAggregator ,
194+ \Magento \Framework \Stdlib \DateTime \TimezoneInterface $ localeDate ,
166195 \Magento \CatalogImportExport \Model \Import \Proxy \Product \ResourceFactory $ resourceFactory ,
167196 \Magento \Catalog \Model \Product $ productModel ,
168197 \Magento \Catalog \Helper \Data $ catalogData ,
@@ -177,17 +206,33 @@ public function __construct(
177206 $ this ->_importExportData = $ importExportData ;
178207 $ this ->_resourceHelper = $ resourceHelper ;
179208 $ this ->_dataSourceModel = $ importData ;
180- $ this ->_connection = $ resource ->getConnection ();
209+ $ this ->_connection = $ resource ->getConnection (' write ' );
181210 $ this ->_resourceFactory = $ resourceFactory ;
182211 $ this ->_productModel = $ productModel ;
183212 $ this ->_catalogData = $ catalogData ;
184213 $ this ->_storeResolver = $ storeResolver ;
185214 $ this ->_importProduct = $ importProduct ;
186- $ this ->_validator = $ validator ;
215+ $ this ->_validators [ self :: VALIDATOR_MAIN ] = $ validator-> init ( $ this ) ;
187216 $ this ->_oldSkus = $ this ->retrieveOldSkus ();
188- $ this ->websiteValidator = $ websiteValidator ;
189- $ this ->groupPriceValidator = $ groupPriceValidator ;
217+ $ this ->_validators [self ::VALIDATOR_WEBSITE ] = $ websiteValidator ;
218+ $ this ->_validators [self ::VALIDATOR_GROUP_PRICE ] = $ groupPriceValidator ;
219+ $ this ->errorAggregator = $ errorAggregator ;
190220 $ this ->_catalogProductEntity = $ this ->_resourceFactory ->create ()->getTable ('catalog_product_entity ' );
221+
222+ foreach (array_merge ($ this ->errorMessageTemplates , $ this ->_messageTemplates ) as $ errorCode => $ message ) {
223+ $ this ->getErrorAggregator ()->addErrorMessageTemplate ($ errorCode , $ message );
224+ }
225+ }
226+
227+ /**
228+ * Validator object getter.
229+ *
230+ * @param string $type
231+ * @return AdvancedPricing\Validator|AdvancedPricing\Validator\Website|AdvancedPricing\Validator\GroupPrice
232+ */
233+ protected function _getValidator ($ type )
234+ {
235+ return $ this ->_validators [$ type ];
191236 }
192237
193238 /**
@@ -211,7 +256,7 @@ public function validateRow(array $rowData, $rowNum)
211256 {
212257 $ sku = false ;
213258 if (isset ($ this ->_validatedRows [$ rowNum ])) {
214- return !isset ( $ this ->_invalidRows [ $ rowNum] );
259+ return !$ this ->getErrorAggregator ()-> isRowInvalid ( $ rowNum );
215260 }
216261 $ this ->_validatedRows [$ rowNum ] = true ;
217262 // BEHAVIOR_DELETE use specific validation logic
@@ -222,8 +267,8 @@ public function validateRow(array $rowData, $rowNum)
222267 }
223268 return true ;
224269 }
225- if (!$ this ->_validator ->isValid ($ rowData )) {
226- foreach ($ this ->_validator ->getMessages () as $ message ) {
270+ if (!$ this ->_getValidator ( self :: VALIDATOR_MAIN ) ->isValid ($ rowData )) {
271+ foreach ($ this ->_getValidator ( self :: VALIDATOR_MAIN ) ->getMessages () as $ message ) {
227272 $ this ->addRowError ($ message , $ rowNum );
228273 }
229274 }
@@ -233,7 +278,7 @@ public function validateRow(array $rowData, $rowNum)
233278 if (false === $ sku ) {
234279 $ this ->addRowError (ValidatorInterface::ERROR_ROW_IS_ORPHAN , $ rowNum );
235280 }
236- return !isset ( $ this ->_invalidRows [ $ rowNum] );
281+ return !$ this ->getErrorAggregator ()-> isRowInvalid ( $ rowNum );
237282 }
238283
239284 /**
@@ -277,10 +322,14 @@ public function deleteAdvancedPricing()
277322 $ listSku = [];
278323 while ($ bunch = $ this ->_dataSourceModel ->getNextBunch ()) {
279324 foreach ($ bunch as $ rowNum => $ rowData ) {
280- if ($ this ->validateRow ($ rowData , $ rowNum )) {
325+ $ this ->validateRow ($ rowData , $ rowNum );
326+ if (!$ this ->getErrorAggregator ()->isRowInvalid ($ rowNum )) {
281327 $ rowSku = $ rowData [self ::COL_SKU ];
282328 $ listSku [] = $ rowSku ;
283329 }
330+ if ($ this ->getErrorAggregator ()->hasToBeTerminated ()) {
331+ $ this ->getErrorAggregator ()->addRowToSkip ($ rowNum );
332+ }
284333 }
285334 }
286335 if ($ listSku ) {
@@ -307,6 +356,7 @@ public function replaceAdvancedPricing()
307356 *
308357 * @return $this
309358 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
359+ * @SuppressWarnings(PHPMD.NPathComplexity)
310360 */
311361 protected function saveAndReplaceAdvancedPrices ()
312362 {
@@ -323,6 +373,11 @@ protected function saveAndReplaceAdvancedPrices()
323373 $ this ->addRowError (ValidatorInterface::ERROR_SKU_IS_EMPTY , $ rowNum );
324374 continue ;
325375 }
376+ if ($ this ->getErrorAggregator ()->hasToBeTerminated ()) {
377+ $ this ->getErrorAggregator ()->addRowToSkip ($ rowNum );
378+ continue ;
379+ }
380+
326381 $ rowSku = $ rowData [self ::COL_SKU ];
327382 $ listSku [] = $ rowSku ;
328383 if (!empty ($ rowData [self ::COL_TIER_PRICE_WEBSITE ])) {
@@ -359,7 +414,7 @@ protected function saveAndReplaceAdvancedPrices()
359414 }
360415 } elseif (\Magento \ImportExport \Model \Import::BEHAVIOR_APPEND == $ behavior ) {
361416 $ this ->processCountExistingPrices ($ tierPrices , self ::TABLE_TIER_PRICE )
362- ->processcountExistingPrices ($ groupPrices , self ::TABLE_GROUPED_PRICE )
417+ ->processCountExistingPrices ($ groupPrices , self ::TABLE_GROUPED_PRICE )
363418 ->processCountNewPrices ($ tierPrices , $ groupPrices );
364419 $ this ->saveProductPrices ($ tierPrices , self ::TABLE_TIER_PRICE )
365420 ->saveProductPrices ($ groupPrices , self ::TABLE_GROUPED_PRICE );
@@ -462,7 +517,7 @@ protected function setUpdatedAt(array $listSku)
462517 */
463518 protected function getWebSiteId ($ websiteCode )
464519 {
465- $ result = $ websiteCode == $ this ->websiteValidator ->getAllWebsitesValue () ||
520+ $ result = $ websiteCode == $ this ->_getValidator ( self :: VALIDATOR_WEBSITE ) ->getAllWebsitesValue () ||
466521 $ this ->_catalogData ->isPriceGlobal () ? 0 : $ this ->_storeResolver ->getWebsiteCodeToId ($ websiteCode );
467522 return $ result ;
468523 }
@@ -475,7 +530,7 @@ protected function getWebSiteId($websiteCode)
475530 */
476531 protected function getCustomerGroupId ($ customerGroup )
477532 {
478- $ customerGroups = $ this ->groupPriceValidator ->getCustomerGroups ();
533+ $ customerGroups = $ this ->_getValidator ( self :: VALIDATOR_GROUP_PRICE ) ->getCustomerGroups ();
479534 return $ customerGroup == self ::VALUE_ALL_GROUPS ? 0 : $ customerGroups [$ customerGroup ];
480535 }
481536
0 commit comments