src/Library/Subscribers/GrapperSubscriber.php line 172

Open in your IDE?
  1. <?php
  2. namespace App\Library\Subscribers;
  3. use App\Library\Database;
  4. use App\Library\Event\GrapperEvent;
  5. use App\Library\Event\GrapperProcessEvent;
  6. use App\Library\Event\GrapperQueueEvent;
  7. use App\models\acount;
  8. use App\models\eadr;
  9. use App\models\grapperLizenz;
  10. use App\models\grapperQueue;
  11. use App\models\grapperStatistik;
  12. use DateTime;
  13. use Doctrine\DBAL\Exception;
  14. use Doctrine\DBAL\Statement;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Process\Process;
  17. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  18. class GrapperSubscriber implements EventSubscriberInterface
  19. {
  20.     const COMMAND '%s %s %s/bin/console rce:grapper:send %s %s';
  21.     const PHP_BIN 'php8.2';
  22.     const ENV_BIN '/usr/bin/env';
  23.     /**
  24.      * Defining required events
  25.      * @return \array[][]
  26.      */
  27.     public static function getSubscribedEvents()
  28.     {
  29.         return [
  30.             GrapperEvent::EVENT => [
  31.                 [ 'processCustomers'1000 ],
  32.             ],
  33.             GrapperQueueEvent::EVENT_FETCH=>[
  34.                 ['initQueueLizenz',900],
  35.                 ['insertQueueSendEmails'850],
  36.             ],
  37.             GrapperProcessEvent::EVENT_FETCH=>[
  38.                 ['initQueueLizenz',900],
  39.             ],
  40.             GrapperQueueEvent::EVENT_RUN=>[
  41.               ['grapperExecute'1000],
  42.             ],
  43.             GrapperEvent::EVENT_PROCESS_CUSTOMER=>[
  44.                 [ 'initLizenz'1000 ],
  45.                 [ 'insertSendEmails'500 ],
  46.                 [ 'grapperStore'100 ],
  47.             ],
  48.             GrapperQueueEvent::EVENT_POST=>[
  49.                 [
  50.                     'finishQueueSend'100,
  51.                 ]
  52.             ],
  53.         ];
  54.     }
  55.     /**
  56.      * @param EventDispatcherInterface $eventDispatcher
  57.      * @param Database $database
  58.      */
  59.     public function __construct(
  60.         private readonly EventDispatcherInterface $eventDispatcher,
  61.         private readonly Database $database
  62.     ){
  63.     }
  64.     public function initLizenz(GrapperEvent $event):void{
  65.         if($event->getCustomer() !== null && !$event->getLizenz() instanceof grapperLizenz){
  66.             /** @var grapperLizenz|null $lizenz */
  67.             $lizenz $this->database->getData(grapperLizenz::class, grapperLizenz::LIZENZ, [$event->getCustomer()->getLizenzid()]);
  68.             if($lizenz===null){
  69.                 $event->setNoLicense(true);
  70.             }else{
  71.                 $event->setNoLicense(false);
  72.                 $event->setLizenz($lizenz);
  73.                 $event->getCustomer()->setLizenz($lizenz);
  74.             }
  75.         }
  76.     }
  77.     /**
  78.      * @param GrapperQueueEvent $event
  79.      * @return void
  80.      */
  81.     public function grapperExecute(GrapperQueueEvent $event): void
  82.     {
  83.         $path realpath(__DIR__.'/../../../');
  84.         $i=0;
  85.         foreach($event->getAddresses() as $row){
  86.               $event->addVerboseOutput('Remaining Mails: '.$event->getAcount()->getLizenz()->getRemainingMails().' <=> Sending Email '.$i);
  87.               dump($i);
  88.               if($i $event->getAcount()->getLizenz()->getRemainingMails()){
  89.                   
  90.               $i++;
  91.                 /** @var eadr $row */
  92.                 $command sprintf(self::COMMANDself::ENV_BINself::PHP_BIN$path$event->getAcount()->getId(), $row->getId()).' -vvv';
  93.                 $prozess Process::fromShellCommandline($command);
  94.                 $prozess->run();
  95.                 $event->addVerboseOutput($prozess->getOutput());
  96.                 if($prozess->isSuccessful()){
  97.                     $event->addSuccess();
  98.                     $event->addSuccessAddress($row->getEmail());
  99.                 }else{
  100.                     $event->addFailure();
  101.                     $event->addFailureAddress($row->getEmail());
  102.                 }
  103.               }
  104.         }
  105.     }
  106.     public function initQueueLizenz(GrapperQueueEvent|GrapperProcessEvent $event):void{
  107.         if($event->getAcount() !== null){
  108.             /** @var grapperLizenz|null $lizenz */
  109.             $lizenz $this->database->getData(grapperLizenz::class, grapperLizenz::LIZENZ, [$event->getAcount()->getLizenzid()]);
  110.             if($lizenz===null){
  111.                 $event->stopPropagation();
  112.             }else{
  113.                 $event->getAcount()->setLizenz($lizenz);
  114.             }
  115.         }
  116.     }
  117.     /**
  118.      * Query Customers and execute one grepper run per customer
  119.      * @param GrapperEvent $event
  120.      * @return void
  121.      * @throws Exception
  122.      */
  123.     public function processCustomers(GrapperEvent $event): void
  124.     {
  125.         if($event->isIndividualCustomer()){
  126.             $event->addVerboseOutput('Processing Specific Customer');
  127.             $stmt $this->database->getConnection()->prepare(acount::GET_SPECIFIC_GRAPPER_CUSTOMERS);
  128.             $stmt->bindValue(1$event->getIndividualCustomer());
  129.         }else{
  130.             $event->addVerboseOutput('Processing All Customers');
  131.             $stmt $this->database->getConnection()->prepare(acount::GET_ALL_GRAPPER_CUSTOMERS);
  132.         }
  133.         $resultSet $stmt->executeQuery();
  134.         while($row $resultSet->fetchAssociative()){
  135.             $customer = new acount();
  136.             $customer->init($row);
  137.             $event->setCustomer($customer);
  138.             $this->eventDispatcher->dispatch($eventGrapperEvent::EVENT_PROCESS_CUSTOMER);
  139.         }
  140.     }
  141.     public function insertSendEmails(GrapperEvent $event): void
  142.     {
  143.         if($event->getCustomer() instanceof acount){
  144.             $stmt $this->database->getConnection()->prepare(grapperStatistik::SELECT_COUNTER);
  145.             $stmt->bindValue(1$event->getCustomer()->getId());
  146.             $stmt->bindValue(2date('Y') . '-' date('m') . '-01 00:00:00');
  147.             $stmt->bindValue(3date('Y') . '-' date('m') . '-' date('t') . '-00:00:00');
  148.             $rowResult $stmt->executeQuery();
  149.         if($event->getLizenz()===null){
  150.                 file_put_contents(__DIR__.'/../../../var/log/error.log'date('d.m.Y H:i:s '). PHP_EOL.var_export($eventtrue).PHP_EOL.'=============='.PHP_EOLFILE_APPEND);
  151.                 $event->stopPropagation();
  152.                 return;
  153.             }
  154.             $event->getLizenz()->setRemainingMails($event->getLizenz()->getMailsPerMonth() - $rowResult->rowCount());
  155.             $event->getCustomer()->getLizenz()->setRemainingMails($event->getLizenz()->getMailsPerMonth() - $rowResult->rowCount());
  156.             $event->addVerboseOutput('Processing Customer '.$event->getCustomer()->getId().' Adding Available Messages of '.$event->getLizenz()->getRemainingMails());
  157.         }
  158.     }
  159.     public function grapperStore(GrapperEvent $event):void{
  160.         if($event->getCustomer() instanceof acount){
  161.               $now = new \DateTime();
  162.               $next $event->getCustomer()->getLastSend();
  163.               if(empty($next)){
  164.             $next = new \DateTime();
  165.               }
  166.               $delta = new \DateInterval($event->getCustomer()->getDatesBetweenSend());
  167.               $next->add($delta);
  168.               if($next >= $now){
  169.             $event->addVerboseOutput('Processing Customer '.$event->getCustomer()->getId().' Job is not up for Prossing unitl: '.$next->format('d.m.Y H:i:s'));
  170.               }else{
  171.                 if($event->getLizenz()->getMailsPerMonth() > 0){
  172.                     /** @var grapperQueue $jobExists */
  173.                     $stmt $this->database->getConnection()->prepare(grapperQueue::CHECK_JOB_EXISTS);
  174.                     $stmt->bindValue(1$event->getCustomer()->getId());
  175.                     $rowResult $stmt->executeQuery();
  176.                     $event->addVerboseOutput('Processing Customer '.$event->getCustomer()->getId().' Jobs Exist: '.($rowResult->rowCount() < 1?'no':'yes'));
  177.                     if($rowResult->rowCount() < 1){
  178.                         $queue = new grapperQueue(null, (new DateTime()), null$event->getCustomer()->getId());
  179.                         $event->addVerboseOutput('Processing Customer '.$event->getCustomer()->getId().' adding Job');
  180.                         $this->database->insert(grapperQueue::INSERT_QUEUE_STEP$queue->toArrayInsert());
  181.                         $this->database->update(acount::UPDATE_GRAPPER_LAST_SEND, [(new \DateTime())->format('Y-m-d H:i:s')],[$event->getCustomer()->getId()]);
  182.                     }else{
  183.                         $event->addVerboseOutput('Processing Customer '.$event->getCustomer()->getId().' Job already exists with id: '.$jobExists->getId());
  184.                     }
  185.                 }
  186.               }
  187.         }
  188.     }
  189.     /**
  190.      * @param GrapperQueueEvent $event
  191.      * @return void
  192.      * @throws Exception
  193.      */
  194.     public function insertQueueSendEmails(GrapperQueueEvent $event):void{
  195.         if($event->getAcount() instanceof acount && $event->getAcount()->getId() > 0){
  196.             $stmt $this->database->getConnection()->prepare(grapperStatistik::SELECT_COUNTER);
  197.             $stmt->bindValue(1$event->getAcount()->getId());
  198.             $stmt->bindValue(2date('Y') . '-' date('m') . '-01 00:00:00');
  199.             $stmt->bindValue(3date('Y') . '-' date('m') . '-' date('t') . '-00:00:00');
  200.             $rowResult $stmt->executeQuery();
  201.             $event->getAcount()->getLizenz()->setRemainingMails($event->getAcount()->getLizenz()->getMailsPerMonth() - $rowResult->rowCount());
  202.             if($event->getAcount()->getLizenz()->getRemainingMails() > $event->getAcount()->getMailsPerBatch()){
  203.             $event->getAcount()->getLizenz()->setRemainingMails($event->getAcount()->getMailsPerBatch());
  204.             }
  205.         }
  206.     }
  207.     /**
  208.      * @throws Exception
  209.      */
  210.     public function finishQueueSend(GrapperQueueEvent $event):void{
  211.         /** @var grapperQueue $item */
  212.         $item $this->database->getData(grapperQueue::class, grapperQueue::CHECK_JOB_EXISTS, [0=>$event->getAcount()->getId()]);
  213.         if($event->getSuccess() > 0){
  214.                 return;
  215.         }
  216.         //@todo check if all queue items have been processed
  217.         $item->setFinished(new DateTime());
  218.         $stmt $this->database->getConnection()->prepare(grapperQueue::UPDATE_QUEUE_STEP);
  219.         $stmt->bindValue(2$event->getQueue()->getId());
  220.         $stmt->bindValue(1$item->getFinished()->format('Y-m-d H:i:s'));
  221.         $stmt->executeQuery();
  222.         $stmt $this->database->getConnection()->prepare(acount::UPDATE_LAST_SEND);
  223.         $stmt->bindValue(1$event->getQueue()->getId());
  224.         $stmt->executeQuery();
  225.     }
  226. }