public function setUp()
 {
     parent::setUp();
     $this->super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super');
     $savedWorkflows = SavedWorkflow::getAll();
     $this->savedWorkflow = $savedWorkflows[0];
     $models = WorkflowModelTestItem::getAll();
     $this->model = $models[0];
 }
 public static function createByTimeSavedWorkflow(array $timeTrigger = array(), array $triggers = array(), array $actions = array(), array $messages = array())
 {
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'some workflow';
     $savedWorkflow->description = 'description';
     $savedWorkflow->moduleClassName = 'WorkflowsTestModule';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_BY_TIME;
     $data[ComponentForWorkflowForm::TYPE_TIME_TRIGGER] = $timeTrigger;
     $data[ComponentForWorkflowForm::TYPE_TRIGGERS] = $triggers;
     $data[ComponentForWorkflowForm::TYPE_ACTIONS] = $actions;
     $data[ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES] = $messages;
     $savedWorkflow->serializedData = serialize($data);
     $savedWorkflow->isActive = true;
     $saved = $savedWorkflow->save();
     assert($saved);
     // Not Coding Standard
     return $savedWorkflow;
 }
 public static function setUpBeforeClass()
 {
     parent::setUpBeforeClass();
     ContactsModule::loadStartingData();
     $super = User::getByUsername('super');
     $super->primaryEmail = new Email();
     $super->primaryEmail->emailAddress = '*****@*****.**';
     assert($super->save());
     // Not Coding Standard
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'some workflow';
     $savedWorkflow->description = 'description';
     $savedWorkflow->moduleClassName = 'moduleClassName';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = 'some type';
     $savedWorkflow->serializedData = serialize(array('something'));
     $saved = $savedWorkflow->save();
     assert($saved);
     // Not Coding Standard
     self::$savedWorkflow = $savedWorkflow;
 }
 public static function setUpBeforeClass()
 {
     parent::setUpBeforeClass();
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'some workflow';
     $savedWorkflow->description = 'description';
     $savedWorkflow->moduleClassName = 'moduleClassName';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = 'some type';
     $savedWorkflow->serializedData = serialize(array('something'));
     $saved = $savedWorkflow->save();
     if (!$saved) {
         throw new FailedToSaveModelException();
     }
     self::$savedWorkflow = $savedWorkflow;
     $model = new WorkflowModelTestItem();
     $model->lastName = 'Green';
     $model->string = 'string';
     $saved = $model->save();
     if (!$saved) {
         throw new FailedToSaveModelException();
     }
     self::$testModel = $model;
 }
 protected function clearNotificationsWorkflowsAndEmailMessages()
 {
     $notifications = Notification::getAll();
     foreach ($notifications as $notification) {
         $notification->delete();
     }
     $emailMessages = EmailMessage::getAll();
     foreach ($emailMessages as $emailMessage) {
         $emailMessage->delete();
     }
     $workflows = SavedWorkflow::getAll();
     foreach ($workflows as $workflow) {
         $workflow->delete();
     }
 }
Esempio n. 6
0
 /**
  * Special method to load ByTimeWorkflowInQueue models
  */
 public function actionLoadWorkflowMessageInQueue()
 {
     if (!Group::isUserASuperAdministrator(Yii::app()->user->userModel)) {
         throw new NotSupportedException();
     }
     $model = new Account();
     $model->name = 'test account';
     $saved = $model->save();
     if (!$saved) {
         throw new NotSupportedException();
     }
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'Test for demo Message Queue model';
     $savedWorkflow->description = 'description';
     $savedWorkflow->moduleClassName = 'AccountsModule';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW;
     $savedWorkflow->type = Workflow::TYPE_BY_TIME;
     $savedWorkflow->isActive = false;
     $savedWorkflow->order = 1;
     $savedWorkflow->serializedData = serialize(array(ComponentForWorkflowForm::TYPE_TRIGGERS => array(), ComponentForWorkflowForm::TYPE_ACTIONS => array(), ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES => array()));
     $saved = $savedWorkflow->save();
     if (!$saved) {
         throw new NotSupportedException();
     }
     for ($i = 1; $i < 6; $i++) {
         $workflowMessageInQueue = new WorkflowMessageInQueue();
         $workflowMessageInQueue->processDateTime = '2014-03-0' . $i . ' 00:00:00';
         $workflowMessageInQueue->savedWorkflow = $savedWorkflow;
         $workflowMessageInQueue->modelClassName = get_class($model);
         $workflowMessageInQueue->modelItem = $model;
         $workflowMessageInQueue->serializedData = serialize(array());
         $workflowMessageInQueue->triggeredByUser = Yii::app()->user->userModel;
         $saved = $workflowMessageInQueue->save();
         if (!$saved) {
             throw new NotSupportedException();
         }
     }
 }
 /**
  * @depends testMessageQueueController
  */
 public function testCopyingWorkflow()
 {
     $savedWorkflows = SavedWorkflow::getAll();
     $this->assertEquals(1, count($savedWorkflows));
     $this->setGetArray(array('type' => 'OnSave', 'id' => $savedWorkflows[0]->id));
     $data = array();
     $data['OnSaveWorkflowWizardForm'] = array('description' => 'someDescription', 'isActive' => '0', 'name' => 'someName', 'triggerOn' => Workflow::TRIGGER_ON_NEW, 'triggersStructure' => '1 AND 2', 'moduleClassName' => 'WorkflowsTestModule');
     $this->setPostArray($data);
     $this->runControllerWithExitExceptionAndGetContent('workflows/default/save');
     $savedWorkflows = SavedWorkflow::getAll();
     $this->assertEquals(1, count($savedWorkflows));
     //Now test copying
     $this->setGetArray(array('type' => 'OnSave', 'id' => $savedWorkflows[0]->id, 'isBeingCopied' => true));
     $this->runControllerWithExitExceptionAndGetContent('workflows/default/save');
     $savedWorkflows = SavedWorkflow::getAll();
     $this->assertEquals(2, count($savedWorkflows));
 }
 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 testSetAndGet
  */
 public function testGetModelsToProcess($pageSize)
 {
     $this->assertEquals(1, WorkflowMessageInQueue::getCount());
     $models = WorkflowMessageInQueue::getModelsToProcess(10);
     $this->assertEquals(1, count($models));
     //Now have one that is not ready for processing. It should still only get 1
     $model = new WorkflowModelTestItem();
     $model->lastName = 'Green2';
     $model->string = 'string2';
     $saved = $model->save();
     $this->assertTrue($saved);
     $savedWorkflows = SavedWorkflow::getByName('some workflow');
     $workflowMessageInQueue = new WorkflowMessageInQueue();
     $workflowMessageInQueue->modelClassName = get_class($model);
     $workflowMessageInQueue->modelItem = $model;
     $workflowMessageInQueue->processDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() + 86400);
     $workflowMessageInQueue->savedWorkflow = $savedWorkflows[0];
     $workflowMessageInQueue->serializedData = serialize(array('something'));
     $saved = $workflowMessageInQueue->save();
     $this->assertTrue($saved);
     $models = WorkflowMessageInQueue::getModelsToProcess(10);
     $this->assertEquals(1, count($models));
 }
 /**
  * Check if picklist modification caused some issues with workflow triggers and if yes notify users
  * @return array
  * @throws NotSupportedException
  */
 public static function getWorkflowsWithInvalidTriggerCustomFieldValue()
 {
     $savedWorkflows = SavedWorkflow::getAll();
     $workflows = array();
     foreach ($savedWorkflows as $savedWorkflow) {
         $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
         $hasInvalidCustomFieldValue = false;
         foreach ($workflow->getTriggers() as $trigger) {
             $modelClassName = $trigger->getModelClassName();
             $customFieldAttributeNames = CustomFieldUtil::getCustomFieldAttributeNames($modelClassName);
             $triggerAttributeName = $trigger->getAttribute();
             if (in_array($triggerAttributeName, $customFieldAttributeNames)) {
                 $customFieldData = CustomFieldDataModelUtil::getDataByModelClassNameAndAttributeName($modelClassName, $triggerAttributeName);
                 $allCustomFieldValues = unserialize($customFieldData->serializedData);
                 // Check with triggers that allow single value
                 if (in_array($trigger->getOperator(), array(OperatorRules::TYPE_EQUALS, OperatorRules::TYPE_DOES_NOT_EQUAL, OperatorRules::TYPE_BECOMES, OperatorRules::TYPE_WAS))) {
                     if (!in_array($trigger->value, $allCustomFieldValues)) {
                         $hasInvalidCustomFieldValue = true;
                         break;
                     }
                 } elseif (in_array($trigger->getOperator(), array(OperatorRules::TYPE_BECOMES_ONE_OF, OperatorRules::TYPE_WAS_ONE_OF, OperatorRules::TYPE_ONE_OF))) {
                     $triggerSelectedCustomFieldValues = MultiSelectDropDownSanitizerUtil::getCustomFieldValuesFromValueString($trigger->value);
                     foreach ($triggerSelectedCustomFieldValues as $triggerValue) {
                         if (!in_array($triggerValue, $allCustomFieldValues)) {
                             $hasInvalidCustomFieldValue = true;
                             break 2;
                         }
                     }
                 }
             }
         }
         if ($hasInvalidCustomFieldValue) {
             $workflows[] = $workflow;
         }
     }
     return $workflows;
 }
 /**
  * @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');
     }
 }
 /**
  * Test sending an email that should go out as a processing that this job would typically do.
  * Also tests that item does not get trashed when deleting the WorkflowMessageInQueue.
  * Also tests that if there is more than one emailmessage against the workflow, that it does not send
  * to all of them
  * @depends testWorkflowMessageInQueueProperlySavesWithoutTrashingRelatedModelItem
  */
 public function testRun()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $emailTemplate = new EmailTemplate();
     $emailTemplate->builtType = EmailTemplate::BUILT_TYPE_PASTED_HTML;
     $emailTemplate->name = 'the name';
     $emailTemplate->modelClassName = 'Account';
     $emailTemplate->type = 2;
     $emailTemplate->subject = 'subject';
     $emailTemplate->textContent = 'sample text content';
     $saved = $emailTemplate->save();
     $this->assertTrue($saved);
     $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount());
     $model = ContactTestHelper::createContactByNameForOwner('Jason', Yii::app()->user->userModel);
     $model->primaryEmail->emailAddress = '*****@*****.**';
     $saved = $model->save();
     $this->assertTrue($saved);
     $modelId = $model->id;
     $model->forget();
     $model = Contact::getById($modelId);
     $trigger = array('attributeIndexOrDerivedType' => 'firstName', 'operator' => OperatorRules::TYPE_EQUALS, 'durationInterval' => '333');
     $actions = array(array('type' => ActionForWorkflowForm::TYPE_UPDATE_SELF, ActionForWorkflowForm::ACTION_ATTRIBUTES => array('description' => array('shouldSetValue' => '1', 'type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => 'some new description'))));
     $emailMessages = array();
     $emailMessages[0]['emailTemplateId'] = $emailTemplate->id;
     $emailMessages[0]['sendFromType'] = EmailMessageForWorkflowForm::SEND_FROM_TYPE_DEFAULT;
     $emailMessages[0]['sendAfterDurationSeconds'] = '0';
     $emailMessages[0][EmailMessageForWorkflowForm::EMAIL_MESSAGE_RECIPIENTS] = array(array('type' => WorkflowEmailMessageRecipientForm::TYPE_DYNAMIC_TRIGGERED_MODEL, 'audienceType' => EmailMessageRecipient::TYPE_TO));
     $emailMessages[1]['emailTemplateId'] = $emailTemplate->id;
     $emailMessages[1]['sendFromType'] = EmailMessageForWorkflowForm::SEND_FROM_TYPE_DEFAULT;
     $emailMessages[1]['sendAfterDurationSeconds'] = '10000';
     $emailMessages[1][EmailMessageForWorkflowForm::EMAIL_MESSAGE_RECIPIENTS] = array(array('type' => WorkflowEmailMessageRecipientForm::TYPE_DYNAMIC_TRIGGERED_MODEL, 'audienceType' => EmailMessageRecipient::TYPE_TO));
     $savedWorkflow = new SavedWorkflow();
     $savedWorkflow->name = 'some workflow';
     $savedWorkflow->description = 'description';
     $savedWorkflow->moduleClassName = 'ContactsModule';
     $savedWorkflow->triggerOn = Workflow::TRIGGER_ON_NEW_AND_EXISTING;
     $savedWorkflow->type = Workflow::TYPE_ON_SAVE;
     $data[ComponentForWorkflowForm::TYPE_TRIGGERS] = array($trigger);
     $data[ComponentForWorkflowForm::TYPE_ACTIONS] = $actions;
     $data[ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES] = $emailMessages;
     $savedWorkflow->serializedData = serialize($data);
     $savedWorkflow->isActive = true;
     $saved = $savedWorkflow->save();
     $this->assertTrue($saved);
     WorkflowTestHelper::createExpiredWorkflowMessageInQueue($model, $savedWorkflow, serialize(array($emailMessages[1])));
     RedBeanModelsCache::forgetAll(true);
     //simulates page change, required to confirm Item does not get trashed
     $this->assertEquals(1, WorkflowMessageInQueue::getCount());
     $job = new WorkflowMessageInQueueJob();
     $this->assertTrue($job->run());
     $this->assertEquals(0, WorkflowMessageInQueue::getCount());
     RedBeanModelsCache::forgetAll(true);
     //simulates page change, required to confirm Item does not get trashed
     $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
 }
 public function testMakeEmailMessageForWorkflowFormByQueueModelAndWorkflow()
 {
     $model = ContactTestHelper::createContactByNameForOwner('Jason', Yii::app()->user->userModel);
     $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);
     $emailMessage = null;
     $emailMessage['emailTemplateId'] = 5;
     $emailMessage['sendFromType'] = EmailMessageForWorkflowForm::SEND_FROM_TYPE_DEFAULT;
     $emailMessage['sendAfterDurationType'] = TimeDurationUtil::DURATION_TYPE_DAY;
     $emailMessage['sendAfterDurationInterval'] = '44';
     $emailMessage[EmailMessageForWorkflowForm::EMAIL_MESSAGE_RECIPIENTS] = array(array('type' => WorkflowEmailMessageRecipientForm::TYPE_DYNAMIC_TRIGGERED_MODEL, 'audienceType' => EmailMessageRecipient::TYPE_TO));
     $workflowMessageInQueue = WorkflowTestHelper::createExpiredWorkflowMessageInQueue($model, $savedWorkflow, serialize(array($emailMessage)));
     $workflow = new Workflow();
     $workflow->setModuleClassName('WorkflowsTestModule');
     $workflow->setType(Workflow::TYPE_ON_SAVE);
     $emailMessageForWorkflowForm = WorkflowEmailMessagesUtil::makeEmailMessageForWorkflowFormByQueueModelAndWorkflow($workflowMessageInQueue, $workflow);
     $this->assertEquals(5, $emailMessageForWorkflowForm->emailTemplateId);
     $this->assertEquals(EmailMessageForWorkflowForm::SEND_FROM_TYPE_DEFAULT, $emailMessageForWorkflowForm->sendFromType);
     $this->assertEquals(TimeDurationUtil::DURATION_TYPE_DAY, $emailMessageForWorkflowForm->sendAfterDurationType);
     $this->assertEquals(44, $emailMessageForWorkflowForm->sendAfterDurationInterval);
     $this->assertEquals(1, count($emailMessageForWorkflowForm->getEmailMessageRecipients()));
 }
 /**
  * @depends testResolveWorkflowToSavedWorkflow
  */
 public function testMakeWorkflowBySavedWorkflow()
 {
     $savedWorkflows = SavedWorkflow::getAll();
     $this->assertEquals(1, count($savedWorkflows));
     $savedWorkflow = $savedWorkflows[0];
     $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
     $triggers = $workflow->getTriggers();
     $this->assertEquals('WorkflowsTestModule', $workflow->getModuleClassName());
     $this->assertEquals('myFirstWorkflow', $workflow->getName());
     $this->assertEquals('aDescription', $workflow->getDescription());
     $this->assertTrue($workflow->getIsActive());
     $this->assertEquals(5, $workflow->getOrder());
     $this->assertEquals(Workflow::TRIGGER_ON_NEW, $workflow->getTriggerOn());
     $this->assertEquals(Workflow::TYPE_ON_SAVE, $workflow->getType());
     $this->assertEquals('1 and 2 or 3 or 4', $workflow->getTriggersStructure());
     $this->assertCount(4, $triggers);
 }
 /**
  * @depends testGetActiveByModuleClassNameAndIsNewModel
  */
 public function testGetAllByModuleClassName()
 {
     $savedWorkflows = SavedWorkflow::getAllByModuleClassName('WorkflowsTestModule');
     $this->assertEquals(2, count($savedWorkflows));
 }
 /**
  * @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 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();
         }
     }
 }
 public static function getWorkflowsMissingRequiredActionAttributes()
 {
     $savedWorkflows = SavedWorkflow::getAll();
     $workflows = array();
     foreach ($savedWorkflows as $savedWorkflow) {
         $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
         $missingRequired = false;
         foreach ($workflow->getActions() as $action) {
             if ($action->isModelActionVariant() && !$action->isTypeAnUpdateVariant() && $action->isMissingRequiredActionAttributes()) {
                 $missingRequired = true;
                 break;
             }
         }
         if ($missingRequired) {
             $workflows[] = $workflow;
         }
     }
     return $workflows;
 }