/** * Check if this user is part of specific project * * @param Project $project * @return boolean */ function isProjectUser(Project $project) { if (!isset($this->is_project_user_cache[$project->getId()])) { $project_user = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $this->getId())); // findById $this->is_project_user_cache[$project->getId()] = $project_user instanceof ProjectUser; } // if return $this->is_project_user_cache[$project->getId()]; }
/** * Delete project - company relation * * This function needs to remove relation from the database and all user - project relations * * @param void * @return boolean */ function delete() { $company = $this->getCompany(); $project = $this->getProject(); if ($company instanceof Company && $project instanceof Project) { $users = $company->getUsers(); if (is_array($users)) { foreach ($users as $user) { $relation = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $user->getId())); //findById if ($relation instanceof ProjectUser) { $relation->delete(); } // if } // foreach } // if } // if return parent::delete(); }
/** * Return project permission for specific user if he is on project. In case of any error $default is returned * * @access public * @param Project $project * @param string $permission Permission name * @param boolean $default Default value * @return boolean */ function getProjectPermission(Project $project, $permission, $default = false) { trace(__FILE__,"getProjectPermission($permission, $default)"); if (is_null($project)) return false; static $valid_permissions; if (!isset($valid_permissions)) { trace(__FILE__,"getProjectPermission($permission, $default):getPermissionsText()"); $valid_permissions = array_keys(permission_manager()->getPermissionsText()); } // if if (!in_array($permission, $valid_permissions)) { return $default; } // if trace(__FILE__,"getProjectPermission($permission, $default):findById project={$project->getId()}"); $project_user = ProjectUsers::findById(array( 'project_id' => $project->getId(), 'user_id' => $this->getId() )); // findById if (!($project_user instanceof ProjectUser)) { return $default; } // if trace(__FILE__,"getProjectPermission($permission, $default):getPermissions()"); $value = in_array($permission,$project_user->getPermissions()) ? true : false; return $value; } // getProjectPermission
/** * Return project permission for specific user if he is on project. In case of any error $default is returned * * @access public * @param Project $project * @param string $permission Permission name * @param boolean $default Default value * @return boolean */ function getProjectPermission(Project $project, $permission, $default = false) { static $valid_permissions = null; if (is_null($valid_permissions)) { $valid_permissions = ProjectUsers::getPermissionColumns(); } // if if (!in_array($permission, $valid_permissions)) { return $default; } // if $project_user = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $this->getId())); // findById if (!$project_user instanceof ProjectUser) { return $default; } // if $getter = 'get' . Inflector::camelize($permission); return $project_user->{$getter}(); }
/** * Remove company from project * * @param void * @return null */ function remove_company() { if (!active_project()->canChangePermissions(logged_user())) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } // if $project = Projects::findById(get_id('project_id')); if (!$project instanceof Project) { flash_error(lang('project dnx')); ajx_current("empty"); return; } // if $company = Companies::findById(get_id('company_id')); if (!$company instanceof Company) { flash_error(lang('company dnx')); ajx_current("empty"); return; } // if $project_company = ProjectCompanies::findById(array('project_id' => $project->getId(), 'company_id' => $company->getId())); if (!$project_company instanceof ProjectCompany) { flash_error(lang('company not on project')); ajx_current("empty"); return; } // if try { DB::beginWork(); $project_company->delete(); $users = ProjectUsers::getCompanyUsersByProject($company, $project); if (is_array($users)) { foreach ($users as $user) { $project_user = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $user->getId())); if ($project_user instanceof ProjectUser) { $project_user->delete(); } } // foreach } // if DB::commit(); flash_success(lang('success remove company from project')); ajx_current("reload"); } catch (Exception $e) { DB::rollback(); flash_error(lang('error remove company from project')); ajx_current("empty"); } // try }
/** * Show update permissions page * * @param void * @return null */ function update_permissions() { $user = Users::findById(get_id()); if (!$user instanceof User) { flash_error(lang('user dnx')); $this->redirectToReferer(get_url('dashboard')); } // if if (!$user->canUpdatePermissions(logged_user())) { flash_error(lang('no access permissions')); $this->redirectToReferer(get_url('dashboard')); } // if $company = $user->getCompany(); if (!$company instanceof Company) { flash_error(lang('company dnx')); $this->redirectToReferer(get_url('dashboard')); } // if $projects = $company->getProjects(); if (!is_array($projects) || !count($projects)) { flash_error(lang('no projects owned by company')); $this->redirectToReferer($company->getViewUrl()); } // if $permissions = ProjectUsers::getNameTextArray(); $redirect_to = array_var($_GET, 'redirect_to'); if (trim($redirect_to) == '' || !is_valid_url($redirect_to)) { $redirect_to = $user->getCardUrl(); } // if tpl_assign('user', $user); tpl_assign('company', $company); tpl_assign('projects', $projects); tpl_assign('permissions', $permissions); tpl_assign('redirect_to', $redirect_to); if (array_var($_POST, 'submitted') == 'submitted') { DB::beginWork(); foreach ($projects as $project) { $relation = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $user->getId())); // findById if (array_var($_POST, 'project_permissions_' . $project->getId()) == 'checked') { if (!$relation instanceof ProjectUser) { $relation = new ProjectUser(); $relation->setProjectId($project->getId()); $relation->setUserId($user->getId()); } // if foreach ($permissions as $permission => $permission_text) { $permission_value = array_var($_POST, 'project_permission_' . $project->getId() . '_' . $permission) == 'checked'; $setter = 'set' . Inflector::camelize($permission); $relation->{$setter}($permission_value); } // foreach $relation->save(); } else { if ($relation instanceof ProjectUser) { $relation->delete(); } // if } // if } // if DB::commit(); flash_success(lang('success user permissions updated')); $this->redirectToUrl($redirect_to); } // if }
/** * Return project user instance for this user and $project * * @param Project $project * @return ProjectUser */ function getProjectUserInstance($project) { $project_id = $project->getId(); if (!array_key_exists($project_id, $this->project_users)) { $this->project_users[$project->getId()] = ProjectUsers::findById(array('user_id' => $this->getId(), 'project_id' => $project->getId())); } // if return $this->project_users[$project->getId()]; }
/** * Return top level types user can see in $project * * @param User $user * @param Project $project * @param boolean $use_cache * @return array */ function getVisibleTypesByProject($user, $project, $use_cache = true) { $project_id = $project->getId(); $cache_id = 'visible_project_types_for_' . $user->getId(); $cached_value = cache_get($cache_id); if (!is_array($cached_value)) { $cached_value = array(); } // if if ($use_cache && isset($cached_value[$project_id])) { return $cached_value[$project_id]; } // if if ($user->isAdministrator() || $user->isProjectManager() || $user->isProjectLeader($project)) { $cached_value[$project_id] = array_keys(Permissions::findProject()); cache_set($cache_id, $cached_value); return $cached_value[$project_id]; } // if $project_user = ProjectUsers::findById(array('user_id' => $user->getId(), 'project_id' => $project->getId())); if (instance_of($project_user, 'ProjectUser')) { $role = $project_user->getRole(); if (instance_of($role, 'Role')) { $permissions = $role->getPermissions(); } else { $permissions = $project_user->getPermissions(); } // if if (is_array($permissions)) { $types = array(); foreach ($permissions as $permission_name => $permission_value) { if ($permission_value >= PROJECT_PERMISSION_ACCESS) { $types[] = $permission_name; } // if } // foreach $cached_value[$project_id] = $types; cache_set($cache_id, $cached_value); return $cached_value[$project_id]; } // if } // if $cached_value[$project_id] = array(); cache_set($cache_id, $cached_value); return array(); }
/** * Remove given user from this project * * @param User $user * @return boolean */ function removeUser($user) { $project_user = ProjectUsers::findById(array('user_id' => $user->getId(), 'project_id' => $this->getId())); if (instance_of($project_user, 'ProjectUser')) { db_begin_work(); $delete = $project_user->delete(); if ($delete && !is_error($delete)) { clean_user_permissions_cache($user); event_trigger('on_project_user_removed', array($this, $user)); db_commit(); return true; } else { db_rollback(); return $delete; } // if } // if return true; }
function view_today_page() { if ($this->request->get('async')) { $object_id = $this->request->post('object_id'); $priority = $this->request->post('priority'); $link = mysql_connect(DB_HOST, DB_USER, DB_PASS); mysql_select_db(DB_NAME); mysql_query("update healingcrystals_project_objects set priority='" . $priority . "' where id='" . $object_id . "'"); mysql_close($link); exit; } $selected_project = $_GET['selected_project']; $order_by = $_GET['order_by']; $sort_order = $_GET['sort_order']; $tab = empty($_GET['tab']) ? 'tab01' : $_GET['tab']; $user = Users::findById($this->request->getId('user_id')); $project_user = ProjectUsers::findById(array('user_id' => $user->getId(), 'project_id' => $this->active_project->getId())); if ($tab == 'tab01') { $entries = $this->logged_user->getOwnedTickets($user->getId(), $selected_project, $order_by, $sort_order); $this->smarty->assign(array('active_user' => $user, 'project_user' => $project_user, 'entries' => $entries, 'user_projects' => $user->getActiveProjects(), 'selected_project' => $selected_project, 'tab' => $tab)); } elseif ($tab == 'tab03') { $content = $this->logged_user->getHomeTabContent($user_id); $this->smarty->assign(array('active_user' => $user, 'project_user' => $project_user, 'page_view' => $page_view, 'tab' => $tab, 'home_tab_content' => $content)); } elseif ($tab == 'tab04') { $entries = $this->logged_user->getSubscribedTickets($user->getId(), $selected_project, $order_by, $sort_order); $this->smarty->assign(array('active_user' => $user, 'project_user' => $project_user, 'entries' => $entries, 'user_projects' => $user->getActiveProjects(), 'selected_project' => $selected_project, 'tab' => $tab)); } elseif ($tab == 'tab02') { $mark_completed = $_GET['mark_completed']; $completed_count = ''; $project_id = $this->active_project->getId(); $user_id = $user->getId(); $fyi_query = array(); if (!empty($mark_completed)) { $ids = explode(',', $mark_completed); $tickets = Tickets::findByIds($ids, STATE_VISIBLE, $this->logged_user->getVisibility()); foreach ($tickets as $ticket) { if ($ticket->isOpen() && $ticket->canChangeCompleteStatus($this->logged_user)) { $complete = $ticket->complete($this->logged_user); if ($complete && !is_error($complete)) { $updated++; $fyi_query[] = "update healingcrystals_assignments_action_request a , healingcrystals_project_objects b set a.is_fyi='-1', last_modified=now() where a.comment_id=b.id and b.type='Comment' and b.project_id='" . $ticket->getProjectId() . "' and b.parent_id='" . $ticket->getId() . "' and a.user_id='" . $this->logged_user->getId() . "' and a.is_fyi='1'"; } // if } // if } // foreach } $link = mysql_connect(DB_HOST, DB_USER, DB_PASS); mysql_select_db(DB_NAME, $link); foreach ($fyi_query as $query) { mysql_query($query, $link); } $entries = array(); $temp = array(); $query = "select b.*, a.is_owner, d.category_name, f.object_id as temp\n from healingcrystals_assignments a \n\t\t\tinner join healingcrystals_project_objects b on (a.object_id=b.id and (b.type='Ticket' or (b.type='Task' and b.parent_type='Ticket'))) \n\t\t\tleft outer join healingcrystals_project_objects e on b.milestone_id=e.id \n\t\t\tleft outer join healingcrystals_project_object_categories c on b.id=c.object_id \n\t\t\tleft outer join healingcrystals_project_milestone_categories d on c.category_id=d.id \n\t\t\tleft outer join healingcrystals_starred_objects f on (b.id=f.object_id and f.user_id='" . $user_id . "') \n\t\t\tinner join healingcrystals_assignments_action_request g on (g.user_id='" . $user_id . "' and g.is_fyi='1' and exists(select * from healingcrystals_project_objects h where h.id=g.comment_id and h.parent_id=b.id)) \n\t\t\twhere a.user_id='" . $user_id . "' and \n (a.is_owner='1' or g.user_id='" . $user_id . "') and \n b.project_id='" . $this->active_project->getId() . "' and \n\t\t\tb.completed_on is null and b.state='3' and b.visibility='1' \n order by b.due_on desc"; $result = mysql_query($query); while ($entry = mysql_fetch_assoc($result)) { $item_class = array_var($entry, 'type'); $item = new $item_class(); $item->loadFromRow($entry); if (!in_array($entry['id'], $temp)) { $milestone_id = $item->getMilestoneId(); if (!empty($milestone_id)) { $query_1 = "select * from healingcrystals_project_objects where id='" . $milestone_id . "'"; $result_1 = mysql_query($query_1); if (mysql_num_rows($result_1)) { $item_1 = new Milestone($milestone_id); } } $entries[] = array('obj' => $item, 'id' => $entry['id'], 'logged_user_is_responsible' => $entry['is_owner'], 'department' => array($entry['category_name']), 'milestone_obj' => $item_1, 'team_name' => $entry['team_name']); $temp[] = $entry['id']; if (!empty($milestone_id)) { unset($item_1); } } else { $entries[array_search($entry['id'], $temp)]['department'][] = $entry['category_name']; } unset($item); } $action_request_comments = array(); $fyi_comments = array(); $fyi_read_comments = array(); $query = "select b.id \n from healingcrystals_assignments_action_request a \n\t\t\tinner join healingcrystals_project_objects b on a.comment_id=b.id \n\t\t\tinner join healingcrystals_projects c on b.project_id=c.id \n\t\t\twhere a.is_action_request='1' and a.user_id='" . $user_id . "' \n\t\t\tand b.project_id='" . $this->active_project->getId() . "' \n\t\t\torder by c.name, a.date_added desc"; $result = mysql_query($query); while ($entry = mysql_fetch_assoc($result)) { $action_request_comments[] = new Comment($entry['id']); } $query = "select b.id \n from healingcrystals_assignments_action_request a \n\t\t\tinner join healingcrystals_project_objects b on a.comment_id=b.id \n\t\t\tinner join healingcrystals_projects c on b.project_id=c.id \n\t\t\twhere a.is_fyi='1' and a.user_id='" . $user_id . "' \n\t\t\tand b.project_id='" . $this->active_project->getId() . "' \n\t\t\torder by c.name, a.date_added desc"; $result = mysql_query($query); while ($entry = mysql_fetch_assoc($result)) { $fyi_comments[] = new Comment($entry['id']); } $query = "select b.id \n from healingcrystals_assignments_action_request a \n\t\t\tinner join healingcrystals_project_objects b on a.comment_id=b.id \n\t\t\tinner join healingcrystals_projects c on b.project_id=c.id \n\t\t\twhere a.is_fyi='R' and a.user_id='" . $user_id . "' \n\t\t\tand b.project_id='" . $this->active_project->getId() . "' \n\t\t\torder by a.fyi_marked_read_on, a.last_modified desc, c.name"; $result = mysql_query($query); while ($entry = mysql_fetch_assoc($result)) { $fyi_read_comments[] = new Comment($entry['id']); } mysql_close($link); $this->smarty->assign(array('active_user' => $user, 'project_user' => $project_user, 'entries' => $entries, 'user_projects' => $user->getActiveProjects(), 'selected_project' => $selected_project, 'tab' => $tab, 'action_request_comments' => $action_request_comments, 'fyi_comments' => $fyi_comments, 'fyi_read_comments' => $fyi_read_comments, 'home_tab_content' => $home_tab_content)); } }
/** * Edit logged user profile. * Called with different POST format from "administration/users/edit user profile " and from "profile/edit my profile" * * @access public * @param void * @return null */ function edit_profile() { $user = Users::findById(get_id()); if (!$user instanceof User) { flash_error(lang('user dnx')); ajx_current("empty"); return; } // if $company = $user->getCompany(); if (!$company instanceof Company) { flash_error(lang('company dnx')); ajx_current("empty"); return; } // if if (!$user->canUpdateProfile(logged_user())) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } // if $redirect_to = array_var($_GET, 'redirect_to'); if (trim($redirect_to) == '' || !is_valid_url($redirect_to)) { $redirect_to = $user->getCardUrl(); } // if tpl_assign('redirect_to', null); $user_data = array_var($_POST, 'user'); if (!is_array($user_data)) { $user_data = array('username' => $user->getUsername(), 'email' => $user->getEmail(), 'display_name' => $user->getDisplayName(), 'title' => $user->getTitle(), 'timezone' => $user->getTimezone(), 'auto_assign' => $user->getAutoAssign(), 'company_id' => $user->getCompanyId(), 'is_admin' => $user->isAdministrator(), 'type' => $user->getType()); // array } // if tpl_assign('user', $user); tpl_assign('company', $company); tpl_assign('user_data', $user_data); tpl_assign('billing_categories', BillingCategories::findAll()); if (is_array(array_var($_POST, 'user'))) { if (array_var($user_data, 'company_id') && !Companies::findById(array_var($user_data, 'company_id')) instanceof Company) { ajx_current("empty"); flash_error(lang("company dnx")); return; } try { DB::beginWork(); $user->setDisplayName(array_var($user_data, 'display_name')); $user->setEmail(array_var($user_data, 'email')); $user->setType(array_var($user_data, 'type')); $user->setTimezone(array_var($user_data, 'timezone')); $user->setTitle(array_var($user_data, 'title')); $user->setUpdatedOn(DateTimeValueLib::now()); if (logged_user()->isAdministrator()) { if ($user->getId() != 1) { // System admin cannot change it's company $user->setCompanyId(array_var($user_data, 'company_id')); } $user->setDefaultBillingId(array_var($user_data, 'default_billing_id')); $user->setUsername(array_var($user_data, 'username')); $project = Projects::findById(array_var($user_data, 'personal_project_id')); if ($project instanceof Project && $user->getPersonalProjectId() != $project->getId()) { $user->setPersonalProjectId($project->getId()); $project_user = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $user->getId())); if (!$project_user) { $project_user = new ProjectUser(); $project_user->setUserId($user->getId()); $project_user->setProjectId($project->getId()); } $project_user->setAllPermissions(true); $project_user->save(); } } $user->save(); $autotimezone = array_var($user_data, 'autodetect_time_zone', null); if ($autotimezone !== null) { set_user_config_option('autodetect_time_zone', $autotimezone, $user->getId()); } $object_controller = new ObjectController(); $object_controller->add_custom_properties($user); if ($user->getId() != 1) { //System admin cannot change its own admin status if ($user->getType() == 'admin') { if ($user->getCompanyId() != owner_company()->getId()) { // external users can't be admins => set as Normal $user->setType('normal'); $user->setAsAdministrator(false); } else { $user->setAsAdministrator(true); } } else { $user->setAsAdministrator(false); } } DB::commit(); flash_success(lang('success update profile')); ajx_current("back"); ajx_add("overview-panel", "reload"); } catch (Exception $e) { DB::rollback(); ajx_current("empty"); flash_error($e->getMessage()); } // try } // if }