public function execute(&$params)
 {
     $workflowId = $this->parseOption('workflowId', $params);
     $stageNumber = $this->parseOption('stageNumber', $params);
     $model = $params['model'];
     $type = lcfirst(X2Model::getModuleName(get_class($model)));
     $modelId = $model->id;
     $workflowStatus = Workflow::getWorkflowStatus($workflowId, $modelId, $type);
     $message = '';
     if (Workflow::validateAction('revert', $workflowStatus, $stageNumber, '', $message)) {
         list($started, $workflowStatus) = Workflow::revertStage($workflowId, $stageNumber, $model, $workflowStatus);
         assert($started);
         return array(true, Yii::t('studio', 'Stage "{stageName}" reverted for {recordName}', array('{stageName}' => $workflowStatus['stages'][$stageNumber]['name'], '{recordName}' => $model->getLink())));
     } else {
         return array(false, $message);
     }
 }
Esempio n. 2
0
 public function actionRevertStage($workflowId, $stageNumber, $modelId, $type)
 {
     $model = $this->validateParams($workflowId, $stageNumber, $modelId, $type);
     if ($model === null) {
         throw new CHttpException(400, 'Bad Request');
     }
     $workflowStatus = Workflow::getWorkflowStatus($workflowId, $modelId, $type);
     $message = '';
     if (Workflow::validateAction('revert', $workflowStatus, $stageNumber, '', $message)) {
         list($completed, $workflowStatus) = Workflow::revertStage($workflowId, $stageNumber, $model);
     }
     echo CJSON::encode(array('workflowStatus' => $workflowStatus, 'flashes' => array('error' => !empty($message) ? array($message) : array(), 'success' => empty($message) ? array(Yii::t('workflow', 'Stage reverted')) : array())));
 }
Esempio n. 3
0
 /**
  * Moves a record up or down a workflow. Assumes that stageA is started but not completed.
  * Intermediate stages and stageB can be in any state.
  * @param int $workflowId
  * @param int $stageA Start stage (indexed by 1) 
  * @param int $stageB End stage (indexed by 1) 
  * @param object $model model associated with workflow
  * @param array $comments comment strings indexed by workflow stage number
  * Precondition: $stageA !== $stageB
  * @return array first element is success, the second is an optional message
  */
 public static function moveFromStageAToStageB($workflowId, $stageA, $stageB, $model, $comments = array())
 {
     if ($stageA === $stageB && YII_DEBUG) {
         throw new CException('Precondition violation: $stageA === $stageB');
     }
     $modelId = $model->id;
     $type = lcfirst(X2Model::getModuleName(get_class($model)));
     $retVal = self::validateStageChange($workflowId, $stageA, $stageB, $modelId, $type, $comments);
     if (!$retVal[0]) {
         return $retVal;
     }
     // enact stage change
     if ($stageA < $stageB) {
         // complete first stage
         list($success, $status) = Workflow::completeStage($workflowId, $stageA, $model, isset($comments[$stageA]) ? $comments[$stageA] : '', false);
         for ($i = $stageA + 1; $i < $stageB; ++$i) {
             // start and complete intermediate stages
             list($success, $status) = Workflow::startStage($workflowId, $i, $model, $status);
             list($success, $status) = Workflow::completeStage($workflowId, $i, $model, isset($comments[$i]) ? $comments[$i] : '', false, $status);
         }
         list($success, $status) = Workflow::startStage($workflowId, $stageB, $model, $status);
         // uncomplete a completed final stage
         list($success, $status) = Workflow::revertStage($workflowId, $stageB, $model, false, $status);
     } else {
         // $stageA > $stageB
         // unstart first stage
         list($success, $status) = Workflow::revertStage($workflowId, $stageA, $model);
         for ($i = $stageA - 1; $i > $stageB; --$i) {
             // uncomplete and unstart intermediate stages
             list($success, $status) = Workflow::revertStage($workflowId, $i, $model, $status);
             list($success, $status) = Workflow::revertStage($workflowId, $i, $model, $status);
         }
         // uncomplete a completed final stage
         list($success, $status) = Workflow::revertStage($workflowId, $stageB, $model, false, $status);
         list($success, $status) = Workflow::startStage($workflowId, $stageB, $model, false, $status);
     }
     return array(true);
 }
Esempio n. 4
0
 public function testRevertStage()
 {
     $workflow = $this->workflows('workflow2');
     $model = $this->contacts('contact935');
     list($success, $status) = Workflow::revertStage($workflow->id, 4, $model);
     // reverted a started stage
     $this->assertTrue($success);
     list($success, $status) = Workflow::revertStage($workflow->id, 4, $model);
     // couldn't revert an unstarted stage
     $this->assertFalse($success);
 }