@@ -2530,22 +2530,22 @@ protected function _saveStockItem()
25302530
25312531 $ row = [];
25322532 $ sku = $ rowData [self ::COL_SKU ];
2533- $ storeId = $ this ->getRowStoreId ($ rowData );
25342533 if ($ this ->skuProcessor ->getNewSku ($ sku ) !== null ) {
25352534 $ stockItem = $ this ->getRowExistingStockItem ($ rowData );
25362535 $ existingStockItemData = $ stockItem ->getData ();
25372536 $ row = $ this ->formatStockDataForRow ($ rowData );
25382537 $ productIdsToReindex [] = $ row ['product_id ' ];
2538+ $ storeId = $ this ->getRowStoreId ($ rowData );
25392539 if (!empty (array_diff_assoc ($ row , $ existingStockItemData ))
25402540 || $ this ->statusProcessor ->isStatusChanged ($ sku , $ storeId )
25412541 ) {
25422542 $ stockChangedProductIds [] = $ row ['product_id ' ];
25432543 }
25442544 }
25452545
2546- if (!isset ($ stockData [$ sku ][ $ storeId ] )) {
2547- $ stockData [$ sku ][ $ storeId ] = $ row ;
2548- $ importedData [$ sku ][ $ storeId ] = $ rowData ;
2546+ if (!isset ($ stockData [$ sku ])) {
2547+ $ stockData [$ sku ] = $ row ;
2548+ $ importedData [$ sku ] = $ rowData ;
25492549 }
25502550 }
25512551
@@ -3404,57 +3404,53 @@ private function formatStockDataForRow(array $rowData): array
34043404
34053405 $ stockItemDo = $ this ->stockRegistry ->getStockItem ($ row ['product_id ' ], $ row ['website_id ' ]);
34063406 $ existStockData = $ stockItemDo ->getData ();
3407+ $ isInStockOld = (bool ) ($ existStockData ['is_in_stock ' ] ?? $ this ->defaultStockData ['is_in_stock ' ]);
34073408
3408- foreach (array_flip ($ this ->_fieldsMap ) as $ fileFieldName => $ systemFieldName ) {
3409- if (isset ($ rowData [$ fileFieldName ]) && isset ($ this ->defaultStockData [$ systemFieldName ])) {
3410- $ row [$ systemFieldName ] = $ rowData [$ fileFieldName ];
3411- }
3412- }
3409+ $ row = array_merge (
3410+ $ this ->defaultStockData ,
3411+ array_intersect_key ($ existStockData , $ this ->defaultStockData ),
3412+ array_intersect_key ($ rowData , $ this ->defaultStockData ),
3413+ $ row
3414+ );
34133415
34143416 if ($ this ->stockConfiguration ->isQty ($ this ->skuProcessor ->getNewSku ($ sku )['type_id ' ])) {
3415- if (empty ($ existStockData )) {
3416- $ initialStatusStock = 0 ;
3417+ $ stockItemDo ->setData ($ row );
3418+ $ isInStock = $ this ->stockStateProvider ->verifyStock ($ stockItemDo );
3419+ /**
3420+ * This following logic originates from
3421+ * @see \Magento\CatalogInventory\Model\Stock\StockItemRepository::updateStockStatus
3422+ * It is important to keep it for consistency
3423+ */
3424+ if ($ stockItemDo ->getManageStock ()) {
3425+ if (!$ isInStock ) {
3426+ if ($ stockItemDo ->getIsInStock () === true ) {
3427+ $ stockItemDo ->setIsInStock (false );
3428+ $ stockItemDo ->setStockStatusChangedAuto (1 );
3429+ }
3430+ } else {
3431+ if ($ stockItemDo ->getIsInStock () !== $ isInStockOld ) {
3432+ $ stockItemDo ->setStockStatusChangedAuto (0 );
3433+ }
3434+ if ($ stockItemDo ->getIsInStock () === false && $ stockItemDo ->getStockStatusChangedAuto ()) {
3435+ $ stockItemDo ->setIsInStock (true );
3436+ }
3437+ }
34173438 } else {
3418- $ initialStatusStock = $ existStockData [ ' is_in_stock ' ] ?? $ this -> defaultStockData [ ' is_in_stock ' ] ;
3439+ $ stockItemDo -> setStockStatusChangedAuto ( 0 ) ;
34193440 }
3420- unset($ existStockData ['is_in_stock ' ]);
3421-
3422- $ row = $ this ->getMergedRowDetails ($ row , $ existStockData , $ rowData );
3423- $ stockItemDo ->setData ($ row );
3424- $ row ['is_in_stock ' ] = $ this ->stockStateProvider ->verifyStock ($ stockItemDo )
3425- ? (int ) $ row ['is_in_stock ' ]
3426- : 0 ;
3441+ $ row ['is_in_stock ' ] = (int ) $ stockItemDo ->getIsInStock ();
3442+ $ row ['stock_status_changed_auto ' ] = (int ) $ stockItemDo ->getStockStatusChangedAuto ();
34273443 if ($ this ->stockStateProvider ->verifyNotification ($ stockItemDo )) {
34283444 $ date = $ this ->dateTimeFactory ->create ('now ' , new \DateTimeZone ('UTC ' ));
34293445 $ row ['low_stock_date ' ] = $ date ->format (DateTime::DATETIME_PHP_FORMAT );
34303446 }
3431- $ row ['stock_status_changed_auto ' ] = (int ) $ initialStatusStock != $ row ['is_in_stock ' ];
34323447 } else {
3433- $ row = $ this ->getMergedRowDetails ($ row , $ existStockData , $ rowData );
34343448 $ row ['qty ' ] = 0 ;
34353449 }
34363450
34373451 return $ row ;
34383452 }
34393453
3440- /**
3441- * Fill in row details with default stock data, existing stock data and import data.
3442- *
3443- * @param array $row
3444- * @param array $existingStockData
3445- * @param array $importData
3446- * @return array
3447- */
3448- private function getMergedRowDetails (array $ row , array $ existingStockData , array $ importData ): array
3449- {
3450- return array_merge (
3451- $ this ->defaultStockData ,
3452- array_intersect_key ($ existingStockData , $ this ->defaultStockData ),
3453- array_intersect_key ($ importData , $ this ->defaultStockData ),
3454- $ row
3455- );
3456- }
3457-
34583454 /**
34593455 * Retrieve product by sku.
34603456 *
0 commit comments