%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/tasks/models/state/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/tasks/models/state/TaskState.php |
<?php namespace humhub\modules\tasks\models\state; use humhub\modules\tasks\helpers\TaskUrl; use humhub\modules\tasks\models\Task; use Yii; use yii\base\Component; /** * Class TaskState * @todo change base class back to BaseObject after v1.3 stable * @package humhub\modules\tasks\models\state */ abstract class TaskState extends Component { const STATES = [ Task::STATUS_PENDING => PendingState::class, Task::STATUS_IN_PROGRESS => InProgressState::class, Task::STATUS_PENDING_REVIEW => PendingReviewState::class, Task::STATUS_COMPLETED => CompletedState::class ]; public static $status; public static $defaultProceedStatus; public static $defaultRevertStatus; /** * @var Task */ public $task; public static function getState($task) { $states = static::STATES; $stateClass = isset($states[$task->status]) ? $states[$task->status] : $states[Task::STATUS_PENDING]; return Yii::createObject([ 'class' => $stateClass, 'task' => $task ]); } /** * Returns an array of statusItems. * Primary used in TaskFilter * * @return array */ public static function getStatusItems() { return [ Task::STATUS_PENDING => Yii::t('TasksModule.base', 'Pending'), Task::STATUS_IN_PROGRESS => Yii::t('TasksModule.base', 'In Progress'), Task::STATUS_PENDING_REVIEW => Yii::t('TasksModule.base', 'In Review'), Task::STATUS_COMPLETED => Yii::t('TasksModule.base', 'Completed'), ]; } /** * send label for change-status button * @return string $statusLabel */ public function getStatusLabel() { switch ($this->status) { case Task::STATUS_PENDING: $statusLabel = Yii::t('TasksModule.base', 'Begin Task'); break; case Task::STATUS_IN_PROGRESS: return $this->review ? Yii::t('TasksModule.base', 'Let Task Review') : Yii::t('TasksModule.base', 'Finish Task'); break; case Task::STATUS_PENDING_REVIEW: $statusLabel = Yii::t('TasksModule.base', 'Finish Task'); break; default : $statusLabel = ''; } return $statusLabel; } public function proceed($newStatus = null) { if($newStatus instanceof TaskState) { $newStatus = $newStatus->getStatusId(); } else { $newStatus = ($newStatus) ? $newStatus : $this->getDefaultProceedStatusId(); } if(!array_key_exists($newStatus, static::STATES) || !$this->canProceed($newStatus)) { return false; } $this->changeStatus($newStatus); $this->task->state->afterProceed($this); return true; } public function reset() { if($this->canRevert(Task::STATUS_PENDING)) { $this->revert(Task::STATUS_PENDING); return true; } return false; } public function canProceed($newStatus = null, $user = null) { if($newStatus instanceof TaskState) { $newStatus = $newStatus->getStatusId(); } else { $newStatus = ($newStatus) ? $newStatus : $this->getDefaultProceedStatusId(); } if(!in_array($newStatus, $this->getProceedStatuses($user))) { return false; } return $this->checkProceedRules($newStatus, $user); } public function getProceedStatuses($user = null) { return array_keys($this->getProceedConfig($user)); } public function getProceedConfig($user = null) { $result = $this->proceedConfig($user); if(!$this->task->review) { unset($result[Task::STATUS_PENDING_REVIEW]); } if(!$this->getStateInstance(Task::STATUS_COMPLETED)->canCompleteTask($user)) { unset($result[Task::STATUS_COMPLETED]); } return $result; } protected function getDefaultProceedStatusId() { if(static::$defaultProceedStatus) { return static::$defaultProceedStatus; } return null; } /** * @return TaskState */ public function getDefaultProceedState() { return $this->getStateInstance($this->getDefaultProceedStatusId()); } public function revert($newStatus = null) { if($newStatus instanceof TaskState) { $newStatus = $newStatus->getStatusId(); } else { $newStatus = ($newStatus) ? $newStatus : $this->getDefaultRevertStatusId(); } if(!array_key_exists($newStatus, static::STATES) || !$this->canRevert($newStatus)) { return false; } $this->changeStatus($newStatus); $this->task->state->afterRevert($this); return true; } public function canRevert($newStatus = null, $user = null) { if($newStatus instanceof TaskState) { $newStatus = $newStatus->getStatusId(); } else { $newStatus = ($newStatus) ? $newStatus : $this->getDefaultRevertStatusId(); } if(!in_array($newStatus, $this->getRevertStatuses($user))) { return false; } return $this->checkRevertRules($newStatus, $user); } public function getRevertStatuses($user = null) { return array_keys($this->getRevertConfig($user)); } public function getRevertConfig($user = null) { $result = $this->revertConfig($user); if(!$this->task->review) { unset($result[Task::STATUS_PENDING_REVIEW]); } return $result; } protected function getDefaultRevertStatusId() { if(static::$defaultRevertStatus) { return static::$defaultRevertStatus; } return null; } public function getDefaultRevertState() { return $this->getStateInstance($this->getDefaultRevertStatusId()); } protected function changeStatus($status) { $this->task->status = $status; $this->task->save(); } /** * @param $newState * @return TaskState */ public function getStateInstance($newState) { if($newState) { return Yii::createObject([ 'class' => static::STATES[$newState], 'task' => $this->task ]); } return null; } public function getCheckUrl() { if($this->canProceed(Task::STATUS_COMPLETED)) { return $this->getStateInstance(Task::STATUS_COMPLETED)->getProceedUrl(); } else if ($this->canProceed(Task::STATUS_PENDING_REVIEW)) { return $this->getStateInstance(Task::STATUS_PENDING_REVIEW)->getProceedUrl(); } return null; } public function getProceedUrl() { return TaskUrl::proceedTask($this->task, static::$status); } public function getRevertUrl() { return TaskUrl::revertTask($this->task, static::$status); } public function isPending() { return ($this->task->status === Task::STATUS_PENDING); } public function isInProgress() { return ($this->task->status === Task::STATUS_IN_PROGRESS); } public function isPendingReview() { return ($this->task->status === Task::STATUS_PENDING_REVIEW); } public function isCompleted() { return ($this->task->status === Task::STATUS_COMPLETED); } public function getStatusId() { return static::$status; } protected abstract function proceedConfig($user = null); protected abstract function revertConfig($user = null); public abstract function checkRevertRules($newStatus = null, $user = null); public abstract function checkProceedRules($newStatus = null, $user = null); public abstract function afterProceed(TaskState $oldState); public abstract function afterRevert(TaskState $oldState); }