src/EventSubscriber/OrderPaymentEventSubscriber.php line 41

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 Doctrine\ORM\EntityManagerInterface;
  14.     class OrderPaymentEventSubscriber implements EventSubscriberInterface
  15.     {
  16.         private $dispatcher;
  17.         public function __construct(
  18.             private LoggerInterface $lifecycleLogger,
  19.             private EntityManagerInterface $entityManager,
  20.             OrderEventSubscriber $orderEventSubscriber
  21.         )
  22.         {
  23.             $this->entityManager $entityManager;
  24.             $this->dispatcher = new  \Symfony\Component\EventDispatcher\EventDispatcher();
  25.             $this->dispatcher->addSubscriber($orderEventSubscriber);
  26.         }
  27.         public static function getSubscribedEvents() : array
  28.         {
  29.             return [
  30.                 OrderPaymentEvent::SUCCESS => 'onPaymentSuccess',
  31.                 OrderPaymentEvent::CREATED => 'onPaymentCreated',
  32.             ];
  33.         }
  34.        
  35.         public function onPaymentCreated(OrderPaymentEvent $event)
  36.         {
  37.             $reference $event->getOrderReference();
  38.             // Log the event
  39.             $this->lifecycleLogger->info(OrderPaymentEvent::CREATED.' '.$reference, [
  40.                 'reference'=>$reference,
  41.             ]);
  42.             $panier $this->entityManager->getRepository(ShopPanier::class)->findBy(['reference'=>$reference]);
  43.             if (!$panier) {
  44.                 throw new \Error('Pas de panier avec la référence "'.$reference.'"');
  45.                 return;
  46.             }
  47.             /** @var \App\Entity\ShopPanier */
  48.             $ShopPanier $panier[0];
  49.             $this->lifecycleLogger->info(OrderPaymentEvent::CREATED.' '.$reference, [
  50.                 'panier'=>['id'=>$ShopPanier->getId(), 'reference'=>$ShopPanier->getReference(), 'produit'=>$ShopPanier->getProduit()->getIntitule()],
  51.             ]);
  52.             $user $ShopPanier->getUser();
  53.     
  54.             $entityManager $this->entityManager;
  55.             /** @var \App\Entity\ShopOrderStatus */
  56.             $ShopOrderStatus $entityManager->getRepository(\App\Entity\ShopOrderStatus::class)->findOneBy(['code'=>'created']);
  57.             $this->lifecycleLogger->info(OrderPaymentEvent::CREATED.' '.$reference, [
  58.                 'ShopOrderStatus'=>$ShopOrderStatus->getIntitule(),
  59.             ]);
  60.             // Nouvelle commande
  61.             $order = new ShopOrder();
  62.             $order->setUser($user);
  63.             $order->setStatus($ShopOrderStatus);
  64.             $order->setReference($reference);
  65.             $order->setAdress($ShopPanier->getAdress());
  66.             $order->setTotal(0);
  67.             $entityManager->persist($order);
  68.             $this->lifecycleLogger->info(OrderPaymentEvent::CREATED.' '.$reference, [
  69.                 'order'=>['id'=>NULL'reference'=>$order->getReference(), 'total'=>$order->getTotal()],
  70.             ]);
  71.     
  72.             // Traitement des éléments de la commande
  73.             foreach($panier as $panierElt) {
  74.                 // Nouveau produit de la commande
  75.                 $shopOrderProduct = new ShopOrderProduct();
  76.                 $shopOrderProduct->setShopOrder($order);
  77.                 $shopOrderProduct->setProduct($panierElt->getProduit());
  78.                 $shopOrderProduct->setQuantite($panierElt->getUnit());
  79.                 $shopOrderProduct->setPrice($panierElt->getProduit()->getPrice());
  80.                 $shopOrderProduct->setIntitule($panierElt->getProduit()->getIntitule());
  81.                 $shopOrderProduct->setDescriptif($panierElt->getProduit()->getDescriptif());
  82.                 $shopOrderProduct->setCategorie($panierElt->getProduit()->getCategorie());
  83.                 $shopOrderProduct->setPoints($panierElt->getProduit()->getPoints());
  84.                 $entityManager->persist($shopOrderProduct);
  85.                 $order->setTotal($order->getTotal() + $shopOrderProduct->getTotal());
  86.                 //On supprime les éléments du panier en cours
  87.                 $panierEltToDelete $entityManager->getRepository(ShopPanier::class)->find($panierElt->getId());
  88.                 $entityManager->remove($panierEltToDelete);
  89.             }
  90.             $this->lifecycleLogger->info(OrderPaymentEvent::CREATED.' '.$reference, [
  91.                 'persist'=>['id'=>$order->getId(), 'reference'=>$order->getReference(), 'total'=>$order->getTotal()],
  92.             ]);
  93.             $entityManager->persist($order);
  94.     
  95.             $entityManager->flush();
  96.             $this->lifecycleLogger->info(OrderPaymentEvent::CREATED.' '.$reference, [
  97.                 'flush'=>'done',
  98.             ]);
  99.         }
  100.         public function onPaymentSuccess(OrderPaymentEvent $event)
  101.         {
  102.             $reference $event->getOrderReference();
  103.             // Log the event
  104.             $this->lifecycleLogger->info(OrderPaymentEvent::SUCCESS.' '.$reference, [
  105.                 'reference'=>$reference,
  106.             ]);
  107.             /** @var \App\Entity\ShopOrder */
  108.             $shopOrder $this->entityManager->getRepository(ShopOrder::class)->findOneBy(['reference'=>$reference]);
  109.             if (!$shopOrder) {
  110.                 throw new \Error('Pas de commande avec la référence "'.$reference.'"');
  111.                 return;
  112.             }
  113.             $this->lifecycleLogger->info(OrderPaymentEvent::SUCCESS.' '.$reference, [
  114.                 'shopOrder'=>['id'=>$shopOrder->getId(), 'reference'=>$shopOrder->getReference(), 'total'=>$shopOrder->getTotal()],
  115.             ]);
  116.             $OrderEvent = new OrderEvent($shopOrder);
  117.             $this->dispatcher->dispatch($OrderEventOrderEvent::CONFIRMED);
  118.         }
  119.     }