Hi, Bestände werden über die Klasse „Shopware\Core\Content\Product\DataAbstractionLayer\StockUpdater.php“ geändert.
In der Funktion „updateAvailableStockAndSales“ über die SQL Anfrage
$sql = '
SELECT LOWER(HEX(order_line_item.product_id)) as product_id,
IFNULL(
SUM(IF(state_machine_state.technical_name = :completed_state, 0, order_line_item.quantity)),
0
) as open_quantity,
IFNULL(
SUM(IF(state_machine_state.technical_name = :completed_state, order_line_item.quantity, 0)),
0
) as sales_quantity
FROM order_line_item
INNER JOIN `order`
ON `order`.id = order_line_item.order_id
AND `order`.version_id = order_line_item.order_version_id
INNER JOIN state_machine_state
ON state_machine_state.id = `order`.state_id
AND state_machine_state.technical_name <> :cancelled_state
WHERE order_line_item.product_id IN (:ids)
AND order_line_item.type = :type
AND order_line_item.version_id = :version
AND order_line_item.product_id IS NOT NULL
GROUP BY product_id;
';
abgerufen und über die Zeile
$update = new RetryableQuery(
$this->connection,
$this->connection->prepare('UPDATE product SET available_stock = stock - :open_quantity, sales = :sales_quantity, updated_at = :now WHERE id = :id')
);
berechnet.
Eine Lösung für euer Problem wäre es ein Plugin zu erstellen mit einem Subscriber (alternativ die Klasse aus Performancegründen überschreiben, aber damit habe ich mich in der SW Umgebung noch nicht befasst) auf die Events in denen die Funktion aufgerufen wird und dort euer eigenes update Statement zu verwenden.
$update = new RetryableQuery(
$this->connection,
$this->connection->prepare('UPDATE product SET available_stock = stock , sales = :sales_quantity, updated_at = :now WHERE id = :id')
);
Grüße