// | https://www.anuko.com/time_tracker/credits.htm
// +----------------------------------------------------------------------+
+import('ttRoleHelper');
+
// Class ttGroupHelper - contains helper functions that operate with groups.
// This is a planned replacement for ttTeamHelper as we move forward with subgroups.
class ttGroupHelper {
global $user;
$mdb2 = getConnection();
- $parent_id = $user->getActiveGroup();
+ $parent_id = $user->getGroup();
$org_id = $user->org_id;
$sql = "select id from tt_groups where parent_id = $parent_id and org_id = $org_id".
global $user;
$mdb2 = getConnection();
- $parent_id = $user->getActiveGroup();
+ $parent_id = $user->getGroup();
$org_id = $user->org_id;
-
- // TODO: inherit all attributes from the parent group, if not supplied.
$name = $fields['name'];
$description = $fields['description'];
- $created = 'now()';
- $created_ip = $mdb2->quote($_SERVER['REMOTE_ADDR']);
+ // We need to inherit other attributes from the parent group.
+ $attrs = ttGroupHelper::getGroupAttrs($parent_id);
+
+ $columns = '(parent_id, org_id, name, description, currency, decimal_mark, lang, date_format, time_format'.
+ ', week_start, tracking_mode, project_required, task_required, record_type, bcc_email'.
+ ', allow_ip, password_complexity, plugins, lock_spec'.
+ ', workday_minutes, config, created, created_ip, created_by)';
- $sql = "insert into tt_groups (parent_id, org_id, name, description, created, created_ip)".
- " values($parent_id, $org_id, ".$mdb2->quote($name).", ".$mdb2->quote($description).", $created, $created_ip)";
+ $values = " values ($parent_id, $org_id";
+ $values .= ', '.$mdb2->quote($name);
+ $values .= ', '.$mdb2->quote($description);
+ $values .= ', '.$mdb2->quote($attrs['currency']);
+ $values .= ', '.$mdb2->quote($attrs['decimal_mark']);
+ $values .= ', '.$mdb2->quote($attrs['lang']);
+ $values .= ', '.$mdb2->quote($attrs['date_format']);
+ $values .= ', '.$mdb2->quote($attrs['time_format']);
+ $values .= ', '.(int)$attrs['week_start'];
+ $values .= ', '.(int)$attrs['tracking_mode'];
+ $values .= ', '.(int)$attrs['project_required'];
+ $values .= ', '.(int)$attrs['task_required'];
+ $values .= ', '.(int)$attrs['record_type'];
+ $values .= ', '.$mdb2->quote($attrs['bcc_email']);
+ $values .= ', '.$mdb2->quote($attrs['allow_ip']);
+ $values .= ', '.$mdb2->quote($attrs['password_complexity']);
+ $values .= ', '.$mdb2->quote($attrs['plugins']);
+ $values .= ', '.$mdb2->quote($attrs['lock_spec']);
+ $values .= ', '.(int)$attrs['workday_minutes'];
+ $values .= ', '.$mdb2->quote($attrs['config']);
+ $values .= ', now(), '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', '.$user->id;
+ $values .= ')';
+
+ $sql = 'insert into tt_groups '.$columns.$values;
$affected = $mdb2->exec($sql);
- return (!is_a($affected, 'PEAR_Error'));
- // TODO: design subgroup roles carefully. Perhaps roles are not to be touched in subgroups at all.
+ if (is_a($affected, 'PEAR_Error')) return false;
+
+ $subgroup_id = $mdb2->lastInsertID('tt_groups', 'id');
+
+ // Copy roles from the parent group to child group.
+ if (!ttRoleHelper::copyRolesToGroup($subgroup_id))
+ return false;
+
+ return $subgroup_id;
}
// markGroupDeleted marks a group and everything in it as deleted.
// Obtain subgroups and call self recursively on them.
$subgroups = $user->getSubgroups($group_id);
foreach($subgroups as $subgroup) {
- if (!$this->markGroupDeleted($subgroup['id']))
+ if (!ttGroupHelper::markGroupDeleted($subgroup['id']))
return false;
}
}
// Mark group deleted.
- $sql = "update tt_groups set status = null where id = $group_id and org_id = $org_id";
+ $modified_part = ', modified = now(), modified_ip = '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', modified_by = '.$user->id;
+ $sql = "update tt_groups set status = null $modified_part where id = $group_id and org_id = $org_id";
$affected = $mdb2->exec($sql);
if (is_a($affected, 'PEAR_Error')) return false;
global $user;
$mdb2 = getConnection();
- // TODO: add modified info to sql for some tables, depending on table name.
+ // Add modified info to sql for some tables, depending on table name.
+ if ($table_name == 'tt_users') {
+ $modified_part = ', modified = now(), modified_ip = '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', modified_by = '.$user->id;
+ }
$org_id = $user->org_id; // The only security measure we use here for match.
- $sql = "update $table_name set status = null where group_id = $group_id and org_id = $org_id";
+ $sql = "update $table_name set status = null $modified_part where group_id = $group_id and org_id = $org_id";
$affected = $mdb2->exec($sql);
return (!is_a($affected, 'PEAR_Error'));
}
$affected = $mdb2->exec($sql);
return (!is_a($affected, 'PEAR_Error'));
}
+
+ // getGroupAttrs obtains all group attributes.
+ static function getGroupAttrs($group_id) {
+ global $user;
+ $mdb2 = getConnection();
+
+ $sql = "select * from tt_groups".
+ " where status = 1 and id = $group_id and org_id = $user->org_id";
+ $res = $mdb2->query($sql);
+ if (!is_a($res, 'PEAR_Error')) {
+ $val = $res->fetchRow();
+ }
+ return $val;
+ }
+
+ // getRoles obtains all active and inactive roles in current group.
+ static function getRoles() {
+ global $user;
+ $mdb2 = getConnection();
+
+ $group_id = $user->getGroup();
+ $org_id = $user->org_id;
+ $sql = "select * from tt_roles".
+ " where group_id = $group_id and org_id = $org_id and status is not null";
+ $res = $mdb2->query($sql);
+ if (is_a($res, 'PEAR_Error')) return false;
+ while ($val = $res->fetchRow()) {
+ $roles[] = $val;
+ }
+ return $roles;
+ }
+
+ // The getActiveClients returns an array of active clients for a group.
+ static function getActiveClients($all_fields = false)
+ {
+ global $user;
+ $mdb2 = getConnection();
+
+ $group_id = $user->getGroup();
+ $org_id = $user->org_id;
+ if ($all_fields)
+ $sql = "select * from tt_clients where group_id = $group_id and org_id = $org_id and status = 1 order by upper(name)";
+ else
+ $sql = "select id, name from tt_clients where group_id = $group_id and org_id = $org_id and status = 1 order by upper(name)";
+
+ $res = $mdb2->query($sql);
+ $result = array();
+ if (!is_a($res, 'PEAR_Error')) {
+ while ($val = $res->fetchRow()) {
+ $result[] = $val;
+ }
+ }
+ return $result;
+ }
+
+ // The getInactiveClients returns an array of inactive clients for a group.
+ static function getInactiveClients($all_fields = false)
+ {
+ global $user;
+ $mdb2 = getConnection();
+
+ $group_id = $user->getGroup();
+ $org_id = $user->org_id;
+ if ($all_fields)
+ $sql = "select * from tt_clients where group_id = $group_id and org_id = $org_id and status = 0 order by upper(name)";
+ else
+ $sql = "select id, name from tt_clients where group_id = $group_id and org_id = $org_id and status = 0 order by upper(name)";
+
+ $res = $mdb2->query($sql);
+ $result = array();
+ if (!is_a($res, 'PEAR_Error')) {
+ while ($val = $res->fetchRow()) {
+ $result[] = $val;
+ }
+ }
+ return $result;
+ }
+
+ // getActiveProjects - returns an array of active projects for a group.
+ static function getActiveProjects()
+ {
+ global $user;
+ $mdb2 = getConnection();
+
+ $group_id = $user->getGroup();
+ $org_id = $user->org_id;
+
+ $sql = "select id, name, description, tasks from tt_projects".
+ " where group_id = $group_id and org_id = $org_id and status = 1 order by upper(name)";
+ $res = $mdb2->query($sql);
+ $result = array();
+ if (!is_a($res, 'PEAR_Error')) {
+ while ($val = $res->fetchRow()) {
+ $result[] = $val;
+ }
+ }
+ return $result;
+ }
+
+ // getInactiveProjects - returns an array of inactive projects for a group.
+ static function getInactiveProjects()
+ {
+ global $user;
+ $mdb2 = getConnection();
+
+ $group_id = $user->getGroup();
+ $org_id = $user->org_id;
+
+ $sql = "select id, name, description, tasks from tt_projects".
+ " where group_id = $group_id and org_id = $org_id and status = 0 order by upper(name)";
+ $res = $mdb2->query($sql);
+ $result = array();
+ if (!is_a($res, 'PEAR_Error')) {
+ while ($val = $res->fetchRow()) {
+ $result[] = $val;
+ }
+ }
+ return $result;
+ }
}