<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Transaction;
use App\Entity\Versement;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class VersementSubscriber implements EventSubscriberInterface
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => [
['updateTransaction', EventPriorities::PRE_WRITE],
['verifyBeforeSaveVersement', EventPriorities::PRE_WRITE],
],
];
}
public function verifyBeforeSaveVersement(ViewEvent $event)
{
$versement = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
if (!$versement instanceof Versement || Request::METHOD_POST !== $method ) {
return ;
}
$totalVersements = 0;
if($versement->getTransaction()){
$totalVersements = array_reduce($versement->getTransaction()->getVersements()->toArray(),function ($v, $item){
return $v + $item->getMontant();
}, 0);
} else if($versement->getInvoice()){
$totalVersements = array_reduce($versement->getInvoice()->getTransaction()->getVersements()->toArray(),function ($v, $item){
return $v + $item->getMontant();
}, 0);
}
$totalToPay = 0;
$totalToPay = $versement->getTransaction() ? $versement->getTransaction()->getAmount() : $versement->getInvoice()->getTransaction()->getAmount();
if($totalVersements == $totalToPay){
throw new \Exception('Cette transaction a déjà été payé dans sa totalité !!!', 500);
}
if($totalVersements + (int)$versement->getMontant() > $totalToPay ){
throw new \Exception('La somme versé est supérieur au reste à payer !!!', 500);
}
}
public function updateTransaction(ViewEvent $event)
{
$versement = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
if (!$versement instanceof Versement || Request::METHOD_POST !== $method ) {
return ;
}
$totalVersements = 0;
if($versement->getTransaction()){
$totalVersements = array_reduce($versement->getTransaction()->getVersements()->toArray(),function ($v, $item){
return $v + $item->getMontant();
}, 0);
} else if($versement->getInvoice()){
$totalVersements = array_reduce($versement->getInvoice()->getTransaction()->getVersements()->toArray(),function ($v, $item){
return $v + $item->getMontant();
}, 0);
}
$newTotal = $totalVersements + $versement->getMontant();
if($versement->getTransaction()){
if($newTotal == $versement->getTransaction()->getAmount() && $newTotal > 0){
$versement->getTransaction()->setIsPayed(true);
$this->em->flush();
}
} else if($versement->getInvoice()){
if($newTotal == $versement->getInvoice()->getTransaction()->getAmount() && $newTotal > 0){
$versement->getInvoice()->getTransaction()->setIsPayed(true);
$this->em->flush();
}
}
}
}