Passed
Push — task/priority_bucket ( e274f2...a93ed1 )
by Yonathan
09:05 queued 10s
created

JobController   B

Complexity

Total Complexity 49

Size/Duplication

Total Lines 607
Duplicated Lines 0 %

Test Coverage

Coverage 73.9%

Importance

Changes 0
Metric Value
wmc 49
eloc 286
dl 0
loc 607
ccs 201
cts 272
cp 0.739
rs 8.48
c 0
b 0
f 0

14 Methods

Rating   Name   Duplication   Size   Complexity  
B show() 0 77 8
A destroy() 0 3 1
A index() 0 23 1
A managerIndex() 0 13 1
A submitForReview() 0 21 2
A fillAndSaveJobPosterTasks() 0 24 5
A populateDefaultQuestions() 0 30 3
A createAsManager() 0 26 2
B populateCreateView() 0 97 4
A fillAndSaveJobPosterQuestions() 0 26 5
A create() 0 3 1
A fillAndSaveJobPoster() 0 41 2
A store() 0 26 3
B fillAndSaveJobPosterCriteria() 0 40 10

How to fix   Complexity   

Complex Class

Complex classes like JobController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use JobController, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace App\Http\Controllers;
4
5
use Illuminate\Support\Facades\Lang;
6
use Illuminate\Support\Facades\Auth;
7
use Illuminate\Support\Facades\Log;
8
use Illuminate\Support\Facades\Mail;
9
use Illuminate\Http\RedirectResponse;
10
use Illuminate\Http\Request;
11
use Illuminate\Http\Response;
12
use Illuminate\View\View;
13
use App\Http\Controllers\Controller;
14
15
use Carbon\Carbon;
16
17
use App\Mail\JobPosterReviewRequested;
18
19
use App\Models\Criteria;
20
use App\Models\JobPoster;
21
use App\Models\JobPosterKeyTask;
22
use App\Models\JobPosterQuestion;
23
use App\Models\Lookup\JobTerm;
24
use App\Models\Lookup\Province;
25
use App\Models\Lookup\SecurityClearance;
26
use App\Models\Lookup\LanguageRequirement;
27
use App\Models\Lookup\Department;
28
use App\Models\Lookup\SkillLevel;
29
use App\Models\Lookup\CriteriaType;
30
use App\Models\Skill;
31
use App\Models\Manager;
32
33
use App\Services\Validation\JobPosterValidator;
34
use Jenssegers\Date\Date;
35
36
class JobController extends Controller
37
{
38
    /**
39
     * Display a listing of JobPosters.
40
     *
41
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
42
     */
43
    public function index()
44
    {
45
        $now = Carbon::now();
46
47
        // Find published jobs that are currently open for applications.
48
        // Eager load required relationships: Department, Province, JobTerm.
49
        // Eager load the count of submitted applications, to prevent the relationship
50
        // from being actually loaded and firing off events.
51
        $jobs = JobPoster::where('open_date_time', '<=', $now)
52
            ->where('close_date_time', '>=', $now)
53
            ->where('published', true)
54
            ->with([
55
                'department',
56
                'province',
57
                'job_term',
58
            ])
59
            ->withCount([
60
                'submitted_applications',
61
            ])
62
            ->get();
63
        return view('applicant/job_index', [
64
            'job_index' => Lang::get('applicant/job_index'),
65
            'jobs' => $jobs
66
        ]);
67
    }
68
69
    /**
70
     * Display a listing of a manager's JobPosters.
71
     *
72
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
73
     */
74 1
    public function managerIndex()
75
    {
76 1
        $manager = Auth::user()->manager;
0 ignored issues
show
Bug introduced by
Accessing manager on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
77 1
        $jobs = JobPoster::where('manager_id', $manager->id)
78 1
            ->withCount('submitted_applications')
79 1
            ->get();
80
81 1
        return view('manager/job_index', [
82
            /*Localization Strings*/
83 1
            'jobs_l10n' => Lang::get('manager/job_index'),
84
85
            /* Data */
86 1
            'jobs' => $jobs,
87
        ]);
88
    }
89
90
    /**
91
     * Submit the Job Poster for review.
92
     *
93
     * @param \Illuminate\Http\Request $request   Incoming request object.
94
     * @param \App\Models\JobPoster    $jobPoster Job Poster object.
95
     *
96
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
97
     */
98 1
    public function submitForReview(Request $request, JobPoster $jobPoster)
99
    {
100
        // Update review request timestamp
101 1
        $jobPoster->review_requested_at = new Date();
102 1
        $jobPoster->save();
103
104
        // Refresh model instance with updated DB values.
105 1
        $jobPoster = JobPoster::withCount('submitted_applications')->where('id', $jobPoster->id)->first();
106
107
        // Send email
108 1
        $reviewer_email = config('mail.reviewer_email');
109 1
        if (isset($reviewer_email)) {
110 1
            Mail::to($reviewer_email)->send(new JobPosterReviewRequested($jobPoster, Auth::user()));
0 ignored issues
show
Bug introduced by
It seems like Illuminate\Support\Facades\Auth::user() can also be of type null; however, parameter $manager of App\Mail\JobPosterReviewRequested::__construct() does only seem to accept App\Models\User, maybe add an additional type check? ( Ignorable by Annotation )

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

110
            Mail::to($reviewer_email)->send(new JobPosterReviewRequested($jobPoster, /** @scrutinizer ignore-type */ Auth::user()));
Loading history...
111
        } else {
112
            Log::error('The reviewer email environment variable is not set.');
113
        }
114
115 1
        return view('manager/job_index/job', [
116
            /*Localization Strings*/
117 1
            'jobs_l10n' => Lang::get('manager/job_index'),
118 1
            'job' => $jobPoster
119
        ]);
120
    }
121
122
    /**
123
     * Delete a draft Job Poster.
124
     *
125
     * @param \Illuminate\Http\Request $request   Incoming request object.
126
     * @param \App\Models\JobPoster    $jobPoster Job Poster object.
127
     *
128
     * @return void
129
     */
130
    public function destroy(Request $request, JobPoster $jobPoster) : void
131
    {
132
        $jobPoster->delete();
133
    }
134
135
    /**
136
     * Display the specified job poster.
137
     *
138
     * @param \Illuminate\Http\Request $request   Incoming request object.
139
     * @param \App\Models\JobPoster    $jobPoster Job Poster object.
140
     *
141
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
142
     */
143 4
    public function show(Request $request, JobPoster $jobPoster)
144
    {
145 4
        $jobPoster->load([
146 4
            'department',
147
            'criteria.skill.skill_type',
148
            'manager.team_culture',
149
            'manager.work_environment'
150
        ]);
151
152 4
        $user = Auth::user();
0 ignored issues
show
Unused Code introduced by
The assignment to $user is dead and can be removed.
Loading history...
153
154
        //TODO: Improve workplace photos, and reference them in template direction from WorkEnvironment model
155 4
        $workplacePhotos = [];
156 4
        foreach ($jobPoster->manager->work_environment->workplace_photo_captions as $photoCaption) {
157
            $workplacePhotos[] = [
158
                'description' => $photoCaption->description,
159
                'url' => '/images/user.png'
160
            ];
161
        }
162
163
        //TODO: replace route('manager.show',manager.id) in templates with link using slug
164
165
        $criteria = [
166 4
            'essential' => $jobPoster->criteria->filter(
167
                function ($value, $key) {
168 2
                    return $value->criteria_type->name == 'essential';
169 4
                }
170
            ),
171 4
            'asset' => $jobPoster->criteria->filter(
172
                function ($value, $key) {
173 2
                    return $value->criteria_type->name == 'asset';
174 4
                }
175
            ),
176
        ];
177
178 4
        $jobLang = Lang::get('applicant/job_post');
179
180 4
        $applyButton = [];
181 4
        if (!$jobPoster->published && $this->authorize('update', $jobPoster)) {
182
            $applyButton = [
183 2
                'href' => route('manager.jobs.edit', $jobPoster->id),
184 2
                'title' => $jobLang['apply']['edit_link_title'],
185 2
                'text' => $jobLang['apply']['edit_link_label'],
186
            ];
187 2
        } elseif (Auth::check() && $jobPoster->isOpen()) {
188
            $applyButton = [
189 1
                'href' => route('job.application.edit.1', $jobPoster->id),
190 1
                'title' => $jobLang['apply']['apply_link_title'],
191 1
                'text' => $jobLang['apply']['apply_link_label'],
192
            ];
193 1
        } elseif (Auth::guest() && $jobPoster->isOpen()) {
194
            $applyButton = [
195 1
                'href' => route('job.application.edit.1', $jobPoster->id),
196 1
                'title' => $jobLang['apply']['login_link_title'],
197 1
                'text' => $jobLang['apply']['login_link_label'],
198
            ];
199
        } else {
200
            $applyButton = [
201
                'href' => null,
202
                'title' => null,
203
                'text' => $jobLang['apply']['job_closed_label'],
204
            ];
205
        }
206
207 4
        return view(
208 4
            'applicant/job_post',
209
            [
210 4
                'job_post' => $jobLang,
211 4
                'manager' => $jobPoster->manager,
212 4
                'manager_profile_photo_url' => '/images/user.png', //TODO get real photo
213 4
                'team_culture' => $jobPoster->manager->team_culture,
214 4
                'work_environment' => $jobPoster->manager->work_environment,
215 4
                'workplace_photos' => $workplacePhotos,
216 4
                'job' => $jobPoster,
217 4
                'criteria' => $criteria,
218 4
                'apply_button' => $applyButton,
219 4
                'skill_template' => Lang::get('common/skills'),
220
            ]
221
        );
222
    }
223
224
    /**
225
     * Create a blank job poster for the specified manager
226
     *
227
     * @param Manager $manager
1 ignored issue
show
Coding Style Documentation introduced by
Missing parameter comment
Loading history...
228
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
229
     */
230 2
    public function createAsManager(Manager $manager)
231
    {
232 2
        $jobPoster = new JobPoster();
233 2
        $jobPoster->manager_id = $manager->id;
234 2
        $managerEn = $manager->translate('en');
235 2
        $managerFr = $manager->translate('fr');
236
237 2
        $jobPoster->fill([
238 2
            'department_id' => $manager->department_id,
239
            'en' => [
240 2
                'branch' => $managerEn->branch,
241 2
                'division' => $managerEn->division,
242
            ],
243
            'fr' => [
244 2
                'branch' => $managerFr->branch,
245 2
                'division' => $managerFr->division,
246
            ]
247
        ]);
248 2
        $jobPoster->save();
249
250 2
        $defaultQuestions = $this->populateDefaultQuestions();
251 2
        if (!empty($defaultQuestions)) {
252 2
            $jobPoster->job_poster_questions()->saveMany($defaultQuestions);
253
        }
254
255 2
        return redirect()->route('manager.jobs.edit', $jobPoster->id);
1 ignored issue
show
Bug Best Practice introduced by
The expression return redirect()->route....edit', $jobPoster->id) returns the type Illuminate\Http\RedirectResponse which is incompatible with the documented return type Illuminate\Contracts\Vie...ry|Illuminate\View\View.
Loading history...
256
    }
257
258
    /**
259
     * Display the form for creating a new Job Poster
260
     *
261
     * @param \Illuminate\Http\Request $request Incoming request object.
262
     *
263
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
264
     */
265
    public function create(Request $request)
266
    {
267
        return $this->populateCreateView($request);
268
    }
269
270
    /**
271
     * Display the form for editing an existing Job Poster
272
     *
273
     * @param \Illuminate\Http\Request $request   Incoming request object.
274
     * @param \App\Models\JobPoster    $jobPoster Job Poster object.
275
     *
276
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
277
     */
278 1
    public function edit(Request $request, JobPoster $jobPoster)
279
    {
280 1
        return $this->populateCreateView($request, $jobPoster);
281
    }
282
283
    /**
284
     * Get the manager from the request object and check if creating or editing
285
     *
286
     * @param \Illuminate\Http\Request $request   Incoming request object.
287
     * @param \App\Models\JobPoster    $jobPoster Optional Job Poster object.
288
     *
289
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
290
     */
291 1
    public function populateCreateView(Request $request, JobPoster $jobPoster = null)
292
    {
293 1
        $manager = $request->user() ? $request->user()->manager : null;
294 1
        if (isset($jobPoster)) {
295 1
            $job = $jobPoster;
296 1
            $route = ['manager.jobs.update', $jobPoster];
297 1
            $jobHeading = 'manager/job_edit';
298
        } else {
299
            $job = [];
300
            $defaultQuestions = $this->populateDefaultQuestions();
301
            if (!empty($defaultQuestions)) {
302
                $job['job_poster_questions'] = $defaultQuestions;
303
            }
304
            $route = ['manager.jobs.store'];
305
            $jobHeading = 'manager/job_create';
306
        }
307
308 1
        $skillLangs = Lang::get('common/skills');
309
310 1
        $softSkills = Skill::whereHas(
311 1
            'skill_type',
312
            function ($query) : void {
313 1
                $query->where('name', '=', 'soft');
314 1
            }
315 1
        )->get()
316 1
            ->mapWithKeys(
317
                function ($skill) {
318
                    return [
319 1
                        $skill->id => $skill->name
320
                    ];
321 1
                }
322
            )
323 1
            ->all();
324
325 1
        $hardSkills = Skill::whereHas(
326 1
            'skill_type',
327
            function ($query) : void {
328 1
                $query->where('name', '=', 'hard');
329 1
            }
330 1
        )->get()
331 1
            ->mapWithKeys(
332
                function ($skill) {
333
                    return [
334 1
                        $skill->id => $skill->name
335
                    ];
336 1
                }
337
            )
338 1
            ->all();
339
340 1
        asort($softSkills, SORT_LOCALE_STRING);
341 1
        asort($hardSkills, SORT_LOCALE_STRING);
342
343
        $skills = [
344
            'essential' => [
345 1
                'hard' => $hardSkills,
346 1
                'soft' => $softSkills
347
            ],
348
            'asset' => [
349 1
                'hard' => $hardSkills,
350 1
                'soft' => $softSkills
351
            ]
352
        ];
353
354 1
        $skillLevelCollection = SkillLevel::all();
355
356 1
        $skillLevels = array();
357
358 1
        $skillLevels['hard'] = $skillLevelCollection->mapWithKeys(
359
            function ($skillLevel) use ($skillLangs) {
360 1
                return [$skillLevel->id => $skillLangs['skill_levels']['hard'][$skillLevel->name]];
361 1
            }
362 1
        )->all();
363
364 1
        $skillLevels['soft'] = $skillLevelCollection->mapWithKeys(
365
            function ($skillLevel) use ($skillLangs) {
366 1
                return [$skillLevel->id => $skillLangs['skill_levels']['soft'][$skillLevel->name]];
367 1
            }
368 1
        )->all();
369
370 1
        return view(
371 1
            'manager/job_create',
372
            [
373
                /*Localization Strings*/
374 1
                'job_l10n' => Lang::get('manager/job_create'),
375
376
                /* Data */
377 1
                'job' => Lang::get($jobHeading),
378 1
                'manager' => $manager,
379 1
                'provinces' => Province::all(),
380 1
                'departments' => Department::all(),
381 1
                'language_requirments' => LanguageRequirement::all(),
382 1
                'security_clearances' => SecurityClearance::all(),
383 1
                'job' => $job,
384 1
                'form_action_url' => route(/** @scrutinizer ignore-type */ ...$route), // phpcs:ignore
0 ignored issues
show
Bug introduced by
$route is expanded, but the parameter $name of route() does not expect variable arguments. ( Ignorable by Annotation )

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

384
                'form_action_url' => route(/** @scrutinizer ignore-type */ /** @scrutinizer ignore-type */ ...$route), // phpcs:ignore
Loading history...
385 1
                'skills' => $skills,
386 1
                'skill_levels' => $skillLevels,
387 1
                'skill_template' => $skillLangs,
388
            ]
389
        );
390
    }
391
392
    /**
393
     * Create a new resource in storage
394
     *
395
     * @param \Illuminate\Http\Request $request   Incoming request object.
396
     * @param \App\Models\JobPoster    $jobPoster Optional Job Poster object.
397
     *
398
     * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse A redirect to the Job Index
399
     */
400 2
    public function store(Request $request, JobPoster $jobPoster = null)
401
    {
402
        // Don't allow edits for published Job Posters
403
        // Also check auth while we're at it
404 2
        if (isset($jobPoster)) {
405 2
            $this->authorize('update', $jobPoster);
406 2
            JobPosterValidator::validateUnpublished($jobPoster);
407
        } else {
408
            $this->authorize('create', JobPoster::class);
409
        }
410
411 2
        $input = $request->input();
412
413 2
        $job = (isset($jobPoster) ? $jobPoster : new JobPoster());
414
415 2
        $job->manager_id = $request->user()->manager->id;
416
417 2
        $this->fillAndSaveJobPoster($input, $job);
418
419 2
        $this->fillAndSaveJobPosterTasks($input, $job, isset($jobPoster));
420
421 2
        $this->fillAndSaveJobPosterQuestions($input, $job, isset($jobPoster));
422
423 2
        $this->fillAndSaveJobPosterCriteria($input, $job, isset($jobPoster));
424
425 2
        return redirect(route('manager.jobs.show', $job->id));
426
    }
427
428
    /**
429
     * Fill Job Poster model's properties and save
430
     *
431
     * @param mixed[]               $input     Field values.
432
     * @param \App\Models\JobPoster $jobPoster Job Poster object.
433
     *
434
     * @return void
435
     */
436 2
    protected function fillAndSaveJobPoster(array $input, JobPoster $jobPoster) : void
437
    {
438 2
        $closeDate = new Date($input['close_date']);
439 2
        $openDate = new Date($input['open_date']);
440 2
        $startDate = new Date($input['start_date']);
441
442 2
        $jobPoster->fill(
443
            [
444 2
                'job_term_id' => JobTerm::where('name', 'month')->firstOrFail()->id,
445 2
                'term_qty' => $input['term_qty'],
446 2
                'open_date_time' => pstDayStartToUtcTime($openDate->year, $openDate->month, $openDate->day),
447 2
                'close_date_time' => pstDayEndToUtcTime($closeDate->year, $closeDate->month, $closeDate->day),
448 2
                'start_date_time' => pstDayStartToUtcTime($startDate->year, $startDate->month, $startDate->day),
449 2
                'department_id' => $input['department'],
450 2
                'province_id' => $input['province'],
451 2
                'salary_min' => $input['salary_min'],
452 2
                'salary_max' => $input['salary_max'],
453 2
                'noc' => $input['noc'],
454 2
                'classification' => $input['classification'],
455 2
                'security_clearance_id' => $input['security_clearance'],
456 2
                'language_requirement_id' => $input['language_requirement'],
457 2
                'remote_work_allowed' => (isset($input['remote_work_allowed']) ? $input['remote_work_allowed'] : false),
458
                'en' => [
459 2
                    'city' => $input['city'],
460 2
                    'title' => $input['title']['en'],
461 2
                    'impact' => $input['impact']['en'],
462 2
                    'branch' => $input['branch']['en'],
463 2
                    'division' => $input['division']['en'],
464 2
                    'education' => $input['education']['en'],
465
                ],
466
                'fr' => [
467 2
                    'city' => $input['city'],
468 2
                    'title' => $input['title']['fr'],
469 2
                    'impact' => $input['impact']['fr'],
470 2
                    'branch' => $input['branch']['fr'],
471 2
                    'division' => $input['division']['fr'],
472 2
                    'education' => $input['education']['fr'],
473
                ],
474
            ]
475
        );
476 2
        $jobPoster->save();
477 2
    }
478
479
    /**
480
     * Fill Job Poster's tasks and save
481
     *
482
     * @param mixed[]               $input     Field values.
483
     * @param \App\Models\JobPoster $jobPoster Job Poster object.
484
     * @param boolean               $replace   Remove existing relationships.
485
     *
486
     * @return void
487
     */
488 2
    protected function fillAndSaveJobPosterTasks(array $input, JobPoster $jobPoster, bool $replace) : void
489
    {
490 2
        if ($replace) {
491 2
            $jobPoster->job_poster_key_tasks()->delete();
492
        }
493
494 2
        if (!array_key_exists('task', $input) || !is_array($input['task'])) {
495 2
            return;
496
        }
497
498
        foreach ($input['task'] as $task) {
499
            $jobPosterTask = new JobPosterKeyTask();
500
            $jobPosterTask->job_poster_id = $jobPoster->id;
501
            $jobPosterTask->fill(
502
                [
503
                    'en' => [
504
                        'description' => $task['en']
505
                    ],
506
                    'fr' => [
507
                        'description' => $task['fr']
508
                    ]
509
                ]
510
            );
511
            $jobPosterTask->save();
512
        }
513
    }
514
515
    /**
516
     * Fill Job Poster's questions and save
517
     *
518
     * @param mixed[]               $input     Field values.
519
     * @param \App\Models\JobPoster $jobPoster Job Poster object.
520
     * @param boolean               $replace   Remove existing relationships.
521
     *
522
     * @return void
523
     */
524 2
    protected function fillAndSaveJobPosterQuestions(array $input, JobPoster $jobPoster, bool $replace) : void
525
    {
526 2
        if ($replace) {
527 2
            $jobPoster->job_poster_questions()->delete();
528
        }
529
530 2
        if (!array_key_exists('question', $input) || !is_array($input['question'])) {
531 2
            return;
532
        }
533
534
        foreach ($input['question'] as $question) {
535
            $jobQuestion = new JobPosterQuestion();
536
            $jobQuestion->job_poster_id = $jobPoster->id;
537
            $jobQuestion->fill(
538
                [
539
                    'en' => [
540
                        'question' => $question['question']['en'],
541
                        'description' => $question['description']['en']
542
                    ],
543
                    'fr' => [
544
                        'question' => $question['question']['fr'],
545
                        'description' => $question['description']['fr']
546
                    ]
547
                ]
548
            );
549
            $jobQuestion->save();
550
        }
551
    }
552
553
    /**
554
     * Fill Job Poster's criteria and save
555
     *
556
     * @param mixed[]               $input     Field values.
557
     * @param \App\Models\JobPoster $jobPoster Job Poster object.
558
     * @param boolean               $replace   Remove existing relationships.
559
     *
560
     * @return void
561
     */
562 2
    protected function fillAndSaveJobPosterCriteria(array $input, JobPoster $jobPoster, bool $replace) : void
563
    {
564 2
        if ($replace) {
565 2
            $jobPoster->criteria()->delete();
566
        }
567
568 2
        if (!array_key_exists('criteria', $input) || !is_array($input['criteria'])) {
569 2
            return;
570
        }
571
572
        $criteria = $input['criteria'];
573
574
        $combinedCriteria = [];
575
        if (isset($criteria['old'])) {
576
            $combinedCriteria = array_replace_recursive($combinedCriteria, $criteria['old']);
577
        }
578
        if (isset($criteria['new'])) {
579
            $combinedCriteria = array_replace_recursive($combinedCriteria, $criteria['new']);
580
        }
581
582
        if (! empty($combinedCriteria)) {
583
            foreach ($combinedCriteria as $criteriaType => $criteriaTypeInput) {
584
                foreach ($criteriaTypeInput as $skillType => $skillTypeInput) {
585
                    foreach ($skillTypeInput as $criteriaInput) {
586
                        $criteria = new Criteria();
587
                        $criteria->job_poster_id = $jobPoster->id;
588
                        $criteria->fill(
589
                            [
590
                                'criteria_type_id' => CriteriaType::where('name', $criteriaType)->firstOrFail()->id,
591
                                'skill_id' => $criteriaInput['skill_id'],
592
                                'skill_level_id' => $criteriaInput['skill_level_id'],
593
                                'en' => [
594
                                    'description' => $criteriaInput['description']['en'],
595
                                ],
596
                                'fr' => [
597
                                    'description' => $criteriaInput['description']['fr'],
598
                                ],
599
                            ]
600
                        );
601
                        $criteria->save();
602
                    }
603
                }
604
            }
605
        }
606
    }
607
608
    /**
609
     * Get the localized default questions and add them to an array.
610
     *
611
     * @return mixed[]|void
612
     */
613 2
    protected function populateDefaultQuestions()
614
    {
615
        $defaultQuestions = [
616 2
            'en' => array_values(Lang::get('manager/job_create', [], 'en')['questions']),
617 2
            'fr' => array_values(Lang::get('manager/job_create', [], 'fr')['questions']),
618
        ];
619
620 2
        if (count($defaultQuestions['en']) !== count($defaultQuestions['fr'])) {
621
            Log::warning('There must be the same number of French and English default questions for a Job Poster.');
622
            return;
623
        }
624
625 2
        $jobQuestions = [];
626
627 2
        for ($i = 0; $i < count($defaultQuestions['en']); $i++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
628 2
            $jobQuestion = new JobPosterQuestion();
629 2
            $jobQuestion->fill(
630
                [
631
                    'en' => [
632 2
                        'question' => $defaultQuestions['en'][$i],
633
                    ],
634
                    'fr' => [
635 2
                        'question' => $defaultQuestions['fr'][$i],
636
                    ]
637
                ]
638
            );
639 2
            $jobQuestions[] = $jobQuestion;
640
        }
641
642 2
        return $jobQuestions;
643
    }
644
}
645