<?php
/*
* Disclaimer: This source code is protected by copyright law and by
* international conventions.
*
* Any reproduction or partial or total distribution of the source code, by any
* means whatsoever, is strictly forbidden.
*
* Anyone not complies with these provisions will be guilty of the offense of
* infringement and the penal sanctions provided for by law.
*
* © 2023 All rights reserved.
*/
namespace App\EventListener;
use App\Entity\Intervention;
use App\Entity\ProviderProduct;
use App\Entity\Stock;
use App\Event\InterventionEvent;
use App\Factory\StockFactory;
use App\Repository\InterventionRepository;
use App\Repository\ProviderProductRepository;
use App\Repository\StockRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* Class ProviderProductOrderDeliveryListener
*
* @author Rémy P. <r.peyron@ingeno.eu>
* @package App\EventListener
*/
class InterventionListener
{
/**
* @var ManagerRegistry
*/
private $manager;
public function __construct (ManagerRegistry $manager)
{
$this->manager = $manager;
}
public function onPostUpdated (InterventionEvent $event)
{
$entity = $event->getIntervention();
if (!$entity->isStep6Valid()) return;
if ($entity->getStockUpdated()) return;
if (!$entity->getInvoice()) return;
if (!$entity->getAgency()) return;
$agency = $entity->getAgency();
/** @var ProviderProductRepository $providerProductRepository */
$providerProductRepository = $this->manager->getRepository(ProviderProduct::class);
/** @var InterventionRepository $interventionRepository */
$interventionRepository = $this->manager->getRepository(Intervention::class);
/** @var StockRepository $stockRepository */
$stockRepository = $this->manager->getRepository(Stock::class);
$em = $this->manager->getManager();
foreach ($entity->getInvoice()->getDetails() as $detail) {
$product = $providerProductRepository->findOneBy(['code' => $detail->getCode()]);
if (!$product) continue;
$stock = $stockRepository->findOneBy(['agency' => $agency->getId(), 'product' => $product->getId()]);
if (!$stock) {
$stock = StockFactory::create();
$stock
->setQuantity(0.00)
->setProduct($product)
->setAgency($agency);
$em->persist($stock);
$em->flush();
}
$stockRepository->update($stock->setQuantity($stock->getQuantity() - $detail->getQuantity()));
}
$interventionRepository->update($entity->setStockUpdated(true));
}
}