Skip to content

Commit

Permalink
use correct way to save stock
Browse files Browse the repository at this point in the history
  • Loading branch information
daniel-rose committed May 4, 2018
1 parent dc3c867 commit a569bf7
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 27 deletions.
65 changes: 38 additions & 27 deletions src/FondOfSpryker/Zed/StockApi/Business/Model/StockApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,9 @@
use FondOfSpryker\Zed\StockApi\Business\Mapper\EntityMapperInterface;
use FondOfSpryker\Zed\StockApi\Business\Mapper\TransferMapperInterface;
use FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToAvailabilityInterface;
use FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToProductInterface;
use FondOfSpryker\Zed\StockApi\Dependency\QueryContainer\StockApiToApiInterface;

use Generated\Shared\Transfer\ApiDataTransfer;

use Generated\Shared\Transfer\StockProductTransfer;
use Orm\Zed\Availability\Persistence\SpyAvailability;
use Spryker\Zed\Api\Business\Exception\EntityNotFoundException;
use Spryker\Zed\Availability\Persistence\AvailabilityQueryContainerInterface;

Expand All @@ -41,6 +38,11 @@ class StockApi implements StockApiInterface
*/
protected $stockFacade;

/**
* @var \FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToProductInterface
*/
protected $productFacade;

/**
* @var \Spryker\Zed\Availability\Persistence\AvailabilityQueryContainerInterface
*/
Expand All @@ -51,19 +53,22 @@ class StockApi implements StockApiInterface
* @param \FondOfSpryker\Zed\StockApi\Business\Mapper\EntityMapperInterface $entityMapper
* @param \FondOfSpryker\Zed\StockApi\Business\Mapper\TransferMapperInterface $transferMapper
* @param \FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToAvailabilityInterface $stockFacade
* @param \FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToProductInterface $productFacade
* @param \Spryker\Zed\Availability\Persistence\AvailabilityQueryContainerInterface $availabilityQueryContainer
*/
public function __construct(
StockApiToApiInterface $apiQueryContainer,
EntityMapperInterface $entityMapper,
TransferMapperInterface $transferMapper,
StockApiToAvailabilityInterface $stockFacade,
StockApiToProductInterface $productFacade,
AvailabilityQueryContainerInterface $availabilityQueryContainer
) {
$this->apiQueryContainer = $apiQueryContainer;
$this->entityMapper = $entityMapper;
$this->transferMapper = $transferMapper;
$this->stockFacade = $stockFacade;
$this->productFacade = $productFacade;
$this->availabilityQueryContainer = $availabilityQueryContainer;
}

Expand All @@ -77,47 +82,53 @@ public function __construct(
*/
public function update($sku, ApiDataTransfer $apiDataTransfer)
{
$availability = $this->getAvailability($sku);
$idProductConcrete = $this->productFacade->findProductConcreteIdBySku($sku);

if (!$availability) {
throw new EntityNotFoundException(sprintf('Availability not found for sku %s', $sku));
if ($idProductConcrete === null) {
throw new EntityNotFoundException(sprintf('Concrete product not found for sku %s', $sku));
}

$stockProductTransferList = $this->stockFacade->getStockProductsByIdProduct($idProductConcrete);

if (count($stockProductTransferList) === 0) {
throw new EntityNotFoundException(sprintf('There is no product stock for sku %s', $sku));
}

$stockProductTransfer = $this->createStockProductTransfer($stockProductTransferList, $apiDataTransfer);

if ($stockProductTransfer === null) {
throw new EntityNotFoundException(sprintf('There is no product stock for sku %s and given warehouse', $sku));
}

$stockProductTransfer = $this->createStockProductTransfer($sku, $apiDataTransfer, $availability);
$stockProductTransfer = $this->stockFacade->updateStockProduct($stockProductTransfer);

return $this->apiQueryContainer->createApiItem($stockProductTransfer, $sku);
}

/**
* @param string $sku
* @param \Generated\Shared\Transfer\StockProductTransfer[] $stockProductTransferList
* @param \Generated\Shared\Transfer\ApiDataTransfer $apiDataTransfer
* @param \Orm\Zed\Availability\Persistence\SpyAvailability $availability
*
* @return \Generated\Shared\Transfer\StockProductTransfer
*/
private function createStockProductTransfer(string $sku, ApiDataTransfer $apiDataTransfer, SpyAvailability $availability)
protected function createStockProductTransfer(array $stockProductTransferList, ApiDataTransfer $apiDataTransfer)
{
$data = (array)$apiDataTransfer->getData();
$preparedStockProductTransfer = null;

$stockProductTransfer = new StockProductTransfer();
$stockProductTransfer->fromArray($data, true);
$stockProductTransfer->setSku($sku);
$stockProductTransfer->setIdStockProduct($availability->getIdAvailability());

return $stockProductTransfer;
}
foreach ($stockProductTransferList as $stockProductTransfer) {
if ($stockProductTransfer->getStockType() !== $data['stock_type']) {
continue;
}

/**
* @param string $sku
*
* @return mixed
*/
public function getAvailability(string $sku)
{
$spyAvailabilityQuery = $this->availabilityQueryContainer->querySpyAvailabilityBySku($sku);
$availability = $spyAvailabilityQuery->findOneOrCreate();
$stockProductTransfer->setIsNeverOutOfStock($data['is_never_out_of_stock']);
$stockProductTransfer->setQuantity($data['quantity']);

return $stockProductTransfer;
}

return $availability;
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,14 @@ protected function getQueryContainer()
{
return $this->getProvidedDependency(StockApiDependencyProvider::QUERY_CONTAINER);
}

/**
* @return \FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToAvailabilityInterface
*
* @throws \Spryker\Zed\Kernel\Exception\Container\ContainerKeyNotFoundException
*/
protected function getProductFacade()
{
return $this->getProvidedDependency(StockApiDependencyProvider::FACADE_STOCK);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace FondOfSpryker\Zed\StockApi\Dependency\Facade;

class StockApiToProductBridge implements StockApiToProductInterface
{
/**
* @var \Spryker\Zed\Product\Business\ProductFacadeInterface
*/
protected $productFacade;

/**
* @param \Spryker\Zed\Product\Business\ProductFacadeInterface $productFacade
*/
public function __construct($productFacade)
{
$this->productFacade = $productFacade;
}

/**
* @param string $sku
*
* @return int|null
*/
public function findProductConcreteIdBySku($sku)
{
return $this->productFacade->findProductConcreteIdBySku($sku);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace FondOfSpryker\Zed\StockApi\Dependency\Facade;

interface StockApiToProductInterface
{
/**
* @param string $sku
*
* @return int|null
*/
public function findProductConcreteIdBySku($sku);
}
18 changes: 18 additions & 0 deletions src/FondOfSpryker/Zed/StockApi/StockApiDependencyProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
namespace FondOfSpryker\Zed\StockApi;

use FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToAvailabilityBridge;
use FondOfSpryker\Zed\StockApi\Dependency\Facade\StockApiToProductBridge;
use FondOfSpryker\Zed\StockApi\Dependency\QueryContainer\StockApiToApiBridge;
use Spryker\Zed\Kernel\AbstractBundleDependencyProvider;
use Spryker\Zed\Kernel\Container;
Expand All @@ -20,6 +21,8 @@ class StockApiDependencyProvider extends AbstractBundleDependencyProvider

const FACADE_STOCK = 'FACADE_STOCK';

const FACADE_PRODUCT = 'FACADE_PRODUCT';

/**
* @param \Spryker\Zed\Kernel\Container $container
*
Expand All @@ -32,6 +35,7 @@ public function provideBusinessLayerDependencies(Container $container)
$container = $this->provideApiQueryContainer($container);
$container = $this->provideQueryContainer($container);
$container = $this->provideStockFacade($container);
$container = $this->provideProductFacade($container);

return $container;
}
Expand Down Expand Up @@ -75,4 +79,18 @@ protected function provideStockFacade(Container $container)
};
return $container;
}

/**
* @param \Spryker\Zed\Kernel\Container $container
*
* @return \Spryker\Zed\Kernel\Container
*/
protected function provideProductFacade(Container $container)
{
$container[static::FACADE_PRODUCT] = function (Container $container) {
return new StockApiToProductBridge($container->getLocator()->product()->facade());
};

return $container;
}
}

0 comments on commit a569bf7

Please sign in to comment.