Wrote a validation routine for holidays.
[timetracker.git] / WEB-INF / lib / ttUser.class.php
index 4a2320b..ab0affe 100644 (file)
@@ -68,7 +68,11 @@ class ttUser {
   var $password_complexity = null; // Password complexity example.
   var $currency = null;         // Currency.
   var $plugins = null;          // Comma-separated list of enabled plugins.
+
+  // Refactoring ongoing. Towards using helper instead of config string?
   var $config = null;           // Comma-separated list of miscellaneous config options.
+  var $configHelper = null;     // An instance of ttConfigHelper class.
+
   var $custom_logo = 0;         // Whether to use a custom logo for group.
   var $lock_spec = null;        // Cron specification for record locking.
   var $workday_minutes = 480;   // Number of work minutes in a regular day.
@@ -137,13 +141,15 @@ class ttUser {
       $this->workday_minutes = $val['workday_minutes'];
       $this->custom_logo = $val['custom_logo'];
 
+      // TODO: refactor this.
       $this->config = $val['config'];
-      $config = new ttConfigHelper($this->config);
+      $this->configHelper = new ttConfigHelper($val['config']);
+
       // Set user config options.
-      $this->show_holidays = $config->getDefinedValue('show_holidays');
-      $this->punch_mode = $config->getDefinedValue('punch_mode');
-      $this->allow_overlap = $config->getDefinedValue('allow_overlap');
-      $this->future_entries = $config->getDefinedValue('future_entries');
+      $this->show_holidays = $this->configHelper->getDefinedValue('show_holidays');
+      $this->punch_mode = $this->configHelper->getDefinedValue('punch_mode');
+      $this->allow_overlap = $this->configHelper->getDefinedValue('allow_overlap');
+      $this->future_entries = $this->configHelper->getDefinedValue('future_entries');
       
       // Set "on behalf" id and name (user).
       if (isset($_SESSION['behalf_id'])) {
@@ -229,7 +235,7 @@ class ttUser {
 
   // getConfig returns config string for active group.
   function getConfig() {
-    return ($this->behalfGroup ? $this->behalfGroup->config : $this->config);
+    return ($this->behalfGroup ? $this->behalfGroup->configHelper->getConfig() : $this->configHelper->getConfig());
   }
 
   // getConfigOption returns true if an option is defined for group.
@@ -263,8 +269,21 @@ class ttUser {
     return in_array($plugin, explode(',', $this->getPlugins()));
   }
 
+  // isOptionEnabled checks whether a config option is enabled for user.
+  function isOptionEnabled($option)
+  {
+    return $this->behalfGroup ? $this->behalfGroup->configHelper->getDefinedValue($option) : $this->configHelper->getDefinedValue($option);
+  }
+
+  // setOption sets an option inside of ttConfigHelper instance.
+  // Note that it does not write to the database.
+  function setOption($option, $enable = true)
+  {
+    return $this->behalfGroup ? $this->behalfGroup->configHelper->setDefinedValue($option, $enable) : $this->configHelper->setDefinedValue($option, $enable);
+  }
+
   // getAssignedProjects - returns an array of assigned projects.
-  function getAssignedProjects()
+  function getAssignedProjects($includeFiles = false)
   {
     $result = array();
     $mdb2 = getConnection();
@@ -273,8 +292,15 @@ class ttUser {
     $group_id = $this->getGroup();
     $org_id = $this->org_id;
 
+    if ($includeFiles) {
+      $filePart = ', if(Sub1.entity_id is null, 0, 1) as has_files';
+      $fileJoin =  " left join (select distinct entity_id from tt_files".
+      " where entity_type = 'project' and group_id = $group_id and org_id = $org_id and status = 1) Sub1".
+      " on (p.id = Sub1.entity_id)";
+    }
+
     // Do a query with inner join to get assigned projects.
-    $sql = "select p.id, p.name, p.description, p.tasks, upb.rate from tt_projects p".
+    $sql = "select p.id, p.name, p.description, p.tasks, upb.rate $filePart from tt_projects p $fileJoin".
       " inner join tt_user_project_binds upb on (upb.user_id = $user_id and upb.project_id = p.id and upb.status = 1)".
       " where p.group_id = $group_id and p.org_id = $org_id and p.status = 1 order by p.name";
     $res = $mdb2->query($sql);
@@ -417,7 +443,7 @@ class ttUser {
 
     $left_joins = null;
     if (isset($options['max_rank']) || $skipClients || isset($options['include_role']))
-        $left_joins .= ' left join tt_roles r on (u.role_id = r.id)';
+      $left_joins .= ' left join tt_roles r on (u.role_id = r.id)';
 
     $where_part = " where u.org_id = $org_id and u.group_id = $group_id";
     if (isset($options['status']))
@@ -475,21 +501,6 @@ class ttUser {
   //   - The entire stack of groups all the way down to current on behalf group.
   //   - All immediate children of the current on behalf group.
   // This allows user to navigate easily to home group, anything in between, and 1 level below.
-  //
-  // Note 1: group dropdown is, by design, to be placed on all pages where "relevant",
-  // such as users.php, projects.php, tasks.php, etc. But some features may be disabled
-  // in some groups. We should check for feature availability on group change
-  // in post and redirect to feature_disabled.php when this happens.
-  // This will allow us to keep dropdown content consistent on all pages.
-  // Filtering content of the dropdown does not seem right.
-  //
-  // Note 2: Menu should display according to $user home group settings.
-  //         Pages, should look according to $user->behalfGroup settings (if set).
-  //         For example, if home group allows tasks, menu should display Tasks,
-  //         even when we are on behalf of a subgroup without tasks.
-  //
-  // Note 3: Language of all pages should be as in $user home group even when
-  //         subgroups have a different language.
   function getGroupsForDropdown() {
     $mdb2 = getConnection();
 
@@ -658,12 +669,13 @@ class ttUser {
     if (isset($fields['plugins'])) $plugins_part = ', plugins = '.$mdb2->quote($fields['plugins']);
     if (isset($fields['config'])) $config_part = ', config = '.$mdb2->quote($fields['config']);
     if (isset($fields['lock_spec'])) $lock_spec_part = ', lock_spec = '.$mdb2->quote($fields['lock_spec']);
+    if (isset($fields['holidays'])) $holidays_part = ', holidays = '.$mdb2->quote($fields['holidays']);
     if (isset($fields['workday_minutes'])) $workday_minutes_part = ', workday_minutes = '.$mdb2->quote($fields['workday_minutes']);
     $modified_part = ', modified = now(), modified_ip = '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', modified_by = '.$mdb2->quote($this->id);
 
     $parts = trim($name_part.$description_part.$currency_part.$lang_part.$decimal_mark_part.$date_format_part.
       $time_format_part.$week_start_part.$tracking_mode_part.$task_required_part.$project_required_part.$record_type_part.
-      $bcc_email_part.$allow_ip_part.$plugins_part.$config_part.$lock_spec_part.$workday_minutes_part.$modified_part, ',');
+      $bcc_email_part.$allow_ip_part.$plugins_part.$config_part.$lock_spec_part.$holidays_part.$workday_minutes_part.$modified_part, ',');
 
     $sql = "update tt_groups set $parts where id = $group_id and org_id = $this->org_id";
     $affected = $mdb2->exec($sql);