<?php
namespace App\EventSubscriber;
use App\Entity\ProductStock;
use App\Event\Produit\StockMvtEvent;
use App\Repository\ProductStockRepository;
use App\Service\ProductHelper;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class StockSubscriber implements EventSubscriberInterface
{
/**
* @var ProductStockRepository
*/
private $productStockRepository;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var ProductHelper
*/
private $productHelper;
public function __construct(ProductStockRepository $productStockRepository, EntityManagerInterface $entityManager, ProductHelper $productHelper)
{
$this->productStockRepository = $productStockRepository;
$this->entityManager = $entityManager;
$this->productHelper = $productHelper;
}
public static function getSubscribedEvents(): array
{
return [
StockMvtEvent::class => ['onStockUpdated', 100],
];
}
public function onStockUpdated(StockMvtEvent $event)
{
$mvt = $event->getMvt();
// On ajoute le prix du produit
$product = $mvt->getProduct();
$tarif = $this->productHelper->getBestTarif($product);
if ($tarif) {
$mvt->setHt($tarif->getHt())
->setTtc($tarif->getTtc())
->setTaxe($tarif->getTva());
}
// Mise à jour du stock réel
$stock = $this->productStockRepository->findOneBy(['product' => $mvt->getProduct(), 'structure' => $mvt->getStructure()]);
if (null === $stock) {
$stock = new ProductStock();
$stock->setStructure($mvt->getStructure())
->setProduct($mvt->getProduct())
->setSeuilCommande(0)
->setQuantite(0)
->setInclureCommandeAuto(true);
}
if ($mvt->getTypeMouvement() == 'in') {
$stock->setQuantite($stock->getQuantite() + $mvt->getQuantite());
} else {
$stock->setQuantite($stock->getQuantite() - $mvt->getQuantite());
}
$this->entityManager->persist($stock);
$this->entityManager->flush();
}
}