diff --git a/php/psql.php b/php/psql.php index cccef033e2eddf07812d4f3d64115f72df9a9c54..11d7a0c1837aac37a3d4f8e16d387bcee77458b8 100644 --- a/php/psql.php +++ b/php/psql.php @@ -1,540 +1,405 @@ -<!DOCTYPE html> - <?php -include_once('getLanguageJSON.php'); -include_once('mysql.php'); -if(!isset($_GET['id'])) +class DB { - header('Location: overview.php'); - exit; -} + private static $db; -$ID = $_GET['id']; -if(!is_numeric($ID) || $ID < 1) -{ - header('Location: error.php?message=error_param_invalid'); - exit; -} + function __construct() + { + try + { + require_once('admin/helper/settings.php'); + self::$db = new PDO( + "mysql:host=localhost;dbname=" . $database_name, + $database_user, + $database_password, + array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); + + self::createTables(); + } + catch(PDOException $e) + { + die($e); + } + } -$db = new DB(); -$db->createTables(); + function createTables() + { + $statement = self::$db->prepare("CREATE TABLE IF NOT EXISTS `roadmaps` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `Projectname` text COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`ID`))ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;"); + $statement->execute(); + + $statement = self::$db->prepare("CREATE TABLE IF NOT EXISTS `milestones` (". + "`ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,". + "`RoadmapID` int(10) UNSIGNED NOT NULL,". + "`VersionCode` int(10) UNSIGNED NOT NULL,". + "`VersionName` text COLLATE utf8_general_ci NOT NULL,". + "`Title` text COLLATE utf8_general_ci NOT NULL,". + "`DueDate` date NOT NULL,". + "`CompletionDate` date NOT NULL,". + "`Status` int(11) NOT NULL,". + "PRIMARY KEY (`ID`)". + ") ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;"); + $statement->execute(); + + $statement = self::$db->prepare("CREATE TABLE IF NOT EXISTS `tasks` (". + "`ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,". + "`MilestoneID` int(10) UNSIGNED NOT NULL,". + "`Title` text CHARACTER SET utf8 NOT NULL,". + "`Description` text CHARACTER SET utf8 NOT NULL,". + "`Status` int(11) NOT NULL,". + "PRIMARY KEY (`ID`)". + ") ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;"); + $statement->execute(); + + $statement = self::$db->prepare("CREATE TABLE IF NOT EXISTS `subtasks` (". + "`ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,". + "`TaskID` int(10) UNSIGNED NOT NULL,". + "`Title` text CHARACTER SET utf8 NOT NULL,". + "`Description` text CHARACTER SET utf8 NOT NULL,". + "`Status` int(11) NOT NULL,". + "PRIMARY KEY (`ID`)". + ") ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;"); + $statement->execute(); + } -$projectName = $db->getRoadmap($ID); -if($projectName == false) -{ - header('Location: error.php?message=error_roadmap_not_existing'); - exit; -} -$projectName = $projectName["Projectname"]; + //======================================== + //---------------- insert ---------------- + //======================================== -$milestones = $db->getMilestones($ID); -if($milestones == false) -{ - header('Location: error.php?message=error_no_milestones'); - exit; -} + function insertRoadmap($projectName) + { + $statement = self::$db->prepare("INSERT INTO roadmaps VALUES('', :projectName);"); + $statement->bindParam("projectName", $projectName); -$numberOfMilestones = sizeof($milestones); + return $statement->execute(); + } -$numberofOpenMilestones = $db->getNumberOfOpenMilestones($ID); -if($numberofOpenMilestones == false) -{ - header('Location: error.php?message=error_database_connection'); - exit; -} - -$numberofOpenMilestones = $numberofOpenMilestones['count']; -?> -<html xmlns="http://www.w3.org/1999/html"> - <head> - <meta charset="UTF-8"/> - <title>Roadmap - <?php echo $projectName;?></title> - <!--Import Google Icon Font--> - <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> - <!--Import materialize.css--> - <link type="text/css" rel="stylesheet" href="../materialize/css/materialize.min.css" media="screen,projection"/> - <link type="text/css" rel="stylesheet" href="../css/style.css"/> - - <!--Import jQuery before materialize.js--> - <script type="text/javascript" src="../js/jquery-2.2.4.min.js"></script> - <script type="text/javascript" src="../materialize/js/materialize.min.js"></script> - <script type="text/javascript" src="../js/main.js"></script> - <script type="text/javascript" src="../js/ResizeSensor.js"></script> - <script type="text/javascript" src="../js/ElementQueries.js"></script> - - <!--Let browser know website is optimized for mobile--> - <meta name="viewport" content="width=device-width, initial-scale=1.0"/> - </head> - - <body class="grey lighten-3"> - <a class="btn-flat right" href="admin/login.php">Login</a> - <div style="clear: both;"></div> - <div id="main"> - <div class="container"> - <h2 class="center-align" id="headline"><?php echo $projectName;?> Roadmap</h2> - <div class="row"> - <div class="col s12"> - <div class="row"> - <div class="col s1 m2 l2 offset-m1 offset-l1 no-padding"> - <div class="hide-on-small-only trainmap"> - <?php - createTrainmapMedAndUp($numberofOpenMilestones, $numberOfMilestones); - ?> - </div> - <div class="hide-on-med-and-up trainmap-small"> - <?php - createTrainmapSmall($numberofOpenMilestones, $numberOfMilestones); - ?> - </div> - </div> - <div class="col s11 m7 l6"> - - <?php - $isFirstMilestone = true; - for($i = 0; $i < $numberOfMilestones; $i++) - { - $currentMilestone = $milestones[$i]; - - //Milestone is inDev - if($currentMilestone['Status'] == 0) - { - $color = 'blue lighten-2'; - - $dueDate = $currentMilestone['DueDate']; - if($dueDate == "2000-01-01") - { - $dueDate = "-"; - } - else - { - $dueDate = date_create($dueDate); - $dueDate = date_format($dueDate, "d.m.Y"); - } - - $tasks = $db->getTasks($currentMilestone['ID']); - if($tasks == false) - { - printMilestoneIndevAndNoTasks($color, $currentMilestone, $dueDate, $languageJSON); - } - else - { - printMilestoneIndevWithTasks($currentMilestone, $db, $tasks, $color, $languageJSON); - } - } - //Milestone is done - else - { - if($isFirstMilestone) - { - $color = 'amber lighten-2'; - } - else - { - $color = 'grey lighten-2'; - } - - $dueDate = $currentMilestone['DueDate']; - if($dueDate == "2000-01-01") - { - $dueDate = "-"; - } - else - { - $dueDate = date_create($dueDate); - $dueDate = date_format($dueDate, "d.m.Y"); - } - - $completionDate = $currentMilestone['CompletionDate']; - $completionDate = date_create($completionDate); - $completionDate = date_format($completionDate, "d.m.Y"); - - $tasks = $db->getTasks($currentMilestone['ID']); - if($tasks == false) - { - printMilestoneDoneAndNoTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate); - } - else - { - printMilestoneDoneWithTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate, $tasks, $db); - } - - if($isFirstMilestone) - { - $isFirstMilestone = false; - } - } - } - ?> - </div> - </div> - </div> - </div> - </div> - </body> -</html> + function insertMilestone($roadmapID, $versionCode, $versionName, $title, $dueDate, $completionDate, $status) + { + $statement = self::$db->prepare("INSERT INTO milestones VALUES('', :roadmapID, :versionCode, :versionName, :title, STR_TO_DATE(:dueDate, '%d.%m.%Y'), STR_TO_DATE(:completionDate, '%d.%m.%Y'), :status);"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->bindParam("versionCode", $versionCode); + $statement->bindParam("versionName", $versionName); + $statement->bindParam("title", $title); + $statement->bindParam("dueDate", $dueDate); + $statement->bindParam("completionDate", $completionDate); + $statement->bindParam("status", $status); + + return $statement->execute(); + } + function insertTask($milestoneID, $title, $description, $status) + { + $statement = self::$db->prepare("INSERT INTO tasks VALUES('', :milestoneID, :title, :description, :status);"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->bindParam("title", $title); + $statement->bindParam("description", $description); + $statement->bindParam("status", $status); + return $statement->execute(); + } -<?php -function createTrainmapMedAndUp($numberofOpenMilestones, $numberOfMilestones) -{ - for($i = 0; $i < $numberofOpenMilestones; $i++) + function insertSubtask($taskID, $title, $description, $status) { - echo '<div class="train-circle train-circle-light"></div>'; + $statement = self::$db->prepare("INSERT INTO subtasks VALUES('', :taskID, :title, :description, :status);"); + $statement->bindParam("taskID", $taskID); + $statement->bindParam("title", $title); + $statement->bindParam("description", $description); + $statement->bindParam("status", $status); + $success = $statement->execute(); - if($numberofOpenMilestones != $numberOfMilestones || $i != ($numberofOpenMilestones-1)) - { - echo '<div class="train-line dotted"></div>'; - } + $this->checkParentTask($taskID); + + return $success; } - for($i = 0; $i < ($numberOfMilestones - $numberofOpenMilestones); $i++) + //======================================== + //---------------- finish ---------------- + //======================================== + + function finishMilestone($milestoneID) { - echo '<div class="train-circle blue"></div>'; + $statement = self::$db->prepare("UPDATE milestones SET status='1' WHERE ID = :milestoneID;"); + $statement->bindParam("milestoneID", $milestoneID); - if($i != (($numberOfMilestones - $numberofOpenMilestones) - 1)) - { - echo '<div class="train-line"></div>'; - } + return $statement->execute(); } -} -function createTrainmapSmall($numberofOpenMilestones, $numberOfMilestones) -{ - for($i = 0; $i < $numberofOpenMilestones; $i++) + function finishTask($taskID) { - echo '<div class="train-circle train-circle-light train-circle-small"></div>'; + $statement = self::$db->prepare("UPDATE tasks SET status='1' WHERE ID = :taskID;"); + $statement->bindParam("taskID", $taskID); - if($numberofOpenMilestones != $numberOfMilestones || $i != ($numberofOpenMilestones-1)) - { - echo '<div class="train-line dotted-small train-line-small"></div>'; - } + return $statement->execute(); } - for($i = 0; $i < ($numberOfMilestones - $numberofOpenMilestones); $i++) + function reopenTask($taskID) { - echo '<div class="train-circle blue train-circle-small"></div>'; + $statement = self::$db->prepare("UPDATE tasks SET status='0' WHERE ID = :taskID;"); + $statement->bindParam("taskID", $taskID); - if($i != (($numberOfMilestones - $numberofOpenMilestones) - 1)) - { - echo '<div class="train-line train-line-small"></div>'; - } + return $statement->execute(); } -} -function printMilestoneIndevAndNoTasks($color, $currentMilestone, $dueDate, $languageJSON) -{ - echo '<div class="card padding white milestone">' . - '<div class="card-content">' . - '<div class="'.$color.' center-align milestone-title">'; - if($currentMilestone['VersionName'] == $currentMilestone['Title']) - { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['Title'] . '</span>'; - - } - else - { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>'; - } - echo '</div>' . - '<div class="milestone-content margin-top">' . - '<div class="white progress-container">'. - '<div class="progress grey lighten-2 high-progress margin-bottom">'. - '<div class="determinate green" style="width: 0%"></div>'. - '</div>'. - '</div>'. - '<div class="row">' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' . - '</div>' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">0% ' . $languageJSON->done . '</span>' . - '</div>' . - '</div>' . - '</div>' . - '</div>' . - '</div>'; -} - -function printMilestoneIndevWithTasks($currentMilestone, $db, $tasks, $color, $languageJSON) -{ - $dueDate = $currentMilestone['DueDate']; - if($dueDate == "2000-01-01") + function finishSubTask($subtaskID) + { + $statement = self::$db->prepare("UPDATE subtasks SET status='1' WHERE ID = :subtaskID;"); + $statement->bindParam("subtaskID", $subtaskID); + + return $statement->execute(); + } + + //======================================== + //---------------- update ---------------- + //======================================== + + function updateRoadmap($roadmapID, $projectName) { - $dueDate = "-"; + $statement = self::$db->prepare("UPDATE roadmaps SET Projectname = :projectName WHERE ID = :roadmapID;"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->bindParam("projectName", $projectName); + + return $statement->execute(); } - else + + function updateMilestone($milestoneID, $versionCode, $versionName, $title, $dueDate, $completionDate, $status) { - $dueDate = date_create($dueDate); - $dueDate = date_format($dueDate, "d.m.Y"); + $statement = self::$db->prepare("UPDATE milestones SET VersionCode = :versionCode, VersionName = :versionName, Title = :title, DueDate = STR_TO_DATE(:dueDate, '%d.%m.%Y'), CompletionDate = STR_TO_DATE(:completionDate, '%d.%m.%Y'), Status = :status WHERE ID = :milestoneID;"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->bindParam("versionCode", $versionCode); + $statement->bindParam("versionName", $versionName); + $statement->bindParam("title", $title); + $statement->bindParam("dueDate", $dueDate); + $statement->bindParam("completionDate", $completionDate); + $statement->bindParam("status", $status); + + return $statement->execute(); } - $numberOfOpenTasks = $db->getNumberOfOpenTasks($currentMilestone['ID']); - if($numberOfOpenTasks == false) + function updateTask($taskID, $milestoneID, $title, $description, $status) { - header('Location: error.php?message=error_database_connection'); - exit; + $statement = self::$db->prepare("UPDATE tasks SET MilestoneID = :milestoneID, Title = :title, Description = :description, Status = :status WHERE ID = :taskID;"); + $statement->bindParam("taskID", $taskID); + $statement->bindParam("milestoneID", $milestoneID); + $statement->bindParam("title", $title); + $statement->bindParam("description", $description); + $statement->bindParam("status", $status); + + return $statement->execute(); } - else + + function updateSubtask($subtaskID, $taskID, $title, $description, $status) { - $numberOfOpenTasks = $numberOfOpenTasks['count']; - $percentage = ((sizeof($tasks) - $numberOfOpenTasks) / sizeof($tasks))*100; - $percentage = round($percentage); + $statement = self::$db->prepare("UPDATE subtasks SET TaskID = :taskID, Title = :title, Description = :description, Status = :status WHERE ID = :subtaskID;"); + $statement->bindParam("subtaskID", $subtaskID); + $statement->bindParam("taskID", $taskID); + $statement->bindParam("title", $title); + $statement->bindParam("description", $description); + $statement->bindParam("status", $status); + + $success = $statement->execute(); + $this->checkParentTask($taskID); - echo '<div class="card padding white milestone">' . - '<div class="card-content">' . - '<div class="'.$color.' center-align milestone-title">'; - if($currentMilestone['VersionName'] == $currentMilestone['Title']) + return $success; + } + + function checkParentTask($taskID) + { + $subTasks = $this->getSubtasks($taskID); + $counter = 0; + for($m = 0; $m < sizeof($subTasks); $m++) { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['Title'] . '</span>'; + $currentSubTask = $subTasks[$m]; + if ($currentSubTask['Status'] == 1) + { + $counter = $counter + 1; + } + } + if($counter == sizeof($subTasks)) + { + $this->finishTask($taskID); } else { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>'; + $this->reopenTask($taskID); } - echo '</div>' . - '<div class="milestone-content margin-top">' . - '<div class="white progress-container">'. - '<div class="progress grey lighten-2 high-progress margin-bottom">'. - '<div class="determinate green" style="width: '.$percentage.'%"></div>'. - '</div>'. - '</div>'. - '<div class="row">' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' . - '</div>' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">'.$percentage.'% ' . $languageJSON->done .'</span>' . - '</div>' . - '</div>' . - '<ul class="collapsible white" data-collapsible="accordion">'; - for($k = 0; $k < sizeof($tasks); $k++) - { - $currentTask = $tasks[$k]; + } - $subtasks = $db->getSubtasks($currentTask['ID']); - if($subtasks == false) + function markAllTasksAsDone($milestoneID) + { + $tasks = $this->getTasks($milestoneID); + for($m = 0; $m < sizeof($tasks); $m++) + { + $subTasks = $this->getSubtasks($tasks[$m]['ID']); + for($i = 0; $i < sizeof($subTasks); $i++) { - //inDev - if($currentTask['Status'] == 0) + if($this->finishSubTask($subTasks[$i]["ID"]) == false) { - echo '<li>' . - '<div class="collapsible-header bold truncate"><i class="material-icons red-text">build</i>' . $currentTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' . - '</li>'; - } - //done - else - { - echo '<li>' . - '<div class="collapsible-header bold truncate"><i class="material-icons green-text">check</i>' . $currentTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' . - '</li>'; + return false; } } - else + + if($this->finishTask($tasks[$m]['ID']) == false) { - printSubTasksDone($currentTask, $subtasks, $db); + return false; } } - echo '</ul>' . - '</div>' . - '</div>' . - '</div>'; + return true; } -} -function printSubTasksDone($currentTask, $subtasks, $db) -{ - $numberOfOpenSubtasks = $db->getNumberOfOpenSubtasks($currentTask['ID']); - if($numberOfOpenSubtasks == false) + //======================================== + //----------------- get ------------------ + //======================================== + + function getRoadmap($roadmapID) { - header('Location: error.php?message=error_database_connection'); - exit; + $statement = self::$db->prepare("SELECT Projectname FROM roadmaps WHERE roadmaps.ID=:roadmapID;"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->execute(); + + return $statement->fetch(); } - else + + function getRoadmaps() { - $numberOfOpenSubtasks = $numberOfOpenSubtasks['count']; - if($numberOfOpenSubtasks == 0) - { - echo '<li>' . - '<div class="collapsible-header bold"><i class="material-icons green-text">check</i>'.$currentTask['Title'].'<span class="right">' . (sizeof($subtasks) - $numberOfOpenSubtasks) . '/' . sizeof($subtasks) . '</span></div>' . - '<div class="collapsible-body">' . - '<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">'; - } - else - { - echo '<li>' . - '<div class="collapsible-header bold"><i class="material-icons red-text">build</i>'.$currentTask['Title'].'<span class="right">' . (sizeof($subtasks) - $numberOfOpenSubtasks) . '/' . sizeof($subtasks) . '</span></div>' . - '<div class="collapsible-body">' . - '<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">'; - } + $statement = self::$db->prepare("SELECT * FROM roadmaps ORDER BY ID;"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->execute(); - for($m = 0; $m < sizeof($subtasks); $m++) - { - $currentSubTask = $subtasks[$m]; - //inDev - if($currentSubTask['Status'] == 0) - { - echo '<li>' . - '<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons red-text margin-left">build</i>' . $currentSubTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' . - '</li>'; - } - //done - else - { - echo '<li>' . - '<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons green-text margin-left">check</i>' . $currentSubTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' . - '</li>'; - } - } + return $statement->fetchAll(); + } + + function getMilestones($roadmapID) + { + $statement = self::$db->prepare("SELECT * FROM milestones WHERE milestones.roadmapID=:roadmapID ORDER BY VersionCode DESC;"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->execute(); - echo '</ul>' . - '</div>' . - '</li>'; + return $statement->fetchAll(); } -} -function printMilestoneDoneAndNoTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate) -{ - echo '<div class="card padding white milestone">' . - '<div class="card-content">' . - '<div class="'.$color.' center-align milestone-title">'; - if($currentMilestone['VersionName'] == $currentMilestone['Title']) + function getMilestone($milestoneID) { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['Title'] . '</span>'; + $statement = self::$db->prepare("SELECT * FROM milestones WHERE milestones.ID=:milestoneID;"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->execute(); + return $statement->fetch(); } - else + + function getNumberOfOpenMilestones($roadmapID) { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>'; + $statement = self::$db->prepare("SELECT COUNT(*) AS 'count' FROM milestones WHERE milestones.roadmapID=:roadmapID AND status = '0';"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->execute(); + + return $statement->fetch(); } - echo '</div>'; - if($isFirstMilestone) + function getTasks($milestoneID) { - echo '<div class="milestone-content margin-top init-as-expanded">'; + $statement = self::$db->prepare("SELECT * FROM tasks WHERE tasks.milestoneID=:milestoneID;"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->execute(); + + return $statement->fetchAll(); } - else + + function getTask($taskID) { - echo '<div class="milestone-content margin-top">'; + $statement = self::$db->prepare("SELECT * FROM tasks WHERE tasks.ID=:taskID;"); + $statement->bindParam("taskID", $taskID); + $statement->execute(); + + return $statement->fetch(); } - echo '<div class="row">' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' . - '</div>' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->done_at . ' ' . $completionDate . '</span>' . - '</div>' . - '</div>' . - '</div>' . - '</div>' . - '</div>'; -} + function getNumberOfOpenTasks($milestoneID) + { + $statement = self::$db->prepare("SELECT COUNT(*) AS 'count' FROM tasks WHERE tasks.MilestoneID=:milestoneID AND status = '0';"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->execute(); -function printMilestoneDoneWithTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate, $tasks, $db) -{ - echo '<div class="card padding white milestone">' . - '<div class="card-content">' . - '<div class="'.$color.' center-align milestone-title">'; - if($currentMilestone['VersionName'] == $currentMilestone['Title']) + return $statement->fetch(); + } + + function getSubtasks($taskID) { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['Title'] . '</span>'; + $statement = self::$db->prepare("SELECT * FROM subtasks WHERE subtasks.taskID=:taskID;"); + $statement->bindParam("taskID", $taskID); + $statement->execute(); + return $statement->fetchAll(); } - else + + function getSubtask($taskID) { - echo '<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>'; + $statement = self::$db->prepare("SELECT * FROM subtasks WHERE subtasks.ID=:taskID;"); + $statement->bindParam("taskID", $taskID); + $statement->execute(); + + return $statement->fetch(); } - echo '</div>'; - if($isFirstMilestone) + function getNumberOfOpenSubtasks($taskID) { - echo '<div class="milestone-content margin-top init-as-expanded">'; + $statement = self::$db->prepare("SELECT COUNT(*) AS 'count' FROM subtasks WHERE subtasks.TaskID=:taskID AND status = '0';"); + $statement->bindParam("taskID", $taskID); + $statement->execute(); + + return $statement->fetch(); } - else + + function getLatestFinishedMilestone($roadmapID) { - echo '<div class="milestone-content margin-top">'; + $statement = self::$db->prepare("SELECT * FROM milestones WHERE RoadmapID=:roadmapID AND status = '1' ORDER BY VersionCode DESC"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->execute(); + + return $statement->fetchAll(); } - echo '<div class="row">' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' . - '</div>' . - '<div class="col s6 valign-wrapper">' . - '<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->done_at . ' ' . $completionDate . '</span>' . - '</div>' . - '</div>' . - '<ul class="collapsible white" data-collapsible="accordion">'; - for($k = 0; $k < sizeof($tasks); $k++) + //======================================== + //--------------- delete ----------------- + //======================================== + + function deleteRoadmap($roadmapID) { - $currentTask = $tasks[$k]; + $statement = self::$db->prepare("DELETE FROM roadmaps WHERE roadmaps.ID=:roadmapID;"); + $statement->bindParam("roadmapID", $roadmapID); + $statement->execute(); - $subtasks = $db->getSubtasks($currentTask['ID']); - if($subtasks == false) - { - echo '<li>' . - '<div class="collapsible-header bold truncate"><i class="material-icons green-text">check</i>' . $currentTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' . - '</li>'; - } - else - { - $numberOfOpenSubtasks = $db->getNumberOfOpenSubtasks($currentTask['ID']); - if($numberOfOpenSubtasks != false) - { - $numberOfOpenSubtasks = $numberOfOpenSubtasks['count']; - if($numberOfOpenSubtasks == 0) - { - echo '<li>' . - '<div class="collapsible-header bold"><i class="material-icons green-text">check</i>'.$currentTask['Title'].'<span class="right">' . sizeof($subtasks) . '/' . sizeof($subtasks) . '</span></div>' . - '<div class="collapsible-body">' . - '<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">'; - } - else - { - echo '<li>' . - '<div class="collapsible-header bold"><i class="material-icons red-text">build</i>'.$currentTask['Title'].'<span class="right">' . (sizeof($subtasks) - $numberOfOpenSubtasks) . '/' . sizeof($subtasks) . '</span></div>' . - '<div class="collapsible-body">' . - '<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">'; - } + return $statement->execute(); + } - for($m = 0; $m < sizeof($subtasks); $m++) - { - $currentSubTask = $subtasks[$m]; - //inDev - if($currentSubTask['Status'] == 0) - { - echo '<li>' . - '<div class="collapsible-header bold truncate"><span class="left">' . ($m + 1) . '</span><i class="material-icons red-text margin-left">build</i>' . $currentSubTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' . - '</li>'; - } - //done - else - { - echo '<li>' . - '<div class="collapsible-header bold truncate"><span class="left">' . ($m + 1) . '</span><i class="material-icons green-text margin-left">check</i>' . $currentSubTask['Title'] . '</div>' . - '<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' . - '</li>'; - } - } + function deleteMilestone($milestoneID) + { + $statement = self::$db->prepare("DELETE FROM milestones WHERE milestones.ID=:milestoneID;"); + $statement->bindParam("milestoneID", $milestoneID); + $statement->execute(); - echo '</ul>' . - '</div>' . - '</li>'; - } - } + return $statement->execute(); + } + + function deleteTask($taskID) + { + $statement = self::$db->prepare("DELETE FROM tasks WHERE tasks.ID=:taskID;"); + $statement->bindParam("taskID", $taskID); + $statement->execute(); + + return $statement->execute(); } - echo '</ul>' . - '</div>' . - '</div>' . - '</div>'; + function deleteSubtask($subtaskID, $taskID) + { + $statement = self::$db->prepare("DELETE FROM subtasks WHERE subtasks.ID=:subtaskID;"); + $statement->bindParam("subtaskID", $subtaskID); + $success = $statement->execute(); + + $this->checkParentTask($taskID); + + return $success; + } } \ No newline at end of file