@@ -2530,22 +2530,22 @@ protected function _saveStockItem()
2530
2530
2531
2531
$ row = [];
2532
2532
$ sku = $ rowData [self ::COL_SKU ];
2533
- $ storeId = $ this ->getRowStoreId ($ rowData );
2534
2533
if ($ this ->skuProcessor ->getNewSku ($ sku ) !== null ) {
2535
2534
$ stockItem = $ this ->getRowExistingStockItem ($ rowData );
2536
2535
$ existingStockItemData = $ stockItem ->getData ();
2537
2536
$ row = $ this ->formatStockDataForRow ($ rowData );
2538
2537
$ productIdsToReindex [] = $ row ['product_id ' ];
2538
+ $ storeId = $ this ->getRowStoreId ($ rowData );
2539
2539
if (!empty (array_diff_assoc ($ row , $ existingStockItemData ))
2540
2540
|| $ this ->statusProcessor ->isStatusChanged ($ sku , $ storeId )
2541
2541
) {
2542
2542
$ stockChangedProductIds [] = $ row ['product_id ' ];
2543
2543
}
2544
2544
}
2545
2545
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 ;
2549
2549
}
2550
2550
}
2551
2551
@@ -3404,57 +3404,53 @@ private function formatStockDataForRow(array $rowData): array
3404
3404
3405
3405
$ stockItemDo = $ this ->stockRegistry ->getStockItem ($ row ['product_id ' ], $ row ['website_id ' ]);
3406
3406
$ existStockData = $ stockItemDo ->getData ();
3407
+ $ isInStockOld = (bool ) ($ existStockData ['is_in_stock ' ] ?? $ this ->defaultStockData ['is_in_stock ' ]);
3407
3408
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
+ );
3413
3415
3414
3416
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
+ }
3417
3438
} else {
3418
- $ initialStatusStock = $ existStockData [ ' is_in_stock ' ] ?? $ this -> defaultStockData [ ' is_in_stock ' ] ;
3439
+ $ stockItemDo -> setStockStatusChangedAuto ( 0 ) ;
3419
3440
}
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 ();
3427
3443
if ($ this ->stockStateProvider ->verifyNotification ($ stockItemDo )) {
3428
3444
$ date = $ this ->dateTimeFactory ->create ('now ' , new \DateTimeZone ('UTC ' ));
3429
3445
$ row ['low_stock_date ' ] = $ date ->format (DateTime::DATETIME_PHP_FORMAT );
3430
3446
}
3431
- $ row ['stock_status_changed_auto ' ] = (int ) $ initialStatusStock != $ row ['is_in_stock ' ];
3432
3447
} else {
3433
- $ row = $ this ->getMergedRowDetails ($ row , $ existStockData , $ rowData );
3434
3448
$ row ['qty ' ] = 0 ;
3435
3449
}
3436
3450
3437
3451
return $ row ;
3438
3452
}
3439
3453
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
-
3458
3454
/**
3459
3455
* Retrieve product by sku.
3460
3456
*
0 commit comments