Passed
Push — task/application-handle-step-s... ( 5a9035...2b5b8c )
by Yonathan
04:05
created

ApplicationController::updateBasic()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
c 0
b 0
f 0
dl 0
loc 7
rs 10
cc 1
nc 1
nop 2
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 App\Models\Lookup\JobApplicationStep;
16
use Illuminate\Http\Request;
17
use Illuminate\Http\Resources\Json\JsonResource;
18
use Illuminate\Validation\Rule;
19
20
class ApplicationController extends Controller
21
{
22
    /**
23
     * Retrieve Application properties, not including relationships.
24
     *
25
     * @param JobApplication $application Incoming Job Application object.
26
     *
27
     * @return mixed
28
     */
29
    public function getBasic(JobApplication $application)
30
    {
31
        return new JobApplicationBasicResource($application);
32
    }
33
34
    /**
35
     * Update Application properties, not including relationships.
36
     *
37
     * @param UpdateJobApplicationBasic $request     Form Validation casted request object.
38
     * @param JobApplication            $application Incoming Job Application object.
39
     *
40
     * @return mixed
41
     */
42
    public function updateBasic(UpdateJobApplicationBasic $request, JobApplication $application)
43
    {
44
        $data = $request->validated();
45
        $application->fill($data);
46
        $application->save();
47
48
        return new JobApplicationBasicResource($application);
49
    }
50
51
    /**
52
     * Return a single Job Application.
53
     *
54
     * @param JobApplication $application Incoming Job Application object.
55
     *
56
     * @return mixed
57
     */
58
    public function show(JobApplication $application)
59
    {
60
        $application->loadMissing('applicant', 'application_review', 'citizenship_declaration', 'veteran_status', 'job_application_answers');
61
        return new JobApplicationResource($application);
62
    }
63
64
    /**
65
     * Return all Job Applications for a given Job Poster.
66
     *
67
     * @param JobPoster $jobPoster Incoming Job Poster object.
68
     *
69
     * @return mixed
70
     */
71
    public function index(JobPoster $jobPoster)
72
    {
73
        $applications = $jobPoster->submitted_applications()
74
            ->with([
75
                'applicant.user',
76
                'application_review.department',
77
                'citizenship_declaration',
78
                'veteran_status'
79
            ])
80
            ->get();
81
82
        return JobApplicationResource::collection($applications);
83
    }
84
85
    /**
86
     * Update a single Job Application Review.
87
     *
88
     * @param Request        $request     Incoming request object.
89
     * @param JobApplication $application Incoming Job Application object.
90
     *
91
     * @return mixed
92
     */
93
    public function updateReview(Request $request, JobApplication $application)
94
    {
95
        $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

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