authorize(); $helper = new QualKardHelper($this->container); $names = array('Drafts', 'Study', 'Hairy', 'Hard', 'Medium', 'Easy', 'Done'); $columns = $this->columnModel->getAll($project['id']); // position-ordered rows $ids = array(); for ($i = 0; $i < 7; $i++) { if (isset($columns[$i])) { $this->columnModel->update($columns[$i]['id'], $names[$i]); $ids[$i] = (int) $columns[$i]['id']; } else { $ids[$i] = (int) $this->columnModel->create($project['id'], $names[$i]); } } // Move every card to Drafts BEFORE deleting extras -- remove() is a raw DELETE (tasks cascade). foreach ($this->taskFinderModel->getAll($project['id']) as $task) { $this->taskPositionModel->movePosition($project['id'], $task['id'], $ids[0], 1, $task['swimlane_id'], false); } for ($i = 7, $n = count($columns); $i < $n; $i++) { $this->columnModel->remove($columns[$i]['id']); } $roles = array('draft', 'study', 'hairy', 'hard', 'medium', 'easy', 'done'); foreach ($roles as $k => $role) { $this->projectMetadataModel->save($project['id'], array('qualkard_col_'.$role => $ids[$k])); } $helper->resetAll($project['id']); $this->projectMetadataModel->save($project['id'], array('qualkard_enabled' => 1)); $this->flash->success(t('QualKard study board is ready.')); $this->redirectToIntegrations($project); } /** * Reset every card on the board: unread, moved to Drafts, armed-inert. Keeps the columns. */ public function reset() { $project = $this->authorize(); (new QualKardHelper($this->container))->resetAll($project['id']); $this->flash->success(t('All cards reset.')); $this->redirectToIntegrations($project); } /** * Disable QualKard on this board (non-destructive: leaves columns and cards as they are). */ public function disable() { $project = $this->authorize(); $this->projectMetadataModel->save($project['id'], array('qualkard_enabled' => 0)); $this->flash->success(t('QualKard disabled on this board.')); $this->redirectToIntegrations($project); } // Project-manager gate + CSRF, shared by every action. private function authorize() { $project = $this->getProject(); if (! $this->helper->user->hasProjectAccess('ProjectEditController', 'edit', $project['id'])) { throw new AccessForbiddenException(); } $this->checkCSRFForm(); return $project; } private function redirectToIntegrations(array $project) { $this->response->redirect($this->helper->url->to('ProjectViewController', 'integrations', array('project_id' => $project['id']))); } }