Completed
Push — dev ( 26e08c...2ff223 )
by Tristan
02:37 queued 02:28
created

JobController::index()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 14
dl 0
loc 23
ccs 0
cts 13
cp 0
rs 9.7998
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
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 Incoming Manager object.
228
     *
229
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
230
     */
231 2
    public function createAsManager(Manager $manager)
232
    {
233 2
        $jobPoster = new JobPoster();
234 2
        $jobPoster->manager_id = $manager->id;
235
236 2
        $jobPoster->save();
237
238 2
        $defaultQuestions = $this->populateDefaultQuestions();
239 2
        if (!empty($defaultQuestions)) {
240 2
            $jobPoster->job_poster_questions()->saveMany($defaultQuestions);
241
        }
242
243 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...
244
    }
245
246
    /**
247
     * Display the form for creating a new Job Poster
248
     *
249
     * @param \Illuminate\Http\Request $request Incoming request object.
250
     *
251
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
252
     */
253
    public function create(Request $request)
254
    {
255
        return $this->populateCreateView($request);
256
    }
257
258
    /**
259
     * Display the form for editing an existing Job Poster
260
     *
261
     * @param \Illuminate\Http\Request $request   Incoming request object.
262
     * @param \App\Models\JobPoster    $jobPoster Job Poster object.
263
     *
264
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
265
     */
266 1
    public function edit(Request $request, JobPoster $jobPoster)
267
    {
268 1
        return $this->populateCreateView($request, $jobPoster);
269
    }
270
271
    /**
272
     * Get the manager from the request object and check if creating or editing
273
     *
274
     * @param \Illuminate\Http\Request $request   Incoming request object.
275
     * @param \App\Models\JobPoster    $jobPoster Optional Job Poster object.
276
     *
277
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory Job Create view
278
     */
279 1
    public function populateCreateView(Request $request, JobPoster $jobPoster = null)
280
    {
281 1
        if ($jobPoster == null || $jobPoster->manager == null) {
282
            $manager = $request->user() ? $request->user()->manager : null;
283
        } else {
284 1
            $manager = $jobPoster->manager;
285
        }
286
287 1
        if (isset($jobPoster)) {
288 1
            $job = $jobPoster;
289 1
            $route = ['manager.jobs.update', $jobPoster];
290 1
            $jobHeading = 'manager/job_edit';
291
        } else {
292
            $job = [];
293
            $defaultQuestions = $this->populateDefaultQuestions();
294
            if (!empty($defaultQuestions)) {
295
                $job['job_poster_questions'] = $defaultQuestions;
296
            }
297
            $route = ['manager.jobs.store'];
298
            $jobHeading = 'manager/job_create';
299
        }
300
301 1
        $skillLangs = Lang::get('common/skills');
302
303 1
        $softSkills = Skill::whereHas(
304 1
            'skill_type',
305
            function ($query) : void {
306 1
                $query->where('name', '=', 'soft');
307 1
            }
308 1
        )->get()
309 1
            ->mapWithKeys(
310
                function ($skill) {
311
                    return [
312 1
                        $skill->id => $skill->name
313
                    ];
314 1
                }
315
            )
316 1
            ->all();
317
318 1
        $hardSkills = Skill::whereHas(
319 1
            'skill_type',
320
            function ($query) : void {
321 1
                $query->where('name', '=', 'hard');
322 1
            }
323 1
        )->get()
324 1
            ->mapWithKeys(
325
                function ($skill) {
326
                    return [
327 1
                        $skill->id => $skill->name
328
                    ];
329 1
                }
330
            )
331 1
            ->all();
332
333 1
        asort($softSkills, SORT_LOCALE_STRING);
334 1
        asort($hardSkills, SORT_LOCALE_STRING);
335
336
        $skills = [
337
            'essential' => [
338 1
                'hard' => $hardSkills,
339 1
                'soft' => $softSkills
340
            ],
341
            'asset' => [
342 1
                'hard' => $hardSkills,
343 1
                'soft' => $softSkills
344
            ]
345
        ];
346
347 1
        $skillLevelCollection = SkillLevel::all();
348
349 1
        $skillLevels = array();
350
351 1
        $skillLevels['hard'] = $skillLevelCollection->mapWithKeys(
352
            function ($skillLevel) use ($skillLangs) {
353 1
                return [$skillLevel->id => $skillLangs['skill_levels']['hard'][$skillLevel->name]];
354 1
            }
355 1
        )->all();
356
357 1
        $skillLevels['soft'] = $skillLevelCollection->mapWithKeys(
358
            function ($skillLevel) use ($skillLangs) {
359 1
                return [$skillLevel->id => $skillLangs['skill_levels']['soft'][$skillLevel->name]];
360 1
            }
361 1
        )->all();
362
363 1
        return view(
364 1
            'manager/job_create',
365
            [
366
                /*Localization Strings*/
367 1
                'job_l10n' => Lang::get('manager/job_create'),
368
369
                /* Data */
370 1
                'job' => Lang::get($jobHeading),
371 1
                'manager' => $manager,
372 1
                'provinces' => Province::all(),
373 1
                'departments' => Department::all(),
374 1
                'language_requirments' => LanguageRequirement::all(),
375 1
                'security_clearances' => SecurityClearance::all(),
376 1
                'job' => $job,
377 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

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