From aa245bd14ae453429830b41985637acac8f8d129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Barto=C5=A1?= Date: Fri, 2 Dec 2016 08:57:42 +0100 Subject: [PATCH] Decrease number of items in stock --- src/AppBundle/Entity/WarehouseProduct.php | 8 +++++ src/AppBundle/Facade/OrderFacade.php | 33 +++++++++++++++++++ .../Facade/WarehouseProductFacade.php | 8 ++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/AppBundle/Entity/WarehouseProduct.php b/src/AppBundle/Entity/WarehouseProduct.php index 438f537..4148617 100644 --- a/src/AppBundle/Entity/WarehouseProduct.php +++ b/src/AppBundle/Entity/WarehouseProduct.php @@ -127,4 +127,12 @@ public function setQuantity($quantity) return $this; } + /** + * Decrease quantity by number to minimum 0 + * @param $number + */ + public function decreaseQuantityBy($number) + { + $this->quantity = max($this->quantity - $number, 0); + } } \ No newline at end of file diff --git a/src/AppBundle/Facade/OrderFacade.php b/src/AppBundle/Facade/OrderFacade.php index 3f0fd41..7e649a2 100644 --- a/src/AppBundle/Facade/OrderFacade.php +++ b/src/AppBundle/Facade/OrderFacade.php @@ -3,8 +3,10 @@ namespace AppBundle\Facade; use AppBundle\Entity\Address; use AppBundle\Entity\Cart; +use AppBundle\Entity\CartItem; use AppBundle\Entity\Order; use AppBundle\Entity\User; +use AppBundle\Entity\Warehouse; use AppBundle\FormType\VO\OrderVO; use AppBundle\Repository\AddressRepository; use AppBundle\Repository\OrderRepository; @@ -19,6 +21,8 @@ */ class OrderFacade { + const DEFAULT_STOCK = 1; + /** @var OrderRepository */ private $orderRepository; @@ -43,9 +47,15 @@ class OrderFacade { /** @var CartItemFacade */ private $cartItemFacade; + /** @var WarehouseProductFacade */ + private $warehouseProductFacade; + /** @var Swift_Mailer */ private $swiftMailer; + /** @var CartItem */ + private $cartItem; + public function __construct( EntityManager $entityManager, OrderRepository $orderRepository, @@ -55,6 +65,8 @@ public function __construct( CartFacade $cartFacade, AddressRepository $addressRepository, CartItemFacade $cartItemFacade, + WarehouseProductFacade $warehouseProductFacade, + CartItem $cartItem, Swift_Mailer $swiftMailer ) { $this->entityManager = $entityManager; @@ -65,6 +77,8 @@ public function __construct( $this->cartFacade = $cartFacade; $this->addressRepository = $addressRepository; $this->cartItemFacade = $cartItemFacade; + $this->warehouseProductFacade = $warehouseProductFacade; + $this->cartItem = $cartItem; $this->swiftMailer = $swiftMailer; } @@ -102,6 +116,8 @@ public function create(OrderVO $orderVO) $order->setDeliveryWarehouse($warehouse); } else { + $warehouse = $this->warehouseRepository->find(static::DEFAULT_STOCK); + if ($orderVO->getAddressId() === 0) { $addressVO = $orderVO->getDelivery(); @@ -127,6 +143,8 @@ public function create(OrderVO $orderVO) $this->entityManager->flush($order->getDeliveryAddress()); } + $this->decreaseStockItems($warehouse, $cart); + $this->entityManager->persist($order); $this->entityManager->flush($order); @@ -137,6 +155,21 @@ public function create(OrderVO $orderVO) return $order; } + public function decreaseStockItems(Warehouse $warehouse, Cart $cart) + { + $cartItems = $this->cartItemFacade->findByCart($cart); + + foreach ($cartItems as $cartItem) { + $warehouseProduct = $this->warehouseProductFacade->findByProductAndWarehouse($cartItem->getProduct(), $warehouse); + + $orderedCount = $cartItem->getQuantity(); + + $warehouseProduct->decreaseQuantityBy($orderedCount); + + $this->entityManager->flush($warehouseProduct); + } + } + public function sendOrderEmail($order) { $cart = $order->getCart(); diff --git a/src/AppBundle/Facade/WarehouseProductFacade.php b/src/AppBundle/Facade/WarehouseProductFacade.php index d846d59..ab86a98 100644 --- a/src/AppBundle/Facade/WarehouseProductFacade.php +++ b/src/AppBundle/Facade/WarehouseProductFacade.php @@ -4,6 +4,7 @@ use AppBundle\Entity\Product; use AppBundle\Entity\Warehouse; +use AppBundle\Entity\WarehouseProduct; use AppBundle\Repository\WarehouseProductRepository; class WarehouseProductFacade @@ -21,8 +22,13 @@ public function findByProduct(Product $product) { ]); } + /** + * @param Product $product + * @param Warehouse $warehouse + * @return WarehouseProduct + */ public function findByProductAndWarehouse(Product $product, Warehouse $warehouse) { - return $this->warehouseProductRepository->findBy([ + return $this->warehouseProductRepository->findOneBy([ "product" => $product, "warehouse" => $warehouse, ]);