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); } }
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()))); }
/** * 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); }
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); }