Skip to content

Commit

Permalink
CC-34924: Reworked cart reorder filter plugins. (#11229)
Browse files Browse the repository at this point in the history
Rework cart reorder filter plugins.
  • Loading branch information
dmiseev authored Dec 11, 2024
1 parent 5b89cd5 commit d05b3c4
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 1 deletion.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"spryker/availability": "^9.8.0",
"spryker/calculation-extension": "^1.1.0",
"spryker/cart-extension": "^1.0.0 || ^2.0.0 || ^4.0.0",
"spryker/cart-reorder-extension": "^1.0.0",
"spryker/cart-reorder-extension": "^1.2.0",
"spryker/decimal-object": "^1.0.0",
"spryker/kernel": "^3.30.0",
"spryker/locale": "^3.0.0 || ^4.0.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,8 @@

<transfer name="CartReorderRequest" strict="true">
<property name="bundleItemIdentifiers" type="array" singular="bundleItemIdentifier"/>
<property name="order" type="Order"/>
<property name="salesOrderItemIds" type="array" singular="idSalesOrderItem"/>
</transfer>

<transfer name="CartReorder" strict="true">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use Spryker\Zed\Kernel\Communication\AbstractPlugin;

/**
* @deprecated Use {@link \Spryker\Zed\ProductBundle\Communication\Plugin\CartReorder\ProductBundleCartReorderOrderItemFilterPlugin} instead.
*
* @method \Spryker\Zed\ProductBundle\Business\ProductBundleFacadeInterface getFacade()
* @method \Spryker\Zed\ProductBundle\Communication\ProductBundleCommunicationFactory getFactory()
* @method \Spryker\Zed\ProductBundle\ProductBundleConfig getConfig()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Zed\ProductBundle\Communication\Plugin\CartReorder;

use ArrayObject;
use Generated\Shared\Transfer\CartReorderRequestTransfer;
use Spryker\Zed\CartReorderExtension\Dependency\Plugin\CartReorderOrderItemFilterPluginInterface;
use Spryker\Zed\Kernel\Communication\AbstractPlugin;

/**
* @method \Spryker\Zed\ProductBundle\Business\ProductBundleFacadeInterface getFacade()
* @method \Spryker\Zed\ProductBundle\Communication\ProductBundleCommunicationFactory getFactory()
* @method \Spryker\Zed\ProductBundle\ProductBundleConfig getConfig()
* @method \Spryker\Zed\ProductBundle\Persistence\ProductBundleQueryContainerInterface getQueryContainer()
*/
class ProductBundleCartReorderOrderItemFilterPlugin extends AbstractPlugin implements CartReorderOrderItemFilterPluginInterface
{
/**
* {@inheritDoc}
* - Expects `CartReorderRequestTransfer.bundleItemIdentifiers` to be set.
* - Requires `CartReorderRequestTransfer.order.items.idSalesOrderItem` to be set.
* - Filters reorder product bundle items.
* - Expands bundle items with first `salesOrderItemId` that belongs to the product bundle.
* - Returns only the filtered bundle items if `CartReorderRequestTransfer.salesOrderItemIds` is empty.
* - Appends the filtered bundle items to the provided `filteredItems`.
*
* @api
*
* @param \ArrayObject<array-key, \Generated\Shared\Transfer\ItemTransfer> $filteredItems
* @param \Generated\Shared\Transfer\CartReorderRequestTransfer $cartReorderRequestTransfer
*
* @return \ArrayObject<array-key, \Generated\Shared\Transfer\ItemTransfer>
*/
public function filter(ArrayObject $filteredItems, CartReorderRequestTransfer $cartReorderRequestTransfer): ArrayObject
{
$filteredBundleItems = $this->getFacade()->filterReorderBundleItems($cartReorderRequestTransfer, $cartReorderRequestTransfer->getOrderOrFail());

if ($filteredBundleItems->count() && $cartReorderRequestTransfer->getSalesOrderItemIds() === []) {
return $filteredBundleItems;
}

foreach ($filteredBundleItems as $filteredBundleItem) {
$filteredItems->append($filteredBundleItem);
}

return $filteredItems;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace SprykerTest\Zed\ProductBundle\Communication\Plugin\CartReorder;

use ArrayObject;
use Codeception\Test\Unit;
use Generated\Shared\Transfer\CartReorderRequestTransfer;
use Generated\Shared\Transfer\ItemTransfer;
use Generated\Shared\Transfer\OrderTransfer;
use Spryker\Zed\ProductBundle\Communication\Plugin\CartReorder\ProductBundleCartReorderOrderItemFilterPlugin;
use SprykerTest\Zed\ProductBundle\ProductBundleCommunicationTester;

/**
* Auto-generated group annotations
*
* @group SprykerTest
* @group Zed
* @group ProductBundle
* @group Communication
* @group Plugin
* @group CartReorder
* @group ProductBundleCartReorderOrderItemFilterPluginTest
* Add your own group annotations below this line
*/
class ProductBundleCartReorderOrderItemFilterPluginTest extends Unit
{
/**
* @var \SprykerTest\Zed\ProductBundle\ProductBundleCommunicationTester
*/
protected ProductBundleCommunicationTester $tester;

/**
* @return void
*/
public function testShouldReplaceFilterItemsToBundleItems(): void
{
// Arrange
$orderTransfer = (new OrderTransfer())
->setItems(new ArrayObject([
(new ItemTransfer())->setIdSalesOrderItem(1),
(new ItemTransfer())->setIdSalesOrderItem(2)->setRelatedBundleItemIdentifier('1'),
(new ItemTransfer())->setIdSalesOrderItem(3)->setRelatedBundleItemIdentifier('1'),
(new ItemTransfer())->setIdSalesOrderItem(4),
(new ItemTransfer())->setIdSalesOrderItem(5)->setRelatedBundleItemIdentifier('2'),
(new ItemTransfer())->setIdSalesOrderItem(6)->setRelatedBundleItemIdentifier('2'),
]))
->setBundleItems(new ArrayObject([
(new ItemTransfer())->setBundleItemIdentifier('1'),
(new ItemTransfer())->setBundleItemIdentifier('2'),
]));

$cartReorderRequestTransfer = (new CartReorderRequestTransfer())
->setOrder($orderTransfer)
->setSalesOrderItemIds([])
->setBundleItemIdentifiers(['1']);

$filteredItems = new ArrayObject([
(new ItemTransfer())->setIdSalesOrderItem(1),
(new ItemTransfer())->setIdSalesOrderItem(2)->setRelatedBundleItemIdentifier('1'),
(new ItemTransfer())->setIdSalesOrderItem(3)->setRelatedBundleItemIdentifier('1'),
(new ItemTransfer())->setIdSalesOrderItem(4),
(new ItemTransfer())->setIdSalesOrderItem(5)->setRelatedBundleItemIdentifier('2'),
(new ItemTransfer())->setIdSalesOrderItem(6)->setRelatedBundleItemIdentifier('2'),
]);

// Arrange
$filteredItems = (new ProductBundleCartReorderOrderItemFilterPlugin())->filter(
$filteredItems,
$cartReorderRequestTransfer,
);

// Assert
$this->assertCount(1, $filteredItems);
}

/**
* @return void
*/
public function testShouldAppendFilterItemsWithBundleItems(): void
{
// Arrange
$orderTransfer = (new OrderTransfer())
->setItems(new ArrayObject([
(new ItemTransfer())->setIdSalesOrderItem(1),
(new ItemTransfer())->setIdSalesOrderItem(2)->setRelatedBundleItemIdentifier('1'),
(new ItemTransfer())->setIdSalesOrderItem(3)->setRelatedBundleItemIdentifier('1'),
(new ItemTransfer())->setIdSalesOrderItem(4),
(new ItemTransfer())->setIdSalesOrderItem(5)->setRelatedBundleItemIdentifier('2'),
(new ItemTransfer())->setIdSalesOrderItem(6)->setRelatedBundleItemIdentifier('2'),
]))
->setBundleItems(new ArrayObject([
(new ItemTransfer())->setBundleItemIdentifier('1'),
(new ItemTransfer())->setBundleItemIdentifier('2'),
]));

$cartReorderRequestTransfer = (new CartReorderRequestTransfer())
->setOrder($orderTransfer)
->setSalesOrderItemIds([1, 4])
->setBundleItemIdentifiers(['1']);

$filteredItems = new ArrayObject([
(new ItemTransfer())->setIdSalesOrderItem(1),
(new ItemTransfer())->setIdSalesOrderItem(4),
]);

// Arrange
$filteredItems = (new ProductBundleCartReorderOrderItemFilterPlugin())->filter(
$filteredItems,
$cartReorderRequestTransfer,
);

// Assert
$this->assertCount(3, $filteredItems);
}
}

0 comments on commit d05b3c4

Please sign in to comment.