Skip to content

Commit

Permalink
Merge pull request #91 from magento-tsg-csl3/MC-41122
Browse files Browse the repository at this point in the history
MC-41122: Inventory reservation compensation does not handle partial …
  • Loading branch information
zakdma authored Mar 23, 2021
2 parents 423c7e5 + 462b374 commit 1f1677d
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,15 @@ public function execute(int $bunchSize = 50, int $page = 1): array
->join(
['item' => $orderItemTableName],
'item.order_id = main_table.entity_id',
['item.sku', 'item.qty_ordered']
[
'item.sku',
'item.is_virtual',
'item.qty_ordered',
'item.qty_canceled',
'item.qty_invoiced',
'item.qty_refunded',
'item.qty_shipped'
]
)
->where('main_table.entity_id IN (?)', $entityIds)
->where('item.product_type IN (?)', $this->allowedProductTypesForSourceItemManagement->execute());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public function execute(Collector $collector, int $bunchSize = 50, int $page = 1

$reservation = $this->reservationBuilder
->setSku($data['sku'])
->setQuantity((float)$data['qty_ordered'])
->setQuantity($this->calculateReservationQty($data))
->setStockId($stockId)
->setMetadata($this->serializer->serialize(
[
Expand All @@ -86,4 +86,20 @@ public function execute(Collector $collector, int $bunchSize = 50, int $page = 1
$collector->addOrderData($data);
}
}

/**
* Return reservation qty amount
*
* @param array $data
* @return float
*/
private function calculateReservationQty(array $data): float
{
$qty = $data['qty_ordered'];
$qty -= $data['qty_canceled'];
$qty -= $data['qty_refunded'];
$qty -= $data['is_virtual'] ? $data['qty_invoiced'] : $data['qty_shipped'];

return (float)$qty;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,22 @@ public function testExecuteEmptyWithPagination()
}
}

/**
* Verify inventory:reservations:list-inconsistencies will return correct items qty for a partially shipped order
*
* @magentoDataFixture Magento_InventoryReservationCli::Test/Integration/_files/create_partially_shipped_order.php
* @magentoDataFixture Magento_InventoryReservationCli::Test/Integration/_files/delete_reservations.php
* @magentoDbIsolation disabled
* @throws \Magento\Framework\Validation\ValidationException
*/
public function testPartiallyShippedOrderWithMissingReservations(): void
{
$inconsistencies = $this->getSalableQuantityInconsistencies();
$items = reset($inconsistencies)
->getItems();
self::assertEquals(1, $items['simple']);
}

/**
* Load current Inconsistencies
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

use Magento\Framework\DB\Transaction;
use Magento\Sales\Api\OrderManagementInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\ShipmentFactory;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;

Resolver::getInstance()
->requireDataFixture('Magento/Sales/_files/order.php');

$objectManager = Bootstrap::getObjectManager();

/** @var Order $order */
$order = $objectManager->create(Order::class)
->loadByIncrementId('100000001');

/** @var OrderManagementInterface $orderManagement */
$orderManagement = $objectManager->create(OrderManagementInterface::class);
$orderManagement->place($order);

/** @var Transaction $transaction */
$transaction = $objectManager->create(Transaction::class);

$items = [];
foreach ($order->getItems() as $orderItem) {
$items[$orderItem->getId()] = $orderItem->getQtyOrdered()/2;
}
$shipment = $objectManager->get(ShipmentFactory::class)
->create($order, $items);
$shipment->register();

$transaction->addObject($shipment)
->addObject($order)
->save();

0 comments on commit 1f1677d

Please sign in to comment.