$TPL["_FORM"] = $_FORM; // Load filter $arr = task::load_task_filter($_FORM); is_array($arr) and $TPL = array_merge($TPL, $arr); // Check for updates if ($_POST["mass_update"]) { if ($_POST["select"]) { $allowed_auto_fields = array("dateTargetStart", "dateTargetCompletion", "dateActualStart", "dateActualCompletion", "managerID", "timeLimit", "timeBest", "timeWorst", "timeExpected", "priority", "taskTypeID", "taskStatus", "personID"); foreach ($_POST["select"] as $taskID => $selected) { $task = new task(); $task->set_id($taskID); $task->select(); // Special case: projectID and parentTaskID have to be done together if ($_POST["update_action"] == "projectIDAndParentTaskID") { // Can't set self to be parent if ($_POST["parentTaskID"] != $task->get_id()) { $task->set_value("parentTaskID", $_POST["parentTaskID"]); } // If task is a parent, change the project of that tasks children if ($_POST["projectID"] != $task->get_value("projectID") && $task->get_value("taskTypeID") == "Parent") { $task->update_children("projectID", $_POST["projectID"]); } $task->set_value("projectID", $_POST["projectID"]); $task->updateSearchIndexLater = true; $task->save(); // All other cases are generic and can be handled by a single clause } else { if ($_POST["update_action"] && in_array($_POST["update_action"], $allowed_auto_fields)) { $task->set_value($_POST["update_action"], $_POST[$_POST["update_action"]]); $task->updateSearchIndexLater = true; $task->save();
*/ define("NO_REDIRECT", 1); require_once "../alloc.php"; //usleep(1000); $t = timeSheetItem::parse_time_string($_REQUEST["time_item"]); $timeUnit = new timeUnit(); $units = $timeUnit->get_assoc_array("timeUnitID", "timeUnitLabelA"); $timeSheetItemMultiplier = new meta("timeSheetItemMultiplier"); $tsims = $timeSheetItemMultiplier->get_list(); foreach ($t as $k => $v) { if ($v) { if ($k == "taskID") { $task = new task(); $task->set_id($v); if ($task->select()) { $v = $task->get_id() . " " . $task->get_link(); } else { $v = "Task " . $v . " not found."; } } else { if ($k == "unit") { $v = $units[$v]; } else { if ($k == "multiplier") { $v = $tsims[sprintf("%0.2f", $v)]["timeSheetItemMultiplierName"]; } } } $rtn[$k] = $v; } }
$project->read_db_record($db); $parent_names[$project->get_id()] = $project->get_value('projectName'); } } else { if ($parentType == "task") { if ($current_user->have_role("admin")) { $query = "SELECT * FROM task"; } else { $query = prepare("SELECT * FROM task WHERE personID=%d ORDER BY taskName", $personID); } $db->query($query); while ($db->next_record()) { $task = new task(); $task->read_db_record($db); if (substr($task->get_value("taskStatus"), 0, 6) != "closed") { $parent_names[$task->get_id()] = $task->get_value('taskName'); } } } } } $TPL["parentType"] = $parentType; $TPL["parentNameOptions"] = page::select_options($parent_names); include_template("templates/reminderSelectParentM.tpl"); break; case 3: // reminder entry form $reminder = new reminder(); if (isset($reminderID)) { $reminder->set_id($reminderID); $reminder->select();
include_template("templates/taskHistoryM.tpl"); } global $timeSheetID; $db = new db_alloc(); $task = new task(); // If taskID $taskID = $_POST["taskID"] or $taskID = $_GET["taskID"]; if (isset($taskID)) { // Displaying a record $task->set_id($taskID); $task->select(); // Creating a new record } else { $_POST["dateCreated"] = date("Y-m-d H:i:s"); $task->read_globals(); $taskID = $task->get_id(); if (has("project") && $task->get_value("projectID")) { $project = $task->get_foreign_object("project"); } } // if someone uploads an attachment 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"); }
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))); } } } } }
public static function get_list($_FORM) { $current_user =& singleton("current_user"); /* * This is the definitive method of getting a list of tasks that need a sophisticated level of filtering * */ list($filter, $having) = task::get_list_filter($_FORM); $debug = $_FORM["debug"]; $debug and print "\n<pre>_FORM: " . print_r($_FORM, 1) . "</pre>"; $debug and print "\n<pre>filter: " . print_r($filter, 1) . "</pre>"; $_FORM["taskView"] or $_FORM["taskView"] = 'prioritised'; // Zero is a valid limit if ($_FORM["limit"] || $_FORM["limit"] === 0 || $_FORM["limit"] === "0") { $limit = prepare("limit %d", $_FORM["limit"]); } $_FORM["return"] or $_FORM["return"] = "html"; $_FORM["people_cache"] =& get_cached_table("person"); $_FORM["timeUnit_cache"] =& get_cached_table("timeUnit"); $_FORM["taskType_cache"] =& get_cached_table("taskType"); if ($_FORM["taskView"] == "prioritised") { unset($filter["parentTaskID"]); $order_limit = " " . $limit; } else { $order_limit = " ORDER BY projectName,taskName " . $limit; } // Get a hierarchical list of tasks if (is_array($filter) && count($filter)) { $f = " WHERE " . implode(" AND ", $filter); } $uid = sprintf("%d", $current_user->get_id()); $spread = sprintf("%d", config::get_config_item("taskPrioritySpread")); $scale = sprintf("%d", config::get_config_item("taskPriorityScale")); $scale_halved = sprintf("%d", config::get_config_item("taskPriorityScale") / 2); $q = "SELECT task.*\n ,projectName\n ,projectShortName\n ,clientID\n ,projectPriority\n ,project.currencyTypeID as currency\n ,rate\n ,rateUnitID\n ,GROUP_CONCAT(pendingTask.pendingTaskID) as pendingTaskIDs\n ,GROUP_CONCAT(DISTINCT alltag.name SEPARATOR ', ') as tags\n FROM task\n LEFT JOIN project ON project.projectID = task.projectID\n LEFT JOIN projectPerson ON project.projectID = projectPerson.projectID AND projectPerson.personID = '" . $uid . "'\n LEFT JOIN pendingTask ON pendingTask.taskID = task.taskID\n LEFT JOIN tag alltag ON alltag.taskID = task.taskID\n LEFT JOIN tag seltag ON seltag.taskID = task.taskID\n " . $f . "\n GROUP BY task.taskID\n " . $having . "\n " . $order_limit; $debug and print "\n<br>QUERY: " . $q; $_FORM["debug"] and print "\n<br>QUERY: " . $q; $db = new db_alloc(); $db->query($q); while ($row = $db->next_record()) { $task = new task(); $task->read_db_record($db); $row["taskURL"] = $task->get_url(); $row["taskName"] = $task->get_name($_FORM); $row["taskLink"] = $task->get_task_link($_FORM); $row["project_name"] = $row["projectShortName"] or $row["project_name"] = $row["projectName"]; $row["projectPriority"] = $db->f("projectPriority"); has("project") and $row["projectPriorityLabel"] = project::get_priority_label($db->f("projectPriority")); has("project") and list($row["priorityFactor"], $row["daysUntilDue"]) = $task->get_overall_priority($row["projectPriority"], $row["priority"], $row["dateTargetCompletion"]); $row["taskTypeImage"] = $task->get_task_image(); $row["taskTypeSeq"] = $_FORM["taskType_cache"][$row["taskTypeID"]]["taskTypeSeq"]; $row["taskStatusLabel"] = $task->get_task_status("label"); $row["taskStatusColour"] = $task->get_task_status("colour"); $row["creator_name"] = $_FORM["people_cache"][$row["creatorID"]]["name"]; $row["manager_name"] = $_FORM["people_cache"][$row["managerID"]]["name"]; $row["assignee_name"] = $_FORM["people_cache"][$row["personID"]]["name"]; $row["closer_name"] = $_FORM["people_cache"][$row["closerID"]]["name"]; $row["estimator_name"] = $_FORM["people_cache"][$row["estimatorID"]]["name"]; $row["creator_username"] = $_FORM["people_cache"][$row["creatorID"]]["username"]; $row["manager_username"] = $_FORM["people_cache"][$row["managerID"]]["username"]; $row["assignee_username"] = $_FORM["people_cache"][$row["personID"]]["username"]; $row["closer_username"] = $_FORM["people_cache"][$row["closerID"]]["username"]; $row["estimator_username"] = $_FORM["people_cache"][$row["estimatorID"]]["username"]; $row["newSubTask"] = $task->get_new_subtask_link(); $_FORM["showPercent"] and $row["percentComplete"] = $task->get_percentComplete(); $_FORM["showTimes"] and $row["timeActual"] = $task->get_time_billed() / 60 / 60; $row["rate"] = page::money($row["currency"], $row["rate"], "%mo"); $row["rateUnit"] = $_FORM["timeUnit_cache"][$row["rateUnitID"]]["timeUnitName"]; $row["priorityLabel"] = $task->get_priority_label(); if (!$_FORM["skipObject"]) { $_FORM["return"] == "array" and $row["object"] = $task; } $row["padding"] = $_FORM["padding"]; $row["taskID"] = $task->get_id(); $row["parentTaskID"] = $task->get_value("parentTaskID"); $row["parentTaskID_link"] = "<a href='" . $task->get_url(false, $task->get_value("parentTaskID")) . "'>" . $task->get_value("parentTaskID") . "</a>"; $row["timeLimitLabel"] = $row["timeBestLabel"] = $row["timeWorstLabel"] = $row["timeExpectedLabel"] = $row["timeActualLabel"] = ""; $row["timeLimit"] !== NULL and $row["timeLimitLabel"] = seconds_to_display_format($row["timeLimit"] * 60 * 60); $row["timeBest"] !== NULL and $row["timeBestLabel"] = seconds_to_display_format($row["timeBest"] * 60 * 60); $row["timeWorst"] !== NULL and $row["timeWorstLabel"] = seconds_to_display_format($row["timeWorst"] * 60 * 60); $row["timeExpected"] !== NULL and $row["timeExpectedLabel"] = seconds_to_display_format($row["timeExpected"] * 60 * 60); $row["timeActual"] !== NULL and $row["timeActualLabel"] = seconds_to_display_format($row["timeActual"] * 60 * 60); if ($_FORM["showComments"] && ($comments = comment::util_get_comments("task", $row["taskID"]))) { $row["comments"] = $comments; } if ($_FORM["taskView"] == "byProject") { $rows[$task->get_id()] = array("parentTaskID" => $row["parentTaskID"], "row" => $row); } else { if ($_FORM["taskView"] == "prioritised") { $rows[$row["taskID"]] = $row; if (is_array($rows) && count($rows)) { uasort($rows, array("task", "priority_compare")); } } } } if ($_FORM["taskView"] == "byProject") { $parentTaskID = $_FORM["parentTaskID"] or $parentTaskID = 0; $t = task::get_recursive_child_tasks($parentTaskID, (array) $rows); list($tasks, $done) = task::build_recursive_task_list($t, $_FORM); // This bit appends the orphan tasks onto the end.. foreach ((array) $rows as $taskID => $r) { $row = $r["row"]; $row["padding"] = 0; if (!$done[$taskID]) { $tasks += array($taskID => $row); } } } else { if ($_FORM["taskView"] == "prioritised") { $tasks =& $rows; } } return (array) $tasks; }
function email_move_status_to_manager($direction, $info) { $current_user =& singleton("current_user"); $project = $this->get_foreign_object("project"); $projectManagers = $project->get_timeSheetRecipients(); // Can get forwards to "manager" only from "edit" or "rejected" if ($direction == "forwards") { //forward to manager requires the timesheet to be owned by the current //user or TIME_INVOICE_TIMESHEETS //project managers may not do this if (!($this->get_value("personID") == $current_user->get_id() || $this->have_perm(PERM_TIME_INVOICE_TIMESHEETS))) { alloc_error("You do not have permission to change this timesheet."); } $this->set_value("dateSubmittedToManager", date("Y-m-d")); $this->set_value("dateRejected", ""); // Check for time overrun $overrun_tasks = array(); $db = new db_alloc(); $task_id_query = prepare("SELECT DISTINCT taskID FROM timeSheetItem WHERE timeSheetID=%d ORDER BY dateTimeSheetItem, timeSheetItemID", $this->get_id()); $db->query($task_id_query); while ($db->next_record()) { $task = new task(); $task->read_db_record($db); $task->select(); if ($task->get_value('timeLimit') > 0) { $total_billed_time = $task->get_time_billed(false) / 3600; if ($total_billed_time > $task->get_value('timeLimit')) { $overrun_tasks[] = sprintf(" * %d %s (limit: %.02f hours, billed so far: %.02f hours)", $task->get_id(), $task->get_value('taskName'), $task->get_value('timeLimit'), $total_billed_time); } } $hasItems = true; } if (!$hasItems) { return alloc_error('Unable to submit time sheet, no items have been added.'); } if (count($overrun_tasks)) { $overrun_notice = "\n\nThe following tasks billed on this timesheet have exceeded their time estimates:\n"; $overrun_notice .= implode("\n", $overrun_tasks); } foreach ($info["projectManagers"] as $pm) { $email = array(); $email["type"] = "timesheet_submit"; $email["to"] = $info["people_cache"][$pm]["emailAddress"]; $email["subject"] = commentTemplate::populate_string(config::get_config_item("emailSubject_timeSheetToManager"), "timeSheet", $this->get_id()); $email["body"] = <<<EOD To Manager: {$info["people_cache"][$pm]["name"]} Time Sheet: {$info["url"]} Submitted By: {$info["timeSheet_personID_name"]} For Project: {$info["projectName"]} A timesheet has been submitted for your approval. If it is satisfactory, submit the timesheet to the Administrator. If not, make it editable again for re-submission.{$overrun_notice} EOD; $this->get_value("billingNote") and $email["body"] .= "\n\nBilling Note: " . $this->get_value("billingNote"); $msg[] = $this->shootEmail($email); } // Can get backwards to "manager" only from "admin" } else { if ($direction == "backwards") { //admin->manager requires APPROVE_TIMESHEETS if (!$this->have_perm(PERM_TIME_INVOICE_TIMESHEETS)) { //no permission, go away alloc_error("You do not have permission to change this timesheet."); } $email = array(); $email["type"] = "timesheet_reject"; $email["to"] = $info["approvedByManagerPersonID_email"]; $email["subject"] = commentTemplate::populate_string(config::get_config_item("emailSubject_timeSheetFromAdministrator"), "timeSheet", $this->get_id()); $email["body"] = <<<EOD To Manager: {$info["approvedByManagerPersonID_name"]} Time Sheet: {$info["url"]} Submitted By: {$info["timeSheet_personID_name"]} For Project: {$info["projectName"]} Rejected By: {$info["people_cache"][$current_user->get_id()]["name"]} EOD; $this->get_value("billingNote") and $email["body"] .= "Billing Note: " . $this->get_value("billingNote"); $msg[] = $this->shootEmail($email); $this->set_value("dateRejected", date("Y-m-d")); } } $this->set_value("status", "manager"); $this->set_value("dateSubmittedToAdmin", ""); $this->set_value("approvedByAdminPersonID", ""); return $msg; }
function populate_string($str, $entity, $entityID = false) { // Actually do the text substitution $current_user =& singleton("current_user"); is_object($current_user) and $swap["cu"] = person::get_fullname($current_user->get_id()); if ($entity == "timeSheet" && $entityID) { $timeSheet = new timeSheet(); $timeSheet->set_id($entityID); $timeSheet->select(); $timeSheet->load_pay_info(); foreach ($timeSheet->pay_info as $k => $v) { $swap[$k] = $v; } if ($timeSheet->get_value("approvedByManagerPersonID")) { $swap["tm"] = person::get_fullname($timeSheet->get_value("approvedByManagerPersonID")); } else { $project = $timeSheet->get_foreign_object("project"); $projectManagers = $project->get_timeSheetRecipients(); if (is_array($projectManagers) && count($projectManagers)) { $people =& get_cached_table("person"); foreach ($projectManagers as $pID) { $swap["tm"] .= $commar . $people[$pID]["name"]; $commar = ", "; } } } if ($timeSheet->get_value("approvedByAdminPersonID")) { $swap["tc"] = person::get_fullname($timeSheet->get_value("approvedByAdminPersonID")); } else { $people =& get_cached_table("person"); $timeSheetAdministrators = config::get_config_item('defaultTimeSheetAdminList'); if (count($timeSheetAdministrators)) { $swap["tc"] = ""; $comma = ""; foreach ($timeSheetAdministrators as $adminID) { $swap["tc"] .= $comma . $people[$adminID]["name"]; $comma = ", "; } } else { $swap["tc"] = 'no-one'; } } $swap["ti"] = $timeSheet->get_id(); $swap["to"] = person::get_fullname($timeSheet->get_value("personID")); $swap["ta"] = person::get_fullname($timeSheet->get_value("personID")); $swap["tf"] = $timeSheet->get_value("dateFrom"); $swap["tt"] = $timeSheet->get_value("dateTo"); $swap["ts"] = $timeSheet->get_timeSheet_status(); $swap["tu"] = config::get_config_item("allocURL") . "time/timeSheet.php?timeSheetID=" . $timeSheet->get_id(); $projectID = $timeSheet->get_value("projectID"); } if ($entity == "task" && $entityID) { $task = new task(); $task->set_id($entityID); $task->select(); $swap["ti"] = $task->get_id(); $swap["to"] = person::get_fullname($task->get_value("creatorID")); $swap["ta"] = person::get_fullname($task->get_value("personID")); $swap["tm"] = person::get_fullname($task->get_value("managerID")); $swap["tc"] = person::get_fullname($task->get_value("closerID")); $swap["tn"] = $task->get_value("taskName"); $swap["td"] = $task->get_value("taskDescription"); $swap["tu"] = config::get_config_item("allocURL") . "task/task.php?taskID=" . $task->get_id(); $swap["tp"] = $task->get_priority_label(); $swap["ts"] = $task->get_task_status("label"); $swap["teb"] = $task->get_value("timeBest"); $swap["tem"] = $task->get_value("timeExpected"); $swap["tew"] = $task->get_value("timeWorst"); $swap["tep"] = person::get_fullname($task->get_value("estimatorID")); //time estimate person, when it's implemented $projectID = $task->get_value("projectID"); } if ($entity == "project" && $entityID || $projectID) { $project = new project(); if ($projectID) { $project->set_id($projectID); } else { $project->set_id($entityID); } $project->select(); $swap["pn"] = $project->get_value("projectName"); $swap["pi"] = $project->get_id(); $clientID = $project->get_value("clientID"); } if ($entity == "client" && $entityID || $clientID) { $client = new client(); if ($clientID) { $client->set_id($clientID); } else { $client->set_id($entityID); } $client->select(); $swap["li"] = $client->get_id(); $swap["cc"] = $client->get_value("clientName"); } $swap["cd"] = config::get_config_item("companyContactAddress"); $swap["cd"] .= " " . config::get_config_item("companyContactAddress2"); $swap["cd"] .= " " . config::get_config_item("companyContactAddress3"); $swap["cd"] .= "\nP: " . config::get_config_item("companyContactPhone"); $swap["cd"] .= "\nF: " . config::get_config_item("companyContactFax"); $swap["cd"] .= "\nE: " . config::get_config_item("companyContactEmail"); $swap["cd"] .= "\nW: " . config::get_config_item("companyContactHomePage"); $swap["cn"] = config::get_config_item("companyName"); $swap["c1"] = config::get_config_item("companyContactAddress"); $swap["c2"] = config::get_config_item("companyContactAddress2"); $swap["c3"] = config::get_config_item("companyContactAddress3"); $swap["ce"] = config::get_config_item("companyContactEmail"); $swap["cp"] = config::get_config_item("companyContactPhone"); $swap["cf"] = config::get_config_item("companyContactFax"); $swap["cw"] = config::get_config_item("companyContactHomePage"); foreach ($swap as $k => $v) { $str = str_replace("%" . $k, $v, $str); } return $str; }
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); }