Completed
Push — feature/application_tracker_va... ( fa2127...f58e89 )
by Tristan
11:57 queued 04:59
created

ApplicationValidator   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 148
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 18
eloc 73
dl 0
loc 148
ccs 0
cts 75
cp 0
rs 10
c 0
b 0
f 0

13 Methods

Rating   Name   Duplication   Size   Complexity  
A arrayMapKeys() 0 6 2
A __construct() 0 4 1
A validate() 0 17 1
A assetSkillsComplete() 0 2 1
A basicsValidator() 0 27 3
A skillsValidator() 0 22 3
A essentialSkillsComplete() 0 2 1
A basicsComplete() 0 3 1
A essentialSkillsValidator() 0 2 1
A affirmationValidator() 0 14 1
A affirmationComplete() 0 2 1
A addNestedValidatorRules() 0 9 1
A assetSkillsValidator() 0 2 1
1
<?php
2
0 ignored issues
show
Coding Style introduced by
Missing file doc comment
Loading history...
3
namespace App\Services\Validation;
4
5
use App\Models\JobApplication;
6
use Illuminate\Support\Facades\Validator;
7
use Illuminate\Validation\Rule;
8
use Illuminate\Validation\Validator as BaseValidator;
9
use App\Models\Lookup\CitizenshipDeclaration;
10
use App\Models\Lookup\CriteriaType;
11
use App\Models\Lookup\VeteranStatus;
12
use App\Models\Lookup\PreferredLanguage;
13
use App\Services\Validation\Rules\ContainsObjectWithAttributeRule;
14
use App\Services\Validation\JobApplicationAnswerValidator;
15
16
class ApplicationValidator {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for class ApplicationValidator
Loading history...
Coding Style introduced by
Opening brace of a class must be on the line after the definition
Loading history...
17
18
    protected $citizenship_ids;
19
    protected $veteran_status_ids;
20
    protected $preferred_language_ids;
21
22
    public function __construct() {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function __construct()
Loading history...
23
        $this->citizenship_ids = CitizenshipDeclaration::all()->pluck('id')->toArray();
24
        $this->veteran_status_ids = VeteranStatus::all()->pluck('id')->toArray();
25
        $this->preferred_language_ids = PreferredLanguage::all()->pluck('id')->toArray();
26
    }
27
28
    public function validate(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function validate()
Loading history...
29
30
        $rules = [
0 ignored issues
show
Unused Code introduced by
The assignment to $rules is dead and can be removed.
Loading history...
31
32
        ];
33
34
        //Validate basic data is filled in
35
        Validator::make($application->getAttributes(), [
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
36
            'job_poster_id' => 'required',
37
            'application_status_id' => 'required',
38
            'citizenship_declaration_id' => ['required', Rule::in($this->citizenship_ids)],
39
            'veteran_status_id' => ['required', Rule::in($this->veteran_status_ids)],
40
            'preferred_language_id' => ['required', Rule::in($this->preferred_language_ids)],
41
            'applicant_id' => 'required',
42
            'submission_signature' => 'required|string|max:191',
43
            'submission_date' => 'required|string|max:191',
44
        ])->validate();
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
45
46
        //TODO
47
        //Validate that all questions have been answered
48
49
        //TODO
50
        //Validate that essential skill declarations have been supplied
51
    }
52
53
    protected function arrayMapKeys($fn, $array) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function arrayMapKeys()
Loading history...
54
        $newArray = [];
55
        foreach($array as $key => $value) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
56
            $newArray[$fn($key)] = $value;
57
        }
58
        return $newArray;
59
    }
60
61
    protected function addNestedValidatorRules($nestedAttribute, $validatorRules, $rules = []) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function addNestedValidatorRules()
Loading history...
62
        // prepend the attribute name of each validator rule with the nested attribute name
63
        $newRules = $this->arrayMapKeys(function($key) use ($nestedAttribute) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
64
                return implode('.', [$nestedAttribute, $key]);
65
            },
0 ignored issues
show
Coding Style introduced by
Closing brace indented incorrectly; expected 8 spaces, found 12
Loading history...
66
            $validatorRules);
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
67
        //Merge new rules with old rules
68
        $rules = array_merge($rules, $newRules);
69
        return $rules;
70
    }
71
72
    public function basicsValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function basicsValidator()
Loading history...
73
        // Validate the fields common to every application
74
        $rules = [
75
            'citizenship_declaration_id' => ['required', Rule::in($this->citizenship_ids)],
76
            'veteran_status_id' => ['required', Rule::in($this->veteran_status_ids)],
77
            'preferred_language_id' => ['required', Rule::in($this->preferred_language_ids)],
78
        ];
79
80
        //Load application answers so they are included in application->toArray()
81
        $application->load('job_application_answers');
82
83
        // Validate that each question has been answered
84
        $jobPosterQuestionRules = [];
85
        foreach($application->job_poster->job_poster_questions as $question) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
86
            $jobPosterQuestionRules[] = new ContainsObjectWithAttributeRule('job_poster_question_id', $question->id);
87
        }
88
        $rules['job_application_answers'] = $jobPosterQuestionRules;
89
        $answerValidatorFactory = new JobApplicationAnswerValidator($application);
90
91
        //Validate that each answer is complete
92
        foreach($application->job_application_answers as $key=>$answer) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
93
            $attribute = implode('.', ['job_application_answers', $key]);
94
            $rules = $this->addNestedValidatorRules($attribute, $answerValidatorFactory->rules(), $rules);
95
        }
96
97
        $validator = Validator::make($application->toArray(), $rules);
98
        return $validator;
99
    }
100
101
    public function basicsComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function basicsComplete()
Loading history...
102
        $validator = $this->basicsValidator($application);
103
        return $validator->passes();
104
    }
105
106
    protected function skillsValidator(JobApplication $application, $criteria_type) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function skillsValidator()
Loading history...
107
        $rules = [];
108
109
        $skillDeclarationRules = [];
110
        $criteriaTypeId = CriteriaType::where('name', $criteria_type)->firstOrFail()->id;
111
        foreach($application->job_poster->criteria->where('criteria_type_id', $criteriaTypeId) as $criteria) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
112
            //Validate that every essential skill has a corresponding declaration
113
            $skillDeclarationRules[] = new ContainsObjectWithAttributeRule('skill_id', $criteria->skill_id);
114
        }
115
        $rules['skill_declarations'] = $skillDeclarationRules;
116
        $application->applicant->load('skill_declarations');
117
118
        //Validate that those declarations are complete
119
        $skilDeclarationValidatorFactory = new SkillDeclarationValidator($application->applicant);
120
        foreach($application->skill_declarations->where('criteria_type_id', $criteriaTypeId) as $key=>$declaration) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
121
            $attribute = implode('.', ['skill_declarations', $key]);
122
            $skilDeclarationValidator = $skilDeclarationValidatorFactory->validator($declaration);
123
            $rules = $this->addNestedValidatorRules($attribute, $skilDeclarationValidator->getRules(), $rules);
124
        }
125
126
        $validator = Validator::make($application->toArray(), $rules);
127
        return $validator;
128
    }
129
130
    public function essentialSkillsValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function essentialSkillsValidator()
Loading history...
131
        return $this->skillsValidator($application, 'essential');
132
    }
133
134
    public function essentialSkillsComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function essentialSkillsComplete()
Loading history...
135
        return $this->essentialSkillsValidator($application)->passes();
136
    }
137
138
    public function assetSkillsValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function assetSkillsValidator()
Loading history...
139
        return $this->skillsValidator($application, 'asset');
140
    }
141
142
    public function assetSkillsComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function assetSkillsComplete()
Loading history...
143
        return $this->assetSkillsValidator($application)->passes();
144
    }
145
146
    public function affirmationValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function affirmationValidator()
Loading history...
147
        $rules = [
148
            'submission_signature' => [
149
                'required',
150
                'string',
151
                'max:191',
152
            ],
153
            'submission_date' => [
154
                'required',
155
                'string',
156
                'max:191',
157
           ]
158
        ];
159
        return Validator::make($application->toArray(), $rules);
160
    }
161
162
    public function affirmationComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function affirmationComplete()
Loading history...
163
        return $this->affirmationValidator($application)->passes();
164
    }
165
}
166