<?PHP
/*-----------------------------------------------------------------------**
---------------------------------------------------------------------------
IPM (Incyte Project Manager)
PHP based project tracking tool
Copyright (c) 2001 by phlux
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
---------------------------------------------------------------------------
**-----------------------------------------------------------------------*/
// FUNCTION LIST
////////// OOP RELATED FUNCTIONS ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
function task_list($id, $status, $order) {
// print the nice indented list
include "config.php";
dbconnect();
$query = "SELECT * FROM IPM_tasks WHERE id='$id' ORDER BY $order";
$result = mysql_query($query);
while ($task = mysql_fetch_array($result)) {
$query2 = "SELECT $listdisplay FROM IPM_users WHERE id='$task[person]'";
$result2 = mysql_query($query2);
$user = mysql_fetch_array($result2);
if (is_toplevel($task[task_id])) {
if (get_decendents($task[task_id],$status) || $task[status]==$status) {
?>
<tr valign=top>
<td class=todolist>
<?
if ($task[status] == "$status") {
$class="listlink";
} else {
$class="placeholder";
}
if ($task[description] == "") {
$string=popuploader("$task[task_id]", "No Description Available", "$task[title]", "$PHP_SELF?op=edittask&task_id=$task[task_id]&name=$list_row[name]", "$class");
} else {
$string=popuploader("$task[task_id]", "$task[description]", "$task[title]", "$PHP_SELF?op=edittask&task_id=$task[task_id]&name=$list_row[name]", "$class");
}
echo "$string";
?>
</td>
<td class=todolist>
<?=$user[$listdisplay]?>
</td>
<td align=center class=todolist>
<? if ($task[comments]) {
echo "<img src=img/comment-on.gif border=0>";
} else {
echo "<img src=img/comment-off.gif border=0>";
} ?>
</td>
<td align=center class=todolist>
<? if (!$task[billable]) {
echo $task[hours];
} else {
echo "<font class=billable>$task[hours]</font>";
} ?>
</td>
<td align=center class=todolist>
<?
if ($task[status] == "$status") {
if ($status==1) {
if (get_children($task[task_id],1)) {
echo "<a href=#><img src=img/d-off.gif border=0></a> "
."<a href=#><img src=img/f-off.gif border=0></a></td></tr>";
} else {
echo "<a href=$PHP_SELF?op=confirmdeletetask&task_id=$task[task_id]&id=$id><img src=img/d-on.gif border=0></a> "
."<a href=$PHP_SELF?op=projectdetail&finish=$task[task_id]&id=$id><img src=img/f-on.gif border=0></a></td></tr>";
}
} else {
if (get_children($task[task_id],0)) {
echo "<a href=#><img src=img/d-off.gif border=0></a> "
."<a href=$PHP_SELF?op=projectdetail&reset=$task[task_id]&id=$id><img src=img/r-on.gif border=0></a></td></tr>";
} else {
echo "<a href=$PHP_SELF?op=confirmdeletetask&task_id=$task[task_id]&id=$id><img src=img/d-on.gif border=0></a> "
."<a href=$PHP_SELF?op=projectdetail&reset=$task[task_id]&id=$id><img src=img/r-on.gif border=0></a></td></tr>";
}
}
} else {
echo "<a href=#><img src=img/d-off.gif border=0></a> "
."<a href=#><img src=img/f-off.gif border=0></a></td></tr>";
}
}
print_tree($task[task_id], 0, $status);
}
}
}
function print_tree($task_id, $count, $status) {
include "config.php";
global $id;
$count++;
$indent=$count*10;
$result = get_children($task_id, 2);
for ($x=0; $x<sizeof($result); $x++) {
$task=get_task_info($result[$x][0]);
$query2 = "SELECT $listdisplay FROM IPM_users WHERE id='$task[person]'";
$result2 = mysql_query($query2);
$todouser = mysql_fetch_array($result2);
if ($task[status]==$status || get_decendents($task[task_id],$status)) {
?>
<tr valign=top>
<td class=todolist>
<img src=img/spacer.gif border=0 height=10 width=<?=$indent?>>
<?
if ($task[status] == "$status") {
$class="listlink";
} else {
$class="placeholder";
}
if ($task[description] == "") {
$string=popuploader("$task[task_id]", "No Description Available", "$task[title]", "$PHP_SELF?op=edittask&task_id=$task[task_id]&name=$list_row[name]", "$class");
} else {
$string=popuploader("$task[task_id]", "$task[description]", "$task[title]", "$PHP_SELF?op=edittask&task_id=$task[task_id]&name=$list_row[name]", "$class");
}
echo "$string";
?>
</td>
<td class=todolist>
<?=$todouser[$listdisplay]?>
</td>
<td align=center class=todolist>
<? if ($task[comments]) {
echo "<img src=img/comment-on.gif border=0>";
} else {
echo "<img src=img/comment-off.gif border=0>";
} ?>
</td>
<td align=center class=todolist>
<? if (!$task[billable]) {
echo $task[hours];
} else {
echo "<font class=billable>$task[hours]</font>";
} ?>
</td>
<td align=center class=todolist>
<?
if ($task[status] == "$status") {
if ($status==1) {
if (get_children($task[task_id],1)) {
echo "<a href=#><img src=img/d-off.gif border=0></a> "
."<a href=#><img src=img/f-off.gif border=0></a></td></tr>";
} else {
echo "<a href=$PHP_SELF?op=confirmdeletetask&task_id=$task[task_id]&id=$id><img src=img/d-on.gif border=0></a> "
."<a href=$PHP_SELF?op=projectdetail&finish=$task[task_id]&id=$id><img src=img/f-on.gif border=0></a></td></tr>";
}
} else {
if (get_children($task[task_id],0)) {
echo "<a href=#><img src=img/d-off.gif border=0></a> "
."<a href=$PHP_SELF?op=projectdetail&reset=$task[task_id]&id=$id><img src=img/r-on.gif border=0></a></td></tr>";
} else {
echo "<a href=$PHP_SELF?op=confirmdeletetask&task_id=$task[task_id]&id=$id><img src=img/d-on.gif border=0></a> "
."<a href=$PHP_SELF?op=projectdetail&reset=$task[task_id]&id=$id><img src=img/r-on.gif border=0></a></td></tr>";
}
}
} else {
echo "<a href=#><img src=img/d-off.gif border=0></a> "
."<a href=#><img src=img/f-off.gif border=0></a></td></tr>";
}
print_tree($result[$x][0], $count, $status);
}
}
}
function get_children($task_id, $status) {
// returns the task_id's of all child tasks that are status=$status
dbconnect();
$count = 0;
if (($status == 0) || ($status == 1)) {
$query = "SELECT task_id FROM IPM_tasks WHERE parent_id='$task_id' AND status='$status'";
} else {
$query = "SELECT task_id FROM IPM_tasks WHERE parent_id='$task_id'";
}
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$children[$count][0] = $row["task_id"];
$count++;
}
return $children;
}
function get_decendents($task_id, $status, $count = 0) {
dbconnect();
$result = get_children($task_id, 2);
for ($x=0; $x<sizeof($result); $x++) {
$task=get_task_info($result[$x][0]);
if (get_children($task[task_id], $status) || $status == $task[status]) {
$decendents[$x][0] = $result[$x][0];
}
get_decendents($result[$x][0], $count, $status);
}
return $decendents;
}
function get_task_info($task_id) {
// returns the data concerning a task
dbconnect();
$query = "SELECT * FROM IPM_tasks WHERE task_id='$task_id'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$info["task_id"] = $task_id;
$info["title"] = stripslashes($row["title"]);
$info["hours"] = $row["hours"];
$info["description"] = stripslashes($row["description"]);
$info["person"] = stripslashes($row["person"]);
$info["status"] = $row["status"];
$info["billable"] = $row["billable"];
$info["comments"] = stripslashes($row["comments"]);
$info["parent_id"] = $row["parent_id"];
}
return $info;
}
function is_toplevel($task_id) {
// returns 1 if the task is at the top level
// returns null if the task is a subtask
dbconnect();
$query = "SELECT parent_id FROM IPM_tasks WHERE task_id='$task_id'";
$result = mysql_query($query);
while ($parent=mysql_fetch_row($result)) {
if ($parent[0]==0) {
return 1;
} else {
return;
}
}
}
function get_parent($task_id) {
// returns task_id of parent task if it exists
dbconnect();
if (is_toplevel($task_id)) {
return;
} else {
$query = "SELECT parent_id FROM IPM_tasks WHERE task_id='$task_id'";
$result = mysql_query($query);
if ($parent = mysql_fetch_row($result)) return $parent;
}
}
function get_ancestors($task_id, $count = 0) {
global $ancestors;
$parent = get_parent($task_id);
if($parent) {
$ancestors[$count][0] = $parent;
get_ancestors($parent, $count+1);
return array_reverse($ancestors);
}
}
function task_dropdown($id) {
// print the nice indented list
include "config.php";
dbconnect();
$query = "SELECT task_id,title FROM IPM_tasks WHERE id='$id'";
$result = mysql_query($query);
while ($task = mysql_fetch_array($result)) {
if (is_toplevel($task[task_id])) {
echo "<option value=$task[task_id]>$task[title]</option>\n";
print_task_dropdown($task[task_id], 0);
}
}
}
function print_task_dropdown($task_id, $count) {
include "config.php";
global $id;
$count++;
$indent=$count*3;
$spacing="";
for ($x=0; $x<$indent; $x++) {
$spacing.=" ";
}
$result = get_children($task_id, 2);
for ($x=0; $x<sizeof($result); $x++) {
$task=get_task_info($result[$x][0]);
echo "<option value=$task[task_id]>$spacing $task[title]</option>";
print_task_dropdown($result[$x][0], $count);
}
}
function get_user_info($id) {
// returns all data concerning a user
dbconnect();
$query = "SELECT * FROM IPM_users WHERE id='$id'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$info["id"] = $id;
$info["username"] = $row["username"];
$info["password"] = $row["password"];
$info["firstname"] = $row["firstname"];
$info["lastname"] = $row["lastname"];
$info["email"] = $row["email"];
$info["role"] = $row["role"];
}
return $info;
}
////////// TASK RELATED FUNCTIONS ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
function mytasks() {
// This function gives a comprehensive summary for all of a user's
// projects and tasks. All tasks assigned to the logged in user are
// displayed along with project details. This is the default function
$user_id=authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $finish;
// If a task was flagged for finishing then do it now
if (isset($finish)) {
finishtask($finish);
}
// get ammount of projects the user is assigned to
$p_query = "SELECT id FROM IPM_tasks WHERE person='$user_id' AND status='1' GROUP BY 'id'";
$p_result = mysql_query($p_query);
$project_total = mysql_num_rows($p_result);
// get ammount of open tasks the user is assigned to
$t_query = "SELECT id FROM IPM_tasks WHERE person='$user_id' AND status='1'";
$t_result = mysql_query($t_query);
$task_total = mysql_num_rows($t_result);
// get billable info for user
$billable_total=0;
$thismonth=date("F, Y");
$b_query = "SELECT DATE_FORMAT(enddate,'%M, %Y'), hours FROM IPM_tasks WHERE person='$user_id' AND status='0' AND billable='1'";
$b_result = mysql_query($b_query);
while ($b_total=mysql_fetch_array($b_result)) {
echo "$b_total[enddate]";
$billable_total=$billable_total+$b_total[hours];
}
// get the general user info
$user_query = "SELECT * FROM IPM_users WHERE id='$user_id'";
$result = mysql_query($user_query);
while ($userinfo = mysql_fetch_array($result)) {
if ($userinfo[role] == "1") {
$role = "Administrator";
} else {
$role = "General User";
}
// Display the HTML that sums up all of this info
?>
<table border=1 bordercolor=black cellpadding=2 cellspacing=0 width=90% align=center>
<tr valign=top>
<td class=header colspan=2>
User Details for <b><?=$userinfo[firstname]?> <?=$userinfo[lastname]?></b>
</td>
</tr>
<tr valign=top>
<td class=darker width=30% align=right>
Username: <br>
Role: <br>
Total Projects: <br>
Total Open Tasks: <br>
Completed Billable Hours for <?=$thismonth?>:
</td>
<td class=lighter width=70% align=left>
<b><?=$userinfo[username]?></b><br>
<b><?=$role?></b><br>
<b><?=$project_total?></b><br>
<b><?=$task_total?></b><br>
<b><?=$billable_total?></b><br>
</td>
</tr>
</table><br>
<?
// find the user's open projects
$open_query = "SELECT * FROM IPM_tasks WHERE person='$user_id' AND status='1' GROUP BY 'id'";
$result2 = mysql_query($open_query);
while ($open = mysql_fetch_array($result2)) {
echo "<table width=90% align=center cellpadding=2 cellspacing=0 border=1 bordercolor=black>";
// grab all info for the open projects
$project_query = "SELECT * FROM IPM_projects WHERE id='$open[id]'";
$result3 = mysql_query($project_query);
while ($project = mysql_fetch_array($result3)) {
?>
<tr valign=top>
<td class=header width=38%>
PROJECT: <b><a class=headerlink href=<?=$PHP_SELF?>?op=projectdetail&id=<?=$project[id]?>><?=$project[name]?></a></b><br>
</td>
<td nowrap width=10% class=header align=right>
<?
draw_time_and_progress_bars($project[id], "CLASS=listheader");
?>
</td>
<td nowrap width=10% class=header align=center>
[<a class=headerlink href=<?=$PHP_SELF?>?op=addtask&id=<?=$project[id]?>&name=<?$project[name]?>>ADD TASK</a>]
:: [<a class=headerlink href=<?=$PHP_SELF?>?op=editproject&id=<?=$project[id]?>>EDIT</a>]
:: [<a class=headerlink href=<?=$PHP_SELF?>?op=confirmprojectdelete&id=<?=$project[id]?>>DELETE</a>]
</td>
</tr>
</table>
<table width=90% align=center cellpadding=2 cellspacing=0 border=1 bordercolor=black>
<tr class=darker>
<td align=center width=5%>
HOURS
</td>
<td align=center width=5%>
COMMENTS
</td>
<td align=center width=25%>
TITLE
</td>
<td align=center width=60%>
DESCRIPTION
</td>
<td width=5% align=center>
ACTION
</td>
</tr>
<?
// grab all info for tasks within this active project
$task_query = "SELECT * FROM IPM_tasks WHERE person='$user_id' AND status='1' AND id='$project[id]' ORDER BY 'hours' DESC";
$result4 = mysql_query($task_query);
while ($task = mysql_fetch_array($result4)) {
?>
<tr class=lighter valign=top>
<td align=center>
<? if (!$task[billable]) {
echo $task[hours];
} else {
echo "<font class=billable>$task[hours]</font>";
} ?>
</td>
<td align=center>
<? if ($task[comments]) {
echo "<img src=img/comment-on.gif border=0>";
} else {
echo "<img src=img/comment-off.gif border=0>";
} ?>
</td>
<td>
<a href=<? echo "$PHP_SELF?op=edittask&task_id=$task[task_id]"; ?>><?=$task[title]?></a>
</td>
<td>
<? echo nl2br($task[description]); ?>
</td>
<td align=center nowrap>
<a href=<? echo "$PHP_SELF?finish=$task[task_id]"; ?>><img src=img/f-on.gif border=0></a>
<a href=<? echo "$PHP_SELF?op=confirmdeletetask&id=$task[id]&task_id=$task[task_id]"; ?>><img src=img/d-on.gif border=0></a>
</td>
</tr>
<?
}
echo "</table><br>";
}
}
}
echo "<p align=center>(Hours in bold are billable)<br>";
include ("footer.php");
}
function addtask($id, $name) {
// This function builds the form for adding a task to a project.
// When this form is submitted the variables are passed to the function
// "addtaskaction()"
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $message;
$query = "SELECT * FROM IPM_projects WHERE id=$id";
$result = mysql_query($query);
$add = mysql_fetch_array($result);
$query2 = "SELECT * FROM IPM_users";
$result2 = mysql_query($query2);
$query3 = "SELECT task_id, title FROM IPM_tasks WHERE id=$id";
$result3 = mysql_query($query3);
?>
<form action=<?=$PHP_SELF?> method=post>
<table border=0 cellspacing=0 cellpadding=2 width=90% align=center>
<tr>
<td width=100% colspan=2 class=header align=left>
<b>Add Task</b>
</td>
</tr>
<tr>
<td width=38% align=right class=darker>
<b>Project Name: </b>
</td>
<td class=lighter width=62%>
<a class=biglink href=<?=$PHP_SELF?>?op=projectdetail&id=<?=$id?>><?=$add[name]?></a>
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Task Name: </b>
</td>
<td class=lighter>
<input name=title type=text>
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Assigned To: </b>
</td>
<td class=lighter>
<select name=person size=1>
<option value="1" selected>Choose a User</option>
<option value="1">-------------</option>
<? while ($users=mysql_fetch_array($result2)) {
echo "<option value=$users[id]>$users[$listdisplay]</option>";
}?>
</select>
<input type=checkbox name=notify value=1 checked > Notify user?
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Quoted Hours: </b>
</td>
<td class=lighter>
<input name=hours size=10 maxlength=10 type=text>
<input type=checkbox name=billable value=1 checked > Billable?
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Subtask of: </b>
</td>
<td class=lighter>
<select name=parent_id size=1>
<option value="0" selected>TOP LEVEL (none)</option>
<option value="0">-------------------------------------</option>
<? task_dropdown($id); ?>
</select>
</td>
</tr>
<tr valign=top>
<td align=right class=darker>
<b>Description: </b>
</td>
<td class=lighter>
<textarea cols=40 rows=4 name=description></textarea>
</td>
</tr>
<tr>
<td class=header align=center colspan=2>
<input class=button type=reset> <input class=button type=submit value="Add Task">
</td>
</tr>
</table>
<input type=hidden name=op value=addtaskaction><input type=hidden name=id value=<?=$id?>>
</form>
<?
include ("footer.php");
}
function addtaskaction($id, $name, $title, $hours, $description, $person, $notify, $billable, $parent_id) {
// This function takes the results from the function "addtask()"
// and inserts them into the database, then displays the results
authenticate();
dbconnect();
include ("config.php");
$result = mysql_query("INSERT INTO IPM_tasks VALUES (NULL,'$id','$title','$hours','$enddate','$description','1','$person','$billable','0','$parent_id')");
echo mysql_error();
addtask($id, $name);
if ($notify == "1") {
$query="SELECT email FROM IPM_users WHERE id='$person'";
$result=mysql_query($query);
$address=mysql_fetch_row($result);
$query2="SELECT name FROM IPM_projects WHERE id='$id'";
$result2=mysql_query($query2);
$project=mysql_fetch_row($result2);
$message="A new task has been assigned to you in IPM. \n\n"
." PROJECT: $project[0] \n"
." TASK NAME: $title \n"
." HOURS: $hours \n"
."DESCRIPTION: $description \n"
."Refer to $ipmhomepage for more information. \n\n"
."Thanks";
mail("$address[0]", "A new task has been assigned to you.", "$message", "From: $ipmaddress", "-f$ipmaddress");
}
if ($result) {
message("Task \"$title\" Added Successfully");
} else {
message("Error Adding Task");
}
include ("footer.php");
}
function edittask($task_id) {
// This function build the menu for editing a pre-existing task in a project.
// When submitted, the variables are passed to the function "edittaskaction()".
authenticate();
include ("config.php");
include ("header.php");
dbconnect();
global $PHP_SELF, $message;
if ($message) message("$message");
$query = "SELECT * FROM IPM_tasks where task_id=$task_id";
$result = mysql_query($query);
while ($edit=mysql_fetch_array($result)) {
$query2 = "SELECT name FROM IPM_projects where id=$edit[id]";
$result2 = mysql_query($query2);
$list=mysql_fetch_array($result2);
$query3 = "SELECT * FROM IPM_users";
$result3 = mysql_query($query3);
$query4 = "SELECT * FROM IPM_users WHERE id='$edit[person]'";
$result4 = mysql_query($query4);
$currentuser = mysql_fetch_array($result4);
$query5 = "SELECT * FROM IPM_comments WHERE task_id='$task_id'";
$result5 = mysql_query($query5);
$query6 = "SELECT * FROM IPM_task_depend WHERE child_id='$task_id'";
$result6 = mysql_query($query6);
?>
<form action=<?=$PHP_SELF?> method=post>
<table cellspacing=0 cellpadding=2 border=0 bordercolor=000000 align=center width=90%>
<tr>
<td width=38% class=header align=left>
<b>Edit Task</b>
</td>
<td width=62% class=header align=right>
[<a class=headerlink href=<?=$PHP_SELF?>?op=addcomment&task_id=<?=$task_id?>>ADD COMMENT</a>]
</td>
</tr>
<tr>
<td width=38% align=right class=darker>
<b>Project Name: </b>
</td>
<td width=62% class=lighter>
<a class=biglink href=<?=$PHP_SELF?>?op=projectdetail&id=<?=$edit[id]?>><?=$list[name]?></a>
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Task Name: </b>
</td>
<td class=lighter>
<input value='<?=$edit[title]?>' name=title size=50 maxlength=80 type=text>
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Assigned To: </b>
</td>
<td class=lighter>
<select name=person size=1>
<option value="<?=$edit[person]?>" selected><?=$currentuser[$listdisplay]?></option>
<option value="<?=$edit[person]?>">-------------</option>"
<? while ($users=mysql_fetch_array($result3)) {
echo "<option value=$users[id]>$users[$listdisplay]</option>";
}?>
</select>
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Quoted Hours: </b>
</td>
<td class=lighter>
<input type=text name=hours size=10 maxlength=10 value=<?=$edit[hours]?>>
<?if ($edit[billable] == 1) {
echo "<input type=checkbox checked name=billable value=1> Billable?";
} else {
echo "<input type=checkbox name=billable value=1> Billable?";
}?>
</td>
</tr>
<tr>
<td align=right class=darker>
<b>Subtask of: </b>
</td>
<td class=lighter>
<select name=parent_id size=1>
<?
if ($parent_task=get_parent($task_id)) {
$parent = get_task_info($parent_task[0]);
echo "<option value=$parent[task_id] selected>$parent[title]</option>"
."<option value=$parent[task_id]>-------------------------------------</option>"
."<option value=\"0\">TOP LEVEL (none)</option>"
."<option value=$parent[task_id]>-------------------------------------</option>";
} else {
echo "<option value=\"0\" selected>TOP LEVEL (none)</option>"
."<option value=\"0\">-------------------------------------</option>";
}
task_dropdown($edit[id]);
?>
</select>
</td>
</tr>
<tr valign=top>
<td class=darker align=right>
<b>Description: </b>
</td>
<td class=lighter>
<textarea cols=40 rows=4 name=description><?=$edit[description]?></textarea>
</td>
</tr>
</tr>
<tr>
<td class=header align=center colspan=2><input class=button value=Restore type=reset> <input class=button type=submit value="Update Task">
</td>
</tr>
</table>
<input type=hidden name=op value=edittaskaction>
<input type=hidden name=id value="<?=$edit[id]?>">
<input type=hidden name=task_id value="<?=$task_id?>">
</form>
<? if ($edit[comments]=="1") display_comments($task_id);
} // end while
include ("footer.php");
} // end function ...a bit confusing down here =)
function edittaskaction($task_id, $id, $title, $hours, $description, $person, $billable, $parent_id) {
// This function takes the variables from edittask() and makes the changes
// to the database where neccessary, then displays the results.
authenticate();
dbconnect();
global $PHP_SELF;
include ("config.php");
if ($parent_id == $task_id) {
$error=1;
$errortext.="<BR>YOU CAN NOT LINK A TASK TO ITSELF!";
}
$children=get_children($task_id, 2);
for ($x=0; $x<sizeof($children); $x++) {
if ($children[$x][0] == $parent_id) {
$error=1;
$errortext.="<BR>YOU CAN NOT LINK A TASK TO ONE OF ITS CHILDREN!";
}
}
if (!$error) {
$query = "UPDATE IPM_tasks SET title='$title', hours='$hours', description='$description', person='$person', billable='$billable', parent_id='$parent_id' WHERE task_id='$task_id'";
$result = mysql_query($query);
}
projectdetail($id);
if ($result) {
message("Task Updated Successfully");
} else {
message("Error Updating Task $errortext");
}
}
function finishtask($task_id) {
// This function updates a task in the database.
// All it really does is switch status from 1 to 0.
// Then it reloads the page you were on.
authenticate();
dbconnect();
$today=date("Y-m-d");
$query = "update IPM_tasks SET status='0', enddate='$today' WHERE task_id=$task_id";
$result = mysql_query($query);
}
function resettask($task_id) {
// This function updates a task in the database.
// All it really does is switch status from 0 to 1.
// Then it reloads the page you were on.
authenticate();
dbconnect();
$query = "update IPM_tasks SET status=1 where task_id=$task_id";
$result = mysql_query($query);
}
function confirmdeletetask($task_id) {
// This function may save your ass. It pops up to make sure you want to delete
// a task. It waits for an answer. If the answer is "yes" then the id is passed
// to the "deletetask()" function. Otherwise you are returned to the project
// detail page
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $id;
if (get_children($task_id,2)) {
$warn="<b>WARNING</b><br>This task contains child tasks. Deleting it will delete all children as well!<BR>";
}
$query = "SELECT title FROM IPM_tasks WHERE task_id=$task_id";
$result = mysql_query($query);
$list = mysql_fetch_array($result);
?>
<table width=40% border=1 bordercolor=black cellspacing=0 cellpadding=4 align=center>
<tr>
<td class=header align=center>
<? echo $warn;?>Are you sure you want to delete the task <b><?=$list[title]?></b>?
</td>
</tr>
<tr>
<td align=center class=message>
<a class=smaller href=<?=$PHP_SELF?>?op=deletetask&task_id=<?=$task_id?>&id=<?=$id?>>[YES]</a>
<a href=<?=$PHP_SELF?>?op=projectdetail&id=<?=$id?>>[NO]</a>
</td>
</tr>
</table>
<?
include ("footer.php");
}
function deletetask($task_id) {
// This function deletes a task flat out. You've already been warned at this point.
authenticate();
dbconnect();
global $PHP_SELF, $id;
$query = "DELETE FROM IPM_tasks WHERE task_id=$task_id";
$result = mysql_query($query);
$query2 = "DELETE FROM IPM_tasks WHERE parent_id=$task_id";
$result2 = mysql_query($query2);
include ("config.php");
projectdetail($id);
if ($result) {
message("Task Deleted");
} else {
message("Error Deleting Task");
}
}
////////// COMMENT RELATED FUNCTIONS ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
function addcomment($task_id) {
// This function builds the form for adding a comment to a task.
// When this form is submitted the variables are passed to the function
// "addcommentaction()"
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $message;
$query="SELECT title FROM IPM_tasks WHERE task_id='$task_id'";
$result=mysql_query($query);
$task=mysql_fetch_row($result);
?>
<form action=<?=$PHP_SELF?> method=post>
<table border=0 cellspacing=0 cellpadding=2 width=90% align=center>
<tr>
<td width=100% colspan=2 class=header align=left>
<b>Adding Comment To "<?=$task[0]?>"</b>
</td>
</tr>
<tr valign=top>
<td width=38% align=right class=darker>
<b>Comment: </b>
</td>
<td width=62% class=lighter>
<textarea cols=60 rows=10 name=comment></textarea>
</td>
</tr>
<tr>
<td class=header align=center colspan=2>
<input class=button type=reset> <input class=button type=submit value="Add Comment">
</td>
</tr>
</table>
<input type=hidden name=op value=addcommentaction><input type=hidden name=task_id value=<?=$task_id?>>
</form>
<?
include ("footer.php");
}
function addcommentaction($task_id, $comment) {
// This function takes the results from the function "addcomment()"
// and inserts them into the database, then displays the results
$user_id=authenticate();
dbconnect();
include ("config.php");
$date=date("YmdHis");
$formatted_comment=addslashes($comment);
$flag_comments_on = mysql_query("UPDATE IPM_tasks SET comments='1' WHERE task_id='$task_id'");
if (mysql_query("INSERT INTO IPM_comments VALUES (NULL,'$task_id','$user_id','$date','$formatted_comment')")) {
$message="Comment Added Successfully";
} else {
$message="Error Adding Comment";
}
edittask($task_id);
}
function editcomment($comment_id, $task_id) {
$user_id=authenticate();
dbconnect();
include ("config.php");
global $PHP_SELF, $message;
// get comment's owner
$query="SELECT user,comment FROM IPM_comments WHERE comment_id='$comment_id'";
$result=mysql_query($query);
if ($owner=mysql_fetch_array($result)) {
$auth_user=$owner[user];
$formatted_comment=str_replace("<br />", "\n", $owner[comment]);
$formatted_comment=stripslashes($formatted_comment);
}
// get the user's info
$query="SELECT * FROM IPM_users WHERE id='$user_id'";
$result=mysql_query($query);
if ($user=mysql_fetch_array($result)) {
$current_user=$user[id];
$current_role=$user[role];
}
// only let the comment owner or an admin edit a comment
if (($auth_user == $current_user) || ($current_role=="1")) {
include ("header.php");
?>
<form action=<?=$PHP_SELF?> method=post>
<table border=0 cellspacing=0 cellpadding=2 width=90% align=center>
<tr>
<td width=100% colspan=2 class=header align=left>
<b>Editing Comment</b>
</td>
</tr>
<tr valign=top>
<td width=38% align=right class=darker>
<b>Comment: </b>
</td>
<td width=62% class=lighter>
<textarea cols=60 rows=10 name=comment><?=$formatted_comment?></textarea>
</td>
</tr>
<tr>
<td class=header align=center colspan=2>
<input class=button type=reset> <input class=button type=submit value="Update Comment">
</td>
</tr>
</table>
<input type=hidden name=op value=editcommentaction>
<input type=hidden name=comment_id value=<?=$comment_id?>>
<input type=hidden name=task_id value=<?=$task_id?>>
</form>
<?
include ("footer.php");
} else {
$message="You are not allowed to edit this comment";
edittask($task_id);
}
}
function editcommentaction($comment_id, $comment, $task_id) {
$user_id=authenticate();
dbconnect();
include ("config.php");
// get comment's owner
$query="SELECT user,comment FROM IPM_comments WHERE comment_id='$comment_id'";
$result=mysql_query($query);
if ($owner=mysql_fetch_array($result)) {
$auth_user=$owner[user];
}
// get the user's info
$query="SELECT * FROM IPM_users WHERE id='$user_id'";
$result=mysql_query($query);
if ($user=mysql_fetch_array($result)) {
$current_user_id=$user[id];
$current_user=$user[$listdisplay];
$current_role=$user[role];
}
if (($auth_user==$current_user_id) || ($current_role=="1")) {
$date=date("M j, Y - h:i:s A");
$formatted_comment=addslashes($comment);
$formatted_comment .="<br /><br /> <i>**EDITED BY $current_user -- [$date]</i>";
if (mysql_query("UPDATE IPM_comments SET comment='$formatted_comment' WHERE comment_id='$comment_id'")) {
$message="Comment Updated Successfully";
} else {
$message="Error Updating Comment";
}
edittask($task_id);
} else {
$message="You are not allowed to edit this comment";
edittask($task_id);
}
}
function deletecomment($comment_id, $task_id) {
$user_id=authenticate();
dbconnect();
include ("config.php");
global $PHP_SELF, $message;
// get comment's owner
$query="SELECT user,comment FROM IPM_comments WHERE comment_id='$comment_id'";
$result=mysql_query($query);
if ($owner=mysql_fetch_array($result)) {
$auth_user=$owner[user];
$formatted_comment=str_replace("<br />", "\n", $owner[comment]);
$formatted_comment=stripslashes($formatted_comment);
}
// get the user's info
$query="SELECT * FROM IPM_users WHERE id='$user_id'";
$result=mysql_query($query);
if ($user=mysql_fetch_array($result)) {
$current_user=$user[id];
$current_role=$user[role];
}
// only let the comment owner or an admin edit a comment
if (($auth_user==$current_user) || ($current_role=="1")) {
include ("header.php");
$message="Are you sure you want to delete this comment?<br><br>"
."[<a href=$PHP_SELF?op=deletecommentaction&comment_id=$comment_id&task_id=$task_id>YES</a>] -- "
."[<a href=$PHP_SELF?op=edittask&task_id=$task_id>NO</a>]";
message($message);
} else {
$message="You are not allowed to delete this comment";
edittask($task_id);
}
}
function deletecommentaction($comment_id, $task_id) {
$user_id=authenticate();
dbconnect();
include ("config.php");
global $PHP_SELF, $message;
// get comment's owner
$query="SELECT user,comment FROM IPM_comments WHERE comment_id='$comment_id'";
$result=mysql_query($query);
if ($owner=mysql_fetch_array($result)) {
$auth_user=$owner[user];
$formatted_comment=str_replace("<br />", "\n", $owner[comment]);
$formatted_comment=stripslashes($formatted_comment);
}
// get the user's info
$query="SELECT * FROM IPM_users WHERE id='$user_id'";
$result=mysql_query($query);
if ($user=mysql_fetch_array($result)) {
$current_user=$user[id];
$current_role=$user[role];
}
// only let the comment owner or an admin edit a comment
if (($auth_user==$current_user) || ($current_role=="1")) {
if (mysql_query("DELETE FROM IPM_comments WHERE comment_id='$comment_id'")) {
$message="Comment Deleted";
} else {
$message="Error Deleting Comment";
}
// get number of comments left, if 0 then un-flag comments for the task
$query="SELECT comment_id FROM IPM_comments WHERE task_id='$task_id'";
$result=mysql_query($query);
if (!$list=mysql_fetch_array($result)) {
mysql_query("UPDATE IPM_tasks SET comments='0' WHERE task_id='$task_id'");
}
edittask($task_id);
}
}
function display_comments($task_id) {
include "config.php";
authenticate();
dbconnect();
$query = "SELECT *,DATE_FORMAT(date,'%b %e, %Y - %r')\"formatted_date\" FROM IPM_comments WHERE task_id='$task_id' ORDER BY date ASC";
$result = mysql_query($query);
?>
<table cellspacing=0 cellpadding=4 border=1 bordercolor=000000 align=center width=80%>
<tr valign=top>
<td width=20% class=header align=left>
<b>Comments</b>
</td>
<td width=80% class=header align=right>
[<a class=headerlink href=<?=$PHP_SELF?>?op=addcomment&task_id=<?=$task_id?>>ADD COMMENT</a>]
</td>
</tr>
<?
while ($comments=mysql_fetch_array($result)) {
$query2="SELECT * FROM IPM_users WHERE id='$comments[user]'";
$result2=mysql_query($query2);
$name=mysql_fetch_array($result2);
$formatted_comments=stripslashes(nl2br($comments[comment]));
?>
<tr valign=top>
<td class=darker align=center>
<b><?=$name[$listdisplay]?></b><br>
<?=$comments[formatted_date]?><br>
<a href=<?=$PHP_SELF?>?op=editcomment&comment_id=<?=$comments[comment_id]?>&task_id=<?=$task_id?>><img src=img/e-on.gif border=0></a> ::
<a href=<?=$PHP_SELF?>?op=deletecomment&comment_id=<?=$comments[comment_id]?>&task_id=<?=$task_id?>><img src=img/d-on.gif border=0></a>
</td>
<td class=lighter>
<?=$formatted_comments?>
</td>
</tr>
<?
}
echo "</table><br><br>";
}
////////// PROJECT RELATED FUNCTIONS ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
function addproject() {
// This function builds the form for adding a new project.
// When this form is submitted the variables are passed to the function
// "addprojectaction()"
authenticate();
include ("config.php");
include ("header.php");
global $PHP_SELF;
$today=date('j');
$thismonthname=date('M');
$thismonthvalue=date('n');
$thisyear=date('Y');
?>
<form action=<?=$PHP_SELF?> method=post>
<table cellspacing=0 cellpadding=2 border=0 bordercolor=000000 align=center width=90%>
<tr>
<td colspan=2 width=100% align=left class=header>
<b>Add New Project</b>
</td>
</tr>
<tr>
<td class=darker width=38% align=right>
<b>Project Name: </b>
</td>
<td class=lighter width=62%>
<input name=name type=text size=40>
</td>
</tr>
<tr>
<td class=darker align=right>
<b>Start Date: </b>
</td>
<td class=lighter>
<select name=startmonth size=1>
<option value=<?=$thismonthvalue?> selected><?=$thismonthname?></option>
<option value=<?=$thismonthvalue?>>-----</option>
<option value=01>Jan</option>
<option value=02>Feb</option>
<option value=03>Mar</option>
<option value=04>Apr</option>
<option value=05>May</option>
<option value=06>Jun</option>
<option value=07>Jul</option>
<option value=08>Aug</option>
<option value=09>Sep</option>
<option value=10>Oct</option>
<option value=11>Nov</option>
<option value=12>Dec</option>
</select>
<select name=startday size=1>
<option value=<?=$today?> selected><?=$today?></option>
<option value=<?=$today?>>-----</option>
<option value=01>01</option>
<option value=02>02</option>
<option value=03>03</option>
<option value=04>04</option>
<option value=05>05</option>
<option value=06>06</option>
<option value=07>07</option>
<option value=08>08</option>
<option value=09>09</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name=startyear size=1>
<option value=<?=$thisyear?> selected><?=$thisyear?></option>
<option value=<?$thisyear?>>-----</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
</select>
</td>
</tr>
<tr>
<td class=darker align=right>
<b>Deadline: </b>
</td>
<td class=lighter>
<select name=endmonth size=1>
<option value=<?=$thismonthvalue?> selected><?=$thismonthname?></option>
<option value=<?=$thismonthvalue?>>-----</option>
<option value=01>Jan</option>
<option value=02>Feb</option>
<option value=03>Mar</option>
<option value=04>Apr</option>
<option value=05>May</option>
<option value=06>Jun</option>
<option value=07>Jul</option>
<option value=08>Aug</option>
<option value=09>Sep</option>
<option value=10>Oct</option>
<option value=11>Nov</option>
<option value=12>Dec</option>
</select>
<select name=endday size=1>
<option value=<?=$today?> selected><?=$today?></option>
<option value=<?=$today?>>-----</option>
<option value=01>01</option>
<option value=02>02</option>
<option value=03>03</option>
<option value=04>04</option>
<option value=05>05</option>
<option value=06>06</option>
<option value=07>07</option>
<option value=08>08</option>
<option value=09>09</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name=endyear size=1>
<option value=<?=$thisyear?> selected><?=$thisyear?></option>
<option value=<?=$thisyear?>>-----</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
</select>
</td>
</tr>
<tr align=top>
<td class=darker align=right>
<b>Comments: </b>
</td>
<td class=lighter>
<textarea cols=40 rows=4 name=comments></textarea>
</td>
</tr>
<tr>
<td class=header align=center colspan=2>
<input class=button type=reset> <input class=button type=submit value="Add Project">
</td>
</tr>
</table>
<input type=hidden name=op value=addprojectaction>
</form>
<?
include ("footer.php");
}
function addprojectaction($name, $startmonth, $startday, $startyear, $endmonth, $endday, $endyear, $comments) {
// This function receives the variables sent by "addproject()"
// then it adds the project to the database.
authenticate();
dbconnect();
$startdate="$startyear.$startmonth.$startday";
$enddate="$endyear.$endmonth.$endday";
//Format DB input
$Fname=addslashes("$name");
$Fcomments=addslashes("$comments");
$result = mysql_query("insert into IPM_projects values (NULL,'$Fname','$startdate','$enddate','$Fcomments','0','0000-00-00')");
include ("config.php");
addproject();
if ($result) {
message("Project \"$name\" Added Successfully");
} else {
message("Error Adding Project");
}
include ("footer.php");
}
function confirmprojectdelete($id) {
// This function may save your ass someday. When you try to delete a project,
// this function is called. It warns you, that the function and all associated tasks
// are about to be deleted. Then it give the choice of continuing or going back to the
// project list.
authenticate();
dbconnect();
$query = "SELECT name FROM IPM_projects WHERE id=$id";
$result = mysql_query($query);
$list = mysql_fetch_array($result);
include ("config.php");
include ("header.php");
global $PHP_SELF;
?>
<table align=center width=40% border=1 bordercolor=black cellspacing=0 cellpadding=4>
<tr>
<td class=header align=center>
Are you sure you want to delete the <b><?=$list[name]?></b> project?
</td>
</tr>
<tr>
<td class=importantmessage align=center>
ALL TASKS AND ASSOCIATED INFO WILL BE DELETED
</td>
</tr>
<tr>
<td align=center class=message>
<a class=smaller href=<?=$PHP_SELF?>?op=deleteproject&id=<?=$id?>>[YES]</a> :: <a href=<?=$PHP_SELF?>?op=listprojects>[NO]</a>
</td>
</tr>
</table>
<?
include ("footer.php");
}
function deleteproject($id) {
// We warned you. This function deletes a project and takes all of its tasks with it.
authenticate();
dbconnect();
global $PHP_SELF;
$result1 = mysql_query("delete FROM IPM_projects where id=$id");
$result2 = mysql_query("delete FROM IPM_tasks where id=$id");
include ("config.php");
listprojects();
if ($result1 && $result2) {
message("Project Deleted");
} else {
message("Error Deleting Project");
}
}
function editproject($id) {
// This function builds the form for editing a pre-existing project.
// When submitted, the variables are sent to "editprojectaction()"
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF;
$query = "SELECT * FROM IPM_projects where id=$id";
$result = mysql_query($query);
$list = mysql_fetch_array($result);
$startyear=substr($list[startdate], 0, 4);
$startmonth=substr($list[startdate], 5, 2);
$startday=substr($list[startdate], 8, 2);
$endyear=substr($list[enddate], 0, 4);
$endmonth=substr($list[enddate], 5, 2);
$endday=substr($list[enddate], 8, 2);
$Uname=stripslashes($list[name]);
$Ucomments=stripslashes("$list[comments]");
?>
<form action=<?=$PHP_SELF?> method=post>
<table border=0 bordercolor=black cellspacing=0 cellpadding=2 width=90% align=center>
<tr>
<td colspan=2 class=header>
Project Editor
</td>
</tr>
<tr>
<td width=38% align=right class=darker>
Project Name:
</td>
<td class=lighter align=left width=62%>
<input value="<?=$Uname?>" size=40 name=name type=text>
</td>
</tr>
<tr>
<td class=darker align=right>
Start Date:
</td>
<td class=lighter>
<select name=startmonth size=1>
<?
// MySQL doesn't store pretty names for months. So this is my workaround.
switch ($startmonth){
case "01":
$startmonthname="Jan";
break;
case "02":
$startmonthname="Feb";
break;
case "03":
$startmonthname="Mar";
break;
case "04":
$startmonthname="Apr";
break;
case "05":
$startmonthname="May";
break;
case "06":
$startmonthname="Jun";
break;
case "07":
$startmonthname="Jul";
break;
case "08":
$startmonthname="Aug";
break;
case "09":
$startmonthname="Sep";
break;
case "10":
$startmonthname="Oct";
break;
case "11":
$startmonthname="Nov";
break;
case "12":
$startmonthname="Dec";
break;
}
?>
<option value=<?=$startmonth?> selected><?=$startmonthname?></option>
<option value=<?=$startmonth?>>-----</option>
<option value=01>Jan</option>
<option value=02>Feb</option>
<option value=03>Mar</option>
<option value=04>Apr</option>
<option value=05>May</option>
<option value=06>Jun</option>
<option value=07>Jul</option>
<option value=08>Aug</option>
<option value=09>Sep</option>
<option value=10>Oct</option>
<option value=11>Nov</option>
<option value=12>Dec</option>
</select>
<select name=startday size=1>
<option value=<?=$startday?> selected><?=$startday?></option>
<option value=<?=$startday?>>-----</option>
<option value=01>01</option>
<option value=02>02</option>
<option value=03>03</option>
<option value=04>04</option>
<option value=05>05</option>
<option value=06>06</option>
<option value=07>07</option>
<option value=08>08</option>
<option value=09>09</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name=startyear size=1>
<option value=<?=$startyear?> selected><?=$startyear?></option>
<option value=<?=$startyear?>>-----</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
</select>
</td>
</tr>
<tr>
<td align=right class=darker>
Deadline:
</td>
<td class=lighter>
<select name=endmonth size=1>
<?
// MySQL doesn't store pretty names for months. So this is my workaround.
switch ($endmonth){
case "01":
$endmonthname="Jan";
break;
case "02":
$endmonthname="Feb";
break;
case "03":
$endmonthname="Mar";
break;
case "04":
$endmonthname="Apr";
break;
case "05":
$endmonthname="May";
break;
case "06":
$endmonthname="Jun";
break;
case "07":
$endmonthname="Jul";
break;
case "08":
$endmonthname="Aug";
break;
case "09":
$endmonthname="Sep";
break;
case "10":
$endmonthname="Oct";
break;
case "11":
$endmonthname="Nov";
break;
case "12":
$endmonthname="Dec";
break;
}
?>
<option value=<?=$endmonth?> selected><?=$endmonthname?></option>
<option value=<?=$endmonth?>>-----</option>
<option value=01>Jan</option>
<option value=02>Feb</option>
<option value=03>Mar</option>
<option value=04>Apr</option>
<option value=05>May</option>
<option value=06>Jun</option>
<option value=07>Jul</option>
<option value=08>Aug</option>
<option value=09>Sep</option>
<option value=10>Oct</option>
<option value=11>Nov</option>
<option value=12>Dec</option>
</select>
<select name=endday size=1>
<option value=<?=$endday?> selected><?=$endday?></option>
<option value=<?=$endday?>>-----</option>
<option value=01>01</option>
<option value=02>02</option>
<option value=03>03</option>
<option value=04>04</option>
<option value=05>05</option>
<option value=06>06</option>
<option value=07>07</option>
<option value=08>08</option>
<option value=09>09</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name=endyear size=1>
<option value=<?=$endyear?> selected><?=$endyear?></option>
<option value=<?=$endyear?>>-----</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
</select>
</td>
</tr>
<tr valign=top>
<td class=darker align=right>
Comments:
</td>
<td class=lighter>
<textarea cols=40 rows=4 name=comments><?=$Ucomments?></textarea>
</td>
</tr>
<tr>
<td class=header align=center colspan=2>
<input class=button value=Restore type=reset> <input class=button type=submit value="Update Project">
</td>
</tr>
</table>
<input type=hidden name=op value=editprojectaction><input type=hidden name=id value=<?=$id?>>
</form>
<?
include ("footer.php");
}
function editprojectaction($id, $name, $startmonth, $startday, $startyear, $endmonth, $endday, $endyear, $comments) {
// This function receives variables from "editproject()" and updated
// the project in the database. Then it tells you if it worked or not.
authenticate();
dbconnect();
global $PHP_SELF;
$startdate="$startyear-$startmonth-$startday";
$enddate="$endyear-$endmonth-$endday";
// Format DB input
$Fname=addslashes("$name");
$Fcomments=addslashes("$comments");
//
$result = mysql_query("update IPM_projects SET name='$Fname', startdate='$startdate', enddate='$enddate', comments='$Fcomments' where id=$id");
include ("config.php");
listprojects();
$Uname=stripslashes("$name");
if ($result) {
message("Project \"<?=$Uname?>\" Updated Successfully");
} else {
message("Error Updating Project");
}
}
function completedlist() {
// This function goes to the database and generates a list of
// completed projects. It also builds a menu for
// editing/deleting/reactivating projects.
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $order;
switch ($order) {
case "nameup":
$list_query = "SELECT id, name, completed_date, comments FROM IPM_projects WHERE completed='1' ORDER BY name ASC";
break;
case "namedown":
$list_query = "SELECT id, name, completed_date, comments FROM IPM_projects WHERE completed='1' ORDER BY name DESC";
break;
case "datedown":
$list_query = "SELECT id, name, completed_date, comments FROM IPM_projects WHERE completed='1' ORDER BY completed_date DESC";
break;
case "dateup":
$list_query = "SELECT id, name, completed_date, comments FROM IPM_projects WHERE completed='1' ORDER BY completed_date ASC";
break;
default:
$list_query = "SELECT id, name, completed_date, comments FROM IPM_projects WHERE completed='1' ORDER BY completed_date ASC";
}
$listresult = mysql_query($list_query);
echo "<center>"
."<table width=90% border=1 bordercolor=black cellspacing=0 cellpadding=4>"
."<tr valign=top>";
if ($order == "nameup") {
echo "<td class=header align=left>";
$string=popuploader('nameup', 'Sort Alphabetically <b>Z-A</b>', '<b>Project Name</b>', "$PHP_SELF?op=completedlist&order=namedown", "headerlink");
echo "$string</td>";
} else {
echo "<td class=header align=left>";
$string=popuploader('namedown', 'Sort Alphabetically <b>A-Z</b>', '<b>Project Name</b>', "$PHP_SELF?op=completedlist&order=nameup", "headerlink");
echo "$string</td>";
}
if ($order == "dateup") {
echo "<td class=header align=center>";
$string=popuploader('dateup', 'Sort by date completed <b>oldest first</b>', '<b>Completed</b>', "$PHP_SELF?op=completedlist&order=datedown", "headerlink");
echo "$string</td>";
} else {
echo "<td class=header align=center>";
$string=popuploader('datedown', 'Sort by date completed <b>most recent first</b>', '<b>Completed</b>', "$PHP_SELF?op=completedlist&order=dateup", "headerlink");
echo "$string</td>";
}
echo "<td class=header align=center><b>Options</b></td>"
."</tr>";
$color=true;
while ($list_row=mysql_fetch_array($listresult))
{
echo "<tr valign=top>";
if (empty($list_row[comments])) {
echo "<td class=lighter align=left><b>";
$string=popuploader("$list_row[id]", "No Comments Available", "$list_row[name]", "$PHP_SELF?op=projectsummary&id=$list_row[id]", "biglink");
echo "$string</b></td>";
} else {
echo "<td class=lighter align=left><b>";
$string=popuploader("$list_row[id]", "$list_row[comments]", "$list_row[name]", "$PHP_SELF?op=projectsummary&id=$list_row[id]", "biglink");
echo "$string</b></td>";
}
echo "<td nowrap width=10% class=darker align=center>$todoitem";
echo prettydate($list_row[completed_date]);
echo "</td>"
."<td nowrap width=10% class=lighter align=center>[<a href=$PHP_SELF?op=reactivateproject&id=$list_row[id]>"
."REACTIVATE</a>] :: [<a href=$PHP_SELF?op=confirmprojectdelete&id=$list_row[id]>"
."DELETE</a>] :: [<a href=$PHP_SELF?op=editproject&id=$list_row[id]>EDIT</a>]</td>"
."</tr>";
}
echo "</table></center><br>";
include ("footer.php");
}
function listprojects() {
// This function goes to the database and generates a list of current projects.
// It also builds a menu for editing/deleting/completing projects.
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $order;
switch ($order) {
case "nameup":
$list_query = "SELECT id, name, enddate, comments FROM IPM_projects WHERE completed='0' ORDER BY name ASC";
break;
case "namedown":
$list_query = "SELECT id, name, enddate, comments FROM IPM_projects WHERE completed='0' ORDER BY name DESC";
break;
case "datedown":
$list_query = "SELECT id, name, enddate, comments FROM IPM_projects WHERE completed='0' ORDER BY enddate DESC";
break;
case "dateup":
$list_query = "SELECT id, name, enddate, comments FROM IPM_projects WHERE completed='0' ORDER BY enddate ASC";
break;
default:
$list_query = "SELECT id, name, enddate, comments FROM IPM_projects WHERE completed='0' ORDER BY enddate ASC";
}
$listresult = mysql_query($list_query);
echo "<table width=90% border=1 bordercolor=black cellspacing=0 cellpadding=4 align=center>"
."<tr valign=top>";
if ($order == "nameup") {
echo "<td class=header align=left>";
$string=popuploader('nameup', 'Sort Alphabetically <b>Z-A</b>', '<b>Project Name</b>', "$PHP_SELF?op=listprojects&order=namedown", "headerlink");
echo "$string</td>";
} else {
echo "<td class=header align=left>";
$string=popuploader('namedown', 'Sort Alphabetically <b>A-Z</b>', '<b>Project Name</b>', "$PHP_SELF?op=listprojects&order=nameup", "headerlink");
echo "$string</td>";
}
echo "<td width=10% class=header align=center><b>Percent Completed</b></td>";
if ($order == "dateup") {
echo "<td width=10% class=header align=center>";
$string=popuploader('dateup', 'Sort by deadline <b>most distant first</b>', '<b>Deadline</b>', "$PHP_SELF?op=listprojects&order=datedown", "headerlink");
echo "$string</td>";
} else {
echo "<td width=10% class=header align=center>";
$string=popuploader('datedown', 'Sort by deadline <b>nearest first</b>', '<b>Deadline</b>', "$PHP_SELF?op=listprojects&order=dateup", "headerlink");
echo "$string</td>";
}
echo "<td width=10% class=header align=center><b>Edit/Delete</b></td>"
."</tr>";
$color=true;
while ($list_row=mysql_fetch_array($listresult))
{
echo "<tr valign=top>";
echo "<td class=lighter align=left><b>";
if (empty($list_row[comments])) {
$string=popuploader("$list_row[id]", "No Comments Available", "$list_row[name]", "$PHP_SELF?op=projectdetail&id=$list_row[id]", "biglink");
} else {
$string=popuploader("$list_row[id]", "$list_row[comments]", "$list_row[name]", "$PHP_SELF?op=projectdetail&id=$list_row[id]", "biglink");
}
echo "$string</b></td>";
echo "<td nowrap class=darker align=right>";
draw_time_and_progress_bars($list_row[id], "");
echo "</td>";
echo "<td nowrap class=darker align=center>";
prettydate($list_row[enddate]);
echo "</td>"
."<td nowrap class=lighter align=center>[<a href=$PHP_SELF?op=addtask&id=$list_row[id]&name=$list_row[name]>"
."ADD TASK</a>] :: [<a href=$PHP_SELF?op=editproject&id=$list_row[id]>"
."EDIT</a>] :: [<a href=$PHP_SELF?op=confirmprojectdelete&id=$list_row[id]>"
."DELETE</a>]</td>"
."</tr>";
}
echo "</table></center><br>";
include ("footer.php");
}
function projectdetail($id) {
// This function displays everyting you need to see about a project
// It shows the startdate, deadline, todo list, finished list, total hours for todo and finished,
// and it calculates the percentage of the project completed. It also gives the option to
// add/edit/delete tasks, edit/delete/complete the project, update list items, and view item descriptions.
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $finish, $reset, $ordertodo, $orderdone;
if (isset($finish)) {
finishtask($finish);
}
if (isset($reset)) {
resettask($reset);
}
$list_project = "SELECT * FROM IPM_projects where id=$id";
$list_result = mysql_query($list_project);
while ($list_row=mysql_fetch_array($list_result)) {
?>
<table width=90% border=0 bordercolor=black align=center cellspacing=0 cellpadding=4>
<tr>
<td class=header>
<b><?=$list_row[name]?><b>
</td>
<td align=right class=header>
<? if (percentcomplete($id) == "100") {
echo "[<a class=headerlink href=$PHP_SELF?op=completeproject&id=$id>COMPLETE PROJECT</a>] :: ";
}?>
[<a class=headerlink href=<?=$PHP_SELF?>?op=addtask&id=<?=$list_row[id]?>&name=<?=$list_row[name]?>>ADD TASK</a>]
:: [<a class=headerlink href=<?=$PHP_SELF?>?op=confirmprojectdelete&id=<?=$list_row[id]?>>DELETE</a>]
:: [<a class=headerlink href=<?=$PHP_SELF?>?op=editproject&id=<?=$list_row[id]?>>EDIT</a>]
</td>
</tr>
<tr class=lighter>
<td width=50%>
<b>Project Start: </b>
<? echo prettydate($list_row[startdate]);?>
</td>
<td width=50%>
<b>Project Deadline: </b>
<? echo prettydate($list_row[enddate]); ?>
</td>
</tr>
<tr valign=top>
<td width=50% class=lighter>
<table width=100% border=0 bordercolor=black cellpadding=2 cellspacing=0>
<tr valign=top>
<td class=darker width=90%>
<? if ($ordertodo == "namedown") {
$string=popuploader("namedown", "Sort by Item Name <b>A-Z</b>", "<b>Todo Items</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=nameup&orderdone=$orderdone", "listheader");
} else {
$string=popuploader("nameup", "Sort by Item Name <b>Z-A</b>", "<b>Todo Items</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=namedown&orderdone=$orderdone", "listheader");
}
echo "$string";
?>
</td>
<td class=darker width=10%>
<? if ($ordertodo == "persondown") {
$string=popuploader("persondown", "Sort by User <b>A-Z</b>", "<b>User</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=personup&orderdone=$orderdone", "listheader");
} else {
$string=popuploader("personup", "Sort by User <b>Z-A</b>", "<b>User</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=persondown&orderdone=$orderdone", "listheader");
}
echo $string;
?>
</td>
<td class=darker width=10%>
<? if ($ordertodo == "commentsdown") {
$string=popuploader("commentsdown", "Arrange Tasks by if They Have Comments", "<b>Comments</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=commentsup&orderdone=$orderdone", "listheader");
} else {
$string=popuploader("commentsup", "Arrange Tasks by if They Have Comments", "<b>Comments</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=commentsdown&orderdone=$orderdone", "listheader");
}
echo $string;
?>
</td>
<td class=darker align=center width=10%>
<? if ($ordertodo == "hoursdown") {
$string=popuploader("hoursdown", "Sort by Hours <b>least first</b>", "<b>Hours</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=hoursup&orderdone=$orderdone", "listheader");
} else {
$string=popuploader("hoursup", "Sort by Hours <b>most first</b>", "<b>Hours</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=hoursdown&orderdone=$orderdone", "listheader");
}
echo "$string";
?>
</td>
<td class=darker width=10% align=center>
<b class=listheader>Action</b>
</td>
</tr>
<?switch ($ordertodo) {
case "nameup":
$todo_order = "title asc";
break;
case "namedown":
$todo_order = "title desc";
break;
case "commentsup":
$todo_order = "comments asc";
break;
case "commentsdown":
$todo_order = "comments desc";
break;
case "personup":
$todo_order = "person asc";
break;
case "persondown":
$todo_order = "person desc";
break;
case "hoursup":
$todo_order = "hours asc";
break;
case "hoursdown":
$todo_order = "hours desc";
break;
default:
$todo_order = "person asc";
}
// call the full TODO list for this project ordered my todo_order
task_list($id, 1, $todo_order);
?>
<tr>
<td class=todolist colspan=5>
<hr>
</td>
</tr>
<tr valign=top>
<td class=todolist colspan=3>
<i>Total Hours Remaining on Project</i>
</td>
<td class=todolist align=center>
<? echo hours_todo($id); ?>
</td>
<td class=todolist>
</td>
</tr>
</table><br><br>
</td>
<!-- END OF TODO LIST SIDE -- BEGIN FINISHED SIDE -->
<td class=lighter>
<table width=100% border=0 cellpadding=2 cellspacing=0>
<tr valign=top>
<td class=darker width=90%>
<? if ($orderdone == "namedown") {
$string=popuploader("namedown", "Sort by Item Name <b>A-Z</b>", "<b>Finished Items</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$ordertodo&orderdone=nameup", "listheader");
} else {
$string=popuploader("nameup", "Sort by Item Name <b>Z-A</b>", "<b>Finished Items</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$ordertodo&orderdone=namedown", "listheader");
}
echo "$string";
?>
</td>
<td class=darker width=10%>
<? if ($ordertodo == "persondown") {
$string=popuploader("persondown", "Sort by User <b>A-Z</b>", "<b>User</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$orderdone&orderdone=personup", "listheader");
} else {
$string=popuploader("personup", "Sort by User <b>Z-A</b>", "<b>User</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$orderdone&orderdone=persondown", "listheader");
}
echo $string;
?>
</td>
<td class=darker width=10%>
<? if ($ordertodo == "commentsdown") {
$string=popuploader("commentsdown", "Arrange Tasks by if They Have Comments", "<b>Comments</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$orderdone&orderdone=commentsup", "listheader");
} else {
$string=popuploader("commentsup", "Arrange Tasks by if They Have Comments", "<b>Comments</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$orderdone&orderdone=commentsdown", "listheader");
}
echo $string;
?>
</td>
<td class=darker align=center width=10%>
<? if ($ordertodo == "hoursdown") {
$string=popuploader("hoursdown", "Sort by Hours <b>least first</b>", "<b>Hours</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$orderdone&orderdone=hoursup", "listheader");
} else {
$string=popuploader("hoursup", "Sort by Hours <b>most first</b>", "<b>Hours</b>", "$PHP_SELF?op=projectdetail&id=$id&ordertodo=$orderdone&orderdone=hoursdown", "listheader");
}
echo "$string";
?>
</td>
<td class=darker width=10% align=center>
<b class=listheader>Action</b>
</td>
</tr>
<?switch ($orderdone) {
case "nameup":
$done_order = "title asc";
break;
case "namedown":
$done_order = "title desc";
break;
case "commentsup":
$done_order = "comments asc";
break;
case "commentsdown":
$done_order = "comments desc";
break;
case "personup":
$done_order = "person asc";
break;
case "persondown":
$done_order = "person desc";
break;
case "hoursup":
$done_order = "hours asc";
break;
case "hoursdown":
$done_order = "hours desc";
break;
default:
$done_order = "person asc";
}
// call the full DONE list for this project ordered my todo_order
task_list($id, 0, $done_order);
?>
<tr>
<td class=donelist colspan=5>
<hr>
</td>
</tr>
<tr valign=top>
<td class=donelist colspan=3>
<i>Total Hours Completed</i>
</td>
<td class=donelist align=center>
<? echo hours_done($id); ?>
</td>
<td class=donelist colspan=1>
</td>
</tr>
</table>
</td>
</tr>
<tr valign=top>
<td colspan=2 class=header>
<? draw_time_and_progress_bars($id, "CLASS=listheader"); ?>
</td>
</tr>
</table>
<br><br>
<?
}
include ("footer.php");
}
function projectsummary($id) {
// This function will display a task summary for a finished project
authenticate();
dbconnect();
include ("config.php");
include ("header.php");
global $PHP_SELF, $reset, $order;
$query = "SELECT * FROM IPM_projects where id=$id";
$result = mysql_query($query);
while ($project=mysql_fetch_array($result)) {
?>
<table width=90% border=0 bordercolor=black align=center cellspacing=0 cellpadding=4>
<tr>
<td class=header>
<b><?=$project[name]?><b>
</td>
<td align=right class=header>
[<a class=headerlink href=<?=$PHP_SELF?>?op=reactivateproject&id=<?=$id?>>REACTIVATE PROJECT</a>]
:: [<a class=headerlink href=<?=$PHP_SELF?>?op=editproject&id=<?=$project[id]?>>EDIT</a>]
:: [<a class=headerlink href=<?=$PHP_SELF?>?op=confirmprojectdelete&id=<?=$project[id]?>>DELETE</a>]
</td>
</tr>
<tr class=lighter>
<td width=50%>
<b>Project Start: </b>
<? echo prettydate($project[startdate]);?>
</td>
<td width=50%>
<b>Project Deadline: </b>
<? echo prettydate($project[enddate]); ?>
</td>
</tr>
<? if ($project[comments]) {
?>
<tr class=lighter>
<td colspan=2>
<b>Project Description: </b>
<? echo nl2br($project[comments]);?>
</td>
<?
}
?>
</tr>
<tr valign=top>
<td colspan=2 class=lighter>
<table width=100% border=0 bordercolor=black cellpadding=2 cellspacing=0>
<tr valign=top>
<td class=darker nowrap width=10%>
<? if ($order == "persondown") {
$string=popuploader("persondown", "Sort by User <b>Z-A</b>", "<b>User</b>", "$PHP_SELF?op=projectsummary&id=$id&order=personup", "listheader");
} else {
$string=popuploader("personup", "Sort by User <b>A-Z</b>", "<b>User</b>", "$PHP_SELF?op=projectsummary&id=$id&order=persondown", "listheader");
}
echo $string;
?>
</td>
<td class=darker>
<? if ($order == "namedown") {
$string=popuploader("namedown", "Sort by Item Name <b>A-Z</b>", "<b>Todo Items</b>", "$PHP_SELF?op=projectsummary&id=$id&order=nameup", "listheader");
} else {
$string=popuploader("nameup", "Sort by Item Name <b>Z-A</b>", "<b>Todo Items</b>", "$PHP_SELF?op=projectsummary&id=$id&order=namedown", "listheader");
}
echo "$string";
?>
</td>
<td class=darker align=center nowrap width=10%>
<? if ($order == "billable") {
$string=popuploader("billable", "Show only Billable Tasks", "<b>Billable</b>", "$PHP_SELF?op=projectsummary&id=$id&order=billable", "listheader");
} else {
$string=popuploader("billable", "Show only Billable Tasks", "<b>Billable</b>", "$PHP_SELF?op=projectsummary&id=$id&order=billable", "listheader");
}
echo "$string";
?>
</td>
<td class=darker align=center nowrap width=10%>
<? if ($order == "hoursdown") {
$string=popuploader("hoursdown", "Sort by Hours <b>least first</b>", "<b>Hours</b>", "$PHP_SELF?op=projectsummary&id=$id&order=hoursup", "listheader");
} else {
$string=popuploader("hoursup", "Sort by Hours <b>most first</b>", "<b>Hours</b>", "$PHP_SELF?op=projectsummary&id=$id&order=hoursdown", "listheader");
}
echo "$string";
?>
</td>
<td class=darker align=center nowrap width=10%>
<? if ($order == "datedown") {
$string=popuploader("datedown", "Sort by Completion Date <b>most recent first</b>", "<b>Completed</b>", "$PHP_SELF?op=projectsummary&id=$id&order=dateup", "listheader");
} else {
$string=popuploader("dateup", "Sort by Completion Date <b>oldest first</b>", "<b>Completed</b>", "$PHP_SELF?op=projectsummary&id=$id&order=datedown", "listheader");
}
echo "$string";
?>
</td>
</tr>
<?switch ($order) {
case "personup":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY person ASC";
break;
case "persondown":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY person DESC";
break;
case "nameup":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY title ASC";
break;
case "namedown":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY title DESC";
break;
case "billable":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id AND billable=1 ORDER BY billable";
break;
case "dateup":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY enddate ASC";
break;
case "datedown":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY enddate DESC";
break;
case "hoursup":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY hours ASC";
break;
case "hoursdown":
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY hours DESC";
break;
default:
$task_query = "SELECT * FROM IPM_tasks WHERE id=$id ORDER BY person ASC";
}
$task_result = mysql_query($task_query);
$total_billable=0;
$total_hours=0;
while ($task=mysql_fetch_array($task_result)) {
$user_query = "SELECT * FROM IPM_users WHERE id='$task[person]'";
$user_result = mysql_query($user_query);
$user = mysql_fetch_array($user_result);
?>
<tr valign=top>
<td class=todolist nowrap width=10%>
<?=$user[$listdisplay]?>
</td>
<td class=todolist>
<? if ($todo[description] == "") {
$string=popuploader("$task[task_id]", "No Description Available", "$task[title]", "$PHP_SELF?op=edittask&task_id=$task[task_id]", "listlink");
} else {
$string=popuploader("$task[task_id]", "$task[description]", "$task[title]", "$PHP_SELF?op=edittask&task_id=$task[task_id]", "listlink");
}
echo "$string";
?>
</td>
<td align=center class=todolist nowrap width=10%>
<? if ($task[billable]) {
$total_billable=$total_billable+$task[hours];
echo "X";
}?>
</td>
<td align=center class=todolist nowrap width=10%>
<? $total_hours=$total_hours+$task[hours];
echo $task[hours];
?>
</td>
<td align=center class=todolist nowrap width=10%>
<? echo prettydate($task[enddate]);?>
</td>
</tr>
<?
}
?>
<tr>
<td class=todolist colspan=5>
</td>
</tr>
<tr class=darker>
<td class=darker colspan=2>
</td>
<td class=headerlink align=center>
Billable Total
</td>
<td class=headerlink align=center>
Hours Total
</td>
<td class=darker>
</td>
</tr>
<tr>
<td class=todolist colspan=2>
</td>
<td align=center class=todolist>
<?=$total_billable?>
</td>
<td align=center class=todolist>
<?=$total_hours?>
</td>
<td class=todolist>
</td>
</tr>
</table><br><br>
</td>
</tr>
</table>
</td>
</tr>
</table>
<br><br>
<?
}
include ("footer.php");
}
function completeproject($id) {
// This function makes the current project complete, taking it off of the
// main active project list.
dbconnect();
include ("config.php");
$completed_date=date('Y-m-d');
$query="update IPM_projects SET completed='1', completed_date='$completed_date' WHERE id='$id'";
$result=mysql_query($query);
listprojects();
}
function reactivateproject($id) {
// This function reactivates a project, taking it off of the
// completed project list.
dbconnect();
include ("config.php");
$query="update IPM_projects SET completed='0' WHERE id='$id'";
$result=mysql_query($query);
listprojects();
}
/* NOT USED AS OF v0.8
function deadline($enddate) {
//This function is used for color-coding the deadlines in the project list.
//Feel free to edit the colors if you want.
//This won't work without the date command installed (you probably have it).
$today=date('d');
$thismonth=date('m');
$thisyear=date('Y');
$endyear=substr($enddate, 0, 4);
$endmonth=substr($enddate, 5, 2);
$endday=substr($enddate, 8, 2);
$monthresult=$endmonth - $thismonth;
$yearresult=$endyear - $thisyear;
$dayresult=$endday - $today;
if ($yearresult == 0) {
if ($monthresult == 0) {
if ($dayresult < 7) {
echo "<font color=FF0000 size=2 face=verdana>";
} else {
echo "<font color=000000 size=2 face=verdana>";
}
} elseif ($monthresult == -1) {
echo "<font color=660000 size=2 face=verdana><done>";
} elseif ($monthresult == 1) {
echo "<font color=333333 size=2 face=verdana>";
} elseif ($monthresult == 2) {
echo "<font color=666666 size=2 face=verdana>";
} elseif ($monthresult == 3) {
echo "<font color=999999 size=2 face=verdana>";
} else {
echo "<font color=999999 size=2 face=verdana>";
}
} elseif ($yearresult >= 1) {
echo "<font color=999999 size=2 face=verdana>";
}
echo prettydate($enddate);
}
*/
////////// MISCELLANEOUS FUNCTIONS ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
function prettydate($enddate) {
// This function makes the date look more human readable
$endyear=substr($enddate, 0, 4);
$endmonth=substr($enddate, 5, 2);
$endday=substr($enddate, 8, 2);
switch ($endmonth) {
case "01":
$prettymonth="January";
break;
case "02":
$prettymonth="February";
break;
case "03":
$prettymonth="March";
break;
case "04":
$prettymonth="April";
break;
case "05":
$prettymonth="May";
break;
case "06":
$prettymonth="June";
break;
case "07":
$prettymonth="July";
break;
case "08":
$prettymonth="August";
break;
case "09":
$prettymonth="September";
break;
case "10":
$prettymonth="October";
break;
case "11":
$prettymonth="November";
break;
case "12":
$prettymonth="December";
break;
}
echo "$prettymonth $endday, $endyear";
}
function hours_todo($id) {
// input project id
// returns the ammount of hours left todo on a project
dbconnect();
$query = "SELECT SUM(hours) FROM IPM_tasks WHERE id='$id' AND status=1";
$result = mysql_query($query);
if ($row = mysql_fetch_array($result)) {
return $row[0];
}
}
function hours_done($id) {
// input project id
// returns the ammount of hours done on a project
dbconnect();
$query = "SELECT SUM(hours) FROM IPM_tasks WHERE id='$id' AND status=0";
$result = mysql_query($query);
if ($row = mysql_fetch_array($result)) {
return $row[0];
}
}
function percentTimeComplete($id) {
// Use built-in MySQL functions to calculate timespan of project and see how
// far into a project (time-wise) we are.
// FUNCTION SUBMITTED BY: DAVID HUGHES (David.W.Hughes@cern.ch)
dbconnect();
$query = "SELECT to_days(current_date)-to_days(startdate) AS elapsed, to_days(enddate)-to_days(startdate) AS total, completed FROM IPM_projects WHERE id = $id";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$elapsed = $row[elapsed];
$total = $row[total];
if ($total == 0) {
return 100;
} else {
if ((100 * $elapsed / $total) == 0) {
return 0;
} else {
return sprintf("%02d", 100 * $elapsed / $total);
}
}
}
function percentcomplete($id) {
// This function takes a project id and and compares the todo hours
// to the finished hours to make a percent done
dbconnect();
$Qtodo="SELECT * FROM IPM_tasks WHERE id=$id AND status=1";
$Qdone="SELECT * FROM IPM_tasks WHERE id=$id AND status=0";
$Rtodo=mysql_query($Qtodo);
$Rdone=mysql_query($Qdone);
$totaltodo=0;
$totaldone=0;
while ($todo=mysql_fetch_array($Rtodo))
{
$totaltodo=$totaltodo + $todo[hours];
}
while ($done=mysql_fetch_array($Rdone))
{
$totaldone=$totaldone + $done[hours];
}
$totalboth=$totaltodo+$totaldone;
if ($totalboth > 0) {
$percent=100 * ($totaldone / $totalboth);
$percentdone = sprintf("%2d",$percent);
return $percentdone;
}else{
return $percenttotal;
}
}
function popuploader($id, $description, $linkname, $url, $class) {
include "config.php";
echo "<a class=$class name=$id href=$url onMouseOver=\"window.status='$linkname'; show('box-$id'); return true;\" onMouseOut=\"hide('box-$id'); return true;\">$linkname</a>";
$res= "<DIV ID=box-$id class=hidden>\n"
."<table border=1 cellpadding=5 cellspacing=0 bordercolor=black width=300>"
."<tr>"
." <td class=popup>"
." <b>$linkname</b><br>"
." <li class=popup>";
$res .=nl2br($description);
$res .=" </td>"
."</tr>"
."</table>"
."</div>";
return $res;
}
function message($message) {
// writes a pre-formated message to the screen (used for results display)
?>
<table align=center width=40% border=1 bordercolor=black cellspacing=0 cellpadding=4>
<tr class=message>
<td align=center>
<?=$message?>
</td>
</tr>
</table>
<br><br>
<?
}
function draw_time_and_progress_bars ($id, $text_class) {
// FUNCTION SUBMITTED BY: DAVID HUGHES (David.W.Hughes@cern.ch)
$timedone = percentTimeComplete($id);
$workdone = percentcomplete($id);
echo "<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=0>\n";
$safe_td = max(0, min(100, $timedone));
if ($completed) { $safe_td = min(100, $safe_td); }
if ($completed || $safe_td < $workdone) {
// project complete or within schedule
$colour = "green";
} elseif ($timedone < 100) {
// within deadline but behind schedule
$colour = "yellow";
} else {
// project over deadline
$colour = "red";
}
if ($timedone <= 0) {
$timedone="scheduled";
} elseif ($timedone >= 100) {
$timedone="<b>overdue</b>";
} else {
$timedone="$timedone% time";
}
if ($workdone <= 0) {
$workdone="not started";
} elseif ($workdone >= 100) {
$workdone="<b>complete</b>";
} else {
$workdone="$workdone% work";
}
echo "<TR><TD ALIGN=left $text_class>$timedone</TD><TD> </TD><TD>", drawbar_colour($colour,$safe_td), "</TD></TR>\n";
echo "<TR><TD ALIGN=left $text_class>$workdone</TD><TD> </TD><TD>", drawbar_colour("green",$workdone), "</TD></TR>\n";
echo "</TABLE>\n";
}
function drawbar_colour ($colour, $percent) {
// This function takes the integer (from 0-100) $percent as an argument
// to build a bargraph using small images. It doesn't depend on the gd lib.
// safety: normalise $percent if it's not between 0 and 100.
// FUNCTION SUBMITTED BY: DAVID HUGHES (David.W.Hughes@cern.ch)
$percent = max(0, min(100, $percent));
$l_colour = ($percent == 0 ? "grey" : $colour);
$r_colour = ($percent == 100 ? $colour : "grey");
// This is a hack to avoid bad browser behaviour from using <img width=0>
if ($percent == 0 ) { $percent = 1; }
if ($percent == 100) { $percent = 99; }
echo "<img src=img/bars/bar-left-$l_colour.gif border=0 height=12 width=5>";
echo "<img src=img/bars/bar-tile-$l_colour.gif border=0 height=12 width=", ($percent*2), ">";
echo "<img src=img/bars/bar-tile-$r_colour.gif border=0 height=12 width=", (200 - $percent*2), ">";
echo "<img src=img/bars/bar-right-$r_colour.gif border=0 height=12 width=5>\n";
}
function dbconnect() {
// This function makes a connection to the SQL server and grabs the appropriate
// database for use in all the other functions.
include ("config.php");
if (!$db=mysql_connect($db_servername, $db_username, $db_password)) {
echo "ERROR! UNABLE TO CONNECT TO DATABASE";
}
if (!mysql_select_db($db_dbname)) {
echo "ERROR! UNABLE TO FIND $db_dbname DATABASE";
}
}
function logout() {
// Terminate session
unset($GLOBALS['uid']);
setcookie("uid");
login();
}
function unauthorized() {
// If you hit cancel on the authentication screen or you fail 3 times
// this function is called and displays a message.
include ("config.php");
echo "<html><head><link rel=stylesheet type=text/css href=$stylesheet_url>"
."<title>$page_title$version</title></head><body><br><br>";
message("$unauthorizedmessage");
echo "</body></html>";
}
function logged_out() {
// If you hit cancel on the authentication screen or you fail 3 times
// this function is called and displays a message.
include ("config.php");
echo "<html><head><link rel=stylesheet type=text/css href=$stylesheet_url>"
."<title>$page_title$version</title></head><body><br><br>";
message("You are now logged out of IPM");
echo "</body></html>";
}
function login() {
include ("config.php");
include ("header.php");
global $PHP_SELF, $finish;
// If you hit cancel on the authentication screen or you fail 3 times
// this function is called and displays a message.
include ("config.php");
echo "<html><head><link rel=stylesheet type=text/css href=$stylesheet_url>"
."<title>$page_title$version</title></head><body><br><br>";
?>
<form action=<?=$PHP_SELF?> method=post>
<table width=90% align=center cellpadding=2 cellspacing=0 border=1 bordercolor=black>
<tr>
<td colspan=2 class=header>
User Login
</td>
</tr>
<tr>
<td width=38% align=right class=darker>
User Name:
</td>
<td class=lighter align=left width=62%>
<input size=40 name=username type=text>
</td>
</tr>
<tr>
<td width=38% align=right class=darker>
Password:
</td>
<td class=lighter align=left width=62%>
<input size=40 name=password type=password>
</td>
</tr>
<tr>
<td class=header align=center colspan=2>
<input class=button type=submit value="Login">
</td>
</tr>
</table>
<input type=hidden name=op value=loginaction>
</form>
<?
echo "</body></html>";
}
function loginaction($username, $password) {
global $uid;
dbconnect();
$query = "SELECT * FROM IPM_users WHERE username='$username'";
if (!($result = mysql_query($query))) {
die("Couldn't retrieve authorization data, please try again later");
}
if (mysql_num_rows($result) > 0) {
if ($user=mysql_fetch_array($result)) {
if (md5($password) == $user[password]) {
($SECURE_COOKIES == "true")? $SSL=1: $SSL=0;
setcookie("uid", $user[id], "0", "", "", $SSL);
$uid = $user[id];
mytasks();
} else {
login();
}
}
} else {
login();
}
}
function authenticate() {
global $uid;
return $uid;
}
function isadmin() {
// Returns true if the logged in user has admin privleges.
include ("config.php");
dbconnect();
$user_id=authenticate();
$query="SELECT role FROM IPM_users WHERE id='$user_id'";
$result=mysql_query($query);
while ($list=mysql_fetch_row($result)){
if ($list[0] == 1) {
return 1;
} else {
return;
}
}
}
function isauthenticated() {
global $uid;
return !empty($uid);
}