public function taskStateChange(User $user, $taskId, $newState)
 {
     $this->task = $this->dataRepository->find($taskId);
     $roles = $this->dataRepository->getRolesInTask($taskId, $user->getId());
     $currentState = $this->task->getState();
     $model = $this->buildModel();
     foreach ($roles as $role) {
         if (array_key_exists($role['role'], $model)) {
             if (array_key_exists($currentState, $model[$role['role']])) {
                 if (in_array($newState, $model[$role['role']][$currentState])) {
                     $this->accessOpened = true;
                     break;
                 }
             }
         }
     }
     if (!$this->accessHasOpened()) {
         return;
     }
     $this->task->setState($newState);
     $states = (new Dictionary())->taskStates();
     switch ($newState) {
         case $states->RUNNING[0]:
             if (!$this->task->getDateAccept()) {
                 $this->task->setDateAccept(new \DateTime());
             }
             break;
         case $states->CANCELED[0]:
             $this->task->setDateCancel(new \DateTime());
             break;
         case $states->COMPLETED[0]:
             $this->task->setDateComplete(new \DateTime());
             break;
         default:
             break;
     }
     $this->wasChanged = true;
 }
 private function buildControlsModel($roles, Dictionary $dictionary, Task $task, TaskManager $manager)
 {
     $buttons = array();
     if (in_array($dictionary->taskRoles()->CREATOR[0], $roles)) {
         $url = $this->router->getUrlByRoute('task_edit', array('id' => $task->getId()), false);
         $buttons[] = array('caption' => 'Править', 'url' => $url);
     }
     $states = $dictionary->taskStates();
     $statesList = $states->getList();
     $statesList[$states->COMPLETED[0]] = 'Завершить задвчу';
     $statesList[$states->ON_REVIEW[0]] = 'Отправить на рассмотрение';
     $statesList[$states->CANCELED[0]] = 'Отменить';
     $statesList[$states->RETURNED[0]] = 'Вернуть на доработку';
     $statesList[$states->RUNNING[0]] = 'Начать выполнение';
     $model = $manager->buildModel();
     foreach ($roles as $role) {
         if (!array_key_exists($role, $model)) {
             continue;
         }
         if (!array_key_exists($task->getState(), $model[$role])) {
             continue;
         }
         foreach ($model[$role][$task->getState()] as $rule) {
             $url = $this->router->getUrlByRoute('task_change_state', array('id' => $task->getId(), 'state' => $rule), false);
             $buttons[] = array('caption' => $statesList[$rule], 'url' => $url);
         }
     }
     return $buttons;
 }