Passed
Push — task/common-translation-packag... ( a41b3d...a8cbe4 )
by Grant
03:51 queued 13s
created

ApplicationByJobController::submit()   B

Complexity

Conditions 6
Paths 8

Size

Total Lines 51
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 51
rs 8.7857
cc 6
nc 8
nop 2

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace App\Http\Controllers;
4
5
use App\Models\Course;
6
use App\Models\Criteria;
7
use App\Models\Degree;
8
use App\Models\JobApplication;
9
use App\Models\JobApplicationAnswer;
10
use App\Models\JobPoster;
11
use App\Models\Lookup\ApplicationStatus;
12
use App\Models\Lookup\CitizenshipDeclaration;
13
use App\Models\Lookup\PreferredLanguage;
14
use App\Models\Lookup\ReviewStatus;
15
use App\Models\Lookup\SkillStatus;
16
use App\Models\Lookup\VeteranStatus;
17
use App\Models\Skill;
18
use App\Models\SkillDeclaration;
19
use App\Models\WorkExperience;
20
use App\Services\Validation\ApplicationValidator;
21
use Facades\App\Services\WhichPortal;
22
use Illuminate\Http\Request;
23
use Illuminate\Http\Resources\Json\JsonResource;
24
use Illuminate\Support\Facades\Auth;
25
use Illuminate\Support\Facades\Lang;
26
use Illuminate\Support\Facades\Log;
27
28
class ApplicationByJobController extends Controller
29
{
30
    /**
31
     * Display a listing of the applications for given jobPoster.
32
     *
33
     * @param  \App\Models\JobPoster $jobPoster Incoming JobPoster object.
34
     * @return \Illuminate\Http\Response
35
     */
36
    public function index(JobPoster $jobPoster)
37
    {
38
        $applications = $jobPoster->submitted_applications()
39
            ->with([
40
                'veteran_status',
41
                'citizenship_declaration',
42
                'application_review',
43
                'applicant.user',
44
                'job_poster.criteria',
45
            ])
46
            ->get();
47
        return view('manager/review_applications', [
0 ignored issues
show
Bug introduced by
The function view 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

47
        return /** @scrutinizer ignore-call */ view('manager/review_applications', [
Loading history...
48
            // Localization Strings.
49
            'jobs_l10n' => Lang::get('manager/job_index'),
50
            // Data.
51
            'job' => new JsonResource($jobPoster),
52
            'is_hr_portal' => WhichPortal::isHrPortal(),
53
            'applications' => $applications,
54
            'review_statuses' => ReviewStatus::all()
55
        ]);
56
    }
57
58
    /**
59
     * Return the current applicant's application for a given Job Poster.
60
     *
61
     * @param  \App\Models\JobPoster $jobPoster Incoming JobPoster object.
62
     * @return mixed|\App\Models\JobApplication
63
     */
64
    protected function getApplicationFromJob(JobPoster $jobPoster)
65
    {
66
        $application = JobApplication::where('applicant_id', Auth::user()->applicant->id)
67
            ->where('job_poster_id', $jobPoster->id)->first();
68
        if ($application == null) {
69
            $application = new JobApplication();
70
            $application->job_poster_id = $jobPoster->id;
71
            $application->applicant_id = Auth::user()->applicant->id;
72
            $application->application_status_id = ApplicationStatus::where('name', 'draft')->firstOrFail()->id;
73
            $application->save();
74
        }
75
        return $application;
76
    }
77
78
    /**
79
     * Show the form for editing Application basics for the specified job.
80
     *
81
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
82
     * @return \Illuminate\Http\Response
83
     */
84
    public function editBasics(JobPoster $jobPoster)
85
    {
86
        $applicant = Auth::user()->applicant;
87
        $application = $this->getApplicationFromJob($jobPoster);
88
89
        // Ensure user has permissions to view and update application.
90
        $this->authorize('view', $application);
91
        $this->authorize('update', $application);
92
93
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

93
        return /** @scrutinizer ignore-call */ view(
Loading history...
94
            'applicant/application_post_01',
95
            [
96
                // Application Template Data.
97
                'application_step' => 1,
98
                'application_template' => Lang::get('applicant/application_template'),
99
                'language_options' => PreferredLanguage::all(),
100
                'citizenship_options' => CitizenshipDeclaration::all(),
101
                'veteran_options' => VeteranStatus::all(),
102
                'preferred_language_template' => Lang::get('common/preferred_language'),
103
                'citizenship_declaration_template' => Lang::get('common/citizenship_declaration'),
104
                'veteran_status_template' => Lang::get('common/veteran_status'),
105
                // Job Data.
106
                'job' => $jobPoster,
107
                // Applicant Data.
108
                'applicant' => $applicant,
109
                'job_application' => $application,
110
                // Submission.
111
                'form_submit_action' => route('job.application.update.1', $jobPoster)
0 ignored issues
show
Bug introduced by
The function route 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

111
                'form_submit_action' => /** @scrutinizer ignore-call */ route('job.application.update.1', $jobPoster)
Loading history...
112
            ]
113
        );
114
    }
115
116
    /**
117
     * Show the form for editing Application Experience for the specified job.
118
     *
119
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
120
     * @return \Illuminate\Http\Response
121
     */
122
    public function editExperience(JobPoster $jobPoster)
123
    {
124
        $applicant = Auth::user()->applicant;
125
        $application = $this->getApplicationFromJob($jobPoster);
126
127
        // Ensure user has permissions to view and update application.
128
        $this->authorize('view', $application);
129
        $this->authorize('update', $application);
130
131
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

131
        return /** @scrutinizer ignore-call */ view(
Loading history...
132
            'applicant/application_post_02',
133
            [
134
                // Application Template Data.
135
                'application_step' => 2,
136
                'application_template' => Lang::get('applicant/application_template'),
137
                // Job Data.
138
                'job' => $jobPoster,
139
                // Applicant Data.
140
                'applicant' => $applicant,
141
                'job_application' => $application,
142
                // Submission.
143
                'form_submit_action' => route('job.application.update.2', $jobPoster)
0 ignored issues
show
Bug introduced by
The function route 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

143
                'form_submit_action' => /** @scrutinizer ignore-call */ route('job.application.update.2', $jobPoster)
Loading history...
144
            ]
145
        );
146
    }
147
148
    /**
149
     * Show the form for editing Application Essential Skills for the specified job.
150
     *
151
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
152
     * @return \Illuminate\Http\Response
153
     */
154
    public function editEssentialSkills(JobPoster $jobPoster)
155
    {
156
        $applicant = Auth::user()->applicant;
157
        $application = $this->getApplicationFromJob($jobPoster);
158
159
        // Ensure user has permissions to view and update application.
160
        $this->authorize('view', $application);
161
        $this->authorize('update', $application);
162
163
        $criteria = [
164
            'essential' => $jobPoster->criteria->filter(function ($value, $key) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

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

164
            'essential' => $jobPoster->criteria->filter(function ($value, /** @scrutinizer ignore-unused */ $key) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
165
                return $value->criteria_type->name == 'essential';
166
            }),
167
            'asset' => $jobPoster->criteria->filter(function ($value, $key) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

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

167
            'asset' => $jobPoster->criteria->filter(function ($value, /** @scrutinizer ignore-unused */ $key) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
168
                return $value->criteria_type->name == 'asset';
169
            }),
170
        ];
171
172
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

172
        return /** @scrutinizer ignore-call */ view(
Loading history...
173
            'applicant/application_post_03',
174
            [
175
                // Application Template Data.
176
                'application_step' => 3,
177
                'application_template' => Lang::get('applicant/application_template'),
178
                // Job Data.
179
                'job' => $jobPoster,
180
                // Skills Data.
181
                'skills' => Skill::all(),
182
                'skill_template' => Lang::get('common/skills'),
183
                'criteria' => $criteria,
184
                // Applicant Data.
185
                'applicant' => $applicant,
186
                'job_application' => $application,
187
                // Submission.
188
                'form_submit_action' => route('job.application.update.3', $jobPoster)
0 ignored issues
show
Bug introduced by
The function route 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

188
                'form_submit_action' => /** @scrutinizer ignore-call */ route('job.application.update.3', $jobPoster)
Loading history...
189
            ]
190
        );
191
    }
192
193
    /**
194
     * Show the form for editing Application Asset Skills for the specified job.
195
     *
196
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
197
     * @return \Illuminate\Http\Response
198
     */
199
    public function editAssetSkills(JobPoster $jobPoster)
200
    {
201
        $applicant = Auth::user()->applicant;
202
        $application = $this->getApplicationFromJob($jobPoster);
203
204
        // Ensure user has permissions to view and update application.
205
        $this->authorize('view', $application);
206
        $this->authorize('update', $application);
207
208
        $criteria = [
209
            'essential' => $jobPoster->criteria->filter(function ($value, $key) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

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

209
            'essential' => $jobPoster->criteria->filter(function ($value, /** @scrutinizer ignore-unused */ $key) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
210
                return $value->criteria_type->name == 'essential';
211
            }),
212
            'asset' => $jobPoster->criteria->filter(function ($value, $key) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

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

212
            'asset' => $jobPoster->criteria->filter(function ($value, /** @scrutinizer ignore-unused */ $key) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
213
                return $value->criteria_type->name == 'asset';
214
            }),
215
        ];
216
217
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

217
        return /** @scrutinizer ignore-call */ view(
Loading history...
218
            'applicant/application_post_04',
219
            [
220
                // Application Template Data.
221
                'application_step' => 4,
222
                'application_template' => Lang::get('applicant/application_template'),
223
                // Job Data.
224
                'job' => $jobPoster,
225
                // Skills Data.
226
                'skills' => Skill::all(),
227
                'skill_template' => Lang::get('common/skills'),
228
                'criteria' => $criteria,
229
                // Applicant Data.
230
                'applicant' => $applicant,
231
                'job_application' => $application,
232
                // Submission.
233
                'form_submit_action' => route('job.application.update.4', $jobPoster)
0 ignored issues
show
Bug introduced by
The function route 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

233
                'form_submit_action' => /** @scrutinizer ignore-call */ route('job.application.update.4', $jobPoster)
Loading history...
234
            ]
235
        );
236
    }
237
238
    /**
239
     * Show the Application Preview for the application for the specified job.
240
     *
241
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
242
     * @return \Illuminate\Http\Response
243
     */
244
    public function preview(JobPoster $jobPoster)
245
    {
246
        $applicant = Auth::user()->applicant;
247
        $application = $this->getApplicationFromJob($jobPoster);
248
249
        $this->authorize('view', $application);
250
        $criteria = [
251
            'essential' => $jobPoster->criteria->filter(function ($value, $key) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

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

251
            'essential' => $jobPoster->criteria->filter(function ($value, /** @scrutinizer ignore-unused */ $key) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
252
                return $value->criteria_type->name == 'essential';
253
            }),
254
            'asset' => $jobPoster->criteria->filter(function ($value, $key) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

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

254
            'asset' => $jobPoster->criteria->filter(function ($value, /** @scrutinizer ignore-unused */ $key) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
255
                return $value->criteria_type->name == 'asset';
256
            }),
257
        ];
258
        $skillDeclarations = $application->isDraft()
259
            ? $applicant->skill_declarations
260
            : $application->skill_declarations;
261
        $degrees = $application->isDraft()
262
            ? $applicant->degrees
263
            : $application->degrees;
264
        $courses = $application->isDraft()
265
            ? $applicant->courses
266
            : $application->courses;
267
        $work_experiences = $application->isDraft()
268
            ? $applicant->work_experiences
269
            : $application->work_experiences;
270
271
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

271
        return /** @scrutinizer ignore-call */ view(
Loading history...
272
            'applicant/application_post_05',
273
            [
274
                // Application Template Data.
275
                'application_step' => 5,
276
                'application_template' => Lang::get('applicant/application_template'),
277
                'preferred_language_template' => Lang::get('common/preferred_language'),
278
                'citizenship_declaration_template' => Lang::get('common/citizenship_declaration'),
279
                'veteran_status_template' => Lang::get('common/veteran_status'),
280
                // Job Data.
281
                'job' => $jobPoster,
282
                // Skills Data.
283
                'skills' => Skill::all(),
284
                'skill_template' => Lang::get('common/skills'),
285
                'criteria' => $criteria,
286
                // Applicant Data.
287
                'applicant' => $applicant,
288
                'job_application' => $application,
289
                'skill_declarations' => $skillDeclarations,
290
                'degrees' => $degrees,
291
                'courses' => $courses,
292
                'work_experiences' => $work_experiences,
293
                'is_manager_view' => WhichPortal::isManagerPortal(),
294
            ]
295
        );
296
    }
297
298
    /**
299
     * Show the Confirm Submit page for the application for the specified job.
300
     *
301
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
302
     * @return \Illuminate\Http\Response
303
     */
304
    public function confirm(JobPoster $jobPoster)
305
    {
306
        $applicant = Auth::user()->applicant;
0 ignored issues
show
Unused Code introduced by
The assignment to $applicant is dead and can be removed.
Loading history...
307
        $application = $this->getApplicationFromJob($jobPoster);
308
309
        $this->authorize('update', $application);
310
311
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

311
        return /** @scrutinizer ignore-call */ view(
Loading history...
312
            'applicant/application_post_06',
313
            [
314
                // Application Template Data.
315
                'application_step' => 6,
316
                'application_template' => Lang::get('applicant/application_template'),
317
                // Used by tracker partial.
318
                'job' => $jobPoster,
319
                'job_application' => $application,
320
                // Submission.
321
                'form_submit_action' => route('job.application.submit', $jobPoster)
0 ignored issues
show
Bug introduced by
The function route 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

321
                'form_submit_action' => /** @scrutinizer ignore-call */ route('job.application.submit', $jobPoster)
Loading history...
322
            ]
323
        );
324
    }
325
326
    /**
327
     * Show the application submission information.
328
     *
329
     * @param  \App\Models\JobPoster $jobPoster Incoming Job Poster object.
330
     * @return \Illuminate\Http\Response
331
     */
332
    public function complete(JobPoster $jobPoster)
333
    {
334
        // Include Applicant Data.
335
        $applicant = Auth::user()->applicant;
336
        // Include Application Data.
337
        $application = $this->getApplicationFromJob($jobPoster);
338
339
        // Ensure user has permissions to view application.
340
        $this->authorize('view', $application);
341
342
        // Return the Completion View.
343
        return view(
0 ignored issues
show
Bug introduced by
The function view 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

343
        return /** @scrutinizer ignore-call */ view(
Loading history...
344
            'applicant/application_post_complete',
345
            [
346
                // Application Template Data.
347
                'application_template' => Lang::get('applicant/application_template'),
348
                // Job Data.
349
                'job' => $jobPoster,
350
                // Applicant Data.
351
                'applicant' => $applicant,
352
                'job_application' => $application
353
            ]
354
        );
355
    }
356
357
    /**
358
     * Update the Application Basics in storage for the specified job.
359
     *
360
     * @param  \Illuminate\Http\Request $request   Incoming Request object.
361
     * @param  \App\Models\JobPoster    $jobPoster Incoming Job Poster object.
362
     * @return \Illuminate\Http\Response
363
     */
364
    public function updateBasics(Request $request, JobPoster $jobPoster)
365
    {
366
        $applicant = Auth::user()->applicant;
0 ignored issues
show
Unused Code introduced by
The assignment to $applicant is dead and can be removed.
Loading history...
367
        $application = $this->getApplicationFromJob($jobPoster);
368
369
        // Ensure user has permissions to update this application.
370
        $this->authorize('update', $application);
371
372
        $application->fill([
373
            'citizenship_declaration_id' => $request->input('citizenship_declaration_id'),
374
            'veteran_status_id' => $request->input('veteran_status_id'),
375
            'preferred_language_id' => $request->input('preferred_language_id'),
376
            'language_requirement_confirmed' => $request->input('language_requirement_confirmed')
377
        ]);
378
        $application->save();
379
380
        $questions = $jobPoster->job_poster_questions;
381
        $questionsInput = $request->input('questions');
382
        foreach ($questions as $question) {
383
            $answer = null;
384
            if (isset($questionsInput[$question->id])) {
385
                $answer = $questionsInput[$question->id];
386
            }
387
            $answerObj = $application->job_application_answers
388
            ->firstWhere('job_poster_question_id', $question->id);
389
            if ($answerObj == null) {
390
                $answerObj = new JobApplicationAnswer();
391
                $answerObj->job_poster_question_id = $question->id;
392
                $answerObj->job_application_id = $application->id;
393
            }
394
            $answerObj->answer = $answer;
395
            $answerObj->save();
396
        }
397
398
        // Redirect to correct page.
399
        switch ($request->input('submit')) {
400
            case 'save_and_quit':
401
            case 'previous':
402
                return redirect()->route('applications.index');
0 ignored issues
show
Bug introduced by
The function redirect 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

402
                return /** @scrutinizer ignore-call */ redirect()->route('applications.index');
Loading history...
403
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
404
            case 'save_and_continue':
405
            case 'next':
406
                return redirect()->route('job.application.edit.2', $jobPoster);
407
                break;
408
            default:
409
                return redirect()->back()->withInput();
410
        }
411
    }
412
413
    /**
414
     * Update the Application Basics in storage for the specified job.
415
     *
416
     * @param  \Illuminate\Http\Request $request   Incoming Request object.
417
     * @param  \App\Models\JobPoster    $jobPoster Incoming Job Poster object.
418
     * @return \Illuminate\Http\Response
419
     */
420
    public function updateExperience(Request $request, JobPoster $jobPoster)
421
    {
422
        $applicant = Auth::user()->applicant;
423
        $application = $this->getApplicationFromJob($jobPoster);
424
425
        // Ensure user has permissions to update this application.
426
        $this->authorize('update', $application);
427
428
        // Record that the user has saved their experience for this application.
429
        $application->experience_saved = true;
430
        $application->save();
431
432
        $degrees = $request->input('degrees');
433
434
        $request->validate([
435
            'degrees.new.*.degree_type_id' => 'required',
436
            'degrees.new.*.area_of_study'  => 'required',
437
            'degrees.new.*.institution'    => 'required',
438
            'degrees.new.*.thesis'         => 'nullable',
439
            'degrees.new.*.start_date'     => 'required|date',
440
            'degrees.new.*.end_date'       => 'required|date',
441
            'degrees.new.*.blockcert_url'  => 'nullable|string',
442
        ]);
443
444
        // Save new degrees.
445
        if (isset($degrees['new'])) {
446
            foreach ($degrees['new'] as $degreeInput) {
447
                $degree = new Degree();
448
                $degree->fill([
449
                    'degree_type_id' => $degreeInput['degree_type_id'],
450
                    'area_of_study' => $degreeInput['area_of_study'],
451
                    'institution' => $degreeInput['institution'],
452
                    'thesis' => $degreeInput['thesis'],
453
                    'start_date' => $degreeInput['start_date'],
454
                    'end_date' => $degreeInput['end_date'],
455
                    'blockcert_url' => $degreeInput['blockcert_url'],
456
                ]);
457
                $applicant->degrees()->save($degree);
458
            }
459
        }
460
461
        // Update old degrees.
462
        if (isset($degrees['old'])) {
463
            foreach ($degrees['old'] as $id => $degreeInput) {
464
                // Ensure this degree belongs to this applicant.
465
                $degree = $applicant->degrees->firstWhere('id', $id);
466
                if ($degree != null) {
467
                    $degree->fill([
468
                        'degree_type_id' => $degreeInput['degree_type_id'],
469
                        'area_of_study' => $degreeInput['area_of_study'],
470
                        'institution' => $degreeInput['institution'],
471
                        'thesis' => $degreeInput['thesis'],
472
                        'start_date' => $degreeInput['start_date'],
473
                        'end_date' => $degreeInput['end_date'],
474
                        'blockcert_url' => $degreeInput['blockcert_url'],
475
                    ]);
476
                    $degree->save();
477
                } else {
478
                    Log::warning("Applicant $applicant->id attempted to update degree with invalid id: $id");
479
                }
480
            }
481
        }
482
483
        $courses = $request->input('courses');
484
485
        $request->validate([
486
            'courses.new.*.name'             => 'required',
487
            'courses.new.*.institution'      => 'required',
488
            'courses.new.*.course_status_id' => 'required',
489
            'courses.new.*.start_date'       => 'required|date',
490
            'courses.new.*.end_date'         => 'required|date',
491
        ]);
492
493
        // Save new courses.
494
        if (isset($courses['new'])) {
495
            foreach ($courses['new'] as $courseInput) {
496
                $course = new Course();
497
                $course->fill([
498
                    'name' => $courseInput['name'],
499
                    'institution' => $courseInput['institution'],
500
                    'course_status_id' => $courseInput['course_status_id'],
501
                    'start_date' => $courseInput['start_date'],
502
                    'end_date' => $courseInput['end_date']
503
                ]);
504
                $applicant->courses()->save($course);
505
            }
506
        }
507
508
        // Update old courses.
509
        if (isset($courses['old'])) {
510
            foreach ($courses['old'] as $id => $courseInput) {
511
                // Ensure this course belongs to this applicant.
512
                $course = $applicant->courses->firstWhere('id', $id);
513
                if ($course != null) {
514
                    $course->fill([
515
                        'name' => $courseInput['name'],
516
                        'institution' => $courseInput['institution'],
517
                        'course_status_id' => $courseInput['course_status_id'],
518
                        'start_date' => $courseInput['start_date'],
519
                        'end_date' => $courseInput['end_date']
520
                    ]);
521
                    $course->save();
522
                } else {
523
                    Log::warning("Applicant $applicant->id attempted to update course with invalid id: $id");
524
                }
525
            }
526
        }
527
528
        $work_experiences = $request->input('work_experiences');
529
530
        $request->validate([
531
            'work_experiences.new.*.role'        => 'required',
532
            'work_experiences.new.*.company'     => 'required',
533
            'work_experiences.new.*.description' => 'required',
534
            'work_experiences.new.*.start_date'  => 'required|date',
535
            'work_experiences.new.*.end_date'    => 'required|date',
536
        ]);
537
538
        // Save new work_experiences.
539
        if (isset($work_experiences['new'])) {
540
            foreach ($work_experiences['new'] as $workExperienceInput) {
541
                $workExperience = new WorkExperience();
542
                $workExperience->fill([
543
                    'role' => $workExperienceInput['role'],
544
                    'company' => $workExperienceInput['company'],
545
                    'description' => $workExperienceInput['description'],
546
                    'start_date' => $workExperienceInput['start_date'],
547
                    'end_date' => $workExperienceInput['end_date']
548
                ]);
549
                $applicant->work_experiences()->save($workExperience);
550
            }
551
        }
552
553
        // Update old work_experiences.
554
        if (isset($work_experiences['old'])) {
555
            foreach ($work_experiences['old'] as $id => $workExperienceInput) {
556
                // Ensure this work_experience belongs to this applicant.
557
                $workExperience = $applicant->work_experiences->firstWhere('id', $id);
558
                if ($workExperience != null) {
559
                    $workExperience->fill([
560
                        'role' => $workExperienceInput['role'],
561
                        'company' => $workExperienceInput['company'],
562
                        'description' => $workExperienceInput['description'],
563
                        'start_date' => $workExperienceInput['start_date'],
564
                        'end_date' => $workExperienceInput['end_date']
565
                    ]);
566
                    $workExperience->save();
567
                } else {
568
                    Log::warning("Applicant $applicant->id attempted to update work_experience with invalid id: $id");
569
                }
570
            }
571
        }
572
573
        // Redirect to correct page.
574
        switch ($request->input('submit')) {
575
            case 'save_and_quit':
576
                return redirect()->route('applications.index');
0 ignored issues
show
Bug introduced by
The function redirect 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

576
                return /** @scrutinizer ignore-call */ redirect()->route('applications.index');
Loading history...
577
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
578
            case 'save_and_continue':
579
            case 'next':
580
                return redirect()->route('job.application.edit.3', $jobPoster);
581
                break;
582
            case 'previous':
583
                return redirect()->route('job.application.edit.1', $jobPoster);
584
                break;
585
            default:
586
                return redirect()->back()->withInput();
587
        }
588
    }
589
590
    /**
591
     * Update the Application Essential Skills in storage for the specified job.
592
     *
593
     * @param  \Illuminate\Http\Request $request   Incoming Request object.
594
     * @param  \App\Models\JobPoster    $jobPoster Incoming Job Poster object.
595
     * @return \Illuminate\Http\Response
596
     */
597
    public function updateEssentialSkills(Request $request, JobPoster $jobPoster)
598
    {
599
        $applicant = Auth::user()->applicant;
600
        $application = $this->getApplicationFromJob($jobPoster);
601
602
        // Ensure user has permissions to update this application.
603
        $this->authorize('update', $application);
604
605
        $skillDeclarations = $request->input('skill_declarations');
606
        $claimedStatusId = SkillStatus::where('name', 'claimed')->firstOrFail()->id;
607
608
        // Save new skill declarations.
609
        if (isset($skillDeclarations['new'])) {
610
            foreach ($skillDeclarations['new'] as $skillType => $typeInput) {
611
                foreach ($typeInput as $criterion_id => $skillDeclarationInput) {
612
                    $skillDeclaration = new SkillDeclaration();
613
                    $skillDeclaration->skill_id = Criteria::find($criterion_id)->skill->id;
614
                    $skillDeclaration->skill_status_id = $claimedStatusId;
615
                    $skillDeclaration->fill([
616
                        'description' => $skillDeclarationInput['description'],
617
                        'skill_level_id' => isset($skillDeclarationInput['skill_level_id']) ? $skillDeclarationInput['skill_level_id'] : null,
618
                    ]);
619
                    $applicant->skill_declarations()->save($skillDeclaration);
620
621
                    $referenceIds = $this->getRelativeIds($skillDeclarationInput, 'references');
622
                    $skillDeclaration->references()->sync($referenceIds);
623
624
                    $sampleIds = $this->getRelativeIds($skillDeclarationInput, 'samples');
625
                    $skillDeclaration->work_samples()->sync($sampleIds);
626
                }
627
            }
628
        }
629
630
        // Update old declarations.
631
        if (isset($skillDeclarations['old'])) {
632
            foreach ($skillDeclarations['old'] as $skillType => $typeInput) {
633
                foreach ($typeInput as $id => $skillDeclarationInput) {
634
                    // Ensure this declaration belongs to this applicant.
635
                    $skillDeclaration = $applicant->skill_declarations->firstWhere('id', $id);
636
                    if ($skillDeclaration != null) {
637
                        // skill_id and skill_status cannot be changed.
638
                        $skillDeclaration->fill([
639
                            'description' => $skillDeclarationInput['description'],
640
                            'skill_level_id' => isset($skillDeclarationInput['skill_level_id']) ? $skillDeclarationInput['skill_level_id'] : null,
641
                        ]);
642
                        $skillDeclaration->save();
643
644
                        $referenceIds = $this->getRelativeIds($skillDeclarationInput, 'references');
645
                        $skillDeclaration->references()->sync($referenceIds);
646
647
                        $sampleIds = $this->getRelativeIds($skillDeclarationInput, 'samples');
648
                        $skillDeclaration->work_samples()->sync($sampleIds);
649
                    } else {
650
                        Log::warning("Applicant $applicant->id attempted to update skill declaration with invalid id: $id");
651
                    }
652
                }
653
            }
654
        }
655
656
        // Redirect to correct page.
657
        switch ($request->input('submit')) {
658
            case 'save_and_quit':
659
                return redirect()->route('applications.index');
0 ignored issues
show
Bug introduced by
The function redirect 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

659
                return /** @scrutinizer ignore-call */ redirect()->route('applications.index');
Loading history...
660
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
661
            case 'save_and_continue':
662
            case 'next':
663
                return redirect()->route('job.application.edit.4', $jobPoster);
664
                break;
665
            case 'previous':
666
                return redirect()->route('job.application.edit.2', $jobPoster);
667
                break;
668
            default:
669
                return redirect()->back()->withInput();
670
        }
671
    }
672
673
    /**
674
     * Update the Application Asset Skills in storage for the specified job.
675
     *
676
     * @param  \Illuminate\Http\Request $request   Incoming Request object.
677
     * @param  \App\Models\JobPoster    $jobPoster Incoming Job Poster object.
678
     * @return \Illuminate\Http\Response
679
     */
680
    public function updateAssetSkills(Request $request, JobPoster $jobPoster)
681
    {
682
        $applicant = Auth::user()->applicant;
683
        $application = $this->getApplicationFromJob($jobPoster);
684
685
        // Ensure user has permissions to update this application.
686
        $this->authorize('update', $application);
687
688
        $skillDeclarations = $request->input('skill_declarations');
689
        $claimedStatusId = SkillStatus::where('name', 'claimed')->firstOrFail()->id;
690
691
        // Save new skill declarations.
692
        if (isset($skillDeclarations['new'])) {
693
            foreach ($skillDeclarations['new'] as $skillType => $typeInput) {
694
                foreach ($typeInput as $criterion_id => $skillDeclarationInput) {
695
                    $skillDeclaration = new SkillDeclaration();
696
                    $skillDeclaration->skill_id = Criteria::find($criterion_id)->skill->id;
697
                    $skillDeclaration->skill_status_id = $claimedStatusId;
698
                    $skillDeclaration->fill([
699
                        'description' => $skillDeclarationInput['description'],
700
                        'skill_level_id' => isset($skillDeclarationInput['skill_level_id']) ? $skillDeclarationInput['skill_level_id'] : null,
701
                    ]);
702
                    $applicant->skill_declarations()->save($skillDeclaration);
703
704
                    $referenceIds = $this->getRelativeIds($skillDeclarationInput, 'references');
705
                    $skillDeclaration->references()->sync($referenceIds);
706
707
                    $sampleIds = $this->getRelativeIds($skillDeclarationInput, 'samples');
708
                    $skillDeclaration->work_samples()->sync($sampleIds);
709
                }
710
            }
711
        }
712
713
        // Update old declarations.
714
        if (isset($skillDeclarations['old'])) {
715
            foreach ($skillDeclarations['old'] as $skillType => $typeInput) {
716
                foreach ($typeInput as $id => $skillDeclarationInput) {
717
                    // Ensure this declaration belongs to this applicant.
718
                    $skillDeclaration = $applicant->skill_declarations->firstWhere('id', $id);
719
                    if ($skillDeclaration != null) {
720
                        // skill_id and skill_status cannot be changed.
721
                        $skillDeclaration->fill([
722
                            'description' => $skillDeclarationInput['description'],
723
                            'skill_level_id' => isset($skillDeclarationInput['skill_level_id']) ? $skillDeclarationInput['skill_level_id'] : null,
724
                        ]);
725
                        $skillDeclaration->save();
726
727
                        $referenceIds = $this->getRelativeIds($skillDeclarationInput, 'references');
728
                        $skillDeclaration->references()->sync($referenceIds);
729
730
                        $sampleIds = $this->getRelativeIds($skillDeclarationInput, 'samples');
731
                        $skillDeclaration->work_samples()->sync($sampleIds);
732
                    } else {
733
                        Log::warning("Applicant $applicant->id attempted to update skill declaration with invalid id: $id");
734
                    }
735
                }
736
            }
737
        }
738
739
        // Redirect to correct page.
740
        switch ($request->input('submit')) {
741
            case 'save_and_quit':
742
                return redirect()->route('applications.index');
0 ignored issues
show
Bug introduced by
The function redirect 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

742
                return /** @scrutinizer ignore-call */ redirect()->route('applications.index');
Loading history...
743
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
744
            case 'save_and_continue':
745
            case 'next':
746
                return redirect()->route('job.application.edit.5', $jobPoster);
747
                break;
748
            case 'previous':
749
                return redirect()->route('job.application.edit.3', $jobPoster);
750
                break;
751
            default:
752
                return redirect()->back()->withInput();
753
        }
754
    }
755
756
    /**
757
     * Submit the Application for the specified job.
758
     *
759
     * @param  \Illuminate\Http\Request $request   Incoming Request object.
760
     * @param  \App\Models\JobPoster    $jobPoster Incoming Job Poster object.
761
     * @return \Illuminate\Http\Response
762
     */
763
    public function submit(Request $request, JobPoster $jobPoster)
764
    {
765
        $application = $this->getApplicationFromJob($jobPoster);
766
767
        // Only complete submission if submit button was pressed.
768
        if ($request->input('submit') == 'submit' && $application->application_status->name == 'draft') {
769
            // Ensure user has permissions to update this application.
770
            $this->authorize('update', $application);
771
            $request->validate([
772
                'submission_signature' => [
773
                    'required',
774
                    'string',
775
                    'max:191',
776
                ],
777
                'submission_date' => [
778
                    'required',
779
                    'string',
780
                    'max:191',
781
                ]
782
            ]);
783
784
            // Save any final info.
785
            $application->fill([
786
                'submission_signature' => $request->input('submission_signature'),
787
                'submission_date' => $request->input('submission_date'),
788
            ]);
789
790
            // Error out of this process now if application is not complete.
791
            $validator = new ApplicationValidator();
792
            $validator->validate($application);
793
794
            // Change status to 'submitted'.
795
            $application->application_status_id = ApplicationStatus::where('name', 'submitted')->firstOrFail()->id;
796
            $application->saveProfileSnapshot();
797
        }
798
799
        $application->save();
800
801
        // Redirect to correct page.
802
        switch ($request->input('submit')) {
803
            case 'save_and_quit':
804
                return redirect()->route('applications.index');
0 ignored issues
show
Bug introduced by
The function redirect 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

804
                return /** @scrutinizer ignore-call */ redirect()->route('applications.index');
Loading history...
805
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
806
            case 'submit':
807
                return redirect()->route('job.application.complete', $jobPoster);
808
                break;
809
            case 'previous':
810
                return redirect()->route('job.application.edit.4', $jobPoster);
811
                break;
812
            default:
813
                return redirect()->back()->withInput();
814
        }
815
    }
816
}
817