query($query, $value);
if ($res = $result->fetchRow()) {
if (($res['user'] == $user and $res['rights_by_creator'] == null) or ($res['creator'] == $user)) {
$res['disabled'] = false;
} else {
$res['disabled'] = true;
}
if ($res['percentage'] == null) {
$res['percentage_null'] = true;
} else {
$res['percentage_null'] = false;
}
}
return $res;
}
public function get_default_new_task($user)
{
$task = [];
$task['taskId'] = 0;
$task['task_version'] = 0;
$task['user'] = $user;
$task['creator'] = $user;
$task['public_for_group'] = null;
$task['rights_by_creator'] = 'y';
$task['priority'] = 3;
$task['completed'] = null;
$task['deleted'] = null;
$task['created'] = $this->now;
$task['status'] = null;
$task['percentage'] = null;
$task['accepted_creator'] = null;
$task['accepted_user'] = null;
/*--history --*/
$task['belongs_to'] = 0;
$task['last_version'] = 0;
$task['title'] = null;
$task['description'] = null;
$task['start'] = null;
$task['end'] = null;
$task['lasteditor'] = $user;
$task['lastchanges'] = $this->now;
/*--*/
$task['percentage_null'] = true;
return $task;
}
public function accept_task($user, $taskId, $value)
{
$query = "update `tiki_user_tasks` set accepted_user = ? where `user`=? and `taskId`=?";
$this->query($query, [$value,$user,(int) $taskId]);
$query = "update `tiki_user_tasks` set accepted_creator = ? where `creator`=? and `taskId`=?";
$this->query($query, [$value,$user,(int) $taskId]);
}
public function new_task($task_user, $creator, $public_for_group, $rights_by_creator, $created, $values)
{
$query = "INSERT INTO `tiki_user_tasks` ( ";
$query .= "`last_version`, `user`, `creator`, ";
$query .= "`public_for_group`, `rights_by_creator`, `created`) ";
$query .= "VALUES (?, ?, ?, ?, ?, ?)";
$this->query($query, [(int) 0, $task_user, $creator, $public_for_group, $rights_by_creator, (int) $created]);
$query = "select `taskId` from `tiki_user_tasks` where `creator` = ? AND `created` = ?";
$taskId = $this->getOne($query, [$creator, (int) $created]);
$values['belongs_to'] = $taskId;
$values['lasteditor'] = $creator;
$values['lastchanges'] = $created;
$values['task_version'] = (int) 0;
if ($task_user != $creator) {
$values['accepted_creator'] = 'y';
}
$query = "INSERT INTO `tiki_user_tasks_history` ( ";
$comma = '';
$query_values = "";
foreach ($values as $key => $value) {
$query .= "$comma `$key`";
$query_values .= "$comma ?";
$comma = ', ';
}
$query .= " ) VALUES ( " . $query_values . ")";
$this->query($query, array_values($values));
return $taskId;
}
public function update_task($taskId, $user, $values, $values_head = null, $admin_mode = false)
{
$query = "SELECT `tiki_user_tasks_history`.* ";
$query .= "FROM `tiki_user_tasks`, `tiki_user_tasks_history` WHERE ";
$query .= "`tiki_user_tasks`.`taskId` = ? AND ";
$query .= "`tiki_user_tasks`.`taskId` = `tiki_user_tasks_history`.`belongs_to` AND ";
$query .= "`tiki_user_tasks`.`last_version` = `tiki_user_tasks_history`.`task_version` ";
$values_select = [(int) $taskId];
if (! $admin_mode) {
$values_select[] = $user;
$values_select[] = $user;
$query .= " AND (`user` = ? OR `creator` = ?) ";
}
$result = $this->query($query, $values_select);
$entries = $result->fetchRow();
// not needed anymore ? // Sept
for ($index = 0; array_key_exists($index, $entries); $index++) {
// Hack since PDO fetchRow returns 2 indexes per DB field
unset($entries[$index]);
}
$query = "INSERT INTO `tiki_user_tasks_history` (";
$query_values = ") VALUES (";
$count_values = 0;
foreach ($values as $key => $value) {
$entries[$key] = $value;
$count_values++;
//echo("$key: $value
");
}
if ($entries['percentage'] == null) {
$entries['status'] = null;
$entries['completed'] = null;
} elseif ($entries['percentage'] >= 100) {
$entries['status'] = 'c';
$entries['completed'] = $this->now;
} else {
$entries['status'] = 'o';
$entries['completed'] = null;
}
if ($count_values > 0) {
$count_entries = 0;
$entries['task_version'] = $entries['task_version'] + 1;
$entries['lasteditor'] = $user;
$entries['lastchanges'] = $this->now;
$comma = '';
foreach ($entries as $key => $value) {
$query .= "$comma `$key`";
$query_values .= "$comma ?";
$comma = ', ';
$count_entries++;
//echo("entries.$key: $value
");
}
//echo("$query
");
$query .= $query_values . ")";
$this->query($query, array_values($entries));
}
$insert_values = [];
$query = "UPDATE `tiki_user_tasks` SET `last_version`= ? ";
$insert_values['last_version'] = (int) $entries['task_version'];
$count_values_head = 0;
if ($values_head != null) {
foreach ($values_head as $key => $value) {
$query .= ", `$key` = ? ";
$insert_values[$key] = $value;
$count_values_head++;
}
}
$insert_values['taskId'] = (int) $taskId;
$query .= "WHERE `taskId`=? ";
if ($count_values > 0 or $count_values_head > 0) {
$this->query($query, array_values($insert_values));
}
return $taskId;
}
public function mark_task_as_trash($taskId, $user, $admin_mode = false)
{
$result = $this->query('SELECT * FROM `tiki_user_tasks` WHERE taskId = ?', [$taskId]);
$res = $result->fetchRow();
if ($user == $res['creator'] or ($user == $res['user'] and $res['rights_by_creator'] == null) or $admin_mode) {
$values = ['deleted' => (int) $this->now];
$this->update_task($taskId, $user, $values, null, $admin_mode);
}
}
public function unmark_task_as_trash($taskId, $user, $admin_mode = false)
{
$result = $this->query("SELECT * FROM `tiki_user_tasks` WHERE taskId = ?", [$taskId]);
$res = $result->fetchRow();
if ($user == $res['creator'] or ($user == $res['user'] and $res['rights_by_creator'] == null) or $admin_mode) {
$values = ['deleted' => null];
$this->update_task($taskId, $user, $values, null, $admin_mode);
}
}
public function open_task($taskId, $user)
{
$values = ['percentage' => (int) 0, 'status' => 'o', 'completed' => null];
$this->update_task($taskId, $user, $values);
}
public function waiting_task($taskId, $user)
{
$values = ['percentage' => null, 'status' => null, 'completed' => null];
$this->update_task($taskId, $user, $values);
}
public function mark_complete_task($taskId, $user)
{
$values = ['percentage' => (int) 100, 'status' => 'c', 'completed' => (int) $this->now];
$this->update_task($taskId, $user, $values);
}
public function update_task_percentage($taskId, $user, $percentage)
{
$values = ['percentage' => $percentage];
$this->update_task($taskId, $user, $values);
}
public function emty_trash($user)
{
$query = "SELECT `tiki_user_tasks`.`taskId` FROM `tiki_user_tasks`, `tiki_user_tasks_history` ";
$query .= "WHERE `tiki_user_tasks`.`creator` = ? AND ";
$query .= "`tiki_user_tasks`.`taskId` = `tiki_user_tasks_history`.`belongs_to` AND ";
$query .= "`tiki_user_tasks`.`last_version` = `tiki_user_tasks_history`.`task_version` AND ";
$query .= "`tiki_user_tasks_history`.`deleted` IS NOT NULL";
$result = $this->query($query, [$user]);
while ($res = $result->fetchRow()) {
$query = "DELETE FROM `tiki_user_tasks_history` WHERE `belongs_to` = ?";
$this->query($query, $res['taskId']);
$query = "DELETE FROM `tiki_user_tasks` WHERE `taskId` = ?";
$this->query($query, $res['taskId']);
}
}
/**
* Returns the tasklist for a user
* $user
* $offset
* $maxRecords lenth of the returned list if it is -1 it returns the full list
* $find serach string
* $sort_mode for sorting,
* $show_private show private tasks user == creator it shows also shared tasks
* to use this option $use_show_shared_for_group must be false
* $show_submitted show submitted tasks creator == user and user != $user it shows also shared tasks
* to use this option $use_show_shared_for_group must be false
* $show_received show received tasks creator != user and user == $user it shows also shared tasks
* to use this option $use_show_shared_for_group must be false
* $show_shared show shared tasks creator != user and user != user
* but the user is in the group to view the this task
* to use this option $use_show_shared_for_group must be false
* $use_show_shared_for_group
* enables the optin $show_shared_for_group with true and
* disables $show_shared, $show_received, $show_submitted and $show_private
* $show_shared_for_group
* shows on null all shared tasks or by a value the tasks to the group value
* $show_trash if on true it shows also the as deleted marked tasks
* $show_completed if on true it shows also the as completed marked tasks
* $use_admin_mode shows all shard tasks also if the user is not in the group to view the task
**/
public function list_tasks($user, $offset = 0, $maxRecords = -1, $find = null, $sort_mode = 'priority_asc', $show_private = true, $show_submitted = true, $show_received = true, $show_shared = true, $use_show_shared_for_group = false, $show_shared_for_group = null, $show_trash = false, $show_completed = false, $use_admin_mode = false)
{
$list_tasks_start = microtime();
$values = [];
if ($use_admin_mode) {
$query = "FROM `tiki_user_tasks_history` AS `t_history`, `tiki_user_tasks` AS `t_head` ";
$query .= "WHERE `t_head`.`public_for_group` IS NOT NULL ";
$query .= "AND `t_head`.`taskId` = `t_history`.`belongs_to` ";
$query .= "AND `t_head`.`last_version` = `t_history`.`task_version` ";
} else {
$query = "FROM `tiki_user_tasks_history` AS `t_history`, `tiki_user_tasks` AS `t_head` ";
if ($show_shared or $use_show_shared_for_group) {
$userid = $this->get_user_id($user);
$query .= ", `users_usergroups` ";
}
$query .= "WHERE ";
$query .= "`t_head`.`taskId` = `t_history`.`belongs_to` AND ";
$query .= "`t_head`.`last_version` = `t_history`.`task_version` AND ";
$query .= "( ";
$query .= "( 1 = 0 ) "; //Dummy
if ($use_show_shared_for_group) {
$query .= " OR ";
$query .= "(`users_usergroups`.`userId` = ?";
$query .= "AND `users_usergroups`.`groupName` = `t_head`.`public_for_group` ";
$values[] = $userid;
if ($show_shared_for_group) {
$query .= "AND `t_head`.`public_for_group` = ? ";
$values[] = $show_shared_for_group;
$query .= ") ";
}
} else {
//private
if ($show_private) {
$query .= " OR ";
$query .= "(`t_head`.`user` = ? AND `t_head`.`creator` = ? ) ";
$values[] = $user;
$values[] = $user;
}
//submitted
if ($show_submitted) {
$query .= " OR ";
$query .= "(`t_head`.`user` != ? AND `t_head`.`creator` = ? ) ";
$values[] = $user;
$values[] = $user;
}
//received
if ($show_received) {
$query .= " OR ";
$query .= "(`t_head`.`user` = ? AND `t_head`.`creator` != ? ) ";
$values[] = $user;
$values[] = $user;
}
//shared
if ($show_shared) {
$query .= " OR ";
$query .= "(`t_head`.`user` != ? AND `t_head`.`creator` != ? ";
$query .= "AND `users_usergroups`.`userId` = ? ";
$query .= "AND `users_usergroups`.`groupName` = `t_head`.`public_for_group`) ";
$values[] = $user;
$values[] = $user;
$values[] = $userid;
}
}
$query .= ") ";
if ($find) {
$query .= " AND ";
$query .= "( ";
$query .= "`t_history`.`title` like ? or ";
$query .= "`t_history`.`description` like ? or";
$query .= "`t_head`.`user` like ? or ";
$query .= "`t_head`.`creator` like ? ";
$query .= ") ";
$values[] = "%" . $find . "%";
$values[] = "%" . $find . "%";
$values[] = "%" . $find . "%";
$values[] = "%" . $find . "%";
}
if ($show_trash == false) {
$query .= " AND ";
$query .= "( `t_history`.`deleted` IS NULL) ";
}
if ($show_completed == false) {
$query .= " AND ";
$query .= "( `t_history`.`completed` IS NULL) ";
}
}
if (isset($sort_mode) and strlen($sort_mode) > 1) {
$order_str = "`t_history`." . $this->convertSortMode($sort_mode) . ", ";
} else {
$order_str = '';
}
// Place the count query before the addition of the order by
// clause to make the query work in postgres..
$query_count = "select count(distinct `t_head`.`taskId`) $query";
$cant = $this->getOne($query_count, $values);
$query .= "ORDER BY $order_str `t_head`.`taskId` desc";
$tasklist = [];
$query_tasklist = "select distinct `t_head`.*, `t_history`.* $query";
$result = $this->query($query_tasklist, $values, $maxRecords, $offset);
//echo("$query_tasklist
");
while ($res = $result->fetchRow()) {
if (($res['user'] == $user) or ($res['creator'] == $user)) {
$res['disabled'] = false;
} else {
$res['disabled'] = true;
}
if ($res['percentage'] == null) {
$res['percentage_null'] = true;
} else {
$res['percentage_null'] = false;
}
$tasklist[] = $res;
}
$retval = [];
$retval["data"] = $tasklist;
$retval["cant"] = $cant;
$list_tasks_end = microtime();
$list_tasks_time = $list_tasks_end - $list_tasks_start;
return $retval;
}
public function get_user_with_permissions($perm)
{
$query = "SELECT DISTINCT `users_users`.`login` AS `login` FROM `users_users` ORDER BY `login`";
$result = $this->query($query, []);
$ret = [];
while ($res = $result->fetchRow()) {
$ret[] = $res;
}
sort($ret);
return $ret;
}
}
$tasklib = new TaskLib();