$username = '******'; $password = '******'; $DB = new PDO($server, $username, $password); $app->register(new Silex\Provider\TwigServiceProvider(), array('twig.path' => __DIR__ . '/../views')); $app->get("/", function () use($app) { return $app['twig']->render('index.html.twig'); }); $app->get("/tasks", function () use($app) { return $app['twig']->render('tasks.html.twig', array('tasks' => Task::getAll())); }); $app->get("/categories", function () use($app) { return $app['twig']->render('categories.html.twig', array('categories' => Category::getAll())); }); $app->post("/tasks", function () use($app) { $task = new task($_POST['description']); $task->save(); return $app['twig']->render('tasks.html.twig', array('tasks' => Task::getAll())); }); $app->post("/delete_tasks", function () use($app) { Task::deleteAll(); return $app['twig']->render('index.html.twig'); }); $app->post("/categories", function () use($app) { $category = new Category($_POST['name']); $category->save(); return $app['twig']->render('categories.html.twig', array('categories' => Category::getAll())); }); $app->post("/delete_categories", function () use($app) { Category::deleteAll(); return $app['twig']->render('index.html.twig'); });
function update_children($field, $value = "") { $q = prepare("SELECT * FROM task WHERE parentTaskID = %d", $this->get_id()); $db = new db_alloc(); $db->query($q); while ($db->row()) { $t = new task(); $t->read_db_record($db); $t->set_value($field, $value); $t->save(); if ($t->get_value("taskTypeID") == "Parent") { $t->update_children($field, $value); } } }
if ($_POST["save_attachment"]) { move_attachment("task", $taskID); alloc_redirect($TPL["url_alloc_task"] . "taskID=" . $taskID . "&sbs_link=attachments"); } // If saving a record if ($_POST["save"] || $_POST["save_and_back"] || $_POST["save_and_new"] || $_POST["save_and_summary"] || $_POST["timeSheet_save"] || $_POST["close_task"]) { $task->read_globals(); if ($_POST["close_task"]) { $task->set_value("taskStatus", "closed_complete"); } // If we're auto-nuking the pending tasks, we need to do that before the call to task->save() if ($task->get_id() && !$_POST["pendingTasksIDs"]) { $task->add_pending_tasks($_POST["pendingTasksIDs"]); } // Moved all validation over into task.inc.php save() $success = $task->save(); count($msg) and $msg = "&message_good=" . urlencode(implode("<br>", $msg)); if ($success) { interestedParty::make_interested_parties("task", $task->get_id(), $_POST["interestedParty"]); // A task can only have a pending task or pending reopen date - pending task is fixed up in JS, but check here too if ($task->get_value("taskStatus") != "pending_tasks") { $_POST['pendingTaskIDs'] = ''; } $task->add_pending_tasks($_POST["pendingTasksIDs"]); $task->add_tags($_POST["tags"]); // This is only valid on pending_, but not on pending_task (because it has a different field) if (strpos($task->get_value("taskStatus"), "pending_") !== 0 || $task->get_value("taskStatus") == "pending_tasks") { $_POST['reopen_task'] = ''; } $task->add_reopen_reminder($_POST["reopen_task"]); // Create reminders if necessary
function move_forwards() { $current_user =& singleton("current_user"); global $TPL; $status = $this->get_value("status"); $db = new db_alloc(); if ($this->get_value("clientID")) { $c = $this->get_foreign_object("client"); $extra = " for " . $c->get_value("clientName"); $taskDesc[] = ""; } $taskname1 = "Sale " . $this->get_id() . ": raise an invoice" . $extra; $taskname2 = "Sale " . $this->get_id() . ": place an order to the supplier"; $taskname3 = "Sale " . $this->get_id() . ": pay the supplier"; $taskname4 = "Sale " . $this->get_id() . ": deliver the goods / action the work"; $cyberadmin = 59; $taskDesc[] = "Sale items:"; $taskDesc[] = ""; foreach ((array) $this->get_productSaleItems() as $psiID => $psi_row) { $p = new product(); $p->set_id($psi_row["productID"]); $taskDesc[] = " " . page::money($psi_row["sellPriceCurrencyTypeID"], $psi_row["sellPrice"], "%S%mo") . " for " . $psi_row["quantity"] . " x " . $p->get_name(); $hasItems = true; } if (!$hasItems) { return alloc_error("No sale items have been added."); } $amounts = $this->get_amounts(); $taskDesc[] = ""; $taskDesc[] = "Total: " . $amounts["total_sellPrice"]; $taskDesc[] = "Total inc " . config::get_config_item("taxName") . ": " . $amounts["total_sellPrice_plus_gst"]; $taskDesc[] = ""; $taskDesc[] = "Refer to the sale in alloc for up-to-date information:"; $taskDesc[] = config::get_config_item("allocURL") . "sale/productSale.php?productSaleID=" . $this->get_id(); $taskDesc = implode("\n", $taskDesc); if ($status == "edit") { $this->set_value("status", "allocate"); $items = $this->get_productSaleItems(); foreach ($items as $r) { $psi = new productSaleItem(); $psi->set_id($r["productSaleItemID"]); $psi->select(); if (!$db->qr("SELECT transactionID FROM transaction WHERE productSaleItemID = %d", $psi->get_id())) { $psi->create_transactions(); } } } else { if ($status == "allocate") { $this->set_value("status", "admin"); // 1. from salesperson to admin $q = prepare("SELECT * FROM task WHERE projectID = %d AND taskName = '%s'", $cyberadmin, $taskname1); if (config::for_cyber() && !$db->qr($q)) { $task = new task(); $task->set_value("projectID", $cyberadmin); // Cyber Admin Project $task->set_value("taskName", $taskname1); $task->set_value("managerID", $this->get_value("personID")); // salesperson $task->set_value("personID", 67); // Cyber Support people (jane) $task->set_value("priority", 3); $task->set_value("taskTypeID", "Task"); $task->set_value("taskDescription", $taskDesc); $task->set_value("dateTargetStart", date("Y-m-d")); $task->set_value("dateTargetCompletion", date("Y-m-d", date("U") + 60 * 60 * 24 * 7)); $task->save(); $TPL["message_good"][] = "Task created: " . $task->get_id() . " " . $task->get_value("taskName"); $p1 = new person(); $p1->set_id($this->get_value("personID")); $p1->select(); $p2 = new person(); $p2->set_id(67); $p2->select(); $recipients[$p1->get_value("emailAddress")] = array("name" => $p1->get_name(), "addIP" => true, "internal" => true); $recipients[$p2->get_value("emailAddress")] = array("name" => $p2->get_name(), "addIP" => true, "internal" => true); $comment = $p2->get_name() . ",\n\n" . $taskname1 . "\n\n" . $taskDesc; $commentID = comment::add_comment("task", $task->get_id(), $comment, "task", $task->get_id()); $emailRecipients = comment::add_interested_parties($commentID, null, $recipients); // Re-email the comment out, including any attachments if (!comment::send_comment($commentID, $emailRecipients)) { alloc_error("Email failed to send."); } else { $TPL["message_good"][] = "Emailed task comment to " . $p1->get_value("emailAddress") . ", " . $p2->get_value("emailAddress") . "."; } } } else { if ($status == "admin" && $this->have_perm(PERM_APPROVE_PRODUCT_TRANSACTIONS)) { $this->set_value("status", "finished"); if ($_REQUEST["changeTransactionStatus"]) { $rows = $this->get_productSaleItems(); foreach ($rows as $row) { $ids[] = $row["productSaleItemID"]; } if ($ids) { $q = prepare("UPDATE transaction SET status = '%s' WHERE productSaleItemID in (%s)", $_REQUEST["changeTransactionStatus"], $ids); $db = new db_alloc(); $db->query($q); } } // 2. from admin to salesperson $q = prepare("SELECT * FROM task WHERE projectID = %d AND taskName = '%s'", $cyberadmin, $taskname2); if (config::for_cyber() && !$db->qr($q)) { $task = new task(); $task->set_value("projectID", $cyberadmin); // Cyber Admin Project $task->set_value("taskName", $taskname2); $task->set_value("managerID", 67); // Cyber Support people (jane) $task->set_value("personID", $this->get_value("personID")); // salesperson $task->set_value("priority", 3); $task->set_value("taskTypeID", "Task"); $task->set_value("taskDescription", $taskDesc); $task->set_value("dateTargetStart", date("Y-m-d")); $task->set_value("dateTargetCompletion", date("Y-m-d", date("U") + 60 * 60 * 24 * 7)); $task->save(); $q = prepare("SELECT * FROM task WHERE projectID = %d AND taskName = '%s'", $cyberadmin, $taskname1); $rai_row = $db->qr($q); if ($rai_row) { $task->add_pending_tasks($rai_row["taskID"]); } $order_the_hardware_taskID = $task->get_id(); $TPL["message_good"][] = "Task created: " . $task->get_id() . " " . $task->get_value("taskName"); $task->add_notification(3, 1, "Task " . $task->get_id() . " " . $taskname2, "Task status moved from pending to open.", array(array("field" => "metaPersonID", "who" => -2))); } // 3. from salesperson to admin $q = prepare("SELECT * FROM task WHERE projectID = %d AND taskName = '%s'", $cyberadmin, $taskname3); if (config::for_cyber() && !$db->qr($q)) { $task = new task(); $task->set_value("projectID", $cyberadmin); // Cyber Admin Project $task->set_value("taskName", $taskname3); $task->set_value("managerID", $this->get_value("personID")); // salesperson $task->set_value("personID", 67); // Cyber Support people (jane) $task->set_value("priority", 3); $task->set_value("taskTypeID", "Task"); $task->set_value("taskDescription", $taskDesc); $task->set_value("dateTargetStart", date("Y-m-d")); $task->set_value("dateTargetCompletion", date("Y-m-d", date("U") + 60 * 60 * 24 * 7)); $task->save(); $task->add_pending_tasks($order_the_hardware_taskID); $pay_the_supplier_taskID = $task->get_id(); $TPL["message_good"][] = "Task created: " . $task->get_id() . " " . $task->get_value("taskName"); $task->add_notification(3, 1, "Task " . $task->get_id() . " " . $taskname3, "Task status moved from pending to open.", array(array("field" => "metaPersonID", "who" => -2))); } // 4. from admin to salesperson $q = prepare("SELECT * FROM task WHERE projectID = %d AND taskName = '%s'", $cyberadmin, $taskname4); if (config::for_cyber() && !$db->qr($q)) { $task = new task(); $task->set_value("projectID", $cyberadmin); // Cyber Admin Project $task->set_value("taskName", $taskname4); $task->set_value("managerID", 67); // Cyber Support people $task->set_value("personID", $this->get_value("personID")); // salesperson $task->set_value("priority", 3); $task->set_value("taskTypeID", "Task"); $task->set_value("taskDescription", $taskDesc); $task->set_value("dateTargetStart", date("Y-m-d")); $task->set_value("dateTargetCompletion", date("Y-m-d", date("U") + 60 * 60 * 24 * 7)); $task->save(); $task->add_pending_tasks($pay_the_supplier_taskID); $TPL["message_good"][] = "Task created: " . $task->get_id() . " " . $task->get_value("taskName"); $task->add_notification(3, 1, "Task " . $task->get_id() . " " . $taskname4, "Task status moved from pending to open.", array(array("field" => "metaPersonID", "who" => -2))); } } } } }
function import_planner_tasks($parentNode, $parentTaskId, $depth, $task_allocation, $resource_people, $project_manager_ID) { //Recursively imports tasks from GNOME Planner, given the parentNode. global $projectID; $current_user =& singleton("current_user"); $result = array(); // our dodgy DOM_NodeList doesn't support foreach.... for ($i = 0; $i < $parentNode->childNodes->length; $i++) { $taskXML = $parentNode->childNodes->item($i); if ($taskXML->nodeType == XML_ELEMENT_NODE && $taskXML->tagName == "task") { $task = new task(); $task->set_value('taskName', trim($taskXML->getAttribute("name"))); $task->set_value('projectID', $projectID); // We can find the task assignee's id in the $task_allocation array, and that person's Person record in the $resource_people array $planner_taskid = $taskXML->getAttribute("id"); // Dates we guess at (i.e., set to now) $task->set_value('dateCreated', date("Y-m-d H:i:s")); $task->set_value('dateAssigned', date("Y-m-d H:i:s")); if ($taskXML->hasAttribute("work-start")) { $task->set_value('dateTargetStart', import_planner_date($taskXML->getAttribute("work-start"))); } else { $task->set_value('dateTargetStart', import_planner_date($taskXML->getAttribute("start"))); $result[] = "Resorting to work value for " . $task->get_value('taskName'); } $task->set_value('dateTargetCompletion', import_planner_date($taskXML->getAttribute("end"))); if ($taskXML->hasAttribute("note")) { $task->set_value('taskDescription', $taskXML->getAttribute("note")); } $task->set_value('creatorID', $current_user->get_id()); $task->set_value('managerID', $project_manager_ID); if ($taskXML->hasAttribute("type") and $taskXML->getAttribute("type") == "milestone") { $task->set_value('taskTypeID', 'Milestone'); } else { $task->set_value('taskTypeID', 'Task'); } $task->set_value('taskStatus', 'open_notstarted'); $task->set_value('priority', '3'); $task->set_value('parentTaskID', $parentTaskId == 0 ? "" : $parentTaskId); // The following fields we leave at their default values: duplicateTaskID, dateActualCompletion, dateActualStart, closerID, timeExpected, dateClosed, parentTaskID, taskModifiedUser // Handle task assignment if (isset($task_allocation[$planner_taskid])) { if (is_array($task_allocation[$planner_taskid])) { // This task was assigned to more than one person. Assign it to the project manager and make a comment about it. $task->set_value('personID', $project_manager_ID); // Save the task so we have a task ID $task->save(); // Make a comment about this task $comment = new comment(); $comment->set_value("commentType", "task"); $comment->set_value("commentLinkID", $task->get_id()); $comment->set_value("commentCreatedTime", date("Y-m-d H:i:s")); // The user doing the import is (implicitly) the user creating the comment $comment->set_value("commentCreatedUser", $current_user->get_id()); // Get the relevant usernames $names = array(); foreach ($task_allocation[$planner_taskid] as $assignee) { $names[] = person::get_fullname($assignee); } $comment->set_value("comment", "Import notice: This task was originally assigned to " . implode($names, ', ') . "."); $comment->save(); $result[] = sprintf("<li>Note: multiple people were assigned to the task %d %s</li>", $task->get_id(), $task->get_value("taskName")); } else { $task->set_value('personID', $resource_people[$task_allocation[$taskXML->getAttribute("id")]]->get_id()); } } else { // Task not assigned to anyone, assign the task to the nominated manager $task->set_value('personID', $project_manager_ID); } $task->save(); $result[] = sprintf('<li>%sCreated task <a href="%s">%d %s</a>.</li>', str_repeat(">", $depth), $task->get_url(), $task->get_id(), $task->get_value('taskName')); // Do child nodes if ($taskXML->hasChildNodes()) { $result = array_merge($result, import_planner_tasks($taskXML, $task->get_id(), $depth + 1, $task_allocation, $resource_people, $project_manager_ID)); } } } return $result; }
function edit_task($commands, $email_receive) { $task_fields = $this->get_fields("task"); // Task commands if ($commands["task"]) { unset($changes); $taskPriorities = config::get_config_item("taskPriorities") or $taskPriorities = array(); foreach ($taskPriorities as $k => $v) { $priorities[strtolower($v["label"])] = $k; } $people_by_username = person::get_people_by_username(); // Else edit/create the task ... $task = new task(); if ($commands["task"] && strtolower($commands["task"]) != "new") { $task->set_id($commands["task"]); if (!$task->select()) { alloc_error("Unable to select task with ID: " . $commands["task"]); } } foreach ($commands as $k => $v) { // transform from username to personID if ($k == "assign") { $changes[$k] = "personID"; $v = $people_by_username[$v]["personID"]; $v or alloc_error("Unrecognized username."); } if ($k == "manage") { $changes[$k] = "managerID"; $v = $people_by_username[$v]["personID"]; $v or alloc_error("Unrecognized username."); } if ($k == "estimator") { $changes[$k] = "estimatorID"; $v = $people_by_username[$v]["personID"]; $v or alloc_error("Unrecognized username."); } // transform from priority label to priority ID if ($k == "priority" && !in_array($v, array(1, 2, 3, 4, 5))) { $v = $priorities[strtolower($v)]; } // so that --type parent becomes --type Parent // mysql's referential integrity is case-insensitive :( if ($k == "type") { $v = ucwords($v); } // Plug the value in if ($task_fields[$k][0]) { $changes[$k] = $task_fields[$k][0]; $task->set_value($task_fields[$k][0], sprintf("%s", $v)); } } if (isset($commands["pend"])) { $changes["pend"] = implode(",", (array) $task->get_pending_tasks()); } if (isset($commands["reopen"])) { $reopen_rows = $task->get_reopen_reminders(); unset($rr_bits); foreach ($reopen_rows as $rr) { $rr_bits[] = $rr["reminderTime"]; } $changes["reopen"] = implode(",", (array) $rr_bits); } if (isset($commands["tags"])) { $changes["tags"] = implode(",", $task->get_tags()); } if (strtolower($commands["task"]) == "new") { if (!$commands["desc"] && is_object($email_receive)) { $task->set_value("taskDescription", $email_receive->get_converted_encoding()); } } $after_label = "After: "; if (strtolower($commands["task"]) != "new") { $str = $this->condense_changes($changes, $task->row()); $str and $status[] = "msg"; $str and $message[] = "Before: " . $str; } else { $after_label = "Fields: "; } // Save task $err = $task->validate(); if (!$err && $task->save()) { $task->select(); if (isset($commands["pend"])) { $task->add_pending_tasks($commands["pend"]); $changes["pend"] = implode(",", (array) $task->get_pending_tasks()); } if (isset($commands["reopen"])) { $task->add_reopen_reminder($commands["reopen"]); $reopen_rows = $task->get_reopen_reminders(); unset($rr_bits); foreach ($reopen_rows as $rr) { $rr_bits[] = $rr["reminderTime"]; } $changes["reopen"] = implode(",", (array) $rr_bits); } if (isset($commands["tags"])) { $task->add_tags(array($commands["tags"])); $changes["tags"] = implode(",", $task->get_tags()); } $str = $this->condense_changes($changes, $task->row()); $str and $status[] = "msg"; $str and $message[] = $after_label . $str; if ($commands["dip"]) { interestedParty::add_remove_ips($commands["dip"], "task", $task->get_id(), $task->get_value("projectID")); } if (strtolower($commands["task"]) == "new") { $status[] = "yay"; $message[] = "Task " . $task->get_id() . " created."; } else { $status[] = "yay"; $message[] = "Task " . $task->get_id() . " updated."; } // Problems } else { alloc_error("Problem updating task: " . implode("\n", (array) $err)); } } return array($status, $message); }
function convert_email_to_new_task($email_receive, $change_user = false) { global $TPL; $current_user =& singleton("current_user"); $orig_current_user =& $current_user; if ($change_user) { inbox::change_current_user($email_receive->mail_headers["from"]); $current_user =& singleton("current_user"); if (is_object($current_user) && method_exists($current_user, "get_id") && $current_user->get_id()) { $personID = $current_user->get_id(); } } $email_receive->save_email(); // Subject line is name, email body is body $task = new task(); $task->set_value("taskName", $email_receive->mail_headers["subject"]); $task->set_value("taskDescription", $email_receive->mail_text); $task->set_value("priority", "3"); $task->set_value("taskTypeID", "Task"); $task->save(); if (!$TPL["message"] && $task->get_id()) { $dir = ATTACHMENTS_DIR . DIRECTORY_SEPARATOR . "task" . DIRECTORY_SEPARATOR . $task->get_id(); if (!is_dir($dir)) { mkdir($dir); foreach ((array) $email_receive->mimebits as $file) { $fh = fopen($dir . DIRECTORY_SEPARATOR . $file["name"], "wb"); fputs($fh, $file["blob"]); fclose($fh); } } rmdir_if_empty(ATTACHMENTS_DIR . DIRECTORY_SEPARATOR . "task" . DIRECTORY_SEPARATOR . $task->get_id()); $msg = "Created task " . $task->get_task_link(array("prefixTaskID" => true)) . " and moved the email to the task's mail folder."; $mailbox = "INBOX/task" . $task->get_id(); $email_receive->create_mailbox($mailbox) and $msg .= "\nCreated mailbox: " . $mailbox; $email_receive->archive($mailbox) and $msg .= "\nMoved email to " . $mailbox; $msg and $TPL["message_good_no_esc"][] = $msg; list($from_address, $from_name) = parse_email_address($email_receive->mail_headers["from"]); $ip["emailAddress"] = $from_address; $ip["name"] = $from_name; $ip["personID"] = $personID; $ip["entity"] = "task"; $ip["entityID"] = $task->get_id(); interestedParty::add_interested_party($ip); } // Put current_user back to normal $current_user =& $orig_current_user; singleton("current_user", $current_user); }
function testDeleteCategoryTasks() { //Arrange $name = "Work Stuff"; $id = null; $test_category = new Category($name, $id); $test_category->save(); $description = "Build Website"; $category_id = $test_category->getId(); $test_task = new task($description, $id, $category_id); $test_task->save(); //Act $test_category->delete(); //Assert $this->assertEquals([], task::getAll()); }