src/EventSubscriber/OrderPaymentEventSubscriber.php line 40

Open in your IDE?
  1. <?php
  2.     namespace App\EventSubscriber;
  3.     /* 
  4.     bin/stripe listen --forward-to localhost:4242/cultureroute/public/stripe/webhook
  5.     */
  6.     use App\Event\OrderPaymentEvent;
  7.     use App\Event\OrderEvent;
  8.     use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9.     use Psr\Log\LoggerInterface;
  10.     use App\Entity\ShopPanier;
  11.     use App\Entity\ShopOrder;
  12.     use App\Entity\ShopOrderProduct;
  13.     use App\Entity\User;
  14.     use Doctrine\ORM\EntityManagerInterface;
  15.     class OrderPaymentEventSubscriber implements EventSubscriberInterface
  16.     {
  17.         private $entityManager;
  18.         private $logger;
  19.         public function __construct(LoggerInterface $lifecycleLoggerEntityManagerInterface $entityManagerOrderEventSubscriber $orderEventSubscriber)
  20.         {
  21.             $this->logger $lifecycleLogger;
  22.             $this->entityManager $entityManager;
  23.             $this->dispatcher = new  \Symfony\Component\EventDispatcher\EventDispatcher();
  24.             $this->dispatcher->addSubscriber($orderEventSubscriber);
  25.         }
  26.         public static function getSubscribedEvents() : array
  27.         {
  28.             return [
  29.                 OrderPaymentEvent::SUCCESS => 'onPaymentSuccess',
  30.                 OrderPaymentEvent::CREATED => 'onPaymentCreated',
  31.             ];
  32.         }
  33.        
  34.         public function onPaymentCreated(OrderPaymentEvent $event)
  35.         {
  36.             $reference $event->getOrderReference();
  37.             // Log the event
  38.             $this->logger->info(OrderPaymentEvent::CREATED, [
  39.                 'reference'=>$reference,
  40.             ]);
  41.             $panier $this->entityManager->getRepository(ShopPanier::class)->findBy(['reference'=>$reference]);
  42.             if (!$panier) {
  43.                 throw new \Error('Pas de panier avec la référence "'.$reference.'"');
  44.                 return;
  45.             }
  46.             $ShopPanier $panier[0];
  47.             $user $ShopPanier->getUser();
  48.     
  49.             $entityManager $this->entityManager;
  50.             $ShopOrderStatus $entityManager->getRepository(\App\Entity\ShopOrderStatus::class)->findOneBy(['code'=>'created']);
  51.             // Nouvelle commande
  52.             $order = new ShopOrder();
  53.             $order->setUser($user);
  54.             $order->setStatus($ShopOrderStatus);
  55.             $order->setReference($reference);
  56.             $order->setAdress($ShopPanier->getAdress());
  57.             $order->setTotal(0);
  58.             $entityManager->persist($order);
  59.     
  60.             // Traitement des éléments de la commande
  61.             foreach($panier as $panierElt) {
  62.                 // Nouveau produit de la commande
  63.                 $shopOrderProduct = new ShopOrderProduct();
  64.                 $shopOrderProduct->setShopOrder($order);
  65.                 $shopOrderProduct->setProduct($panierElt->getProduit());
  66.                 $shopOrderProduct->setQuantite($panierElt->getUnit());
  67.                 $shopOrderProduct->setPrice($panierElt->getProduit()->getPrice());
  68.                 $shopOrderProduct->setIntitule($panierElt->getProduit()->getIntitule());
  69.                 $shopOrderProduct->setDescriptif($panierElt->getProduit()->getDescriptif());
  70.                 $shopOrderProduct->setCategorie($panierElt->getProduit()->getCategorie());
  71.                 $shopOrderProduct->setPoints($panierElt->getProduit()->getPoints());
  72.                 $entityManager->persist($shopOrderProduct);
  73.                 $order->setTotal($order->getTotal() + $shopOrderProduct->getTotal());
  74.                 //On supprime les éléments du panier en cours
  75.                 $panierEltToDelete $entityManager->getRepository(ShopPanier::class)->find($panierElt->getId());
  76.                 $entityManager->remove($panierEltToDelete);
  77.             }
  78.             $entityManager->persist($order);
  79.     
  80.             $entityManager->flush();
  81.         }
  82.         public function onPaymentSuccess(OrderPaymentEvent $event)
  83.         {
  84.             $reference $event->getOrderReference();
  85.             // Log the event
  86.             $this->logger->info(OrderPaymentEvent::SUCCESS, [
  87.                 'reference'=>$reference,
  88.             ]);
  89.             $shopOrder $this->entityManager->getRepository(ShopOrder::class)->findOneBy(['reference'=>$reference]);
  90.             if (!$shopOrder) {
  91.                 throw new \Error('Pas de commande avec la référence "'.$reference.'"');
  92.                 return;
  93.             }
  94.             $OrderEvent = new OrderEvent($shopOrder);
  95.             $this->dispatcher->dispatch($OrderEventOrderEvent::CONFIRMED);
  96.         }
  97.     }