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. $foundItemsInCategory = true;
  51. break 2;
  52. }
  53. }
  54. }
  55. }
  56. if (!$foundItemsInCategory)
  57. {
  58. $event->stopPropagation();
  59. return;
  60. }
  61. }
  62. if ($printer->getRestrictItemsByCategory() && 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. }