vendor/boldr/receipt-printer-bundle/src/EventSubscriber/EventSubscriber.php line 72

Open in your IDE?
  1. <?php
  2. namespace Boldr\Shop\ReceiptPrinterBundle\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Boldr\Shop\ShopBundle\Event\OrderStateUpdatedEvent;
  5. use Boldr\Shop\ReceiptPrinterBundle\Printer\PrintJobManager;
  6. use Boldr\Shop\ReceiptPrinterBundle\Event\QueueReceiptEvent;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Exception;
  9. use Psr\Log\LoggerInterface;
  10. class EventSubscriber implements EventSubscriberInterface
  11. {
  12.     public function __construct(
  13.         private readonly PrintJobManager $printJobManager,
  14.         private readonly array $receiptOrderStates,
  15.         private readonly EntityManagerInterface $entityManager,
  16.         private readonly LoggerInterface $logger
  17.     ) {}
  18.     public static function getSubscribedEvents()
  19.     {
  20.         return [
  21.             OrderStateUpdatedEvent::class => [
  22.                 ['onOrderStateChanged'10]
  23.             ],
  24.             QueueReceiptEvent::class => [
  25.                 ['onQueueReceipt'10]
  26.             ]
  27.         ];
  28.     }
  29.     public function onQueueReceipt(QueueReceiptEvent $event)
  30.     {
  31.         $printer $event->getPrinter();
  32.         $orders $event->getOrders();
  33.         // Filter out printers that don't print this category
  34.         if ($printer->getRestrictItemsByCategory())
  35.         {
  36.             $foundItemsInCategory false;
  37.             $printerCategoryIds = [];
  38.             foreach ($printer->getRestrictCategories() as $category)
  39.             {
  40.                 $printerCategoryIds[$category->getId()] = true;
  41.             }
  42.             foreach ($orders as $order)
  43.             {
  44.                 foreach ($order->getItems() as $item)
  45.                 {
  46.                     foreach ($item->getProductVariant()->getProduct()->getCategories() as $category)
  47.                     {
  48.                         if (isset($printerCategoryIds[$category->getId()]))
  49.                         {
  50.                             return;
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.             if (!$foundItemsInCategory)
  56.             {
  57.                 $event->stopPropagation();
  58.                 return;
  59.             }
  60.         }
  61.     }
  62.     public function onOrderStateChanged(OrderStateUpdatedEvent $event)
  63.     {
  64.         if (in_array($event->getNewState(), $this->receiptOrderStates))
  65.         {
  66.             // Execute transaction to prevent double receipts
  67.             $sql 'INSERT INTO shop_receipt_printer_initial_receipt (`order_id`) VALUES (:id)';
  68.             $stmt $this->entityManager->getConnection()->prepare($sql);
  69.             $stmt->bindValue('id'$event->getOrder()->getId());
  70.             try
  71.             {
  72.                 $stmt->executeStatement();
  73.                 $this->printJobManager->printReceiptForOrders([$event->getOrder()]);
  74.             }
  75.             catch (Exception $ex)
  76.             {
  77.                 $this->logger->info('Prevented double receipt for order nr. '$event->getOrder()->getNumber() .' (id #'$event->getOrder()->getId() .')', [
  78.                     'exception' => $ex
  79.                 ]);
  80.             }
  81.         }
  82.     }
  83. }