Passed
Push — feature/screening-plan ( a30cac...87436a )
by Tristan
07:23
created

ApplicationValidator   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 169
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 21
eloc 85
dl 0
loc 169
ccs 0
cts 86
cp 0
rs 10
c 0
b 0
f 0

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A assetSkillsComplete() 0 2 1
A basicsValidator() 0 27 3
A arrayMapKeys() 0 6 2
A skillsValidator() 0 25 4
A essentialSkillsComplete() 0 2 1
A experienceValidator() 0 3 1
A basicsComplete() 0 3 1
A essentialSkillsValidator() 0 2 1
A affirmationValidator() 0 14 1
A validate() 0 32 1
A affirmationComplete() 0 2 1
A addNestedValidatorRules() 0 9 1
A assetSkillsValidator() 0 2 1
A experienceComplete() 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
        $backendRules = [
31
            'job_poster_id' => 'required',
32
            'application_status_id' => 'required',
33
            'applicant_id' => 'required'
34
        ];
35
36
        $rules = array_merge(
37
            $backendRules,
38
            //$this->basicsValidator($application)->getRules(),
39
            $this->experienceValidator($application)->getRules(),
40
            //$this->essentialSkillsValidator($application)->getRules(),
41
            $this->affirmationValidator($application)->getRules()
42
        );
43
44
        $data = $application->toArray();
45
46
        // Combining and simplifiying error messages
47
        $rules = array_merge(
48
            $rules,
49
            ['application_step_1' => 'required|boolean|accepted'],
50
            ['application_step_3' => 'required|boolean|accepted']
51
        );
52
        $data = array_merge(
53
            $data,
54
            ['application_step_1' => $this->basicsComplete($application)],
55
            ['application_step_3' => $this->essentialSkillsComplete($application)]
56
        );
57
58
        //Validate basic data is filled in
59
        Validator::make($data, $rules)->validate();
60
    }
61
62
    protected function arrayMapKeys($fn, $array) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function arrayMapKeys()
Loading history...
63
        $newArray = [];
64
        foreach($array as $key => $value) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
65
            $newArray[$fn($key)] = $value;
66
        }
67
        return $newArray;
68
    }
69
70
    protected function addNestedValidatorRules($nestedAttribute, $validatorRules, $rules = []) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function addNestedValidatorRules()
Loading history...
71
        // prepend the attribute name of each validator rule with the nested attribute name
72
        $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...
73
                return implode('.', [$nestedAttribute, $key]);
74
            },
0 ignored issues
show
Coding Style introduced by
Closing brace indented incorrectly; expected 8 spaces, found 12
Loading history...
75
            $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...
76
        //Merge new rules with old rules
77
        $rules = array_merge($rules, $newRules);
78
        return $rules;
79
    }
80
81
    public function basicsValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function basicsValidator()
Loading history...
82
        // Validate the fields common to every application
83
        $rules = [
84
            'citizenship_declaration_id' => ['required', Rule::in($this->citizenship_ids)],
85
            'veteran_status_id' => ['required', Rule::in($this->veteran_status_ids)],
86
            'preferred_language_id' => ['required', Rule::in($this->preferred_language_ids)],
87
        ];
88
89
        //Load application answers so they are included in application->toArray()
90
        $application->load('job_application_answers');
91
92
        // Validate that each question has been answered
93
        $jobPosterQuestionRules = [];
94
        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...
95
            $jobPosterQuestionRules[] = new ContainsObjectWithAttributeRule('job_poster_question_id', $question->id);
96
        }
97
        $rules['job_application_answers'] = $jobPosterQuestionRules;
98
        $answerValidatorFactory = new JobApplicationAnswerValidator($application);
99
100
        //Validate that each answer is complete
101
        foreach($application->job_application_answers as $key=>$answer) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
102
            $attribute = implode('.', ['job_application_answers', $key]);
103
            $rules = $this->addNestedValidatorRules($attribute, $answerValidatorFactory->rules(), $rules);
104
        }
105
106
        $validator = Validator::make($application->toArray(), $rules);
107
        return $validator;
108
    }
109
110
    public function basicsComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function basicsComplete()
Loading history...
111
        $validator = $this->basicsValidator($application);
112
        return $validator->passes();
113
    }
114
115
    public function experienceValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function experienceValidator()
Loading history...
116
        $rules = ['experience_saved' => 'required|boolean|accepted'];
117
        return Validator::make($application->toArray(), $rules);
118
    }
119
120
    public function experienceComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function experienceComplete()
Loading history...
121
        return $this->experienceValidator($application)->passes();
122
    }
123
124
    protected function skillsValidator(JobApplication $application, $criteria_type) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function skillsValidator()
Loading history...
125
        $rules = [];
126
127
        $skillDeclarationRules = [];
128
        $criteriaTypeId = CriteriaType::where('name', $criteria_type)->firstOrFail()->id;
129
        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...
130
            //Validate that every essential skill has a corresponding declaration
131
            $skillDeclarationRules[] = new ContainsObjectWithAttributeRule('skill_id', $criteria->skill_id);
132
        }
133
        $rules['skill_declarations'] = $skillDeclarationRules;
134
        $application->applicant->load('skill_declarations');
135
136
        //Validate that those declarations are complete
137
        $skilDeclarationValidatorFactory = new SkillDeclarationValidator($application->applicant);
138
        $relevantSkillIds = $application->job_poster->criteria->where('criteria_type_id', $criteriaTypeId)->pluck('skill_id');
139
        foreach( $application->skill_declarations as $key=>$declaration) {
0 ignored issues
show
Coding Style introduced by
Expected "foreach (...) {\n"; found "foreach(...) {\n"
Loading history...
140
            if ($relevantSkillIds->contains($declaration->skill_id)) {
141
                $attribute = implode('.', ['skill_declarations', $key]);
142
                $skillDeclarationValidator = $skilDeclarationValidatorFactory->validator($declaration);
0 ignored issues
show
Bug introduced by
The method validator() does not exist on App\Services\Validation\SkillDeclarationValidator. Did you maybe mean validate()? ( Ignorable by Annotation )

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

142
                /** @scrutinizer ignore-call */ 
143
                $skillDeclarationValidator = $skilDeclarationValidatorFactory->validator($declaration);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
143
                $rules = $this->addNestedValidatorRules($attribute, $skillDeclarationValidator->getRules(), $rules);
144
            }
145
        }
146
147
        $validator = Validator::make($application->toArray(), $rules);
148
        return $validator;
149
    }
150
151
    public function essentialSkillsValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function essentialSkillsValidator()
Loading history...
152
        return $this->skillsValidator($application, 'essential');
153
    }
154
155
    public function essentialSkillsComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function essentialSkillsComplete()
Loading history...
156
        return $this->essentialSkillsValidator($application)->passes();
157
    }
158
159
    public function assetSkillsValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function assetSkillsValidator()
Loading history...
160
        return $this->skillsValidator($application, 'asset');
161
    }
162
163
    public function assetSkillsComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function assetSkillsComplete()
Loading history...
164
        return $this->assetSkillsValidator($application)->passes();
165
    }
166
167
    public function affirmationValidator(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function affirmationValidator()
Loading history...
168
        $rules = [
169
            'submission_signature' => [
170
                'required',
171
                'string',
172
                'max:191',
173
            ],
174
            'submission_date' => [
175
                'required',
176
                'string',
177
                'max:191',
178
           ]
179
        ];
180
        return Validator::make($application->toArray(), $rules);
181
    }
182
183
    public function affirmationComplete(JobApplication $application) {
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function affirmationComplete()
Loading history...
184
        return $this->affirmationValidator($application)->passes();
185
    }
186
}
187