public function testSetAndGetModel()
 {
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'some workflow';
     $savedWorkflow->description = 'description';
     $savedWorkflow->moduleClassName = 'WorkflowsTestModule';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = 'some type';
     $savedWorkflow->order = 1;
     $savedWorkflow->serializedData = serialize(array('something'));
     $savedWorkflow->isActive = true;
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     $savedWorkflowId = $savedWorkflow->id;
     $savedWorkflow->forget();
     $savedWorkflow = SavedWorkflow::getById($savedWorkflowId);
     $this->assertEquals('some workflow', $savedWorkflow->name);
     $this->assertEquals('description', $savedWorkflow->description);
     $this->assertEquals('WorkflowsTestModule', $savedWorkflow->moduleClassName);
     $this->assertEquals(Workflow::TRIGGER_ON_NEW, $savedWorkflow->triggerOn);
     $this->assertEquals('some type', $savedWorkflow->type);
     $this->assertEquals(serialize(array('something')), $savedWorkflow->serializedData);
 }
 /**
  * @param Workflow $workflow
  * @param EmailMessageForWorkflowForm $emailMessage
  * @param RedBeanModel $model
  * @param User $triggeredByUser
  * @throws FailedToSaveModelException
  */
 protected static function processEmailMessageAfterSave(Workflow $workflow, EmailMessageForWorkflowForm $emailMessage, RedBeanModel $model, User $triggeredByUser)
 {
     if ($emailMessage->sendAfterDurationInterval == 0) {
         $helper = new WorkflowEmailMessageProcessingHelper($emailMessage, $model, $triggeredByUser);
         $helper->process();
     } else {
         $emailMessageData = SavedWorkflowToWorkflowAdapter::makeArrayFromEmailMessageForWorkflowFormAttributesData(array($emailMessage));
         $workflowMessageInQueue = new WorkflowMessageInQueue();
         $workflowMessageInQueue->processDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime($emailMessage->resolveNewTimeStampForDuration(time()));
         $workflowMessageInQueue->savedWorkflow = SavedWorkflow::getById((int) $workflow->getId());
         $workflowMessageInQueue->modelClassName = get_class($model);
         $workflowMessageInQueue->modelItem = $model;
         $workflowMessageInQueue->serializedData = serialize($emailMessageData);
         $workflowMessageInQueue->triggeredByUser = $triggeredByUser;
         $saved = $workflowMessageInQueue->save();
         if (!$saved) {
             throw new FailedToSaveModelException();
         }
     }
 }
 /**
  * @depends testEditAction
  */
 public function testManageOrder()
 {
     //Create a second workflow
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'some workflow2';
     $savedWorkflow->description = 'description2';
     $savedWorkflow->moduleClassName = 'WorkflowsTestModule';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $savedWorkflow->serializedData = serialize(array(ComponentForWorkflowForm::TYPE_TRIGGERS => array(), ComponentForWorkflowForm::TYPE_ACTIONS => array(), ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES => array()));
     $savedWorkflow->isActive = true;
     $savedWorkflow->order = 2;
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     //Go to manage order
     $this->resetGetArray();
     $this->resetPostArray();
     $this->runControllerWithNoExceptionsAndGetContent('workflows/default/manageOrder');
     //loadOrderByModule - where none exist
     $this->setGetArray(array('moduleClassName' => 'OpportunitiesModule'));
     $content = $this->runControllerWithExitExceptionAndGetContent('workflows/default/loadOrderByModule');
     $this->assertEquals('{"dataToOrder":"false"}', $content);
     //load orderByModule - where at least one exists
     $this->setGetArray(array('moduleClassName' => 'WorkflowsTestModule'));
     $content = $this->runControllerWithNoExceptionsAndGetContent('workflows/default/loadOrderByModule');
     $this->assertNotEquals('{"dataToOrder":"false"}', $content);
     //saveOrder, switching order
     $savedWorkflows = SavedWorkflow::getAll('order');
     $this->assertEquals(2, count($savedWorkflows));
     $firstOrder = $savedWorkflows[0]->order;
     $secondOrder = $savedWorkflows[1]->order;
     $this->resetGetArray();
     $this->setPostArray(array('SavedWorkflow' => array('moduleClassName' => 'WorkflowsTestModule', 'savedWorkflowIds' => array($savedWorkflows[1]->id, $savedWorkflows[0]->id))));
     $content = $this->runControllerWithExitExceptionAndGetContent('workflows/default/saveOrder');
     $this->assertEquals('{"message":"Order saved successfully.","type":"message"}', $content);
     // Not Coding Standard
     $this->assertEquals($firstOrder, SavedWorkflow::getById($savedWorkflows[1]->id)->order);
     $this->assertEquals($secondOrder, SavedWorkflow::getById($savedWorkflows[0]->id)->order);
 }
 protected function resolveSavedWorkflowAndWorkflowByPostData(array $postData, &$savedWorkflow, &$workflow, $type, $id = null, $isBeingCopied = false)
 {
     if ($id == null) {
         $this->resolveCanCurrentUserAccessWorkflows();
         $savedWorkflow = new SavedWorkflow();
         $workflow = new Workflow();
         $workflow->setType($type);
     } elseif ($isBeingCopied) {
         $savedWorkflow = new SavedWorkflow();
         $oldWorkflow = SavedWorkflow::getById(intval($id));
         ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($oldWorkflow);
         ZurmoCopyModelUtil::copy($oldWorkflow, $savedWorkflow);
         $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
     } else {
         $savedWorkflow = SavedWorkflow::getById(intval($id));
         ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($savedWorkflow);
         $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
     }
     DataToWorkflowUtil::resolveWorkflowByWizardPostData($workflow, $postData, WorkflowToWizardFormAdapter::getFormClassNameByType($type));
 }
 /**
  * @depends testResolveProcessDateTimeByWorkflowAndModelWithPseudoNullDateTime
  */
 public function testResolveOrder()
 {
     $this->assertCount(0, SavedWorkflow::getAll());
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'the name';
     $savedWorkflow->moduleClassName = 'AccountsModule';
     $savedWorkflow->serializedData = serialize(array('some data'));
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $this->assertNull($savedWorkflow->order);
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(1, $savedWorkflow->order);
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     $savedWorkflowId1 = $savedWorkflow->id;
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'the name 2';
     $savedWorkflow->moduleClassName = 'AccountsModule';
     $savedWorkflow->serializedData = serialize(array('some data 2'));
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $this->assertNull($savedWorkflow->order);
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(2, $savedWorkflow->order);
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     $savedWorkflowId2 = $savedWorkflow->id;
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'the name 3';
     $savedWorkflow->moduleClassName = 'AccountsModule';
     $savedWorkflow->serializedData = serialize(array('some data 2'));
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $this->assertNull($savedWorkflow->order);
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(3, $savedWorkflow->order);
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     $savedWorkflowId3 = $savedWorkflow->id;
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'the name 4';
     $savedWorkflow->moduleClassName = 'ContactsModule';
     $savedWorkflow->serializedData = serialize(array('some data'));
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $this->assertNull($savedWorkflow->order);
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(1, $savedWorkflow->order);
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     $savedWorkflowId4 = $savedWorkflow->id;
     $savedWorkflow = SavedWorkflow::getById($savedWorkflowId2);
     $this->assertEquals(2, $savedWorkflow->order);
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(2, $savedWorkflow->order);
     //Change the moduleClassName to opportunities, it should show 1
     $savedWorkflow->moduleClassName = 'OpportunitiesModule';
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(1, $savedWorkflow->order);
     //Delete the workflow. When creating a new AccountsWorkflow, it should show order 4 since the max
     //is still 3.
     $deleted = $savedWorkflow->delete();
     $this->assertTrue($deleted);
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'the name 5';
     $savedWorkflow->moduleClassName = 'AccountsModule';
     $savedWorkflow->serializedData = serialize(array('some data 2'));
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $this->assertNull($savedWorkflow->order);
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(4, $savedWorkflow->order);
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     //Try to resolve order for the same
     SavedWorkflowsUtil::resolveOrder($savedWorkflow);
     $this->assertEquals(4, $savedWorkflow->order);
     //Resolve order when copying.  It should increase
     SavedWorkflowsUtil::resolveOrder($savedWorkflow, true);
     $this->assertEquals(5, $savedWorkflow->order);
 }
 /**
  * @param Workflow $workflow
  * @param RedBeanModel $model
  * @throws FailedToSaveModelException
  */
 protected static function processToByTimeWorkflowInQueue(Workflow $workflow, RedBeanModel $model)
 {
     assert('$workflow->getId() > 0');
     try {
         $byTimeWorkflowInQueue = ByTimeWorkflowInQueue::resolveByWorkflowIdAndModel(SavedWorkflow::getById((int) $workflow->getId()), $model);
         $byTimeWorkflowInQueue->processDateTime = static::resolveProcessDateTimeByWorkflowAndModel($workflow, $model);
         $saved = $byTimeWorkflowInQueue->save();
         if (!$saved) {
             throw new FailedToSaveModelException();
         }
     } catch (ValueForProcessDateTimeIsNullException $e) {
         //For now just log this exception. If this exception is thrown it means a date or dateTime
         //somehow was set to empty, so we can't properly process this.
         WorkflowUtil::handleProcessingException($e, 'application.modules.workflows.utils.SavedWorkflowsUtil.processToByTimeWorkflowInQueue');
     }
 }