Passed
Push — task/all-applications-to-pdf ( cb7375...852a46 )
by Tristan
59:34 queued 50:51
created

AssessmentPlanController   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 45
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 5
eloc 25
dl 0
loc 45
ccs 0
cts 24
cp 0
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
A getForJob() 0 35 5
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use Illuminate\Support\Facades\Gate;
6
use App\Models\JobPoster;
7
use App\Models\Criteria;
8
use App\Models\Assessment;
9
use App\Models\RatingGuideQuestion;
10
use App\Models\RatingGuideAnswer;
11
use App\Models\Lookup\AssessmentType;
12
13
class AssessmentPlanController extends Controller
14
{
15
    /**
16
     * Return all the criteria, Assessments, Assessments,
17
     * RatingGuideQuestions, and RatingGuideAnswers associated with a job,
18
     * as an array.
19
     *
20
     * @param JobPoster $jobPoster Job Poster to retrieve assessment plan for.
21
     * @return mixed[]
22
     */
23
    public function getForJob(JobPoster $jobPoster)
0 ignored issues
show
introduced by
Method \App\Http\Controllers\AssessmentPlanController::getForJob() does not have return type hint for its return value but it should be possible to add it based on @return annotation "mixed[]".
Loading history...
24
    {
25
        if (Gate::denies('view-assessment-plan', $jobPoster)) {
26
            abort(403);
27
        }
28
29
        $criteria = Criteria::where('job_poster_id', $jobPoster->id)->get();
30
        $criteriaTranslated = [];
31
        foreach ($criteria as $criterion) {
32
            // TODO: getTranslationsArray probably makes DB calls every loop. Find a way to profile & optimize.
33
            $criteriaTranslated[] = array_merge($criterion->toArray(), $criterion->getTranslationsArray());
34
        }
35
        $criteriaIds = $criteria->pluck("id");
36
        $assessments = Assessment::whereIn("criterion_id", $criteriaIds)->get();
37
        // Check for newly created assessment plan, and initialize any empty criteria to have the
38
        // "Narrative Review" option set.
39
        $assessmentCriteriaIds = $assessments->pluck("criterion_id");
40
        $emptyAssessments = array_diff($criteriaIds->toArray(), $assessmentCriteriaIds->toArray());
41
        if (!empty($emptyAssessments)) {
42
            $narrativeReview = AssessmentType::where("key", "narrative_assessment")->first();
43
            foreach ($emptyAssessments as $criterionId) {
44
                Assessment::create([
45
                    'criterion_id' => $criterionId,
46
                    'assessment_type_id' => $narrativeReview->id
47
                ]);
48
            }
49
            $assessments = Assessment::whereIn("criterion_id", $criteriaIds)->get();
50
        }
51
        $questions = RatingGuideQuestion::where('job_poster_id', $jobPoster->id)->get();
52
        $answers = RatingGuideAnswer::whereIn('rating_guide_question_id', $questions->pluck('id'))->get();
53
        return [
54
            'criteria' => $criteriaTranslated,
55
            'assessments' => $assessments->toArray(),
56
            'rating_guide_questions' => $questions->toArray(),
57
            'rating_guide_answers' => $answers->toArray()
58
        ];
59
    }
60
}
61