Passed
Push — feature/post-covid-application... ( 4340d4...92a3aa )
by Yonathan
08:31 queued 01:05
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
            'language_requirement_confirmed' => $request->input('language_requirement_confirmed', false),
48
            'language_test_confirmed' => $request->input('language_test_confirmed', false),
49
            'education_requirement_confirmed' => $request->input('education_requirement_confirmed', false),
50
        ]);
51
        $application->save();
52
53
        return new JobApplicationBasicResource($application);
54
    }
55
56
    /**
57
     * Return a single Job Application.
58
     *
59
     * @param JobApplication $application Incoming Job Application object.
60
     *
61
     * @return mixed
62
     */
63
    public function show(JobApplication $application)
64
    {
65
        $application->loadMissing('applicant', 'application_review', 'citizenship_declaration', 'veteran_status');
66
        return new JobApplicationResource($application);
67
    }
68
69
    /**
70
     * Return all Job Applications for a given Job Poster.
71
     *
72
     * @param JobPoster $jobPoster Incoming Job Poster object.
73
     *
74
     * @return mixed
75
     */
76
    public function index(JobPoster $jobPoster)
77
    {
78
        $applications = $jobPoster->submitted_applications()
79
            ->with([
80
                'applicant.user',
81
                'application_review.department',
82
                'citizenship_declaration',
83
                'veteran_status'
84
            ])
85
            ->get();
86
87
        return JobApplicationResource::collection($applications);
88
    }
89
90
    /**
91
     * Update a single Job Application Review.
92
     *
93
     * @param Request        $request     Incoming request object.
94
     * @param JobApplication $application Incoming Job Application object.
95
     *
96
     * @return mixed
97
     */
98
    public function updateReview(Request $request, JobApplication $application)
99
    {
100
        $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

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