<?php
namespace App\EventSubscriber;
/*
bin/stripe listen --forward-to localhost:4242/cultureroute/public/stripe/webhook
*/
use App\Event\OrderPaymentEvent;
use App\Event\OrderEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Psr\Log\LoggerInterface;
use App\Entity\ShopPanier;
use App\Entity\ShopOrder;
use App\Entity\ShopOrderProduct;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
class OrderPaymentEventSubscriber implements EventSubscriberInterface
{
private $entityManager;
private $logger;
public function __construct(LoggerInterface $lifecycleLogger, EntityManagerInterface $entityManager, OrderEventSubscriber $orderEventSubscriber)
{
$this->logger = $lifecycleLogger;
$this->entityManager = $entityManager;
$this->dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
$this->dispatcher->addSubscriber($orderEventSubscriber);
}
public static function getSubscribedEvents() : array
{
return [
OrderPaymentEvent::SUCCESS => 'onPaymentSuccess',
OrderPaymentEvent::CREATED => 'onPaymentCreated',
];
}
public function onPaymentCreated(OrderPaymentEvent $event)
{
$reference = $event->getOrderReference();
// Log the event
$this->logger->info(OrderPaymentEvent::CREATED, [
'reference'=>$reference,
]);
$panier = $this->entityManager->getRepository(ShopPanier::class)->findBy(['reference'=>$reference]);
if (!$panier) {
throw new \Error('Pas de panier avec la référence "'.$reference.'"');
return;
}
$ShopPanier = $panier[0];
$user = $ShopPanier->getUser();
$entityManager = $this->entityManager;
$ShopOrderStatus = $entityManager->getRepository(\App\Entity\ShopOrderStatus::class)->findOneBy(['code'=>'created']);
// Nouvelle commande
$order = new ShopOrder();
$order->setUser($user);
$order->setStatus($ShopOrderStatus);
$order->setReference($reference);
$order->setAdress($ShopPanier->getAdress());
$order->setTotal(0);
$entityManager->persist($order);
// Traitement des éléments de la commande
foreach($panier as $panierElt) {
// Nouveau produit de la commande
$shopOrderProduct = new ShopOrderProduct();
$shopOrderProduct->setShopOrder($order);
$shopOrderProduct->setProduct($panierElt->getProduit());
$shopOrderProduct->setQuantite($panierElt->getUnit());
$shopOrderProduct->setPrice($panierElt->getProduit()->getPrice());
$shopOrderProduct->setIntitule($panierElt->getProduit()->getIntitule());
$shopOrderProduct->setDescriptif($panierElt->getProduit()->getDescriptif());
$shopOrderProduct->setCategorie($panierElt->getProduit()->getCategorie());
$shopOrderProduct->setPoints($panierElt->getProduit()->getPoints());
$entityManager->persist($shopOrderProduct);
$order->setTotal($order->getTotal() + $shopOrderProduct->getTotal());
//On supprime les éléments du panier en cours
$panierEltToDelete = $entityManager->getRepository(ShopPanier::class)->find($panierElt->getId());
$entityManager->remove($panierEltToDelete);
}
$entityManager->persist($order);
$entityManager->flush();
}
public function onPaymentSuccess(OrderPaymentEvent $event)
{
$reference = $event->getOrderReference();
// Log the event
$this->logger->info(OrderPaymentEvent::SUCCESS, [
'reference'=>$reference,
]);
$shopOrder = $this->entityManager->getRepository(ShopOrder::class)->findOneBy(['reference'=>$reference]);
if (!$shopOrder) {
throw new \Error('Pas de commande avec la référence "'.$reference.'"');
return;
}
$OrderEvent = new OrderEvent($shopOrder);
$this->dispatcher->dispatch($OrderEvent, OrderEvent::CONFIRMED);
}
}