name, [$this->id], [ 'title' => trans( 'app.show_detail_title', ['name' => $this->name, 'type' => trans('project.project')] ), ]); } public function jobs() { return $this->hasMany(Job::class)->orderBy('position'); } public function tasks() { return $this->hasManyThrough(Task::class, Job::class); } public function mainJobs() { return $this->hasMany(Job::class)->orderBy('position')->whereTypeId(1); } public function additionalJobs() { return $this->hasMany(Job::class)->orderBy('position')->whereTypeId(2); } public function subscriptions() { return $this->hasMany(Subscription::class); } public function invoices() { return $this->hasMany(Invoice::class); } public function payments() { return $this->hasMany(Payment::class)->orderBy('date', 'desc'); } public function customer() { return $this->belongsTo(Customer::class); } public function cashInTotal() { return $this->payments->sum(function ($payment) { return $payment->in_out == 1 ? $payment->amount : 0; }); } public function cashOutTotal() { return $this->payments->sum(function ($payment) { return $payment->in_out == 0 ? $payment->amount : 0; }); } public function getJobOveralProgress() { $overalProgress = 0; $this->load('jobs.tasks'); $totalPrice = $this->jobs->sum('price'); foreach ($this->jobs as $job) { $progress = $job->tasks->avg('progress'); $index = $totalPrice ? ($job->price / $totalPrice) : 1; $overalProgress += $progress * $index; } return $overalProgress; } public function files() { return $this->morphMany(File::class, 'fileable'); } public function getCollectibeEarnings() { // Collectible earnings is total of (price * avg task progress of each job) $collectibeEarnings = 0; $this->load('jobs.tasks'); foreach ($this->jobs as $job) { $progress = $job->tasks->avg('progress'); $collectibeEarnings += ($progress / 100) * $job->price; } return $collectibeEarnings; } }