belongsTo('App\Models\Account'); } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function invoice() { return $this->belongsTo('App\Models\Invoice'); } /** * @return mixed */ public function user() { return $this->belongsTo('App\Models\User')->withTrashed(); } /** * @return mixed */ public function client() { return $this->belongsTo('App\Models\Client')->withTrashed(); } /** * @return mixed */ public function project() { return $this->belongsTo('App\Models\Project')->withTrashed(); } /** * @param $task * @return string */ public static function calcStartTime($task) { $parts = json_decode($task->time_log) ?: []; if (count($parts)) { return Utils::timestampToDateTimeString($parts[0][0]); } else { return ''; } } /** * @return string */ public function getStartTime() { return self::calcStartTime($this); } public function getLastStartTime() { $parts = json_decode($this->time_log) ?: []; if (count($parts)) { $index = count($parts) - 1; return $parts[$index][0]; } else { return ''; } } /** * @param $task * @return int */ public static function calcDuration($task) { $duration = 0; $parts = json_decode($task->time_log) ?: []; foreach ($parts as $part) { if (count($part) == 1 || !$part[1]) { $duration += time() - $part[0]; } else { $duration += $part[1] - $part[0]; } } return $duration; } /** * @return int */ public function getDuration() { return self::calcDuration($this); } /** * @return int */ public function getCurrentDuration() { $parts = json_decode($this->time_log) ?: []; $part = $parts[count($parts)-1]; if (count($part) == 1 || !$part[1]) { return time() - $part[0]; } else { return 0; } } /** * @return bool */ public function hasPreviousDuration() { $parts = json_decode($this->time_log) ?: []; return count($parts) && (count($parts[0]) && $parts[0][1]); } /** * @return float */ public function getHours() { return round($this->getDuration() / (60 * 60), 2); } /** * Gets the route to the tasks edit action * * @return string */ public function getRoute() { return "/tasks/{$this->public_id}/edit"; } public function getName() { return '#' . $this->public_id; } public function getDisplayName() { if ($this->description) { return mb_strimwidth($this->description, 0, 16, "..."); } return '#' . $this->public_id; } public function scopeDateRange($query, $startDate, $endDate) { $query->whereRaw('cast(substring(time_log, 3, 10) as unsigned) >= ' . $startDate->format('U')); $query->whereRaw('cast(substring(time_log, 3, 10) as unsigned) <= ' . $endDate->format('U')); return $query; } public static function getStatuses($entityType = false) { $statuses = []; $statuses[TASK_STATUS_LOGGED] = trans('texts.logged'); $statuses[TASK_STATUS_RUNNING] = trans('texts.running'); $statuses[TASK_STATUS_INVOICED] = trans('texts.invoiced'); $statuses[TASK_STATUS_PAID] = trans('texts.paid'); return $statuses; } } Task::created(function ($task) { event(new TaskWasCreated($task)); }); Task::updated(function ($task) { event(new TaskWasUpdated($task)); });