<?php
namespace App\Events;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\PersFertiOrgSpecComposition;
use App\Exception\PersFertiOrgSpecError;
use App\Repository\ParametrageRepository;
use App\Repository\PersFertiOrgSpecCompositionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
class AddPersFertiOrgSpecCompositionSubscriber implements EventSubscriberInterface
{
private $security;
/** @var EntityManagerInterface */
private $manager;
private $persFertiOrgSpecCompositionRepository;
private $parametrageRepository;
public function __construct(Security $security, PersFertiOrgSpecCompositionRepository $persFertiOrgSpecCompositionRepository,ParametrageRepository $parametrageRepository)
{
$this->security = $security;
$this->persFertiOrgSpecCompositionRepository = $persFertiOrgSpecCompositionRepository;
$this->parametrageRepository = $parametrageRepository;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['setForPersFertiOrgSpecComposition',EventPriorities::PRE_VALIDATE]
];
}
public function setForPersFertiOrgSpecComposition(ViewEvent $event){
$result = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
//Vérifier les contraintes de %
if($result instanceof PersFertiOrgSpecComposition && ($method == 'POST' || $method == 'PATCH')) {
$persFertiOrgSpecComposition=$this->persFertiOrgSpecCompositionRepository->findBy(array('persFertiOrgSpec' => $result->getPersFertiOrgSpec()));
$somme=0;
foreach ($persFertiOrgSpecComposition as $elt){
if($elt->getId() != $event->getRequest()->attributes->get('id')) $somme+=$elt->getQPourc();
}
$restant = 100 - $somme;
//ajouter l'élément courant
$somme+= $result->getQPourc();
if($somme > 100){
throw new PersFertiOrgSpecError('La composition totale de votre effluent ne peut pas dépasser 100%. Il reste '.floor($restant).'%.');
}
$messageInverse = $this->parametrageRepository->findOneBy(array('code' => 'FERTI_ORG_INVERSION_MESSAGE'));
if($result->getNNh4Pourc() > $result->getNPourc()){
throw new PersFertiOrgSpecError($messageInverse->getValeur());
}
/*
$ecart = $this->parametrageRepository->findOneBy(array('code' => 'FERTI_ORG_ECART_POURC'));
$messageEcart = $this->parametrageRepository->findOneBy(array('code' => 'FERTI_ORG_ECART_MESSAGE'));
$ecartNPourcBas=number_format($result->getRegFertiOrgType()->getNPourc() - ($result->getRegFertiOrgType()->getNPourc()*$ecart->getValeur()/100),2);
$ecartNPourcHaut=number_format($result->getRegFertiOrgType()->getNPourc() + ($result->getRegFertiOrgType()->getNPourc()*$ecart->getValeur()/100),2);
$ecartNNh4cBas=number_format($result->getRegFertiOrgType()->getNNh4Pourc() - ($result->getRegFertiOrgType()->getNNh4Pourc()*$ecart->getValeur()/100),2);
$ecarNNh4Haut=number_format($result->getRegFertiOrgType()->getNNh4Pourc() + ($result->getRegFertiOrgType()->getNNh4Pourc()*$ecart->getValeur()/100),2);
$messageNPourc = '. Votre valeur Teneur N total doit etre située entre '.($ecartNPourcBas*10).' et '.($ecartNPourcHaut*10);
$messageNNh4 = '. Votre valeur Teneur N-NH4 total doit etre située entre '.($ecartNNh4cBas*10).' et '.($ecarNNh4Haut*10);
if($result->getNPourc() < $ecartNPourcBas || $result->getNPourc() > $ecartNPourcHaut){
throw new PersFertiOrgSpecError($messageEcart->getValeur().$messageNPourc);
}
if($result->getNNh4Pourc() < $ecartNNh4cBas || $result->getNNh4Pourc() > $ecarNNh4Haut){
throw new PersFertiOrgSpecError($messageEcart->getValeur().$messageNNh4);
}
*/
}
}
}