/**
  * Show groups index page
  *
  * @param void
  * @return null
  */
 function index()
 {
     $project_groups = ProjectGroups::findAll($this->logged_user);
     if ($this->request->getFormat() == FORMAT_HTML) {
         $this->smarty->assign(array('project_groups' => $project_groups, 'can_add_project_group' => ProjectGroup::canAdd($this->logged_user)));
     } else {
         $this->serveData($project_groups, 'project_groups');
     }
     // if
 }
/**
 * Select project group helper
 *
 * Params:
 * 
 * - value - ID of selected group
 * - optional - boolean
 * - can_create_new - Should this select box offer option to create a new 
 *   company from within the list
 * 
 * @param array $params
 * @param Smarty $smarty
 * @return string
 */
function smarty_function_select_project_group($params, &$smarty)
{
    static $ids = array();
    $optional = array_var($params, 'optional', true, true);
    $value = array_var($params, 'value', null, true);
    $can_create_new = array_var($params, 'can_create_new', true, true);
    $id = array_var($params, 'id', null, true);
    if (empty($id)) {
        $counter = 1;
        do {
            $id = "select_project_group_dropdown_{$counter}";
            $counter++;
        } while (in_array($id, $ids));
    }
    // if
    $ids[] = $id;
    $params['id'] = $id;
    $groups = ProjectGroups::findAll($smarty->get_template_vars('logged_user'), true);
    if ($optional) {
        $options = array(option_tag(lang('-- None --'), ''), option_tag('', ''));
    } else {
        $options = array();
    }
    // if
    if (is_foreachable($groups)) {
        foreach ($groups as $group) {
            $option_attributes = array('class' => 'object_option');
            if ($value == $group->getId()) {
                $option_attributes['selected'] = true;
            }
            // if
            $options[] = option_tag($group->getName(), $group->getId(), $option_attributes);
        }
        // foreach
    }
    // if
    if ($can_create_new) {
        $params['add_object_url'] = assemble_url('project_groups_quick_add');
        $params['object_name'] = 'project_group';
        $params['add_object_message'] = lang('Please insert new project group name');
        $logged_user = get_logged_user();
        if (instance_of($logged_user, 'User') && ProjectGroup::canAdd($logged_user)) {
            $options[] = option_tag('', '');
            $options[] = option_tag(lang('New Project Group...'), '', array('class' => 'new_object_option'));
        }
        // if
    }
    // if
    return select_box($options, $params) . '<script type="text/javascript">$("#' . $id . '").new_object_from_select();</script>';
}
 /**
  * Return all groups ordered by name
  * 
  * This function will return only groups visible to given user
  * 
  * If $return_all is set to true all groups will be loaded and returned. 
  * This is used in situations where we need all of them regardels of user 
  * previous assignments (like select project group helper)
  *
  * @param User $user
  * @param boolean $return_all
  * @return array
  */
 function findAll($user, $return_all = false)
 {
     if ($return_all || $user->isAdministrator() || $user->isProjectManager()) {
         return ProjectGroups::find(array('order' => 'name'));
     }
     // if
     $project_ids = Projects::findProjectIdsByUser($user);
     if (is_foreachable($project_ids)) {
         $projects_table = TABLE_PREFIX . 'projects';
         $project_groups_table = TABLE_PREFIX . 'project_groups';
         return ProjectGroups::findBySQL("SELECT DISTINCT {$project_groups_table}.* FROM {$projects_table}, {$project_groups_table} WHERE {$project_groups_table}.id = {$projects_table}.group_id AND {$projects_table}.id IN (?) ORDER BY {$project_groups_table}.name", array($project_ids));
     } else {
         return null;
     }
     // if
 }
 /**
  * Projects listing
  *
  */
 function index()
 {
     $per_page = 10;
     $page = (int) $this->request->get('page');
     if ($page < 1) {
         $page = 1;
     }
     // if
     $group = null;
     $group_id = $this->request->getId('group_id');
     if ($group_id) {
         $group = ProjectGroups::findById($group_id);
     }
     // if
     if (instance_of($group, 'ProjectGroup')) {
         list($projects, $pagination) = Projects::paginateByUserAndGroup($this->logged_user, $group, array(PROJECT_STATUS_ACTIVE), $page, $per_page);
     } else {
         list($projects, $pagination) = Projects::paginateByUser($this->logged_user, array(PROJECT_STATUS_ACTIVE), $page, $per_page);
     }
     // if
     $this->smarty->assign(array('groups' => ProjectGroups::findAll($this->logged_user), 'selected_group_id' => $group_id, 'pagination' => $pagination, 'projects' => $projects, 'page_title' => lang('Projects'), 'paginator_url' => assemble_url('mobile_access_projects')));
 }
/**
 * Render select project template widget
 *
 * @param array $params
 * @param Smarty $smarty
 * @return string
 */
function smarty_function_select_project_template($params, &$smarty)
{
    $options = array(option_tag(lang('-- Create a Blank Project --'), ''), option_tag('', ''));
    $value = array_var($params, 'value', null, true);
    $projects_loaded = false;
    $group_id = ConfigOptions::getValue('project_templates_group');
    if ($group_id) {
        $group = ProjectGroups::findById($group_id);
        if (instance_of($group, 'ProjectGroup')) {
            $projects = Projects::findByGroup($group);
            $projects_loaded = true;
            if (is_foreachable($projects)) {
                foreach ($projects as $project) {
                    $option_attributes = $project->getId() == $value ? array('selected' => true) : null;
                    $options[] = option_tag($project->getName(), $project->getId(), $option_attributes);
                }
                // if
            }
            // if
        }
        // if
    }
    // if
    if (!$projects_loaded) {
        $projects = Projects::findNamesByUser($smarty->get_template_vars('logged_user'));
        if (is_foreachable($projects)) {
            foreach ($projects as $k => $v) {
                $option_attributes = $k == $value ? array('selected' => true) : null;
                $options[] = option_tag($v, $k, $option_attributes);
            }
            // foreach
        }
        // if
    }
    // if
    return select_box($options, $params);
}
 /**
  * Return true if $user can delete this group
  *
  * @param User $user
  * @return boolean
  */
 function canDelete($user)
 {
     return ($user->isProjectManager() || $user->isAdministrator()) && $this->getProjectsCount() == 0 && ProjectGroups::count() > 1;
 }
 /**
  * Projects Arhive
  *
  * @param void
  * @return null
  */
 function archive()
 {
     if ($this->request->isApiCall()) {
         $this->serveData(Projects::findByUser($this->logged_user), 'projects');
     }
     // if
     $per_page = 10;
     $page = (int) $this->request->get('page');
     if ($page < 1) {
         $page = 1;
     }
     // if
     if (!$this->logged_user->isOwner()) {
         $group_by = 'group';
     } else {
         $group_by = $this->request->get('group_by');
         if ($group_by != 'client') {
             $group_by = 'group';
         }
         // if
     }
     // if
     $filter_by_status = $this->request->get('filter');
     if (is_null($filter_by_status)) {
         $filter_by_status = 'all';
     }
     // if
     switch ($filter_by_status) {
         case 'all':
             $statuses = array(PROJECT_STATUS_COMPLETED, PROJECT_STATUS_CANCELED, PROJECT_STATUS_PAUSED);
             break;
         case 'completed':
             $statuses = array(PROJECT_STATUS_COMPLETED);
             break;
         case 'paused':
             $statuses = array(PROJECT_STATUS_PAUSED);
             break;
         case 'canceled':
             $statuses = array(PROJECT_STATUS_CANCELED);
             break;
         default:
             $statuses = array(PROJECT_STATUS_COMPLETED, PROJECT_STATUS_CANCELED, PROJECT_STATUS_PAUSED);
             break;
     }
     // switch project status filter
     $this->smarty->assign(array('group_by' => $group_by, 'filter' => $filter_by_status));
     if ($group_by == 'group') {
         $group = null;
         $group_id = $this->request->getId('group_id');
         if ($group_id) {
             $group = ProjectGroups::findById($group_id);
         }
         // if
         if (instance_of($group, 'ProjectGroup')) {
             list($projects, $pagination) = Projects::paginateByUserAndGroup($this->logged_user, $group, $statuses, $page, $per_page, true);
         } else {
             list($projects, $pagination) = Projects::paginateByUser($this->logged_user, $statuses, $page, $per_page, true);
         }
         // if
         $this->smarty->assign(array('projects' => $projects, 'pagination' => $pagination, 'groups' => ProjectGroups::findAll($this->logged_user), 'selected_group' => $group));
     } else {
         $company = null;
         $company_id = $this->request->getId('company_id');
         if ($company_id) {
             $company = Companies::findById($company_id);
         }
         // if
         if (!instance_of($company, 'Company')) {
             $company = $this->owner_company;
         }
         // if
         list($projects, $pagination) = Projects::paginateByUserAndCompany($this->logged_user, $company, $statuses, $page, $per_page, true);
         $this->smarty->assign(array('projects' => $projects, 'pagination' => $pagination, 'companies' => Companies::findClients($this->logged_user), 'selected_company' => $company));
     }
     // if
 }
 /**
  * Get parent project group
  *
  * @param void
  * @return ProjectGroup
  */
 function getGroup()
 {
     if ($this->group === false) {
         if ($this->getGroupId() == 0) {
             $this->group = null;
         } else {
             $this->group = ProjectGroups::findById($this->getGroupId());
         }
         // if
     }
     // if
     return $this->group;
 }