X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=plugins%2FMonthlyQuota.class.php;h=6e420f91846734433820ba2a1d94261846401fbf;hb=376e864381d36df99d302af980d848adab585d46;hp=13cbd9d4d0cc32b743dce95df0e5b2f2ce71d183;hpb=a84f7509ea5462f08ca01c5435e0217045391a45;p=timetracker.git diff --git a/plugins/MonthlyQuota.class.php b/plugins/MonthlyQuota.class.php index 13cbd9d4..6e420f91 100644 --- a/plugins/MonthlyQuota.class.php +++ b/plugins/MonthlyQuota.class.php @@ -47,7 +47,7 @@ class MonthlyQuota { $deleteSql = "DELETE FROM tt_monthly_quotas WHERE year = $year AND month = $month AND team_id = $team_id"; $this->db->exec($deleteSql); if ($quota){ - $float_quota = ttTimeHelper::quotaToFloat($quota); + $float_quota = $this->quotaToFloat($quota); $insertSql = "INSERT INTO tt_monthly_quotas (team_id, year, month, quota) values ($team_id, $year, $month, $float_quota)"; $affected = $this->db->exec($insertSql); return (!is_a($affected, 'PEAR_Error')); @@ -80,7 +80,8 @@ class MonthlyQuota { // If we did not find a record, return a calculated monthly quota. $numWorkdays = $this->getNumWorkdays($month, $year); global $user; - return $numWorkdays * $user->workday_hours; + return $numWorkdays * $user->workday_hours; // TODO: fix a rounding issue for small values like 0:01 + // Possibly with a database field type change (minutes?). } // getMany - returns an array of quotas for a given year for team. @@ -115,4 +116,51 @@ class MonthlyQuota { } return $workdaysInMonth; } + + // isValidQuota validates a localized value as an hours quota string (in hours and minutes). + public function isValidQuota($value) { + + if (strlen($value) == 0 || !isset($value)) return true; + + if (preg_match('/^[0-9]{1,3}h?$/', $value )) { // 000 - 999 + return true; + } + + if (preg_match('/^[0-9]{1,3}:[0-5][0-9]$/', $value )) { // 000:00 - 999:59 + return true; + } + + global $user; + $localizedPattern = '/^([0-9]{1,3})?['.$user->decimal_mark.'][0-9]{1,4}h?$/'; + if (preg_match($localizedPattern, $value )) { // decimal values like 000.5, 999.25h, ... .. 999.9999h (or with comma) + return true; + } + + return false; + } + + // quotaToFloat converts a valid quota value to a float. + public function quotaToFloat($value) { + + if (preg_match('/^[0-9]{1,3}h?$/', $value )) { // 000 - 999 + return (float) $value; + } + + if (preg_match('/^[0-9]{1,3}:[0-5][0-9]$/', $value )) { // 000:00 - 999:59 + $minutes = ttTimeHelper::toMinutes($value); + return ($minutes / 60.0); + } + + global $user; + $localizedPattern = '/^([0-9]{1,3})?['.$user->decimal_mark.'][0-9]{1,4}h?$/'; + if (preg_match($localizedPattern, $value )) { // decimal values like 000.5, 999.25h, ... .. 999.9999h (or with comma) + // Strip optional h in the end. + $value = trim($value, 'h'); + if ($user->decimal_mark == ',') + $value = str_replace(',', '.', $value); + return (float) $value; + } + + return null; + } }