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

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.                             $foundItemsInCategory true;
  51.                             break 2;
  52.                         }
  53.                     }
  54.                 }
  55.             }
  56.             if (!$foundItemsInCategory)
  57.             {
  58.                 $event->stopPropagation();
  59.                 return;
  60.             }
  61.         }
  62.         if (count($printer->onlyContainingCategories) > 0)
  63.         {
  64.             // Stop propagation, if the order contains a product that does not as one of its categories have any of the categories in the printer's onlyContainingCategories
  65.             foreach ($orders as $order)
  66.             {
  67.                 foreach ($order->getItems() as $item)
  68.                 {
  69.                     $productCategories $item->getProductVariant()->getProduct()->getCategories();
  70.                     $productCategoryIds array_map(fn($category) => $category->getId(), $productCategories->toArray());
  71.                     $found false;
  72.                     foreach ($printer->onlyContainingCategories as $category)
  73.                     {
  74.                         if (in_array($category->getId(), $productCategoryIds))
  75.                         {
  76.                             $found true;
  77.                             break;
  78.                         }
  79.                     }
  80.                     if (!$found)
  81.                     {
  82.                         $event->stopPropagation();
  83.                         return;
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.     }
  89.     public function onOrderStateChanged(OrderStateUpdatedEvent $event)
  90.     {
  91.         if (in_array($event->getNewState(), $this->receiptOrderStates))
  92.         {
  93.             // Execute transaction to prevent double receipts
  94.             $sql 'INSERT INTO shop_receipt_printer_initial_receipt (`order_id`) VALUES (:id)';
  95.             $stmt $this->entityManager->getConnection()->prepare($sql);
  96.             $stmt->bindValue('id'$event->getOrder()->getId());
  97.             try
  98.             {
  99.                 $stmt->executeStatement();
  100.                 $this->printJobManager->printReceiptForOrders([$event->getOrder()]);
  101.             }
  102.             catch (Exception $ex)
  103.             {
  104.                 $this->logger->info('Prevented double receipt for order nr. '$event->getOrder()->getNumber() .' (id #'$event->getOrder()->getId() .')', [
  105.                     'exception' => $ex
  106.                 ]);
  107.             }
  108.         }
  109.     }
  110. }