Browse Source

Simplify job on progress list query into AdminDashboardQuery class

Eagerload tasks on job list tab on project detail page
Remove user job list pagination because it only shows current jobs
Add nameLink method on job model
pull/6/head
Nafies Luthfi 8 years ago
parent
commit
4be92ee612
  1. 10
      app/Entities/Projects/Job.php
  2. 14
      app/Entities/Projects/JobsRepository.php
  3. 2
      app/Http/Controllers/Projects/JobsController.php
  4. 9
      app/Http/Controllers/Users/JobsController.php
  5. 27
      app/Queries/AdminDashboardQuery.php
  6. 8
      resources/views/jobs/unfinished.blade.php
  7. 5
      resources/views/users/jobs.blade.php
  8. 15
      tests/Unit/Models/JobTest.php
  9. 28
      tests/Unit/Queries/AdminDashboardQueryTest.php

10
app/Entities/Projects/Job.php

@ -18,6 +18,16 @@ class Job extends Model
protected $presenter = JobPresenter::class;
protected $guarded = ['id', 'created_at', 'updated_at'];
public function nameLink()
{
return link_to_route('jobs.show', $this->name, [$this->id], [
'title' => trans(
'app.show_detail_title',
['name' => $this->name, 'type' => trans('job.job')]
),
]);
}
public function project()
{
return $this->belongsTo(Project::class, 'project_id');

14
app/Entities/Projects/JobsRepository.php

@ -4,6 +4,7 @@ namespace App\Entities\Projects;
use App\Entities\BaseRepository;
use App\Entities\Users\User;
use App\Queries\AdminDashboardQuery;
use DB;
/**
@ -22,17 +23,8 @@ class JobsRepository extends BaseRepository
public function getUnfinishedJobs(User $user)
{
$jobsQuery = $this->model->whereHas('tasks', function ($query) {
return $query->where('progress', '<', 100);
})->whereHas('project', function ($query) {
return $query->whereIn('status_id', [2, 3]);
})->with(['tasks', 'project']);
if ($user->hasRole('admin') == false) {
$jobsQuery->where('worker_id', $user->id);
}
return $jobsQuery->get();
return (new AdminDashboardQuery)
->onProgressJobs($user, ['project', 'worker']);
}
public function requireProjectById($projectId)

2
app/Http/Controllers/Projects/JobsController.php

@ -24,7 +24,7 @@ class JobsController extends Controller
public function index(Project $project)
{
$jobs = $project->jobs;
$jobs = $project->jobs()->with(['tasks'])->get();
return view('projects.jobs.index', compact('project', 'jobs'));
}

9
app/Http/Controllers/Users/JobsController.php

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Users;
use App\Entities\Users\User;
use App\Http\Controllers\Controller;
use App\Queries\AdminDashboardQuery;
/**
* User Jobs Controller.
@ -14,13 +15,7 @@ class JobsController extends Controller
{
public function index(User $user)
{
$jobs = $user->jobs()->whereHas('tasks', function ($query) {
return $query->where('progress', '<', 100);
})->whereHas('project', function ($query) {
return $query->whereIn('status_id', [2, 3]);
})->where('worker_id', $user->id)
->with(['tasks', 'project'])
->paginate();
$jobs = (new AdminDashboardQuery)->onProgressJobs($user);
return view('users.jobs', compact('user', 'jobs'));
}

27
app/Queries/AdminDashboardQuery.php

@ -96,22 +96,35 @@ class AdminDashboardQuery
}
/**
* Get on progress project jobs count.
* Get on progress project jobs list.
*
* @return int
*/
public function onProgressJobCount(User $user)
public function onProgressJobs(User $user, array $eagerLoads = [])
{
$jobQuery = Job::whereHas('tasks', function ($query) {
return $query->where('progress', '<', 100);
})->whereHas('project', function ($query) {
$eagerLoads = array_merge(['tasks'], $eagerLoads);
$jobQuery = Job::whereHas('project', function ($query) {
return $query->whereIn('status_id', [2, 3]);
});
})->with($eagerLoads);
if ($user->hasRole('admin') == false) {
$jobQuery->where('worker_id', $user->id);
}
return $jobQuery->count();
$jobs = $jobQuery->get()
->where('progress', '<', 100)
->values();
return $jobs;
}
/**
* Get on progress project jobs count.
*
* @return int
*/
public function onProgressJobCount(User $user)
{
return $this->onProgressJobs($user)->count();
}
}

8
resources/views/jobs/unfinished.blade.php

@ -1,6 +1,6 @@
@extends('layouts.app')
@section('title', trans('project.jobs'))
@section('title', trans('job.on_progress'))
@section('content')
<h1 class="page-header">{{ trans('job.on_progress') }}</h1>
@ -21,9 +21,9 @@
@forelse($jobs as $key => $job)
<tr>
<td>{{ 1 + $key }}</td>
<td>{{ $job->project->name }}</td>
<td>{{ $job->project->nameLink() }}</td>
<td>
{{ $job->name }}
{{ $job->nameLink() }}
@if ($job->tasks->isEmpty() == false)
<ul>
@foreach($job->tasks as $task)
@ -36,7 +36,7 @@
@endif
</td>
<td class="text-center">{{ $job->tasks_count = $job->tasks->count() }}</td>
<td class="text-center">{{ formatDecimal($job->progress = $job->tasks->avg('progress')) }} %</td>
<td class="text-center">{{ formatDecimal($job->progress) }} %</td>
<td class="text-right">{{ formatRp($job->price) }}</td>
<td>{{ $job->worker->name }}</td>
<td>

5
resources/views/users/jobs.blade.php

@ -17,10 +17,10 @@
<tbody>
@forelse($jobs as $key => $job)
<tr>
<td>{{ $jobs->firstItem() + $key }}</td>
<td>{{ 1 + $key }}</td>
<td>{{ $job->project->nameLink() }}</td>
<td>
{{ link_to_route('jobs.show', $job->name, [$job], ['title' => trans('job.show')]) }}
{{ $job->nameLink() }}
@if ($job->tasks->isEmpty() == false)
<ul>
@foreach($job->tasks as $task)
@ -49,5 +49,4 @@
</tbody>
</table>
</div>
{{ $jobs->appends(Request::except('page'))->render() }}
@endsection

15
tests/Unit/Models/JobTest.php

@ -16,6 +16,21 @@ use Tests\TestCase;
class JobTest extends TestCase
{
/** @test */
public function a_job_has_name_link_method()
{
$job = factory(Job::class)->make();
$this->assertEquals(
link_to_route('jobs.show', $job->name, [$job->id], [
'title' => trans(
'app.show_detail_title',
['name' => $job->name, 'type' => trans('job.job')]
),
]), $job->nameLink()
);
}
/** @test */
public function a_job_belongs_to_a_project()
{
$project = factory(Project::class)->create();

28
tests/Unit/Queries/AdminDashboardQueryTest.php

@ -70,6 +70,34 @@ class AdminDashboardQueryTest extends TestCase
}
/** @test */
public function retrieve_job_on_progress_list()
{
$worker = $this->createUser('worker');
$project1 = factory(Project::class)->create(['status_id' => 2]);
$project1job1 = factory(Job::class)->create(['project_id' => $project1->id, 'worker_id' => $worker->id]);
$project1job1Task1 = factory(Task::class)->create(['job_id' => $project1job1->id, 'progress' => 50]);
$project1job1Task2 = factory(Task::class)->create(['job_id' => $project1job1->id, 'progress' => 100]);
$project1job2 = factory(Job::class)->create(['project_id' => $project1->id, 'worker_id' => $worker->id]);
$project1job2Task1 = factory(Task::class)->create(['job_id' => $project1job2->id, 'progress' => 100]);
$project1job2Task2 = factory(Task::class)->create(['job_id' => $project1job2->id, 'progress' => 100]);
$project2 = factory(Project::class)->create(['status_id' => 2]);
$project2job1 = factory(Job::class)->create(['project_id' => $project2->id, 'worker_id' => $worker->id]);
$project2job1Task1 = factory(Task::class)->create(['job_id' => $project2job1->id, 'progress' => 50]);
$project2job1Task2 = factory(Task::class)->create(['job_id' => $project2job1->id, 'progress' => 100]);
$project2job2 = factory(Job::class)->create(['project_id' => $project2->id, 'worker_id' => $worker->id]);
$project2job2Task1 = factory(Task::class)->create(['job_id' => $project2job2->id, 'progress' => 50]);
$project2job2Task2 = factory(Task::class)->create(['job_id' => $project2job2->id, 'progress' => 100]);
$this->assertCount(2, Project::all());
$this->assertCount(4, Job::all());
$this->assertCount(8, Task::all());
$this->assertCount(3, (new AdminDashboardQuery())->onProgressJobs($worker));
}
/** @test */
public function retrieve_job_on_progress_count()
{
$worker = $this->createUser('worker');

Loading…
Cancel
Save