/**
  * Schedules EmailBody for processing.
  *
  * @param EmailBody $emailBody
  */
 protected function scheduleProcess(EmailBody $emailBody)
 {
     /*
      * Retrieve all process definitions to trigger
      */
     $definitions = $this->processStorage->getService()->getProcessDefinitionNames();
     $definitions = $this->getDefinitionRepository()->findBy(['name' => $definitions]);
     /*
      * Trigger process definitions with provided data
      */
     foreach ($definitions as $definition) {
         $trigger = new ProcessTrigger();
         $trigger->setDefinition($definition);
         $data = new ProcessData();
         $data->set('data', $emailBody);
         $this->handler->handleTrigger($trigger, $data);
     }
 }
 /**
  * Schedules EmailBody for processing.
  *
  * @param EmailBody $emailBody
  */
 protected function scheduleProcess(EmailBody $emailBody)
 {
     /*
      * Retrieve all process definitions to trigger
      */
     $definitions = $this->processStorage->getService()->getProcessDefinitionNames();
     $definitions = $this->getDefinitionRepository()->findBy(['name' => $definitions]);
     /*
      * Trigger process definitions with provided data
      */
     foreach ($definitions as $definition) {
         $trigger = new ProcessTrigger();
         //id must be unique otherwise in cache will be saved and runned first definition with id = null
         $trigger->setId($definition->getName());
         $trigger->setDefinition($definition);
         $data = new ProcessData();
         $data->set('data', $emailBody);
         $this->handler->handleTrigger($trigger, $data);
     }
 }
 /**
  * @param PostFlushEventArgs $args
  */
 public function postFlush(PostFlushEventArgs $args)
 {
     if (!$this->enabled) {
         return;
     }
     $entityManager = $args->getEntityManager();
     // handle processes
     $hasQueuedOrHandledProcesses = false;
     $handledProcesses = [];
     foreach ($this->scheduledProcesses as &$entityProcesses) {
         while ($entityProcess = array_shift($entityProcesses)) {
             /** @var ProcessTrigger $trigger */
             $trigger = $entityProcess['trigger'];
             /** @var ProcessData $data */
             $data = $entityProcess['data'];
             if (!$this->handler->isTriggerApplicable($trigger, $data)) {
                 $this->logger->debug('Process trigger is not applicable', $trigger, $data);
                 continue;
             }
             if ($trigger->isQueued() || $this->forceQueued) {
                 $processJob = $this->queueProcess($trigger, $data);
                 $entityManager->persist($processJob);
                 $this->queuedJobs[(int) $trigger->getTimeShift()][$trigger->getPriority()][] = $processJob;
             } else {
                 $this->logger->debug('Process handled', $trigger, $data);
                 $this->handler->handleTrigger($trigger, $data);
                 $handledProcesses[] = $entityProcess;
             }
             $hasQueuedOrHandledProcesses = true;
         }
     }
     // save both handled entities and queued process jobs
     if ($hasQueuedOrHandledProcesses) {
         $entityManager->flush();
         foreach ($handledProcesses as $entityProcess) {
             /** @var ProcessTrigger $trigger */
             $trigger = $entityProcess['trigger'];
             /** @var ProcessData $data */
             $data = $entityProcess['data'];
             $this->handler->finishTrigger($trigger, $data);
         }
     }
     // delete unused processes
     if ($this->removedEntityHashes) {
         $this->registry->getRepository('OroWorkflowBundle:ProcessJob')->deleteByHashes($this->removedEntityHashes);
         $this->removedEntityHashes = array();
     }
     // create queued JMS jobs
     $this->createJobs($entityManager);
 }
 public function testFinishJob()
 {
     $processTrigger = $this->getMock('Oro\\Bundle\\WorkflowBundle\\Entity\\ProcessTrigger');
     $processData = $this->getMockBuilder('Oro\\Bundle\\WorkflowBundle\\Model\\ProcessData')->disableOriginalConstructor()->getMock();
     $processJob = $this->getMock('Oro\\Bundle\\WorkflowBundle\\Entity\\ProcessJob');
     $processJob->expects($this->once())->method('getProcessTrigger')->will($this->returnValue($processTrigger));
     $processJob->expects($this->once())->method('getData')->will($this->returnValue($processData));
     $this->eventDispatcher->expects($this->once())->method('dispatch')->with(ProcessEvents::HANDLE_AFTER_FLUSH, $this->callback(function ($event) use($processTrigger, $processData) {
         $this->assertInstanceOf('Oro\\Bundle\\WorkflowBundle\\Event\\ProcessHandleEvent', $event);
         $this->assertAttributeSame($processTrigger, 'processTrigger', $event);
         $this->assertAttributeSame($processData, 'processData', $event);
         return true;
     }));
     $this->handler->finishJob($processJob);
 }