Passed
Push — feature/basic-application-endp... ( 39b0fe )
by Chris
06:14
created

ApplicationController::getBasic()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
namespace App\Http\Controllers\Api;
4
5
use App\Http\Controllers\Controller;
6
use App\Http\Requests\UpdateJobApplicationBasic;
7
use App\Http\Resources\JobApplication as JobApplicationResource;
8
use App\Http\Resources\JobApplicationBasic as JobApplicationBasicResource;
9
use App\Models\ApplicationReview;
10
use App\Models\JobApplication;
11
use App\Models\JobPoster;
12
use App\Models\Lookup\ApplicationStatus;
13
use App\Models\Lookup\Department;
14
use App\Models\Lookup\ReviewStatus;
15
use Illuminate\Http\Request;
16
use Illuminate\Http\Resources\Json\JsonResource;
17
use Illuminate\Validation\Rule;
18
19
class ApplicationController extends Controller
20
{
21
    /**
22
     * Retrieve Application properties, not including relationships.
23
     *
24
     * @param JobApplication $application Incoming Job Application object.
25
     *
26
     * @return mixed
27
     */
28
    public function getBasic(JobApplication $application)
29
    {
30
        return new JobApplicationBasicResource($application);
31
    }
32
33
    /**
34
     * Update Application properties, not including relationships.
35
     *
36
     * @param UpdateJobApplicationBasic $request     Form Validation casted request object.
37
     * @param JobApplication            $application Incoming Job Application object.
38
     *
39
     * @return mixed
40
     */
41
    public function updateBasic(UpdateJobApplicationBasic $request, JobApplication $application)
42
    {
43
        $request->validated();
44
        $application->fill([
45
            'citizenship_declaration_id' => $request->input('citizenship_declaration_id'),
46
            'veteran_status_id' => $request->input('veteran_status_id'),
47
            'preferred_language_id' => $request->input('preferred_language_id'),
48
            'language_requirement_confirmed' => $request->input('language_requirement_confirmed', false),
49
            'language_test_confirmed' => $request->input('language_test_confirmed', false),
50
            'education_requirement_confirmed' => $request->input('education_requirement_confirmed', false),
51
        ]);
52
        $application->save();
53
54
        return new JobApplicationBasicResource($application);
55
    }
56
57
    /**
58
     * Return a single Job Application.
59
     *
60
     * @param JobApplication $application Incoming Job Application object.
61
     *
62
     * @return mixed
63
     */
64
    public function show(JobApplication $application)
65
    {
66
        $application->loadMissing('applicant', 'application_review', 'citizenship_declaration', 'veteran_status');
67
        return new JobApplicationResource($application);
68
    }
69
70
    /**
71
     * Return all Job Applications for a given Job Poster.
72
     *
73
     * @param JobPoster $jobPoster Incoming Job Poster object.
74
     *
75
     * @return mixed
76
     */
77
    public function index(JobPoster $jobPoster)
78
    {
79
        $applications = $jobPoster->submitted_applications()
80
            ->with([
81
                'applicant.user',
82
                'application_review.department',
83
                'citizenship_declaration',
84
                'veteran_status'
85
            ])
86
            ->get();
87
88
        return JobApplicationResource::collection($applications);
89
    }
90
91
    /**
92
     * Update a single Job Application Review.
93
     *
94
     * @param Request        $request     Incoming request object.
95
     * @param JobApplication $application Incoming Job Application object.
96
     *
97
     * @return mixed
98
     */
99
    public function updateReview(Request $request, JobApplication $application)
100
    {
101
        $strategicResponseDepartmentId = config('app.strategic_response_department_id');
0 ignored issues
show
Bug introduced by
The function config was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

101
        $strategicResponseDepartmentId = /** @scrutinizer ignore-call */ config('app.strategic_response_department_id');
Loading history...
102
        $availabilityStatuses = ReviewStatus::whereIn('name', ['allocated', 'not_available'])->get()->pluck('id');
103
104
        $request->validate([
105
            'review_status_id' => [
106
                'nullable',
107
                Rule::in(ReviewStatus::all()->pluck('id')->toArray())
108
            ],
109
            'department_id' => [
110
                'nullable',
111
                Rule::in(Department::all()->pluck('id')->toArray())
112
            ],
113
            'notes' => 'nullable|string'
114
        ]);
115
116
        $review = $application->application_review;
117
        if ($review === null) {
118
            $review = new ApplicationReview();
119
            $review->job_application()->associate($application);
120
        }
121
        $review->fill([
122
            'review_status_id' => $request->input('review_status_id'),
123
            'department_id' => $request->input('department_id'),
124
            'notes' => $request->input('notes'),
125
        ]);
126
        $review->save();
127
128
        if ($application->job_poster->department_id === $strategicResponseDepartmentId
129
            && in_array($review->review_status_id, $availabilityStatuses->toArray())
130
        ) {
131
            $this->setAvailability($application);
132
        }
133
134
        $review->fresh();
135
        $review->loadMissing('department');
136
137
        return new JsonResource($review);
138
    }
139
140
    /**
141
     * Sets the review status for any other application reviews
142
     * belonging to a given Applicant to `not_available`.
143
     * Designed to be used for the Strategic Talent Response screening,
144
     * but could be repurposed.
145
     *
146
     * @param JobApplication $application Incoming Job Application object.
147
     *
148
     * @return void
149
     */
150
    protected function setAvailability(JobApplication $application)
151
    {
152
        $departmentId = $application->job_poster->department_id;
153
        $submittedStatusId = ApplicationStatus::where('name', 'submitted')->value('id');
154
        $unavailableStatusId = ReviewStatus::where('name', 'not_available')->value('id');
155
156
        // This is kinda gross, but it seems to filter out the correct subset, and allows a single database call
157
        // to perform the update. Seems better than returning a result set, looping, and pushing individual changes.
158
        ApplicationReview::whereHas('job_application.job_poster', function ($query) use ($departmentId) {
159
            $query->where('department_id', $departmentId);
160
        })->whereHas('job_application', function ($query) use ($application, $submittedStatusId) {
161
            $query->where([
162
                ['id', '<>', $application->id],
163
                ['application_status_id', $submittedStatusId],
164
                ['applicant_id', $application->applicant->id]
165
            ]);
166
        })->update(['review_status_id' => $unavailableStatusId]);
167
    }
168
}
169