Skip to content

Commit

Permalink
CC-33281 Introduced merchant commission item collector rules (#10984)
Browse files Browse the repository at this point in the history
CC-33281 Commissions condition rules (category, product, price, merchant)
  • Loading branch information
AsonUnique authored Jul 3, 2024
1 parent 28745ee commit a398be4
Show file tree
Hide file tree
Showing 11 changed files with 470 additions and 26 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"require-dev": {
"spryker/code-sniffer": "*",
"spryker/container": "*",
"spryker/product-attribute": "*",
"spryker/product-image": "*",
"spryker/propel": "*",
"spryker/testify": "*"
Expand Down
16 changes: 16 additions & 0 deletions src/Spryker/Shared/Product/Transfer/product.transfer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,22 @@
<property name="localeNames" type="string[]" singular="localeName"/>
</transfer>

<transfer name="ProductAttributeKeyCriteria" strict="true">
<property name="productAttributeKeyConditions" type="ProductAttributeKeyConditions"/>
<property name="sortCollection" type="Sort[]" singular="sort"/>
<property name="pagination" type="Pagination"/>
</transfer>

<transfer name="ProductAttributeKeyConditions" strict="true">
<property name="keys" type="string[]" singular="key"/>
<property name="isSuper" type="bool"/>
</transfer>

<transfer name="ProductAttributeKeyCollection" strict="true">
<property name="productAttributeKeys" type="ProductAttributeKey[]" singular="productAttributeKey"/>
<property name="pagination" type="Pagination" strict="true"/>
</transfer>

<transfer name="MessageAttributes">
<property name="storeReference" type="string"/>
<property name="tenantIdentifier" type="string"/>
Expand Down
17 changes: 17 additions & 0 deletions src/Spryker/Zed/Product/Business/ProductFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use Generated\Shared\Transfer\ProductAbstractCriteriaTransfer;
use Generated\Shared\Transfer\ProductAbstractSuggestionCollectionTransfer;
use Generated\Shared\Transfer\ProductAbstractTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyTransfer;
use Generated\Shared\Transfer\ProductConcreteCollectionTransfer;
use Generated\Shared\Transfer\ProductConcreteCriteriaTransfer;
Expand Down Expand Up @@ -1300,4 +1302,19 @@ public function getProductAbstractCollection(ProductAbstractCriteriaTransfer $pr
{
return $this->getFactory()->createProductAbstractReader()->getProductAbstractCollection($productAbstractCriteriaTransfer);
}

/**
* {@inheritDoc}
*
* @api
*
* @param \Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
*
* @return \Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer
*/
public function getProductAttributeKeyCollection(
ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
): ProductAttributeKeyCollectionTransfer {
return $this->getRepository()->getProductAttributeKeyCollection($productAttributeKeyCriteriaTransfer);
}
}
23 changes: 23 additions & 0 deletions src/Spryker/Zed/Product/Business/ProductFacadeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use Generated\Shared\Transfer\ProductAbstractCriteriaTransfer;
use Generated\Shared\Transfer\ProductAbstractSuggestionCollectionTransfer;
use Generated\Shared\Transfer\ProductAbstractTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyTransfer;
use Generated\Shared\Transfer\ProductConcreteCollectionTransfer;
use Generated\Shared\Transfer\ProductConcreteCriteriaTransfer;
Expand Down Expand Up @@ -1155,4 +1157,25 @@ public function getProductConcreteCollection(
* @return \Generated\Shared\Transfer\ProductAbstractCollectionTransfer
*/
public function getProductAbstractCollection(ProductAbstractCriteriaTransfer $productAbstractCriteriaTransfer): ProductAbstractCollectionTransfer;

/**
* Specification:
* - Retrieves product attribute key entities filtered by criteria.
* - Uses `ProductAttributeKeyCriteriaTransfer.productAttributeKeyConditions.keys` to filter by `key`.
* - Uses `ProductAttributeKeyCriteriaTransfer.productAttributeKeyConditions.isSuper` to filter by `isSuper` flag.
* - Uses `ProductAttributeKeyCriteriaTransfer.sortCollection.field` to set the `order by` field.
* - Uses `ProductAttributeKeyCriteriaTransfer.sortCollection.isAscending` to set ascending order otherwise will be used descending order.
* - Uses `ProductAttributeKeyCriteriaTransfer.pagination.{limit, offset}` to paginate result with limit and offset.
* - Uses `ProductAttributeKeyCriteriaTransfer.pagination.{page, maxPerPage}` to paginate result with page and maxPerPage.
* - Returns `ProductAttributeKeyCollectionTransfer` filled with found product attribute keys.
*
* @api
*
* @param \Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
*
* @return \Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer
*/
public function getProductAttributeKeyCollection(
ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
): ProductAttributeKeyCollectionTransfer;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?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\Product\Persistence\Mapper;

use Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyTransfer;
use Propel\Runtime\Collection\Collection;

class ProductAttributeKeyMapper
{
/**
* @param \Propel\Runtime\Collection\Collection<\Orm\Zed\Product\Persistence\SpyProductAttributeKey> $productAttributeKeyEntities
* @param \Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer $productAttributeKeyCollectionTransfer
*
* @return \Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer
*/
public function mapProductAttributeKeyEntitiesToProductAttributeKeyCollection(
Collection $productAttributeKeyEntities,
ProductAttributeKeyCollectionTransfer $productAttributeKeyCollectionTransfer
): ProductAttributeKeyCollectionTransfer {
foreach ($productAttributeKeyEntities as $productAttributeKeyEntity) {
$productAttributeKeyTransfer = (new ProductAttributeKeyTransfer())
->fromArray($productAttributeKeyEntity->toArray(), true);

$productAttributeKeyCollectionTransfer->addProductAttributeKey($productAttributeKeyTransfer);
}

return $productAttributeKeyCollectionTransfer;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Spryker\Zed\Product\Dependency\Service\ProductToUtilEncodingInterface;
use Spryker\Zed\Product\Persistence\Mapper\LocalizedAttributesMapper;
use Spryker\Zed\Product\Persistence\Mapper\ProductAbstractStoreMapper;
use Spryker\Zed\Product\Persistence\Mapper\ProductAttributeKeyMapper;
use Spryker\Zed\Product\Persistence\Mapper\ProductMapper;
use Spryker\Zed\Product\Persistence\Mapper\ProductMapperInterface;
use Spryker\Zed\Product\ProductDependencyProvider;
Expand Down Expand Up @@ -119,4 +120,12 @@ public function createProductAbstractStoreMapper(): ProductAbstractStoreMapper
{
return new ProductAbstractStoreMapper();
}

/**
* @return \Spryker\Zed\Product\Persistence\Mapper\ProductAttributeKeyMapper
*/
public function createProductAttributeKeyMapper(): ProductAttributeKeyMapper
{
return new ProductAttributeKeyMapper();
}
}
116 changes: 90 additions & 26 deletions src/Spryker/Zed/Product/Persistence/ProductRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
use Generated\Shared\Transfer\ProductAbstractCriteriaTransfer;
use Generated\Shared\Transfer\ProductAbstractSuggestionCollectionTransfer;
use Generated\Shared\Transfer\ProductAbstractTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer;
use Generated\Shared\Transfer\ProductConcreteCollectionTransfer;
use Generated\Shared\Transfer\ProductConcreteCriteriaTransfer;
use Generated\Shared\Transfer\ProductConcreteTransfer;
Expand All @@ -28,6 +30,7 @@
use Orm\Zed\Product\Persistence\Map\SpyProductLocalizedAttributesTableMap;
use Orm\Zed\Product\Persistence\Map\SpyProductTableMap;
use Orm\Zed\Product\Persistence\SpyProductAbstractQuery;
use Orm\Zed\Product\Persistence\SpyProductAttributeKeyQuery;
use Orm\Zed\Product\Persistence\SpyProductQuery;
use Orm\Zed\Url\Persistence\SpyUrlQuery;
use Propel\Runtime\ActiveQuery\ModelCriteria;
Expand Down Expand Up @@ -1003,12 +1006,17 @@ public function getProductConcreteCollection(

$paginationTransfer = $productConcreteCriteriaTransfer->getPagination();
if ($paginationTransfer !== null) {
$productConcreteQuery = $this->applyProductConcretePagination($productConcreteQuery, $paginationTransfer);
/** @var \Orm\Zed\Product\Persistence\SpyProductQuery $productConcreteQuery */
$productConcreteQuery = $this->applyPaginationToQuery($productConcreteQuery, $paginationTransfer);
$productConcreteCollectionTransfer->setPagination($paginationTransfer);
}

$productConcreteQuery = $this->expandProductConcreteQueryWithProductLocalizedAttributes($productConcreteQuery, $productConcreteCriteriaTransfer);
$productConcreteQuery = $this->applyProductConcreteSorting($productConcreteQuery, $productConcreteCriteriaTransfer);
/** @var \Orm\Zed\Product\Persistence\SpyProductQuery $productConcreteQuery */
$productConcreteQuery = $this->applySortingToQuery(
$productConcreteQuery,
$productConcreteCriteriaTransfer->getSortCollection(),
);

return $this->getFactory()
->createProductMapper()
Expand All @@ -1018,6 +1026,40 @@ public function getProductConcreteCollection(
);
}

/**
* @param \Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
*
* @return \Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer
*/
public function getProductAttributeKeyCollection(
ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
): ProductAttributeKeyCollectionTransfer {
$productAttributeKeyCollectionTransfer = new ProductAttributeKeyCollectionTransfer();

$productAttributeKeyQuery = $this->getFactory()->createProductAttributeKeyQuery();
$productAttributeKeyQuery = $this->applyProductAttributeKeyFilters($productAttributeKeyQuery, $productAttributeKeyCriteriaTransfer);

$paginationTransfer = $productAttributeKeyCriteriaTransfer->getPagination();
if ($paginationTransfer !== null) {
/** @var \Orm\Zed\Product\Persistence\SpyProductAttributeKeyQuery $productAttributeKeyQuery */
$productAttributeKeyQuery = $this->applyPaginationToQuery($productAttributeKeyQuery, $paginationTransfer);
$productAttributeKeyCollectionTransfer->setPagination($paginationTransfer);
}

/** @var \Orm\Zed\Product\Persistence\SpyProductAttributeKeyQuery $productAttributeKeyQuery */
$productAttributeKeyQuery = $this->applySortingToQuery(
$productAttributeKeyQuery,
$productAttributeKeyCriteriaTransfer->getSortCollection(),
);

return $this->getFactory()
->createProductAttributeKeyMapper()
->mapProductAttributeKeyEntitiesToProductAttributeKeyCollection(
$productAttributeKeyQuery->find(),
$productAttributeKeyCollectionTransfer,
);
}

/**
* @module Locale
*
Expand Down Expand Up @@ -1095,26 +1137,26 @@ protected function applyProductConcreteFilters(
}

/**
* @param \Orm\Zed\Product\Persistence\SpyProductQuery $productConcreteQuery
* @param \Propel\Runtime\ActiveQuery\ModelCriteria $query
* @param \Generated\Shared\Transfer\PaginationTransfer $paginationTransfer
*
* @return \Orm\Zed\Product\Persistence\SpyProductQuery
* @return \Propel\Runtime\ActiveQuery\ModelCriteria
*/
protected function applyProductConcretePagination(
SpyProductQuery $productConcreteQuery,
protected function applyPaginationToQuery(
ModelCriteria $query,
PaginationTransfer $paginationTransfer
): SpyProductQuery {
): ModelCriteria {
if ($paginationTransfer->getOffset() !== null && $paginationTransfer->getLimit() !== null) {
$paginationTransfer->setNbResults($productConcreteQuery->count());
$paginationTransfer->setNbResults($query->count());

$productConcreteQuery->offset($paginationTransfer->getOffsetOrFail())
$query->offset($paginationTransfer->getOffsetOrFail())
->setLimit($paginationTransfer->getLimitOrFail());

return $productConcreteQuery;
return $query;
}

if ($paginationTransfer->getPage() !== null && $paginationTransfer->getMaxPerPage()) {
$paginationModel = $productConcreteQuery->paginate(
$paginationModel = $query->paginate(
$paginationTransfer->getPage(),
$paginationTransfer->getMaxPerPage(),
);
Expand All @@ -1127,34 +1169,56 @@ protected function applyProductConcretePagination(
->setNextPage($paginationModel->getNextPage())
->setPreviousPage($paginationModel->getPreviousPage());

/** @var \Orm\Zed\Product\Persistence\SpyProductQuery $productConcreteQuery */
$productConcreteQuery = $paginationModel->getQuery();

return $productConcreteQuery;
return $paginationModel->getQuery();
}

return $productConcreteQuery;
return $query;
}

/**
* @param \Orm\Zed\Product\Persistence\SpyProductQuery $productConcreteQuery
* @param \Generated\Shared\Transfer\ProductConcreteCriteriaTransfer $productConcreteCriteriaTransfer
* @param \Propel\Runtime\ActiveQuery\ModelCriteria $query
* @param \ArrayObject<array-key, \Generated\Shared\Transfer\SortTransfer> $sortCollection
*
* @return \Orm\Zed\Product\Persistence\SpyProductQuery
* @return \Propel\Runtime\ActiveQuery\ModelCriteria
*/
protected function applyProductConcreteSorting(
SpyProductQuery $productConcreteQuery,
ProductConcreteCriteriaTransfer $productConcreteCriteriaTransfer
): SpyProductQuery {
$sortCollection = $productConcreteCriteriaTransfer->getSortCollection();
protected function applySortingToQuery(
ModelCriteria $query,
ArrayObject $sortCollection
): ModelCriteria {
foreach ($sortCollection as $sortTransfer) {
$productConcreteQuery->orderBy(
$query->orderBy(
$sortTransfer->getFieldOrFail(),
$sortTransfer->getIsAscending() ? Criteria::ASC : Criteria::DESC,
);
}

return $productConcreteQuery;
return $query;
}

/**
* @param \Orm\Zed\Product\Persistence\SpyProductAttributeKeyQuery $productAttributeKeyQuery
* @param \Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
*
* @return \Orm\Zed\Product\Persistence\SpyProductAttributeKeyQuery
*/
protected function applyProductAttributeKeyFilters(
SpyProductAttributeKeyQuery $productAttributeKeyQuery,
ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
): SpyProductAttributeKeyQuery {
$productAttributeKeyConditionsTransfer = $productAttributeKeyCriteriaTransfer->getProductAttributeKeyConditions();
if ($productAttributeKeyConditionsTransfer === null) {
return $productAttributeKeyQuery;
}

if ($productAttributeKeyConditionsTransfer->getKeys() !== []) {
$productAttributeKeyQuery->filterByKey_In($productAttributeKeyConditionsTransfer->getKeys());
}

if ($productAttributeKeyConditionsTransfer->getIsSuper() !== null) {
$productAttributeKeyQuery->filterByIsSuper($productAttributeKeyConditionsTransfer->getIsSuperOrFail());
}

return $productAttributeKeyQuery;
}

/**
Expand Down
11 changes: 11 additions & 0 deletions src/Spryker/Zed/Product/Persistence/ProductRepositoryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
use Generated\Shared\Transfer\ProductAbstractCollectionTransfer;
use Generated\Shared\Transfer\ProductAbstractCriteriaTransfer;
use Generated\Shared\Transfer\ProductAbstractSuggestionCollectionTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer;
use Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer;
use Generated\Shared\Transfer\ProductConcreteCollectionTransfer;
use Generated\Shared\Transfer\ProductConcreteCriteriaTransfer;
use Generated\Shared\Transfer\ProductConcreteTransfer;
Expand Down Expand Up @@ -255,4 +257,13 @@ public function getProductAbstractLocalizedAttributes(array $productAbstractIds)
public function getProductConcreteCollection(
ProductConcreteCriteriaTransfer $productConcreteCriteriaTransfer
): ProductConcreteCollectionTransfer;

/**
* @param \Generated\Shared\Transfer\ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
*
* @return \Generated\Shared\Transfer\ProductAttributeKeyCollectionTransfer
*/
public function getProductAttributeKeyCollection(
ProductAttributeKeyCriteriaTransfer $productAttributeKeyCriteriaTransfer
): ProductAttributeKeyCollectionTransfer;
}
Loading

0 comments on commit a398be4

Please sign in to comment.