|
|
<?php
namespace App\Models;
use App\Models\Task; use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB;
class Work extends Model { use HasFactory; protected $fillable = [ 'business_id', 'project_id', 'task_id', 'user_id', 'message', 'minute_sum', 'started_at', 'ended_at', 'task' ];
protected $fillable_relations = ['task'];
protected $casts = [ 'started_at' => 'datetime:Y-m-d H:i', 'ended_at' => 'datetime:Y-m-d H:i' ];
protected $reportable = [ 'message', 'minute_sum', 'started_at', 'ended_at', ];
public function rules() { $started_at = request()->started_at ?? $this->started_at->format('Y-m-d H:i'); $ended_at = request()->ended_at ?? $this->ended_at->format('Y-m-d H:i'); return [ 'message' => 'nullable|string|min:3|max:225', 'started_at' => 'required|date_format:Y-m-d H:i|after:'.$this->task()->first()->created_at, 'ended_at' => [ 'required', 'date_format:Y-m-d H:i', 'after:'.$started_at, function ($attribute, $value, $fail) use ($ended_at, $started_at) { $works = \App\Work::where([ ['ended_at', '>', $started_at], ['ended_at', '<', $ended_at], ])->orWhere([ ['started_at', '>', $started_at], ['started_at', '<', $ended_at], ])->orWhere([ ['started_at', '>=', $started_at], ['ended_at', '<=', $ended_at], ])->when(isset($this->id), function ($query) { return $query->where('id', '!=', $this->id); })->exists(); if ($works) { $fail('The selected work is invalid.'); } } ], ];
}
public function getValueOf(?string $key) { $values = [ 'business_id' => $this->business_id, 'project_id' => $this->project_id, 'sprint_id' => null, 'workflow_id' => null, 'status_id' => null, 'system_id' => null, 'task_id' => $this->task->id, 'subject_id' => $this->id, 'user_id' => null, ];
if ($key && isset($values, $key)) { return $values[$key]; }
return $values; }
public function updateRelations() { $this->filled_relations['task']['work_start'] = Work::where('task_id', $this->task_id)->orderBy('started_at')->first()->started_at ?? null; $this->task()->update($this->filled_relations['task']); }
public function task() { return $this->belongsTo(Task::class, 'task_id', 'id'); }
public function scopeStartedAtIn($query, $days) { return $query->whereDate('started_at', '>=', Carbon::now()->modify('-'.$days.' day')->toDate()); }
public function scopeStartedAt($query, $date) { return $query->whereDate('started_at', '=', $date); }
public function scopeSpentTimeFrom($query, $data) { return $query->where('minute_sum', '>=', $data); }
public function scopeSpentTimeTo($query, $data) { return $query->where('minute_sum', '<=', $data); }
public function scopeReport($query) { return $query->select( DB::raw('user_id , MIN(started_at) as started_at_min, MAX(ended_at) as ended_at_max, SUM(minute_sum) as work_minute_sum') )->groupBy('user_id'); }
public function scopeReportByDate($query) { return $query->select( DB::raw('DATE(started_at) as date, SUM(minute_sum) as work_minute_sum') )->groupBy('date'); } }
|