Passed
Push — feature/update-managers-applca... ( b38314...b92f9a )
by Yonathan
04:52
created

JobPolicy::reviewApplicationsFor()   A

Complexity

Conditions 5
Paths 12

Size

Total Lines 8
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
c 1
b 0
f 0
dl 0
loc 8
rs 9.6111
cc 5
nc 12
nop 2
1
<?php
2
3
namespace App\Policies;
4
5
use App\Models\User;
6
use App\Models\JobPoster;
7
use App\Policies\BasePolicy;
8
use Illuminate\Support\Facades\Log;
9
10
class JobPolicy extends BasePolicy
11
{
12
13
    /**
14
     * Determine whether the user can view the job poster.
15
     *
16
     * @param \App\Models\?User     $user      User object making the request.
17
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
18
     * @return mixed
19
     */
20
    public function view(?User $user, JobPoster $jobPoster)
21
    {
22
        // Anyone can view a published job past the open date
23
        // Managers can always view jobs they created.
24
        // Hr Advisors can view all jobs in their department.
25
        return $jobPoster->isPublic() ||
26
            ($user &&
27
                $user->isManager() &&
28
                $jobPoster->manager->user_id == $user->id) ||
29
            ($user &&
30
                $user->isHrAdvisor() &&
31
                $user->department_id === $jobPoster->department_id &&
32
                $jobPoster->isVisibleToHr());
33
    }
34
35
    /**
36
     * Any user is permitted to request a list of jobs,
37
     * but only the jobs they are permitted to *view* should be returned.
38
     *
39
     * @param \App\Models\?User $user User object making the request.
40
     * @return boolean
41
     */
42
    public function viewAny(?User $user)
43
    {
44
        return true;
45
    }
46
47
    /**
48
     * Determine whether the user can create job posters.
49
     *
50
     * @param  \App\Models\User $user User to test against.
51
     * @return mixed
52
     */
53
    public function create(User $user)
54
    {
55
        // Any manager can create a new job poster.
56
        return $user->isManager();
57
    }
58
59
    /**
60
     * Determine whether the user can update the job poster.
61
     *
62
     * @param \App\Models\User      $user      User object making the request.
63
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
64
     * @return mixed
65
     */
66
    public function update(User $user, JobPoster $jobPoster)
67
    {
68
        // Only managers can edit jobs, and only their own, managers can't publish jobs or edit published jobs.
69
        return $user->isManager() &&
70
            $jobPoster->manager->user->id == $user->id &&
71
            $jobPoster->isEditable();
72
    }
73
74
    /**
75
     * Determine whether the user can delete the job poster.
76
     *
77
     * @param \App\Models\User      $user      User object making the request.
78
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
79
     *
80
     * @return boolean
81
     */
82
    public function delete(User $user, JobPoster $jobPoster): bool
83
    {
84
        // Jobs can only be deleted when they're in the 'draft'
85
        // state, and only by managers that created them.
86
        return $user->isManager() &&
87
            $jobPoster->manager->user->id == $user->id &&
88
            $jobPoster->isEditable();
89
    }
90
91
    /**
92
     * Determine whether the user can review applications to the job poster.
93
     *
94
     * @param \App\Models\User      $user      User object making the request.
95
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
96
     * @return mixed
97
     */
98
    public function reviewApplicationsFor(User $user, JobPoster $jobPoster)
99
    {
100
        // Managers can only review applications their own jobs.
101
        // HR Advisors can review applications for jobs they manage.
102
        $authManager = $user->isManager() && $jobPoster->manager->user->id == $user->id;
103
        $authHr = $user->isHrAdvisor() && $this->manage($user, $jobPoster);
104
105
        return $jobPoster->isPublic() && ($authManager || $authHr);
106
    }
107
108
    /**
109
     * Determine whether the user is a Manager or an HR Advisor with permission to manage this job.
110
     *
111
     * @param \App\Models\User      $user      User object making the request.
112
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
113
     * @return boolean
114
     */
115
    public function manage(User $user, JobPoster $jobPoster)
116
    {
117
        return ($user->isManager() &&
118
            $jobPoster->manager->user->id == $user->id) ||
119
            ($user->isHrAdvisor()
120
                && $this->view($user, $jobPoster)
121
                && $user->hr_advisor->claimed_job_ids->contains($jobPoster->id));
122
    }
123
124
    /**
125
     * Determine whether the user can view the comments.
126
     *
127
     * @param \App\Models\User      $user      User object making the request.
128
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
129
     * @return boolean
130
     */
131
    public function viewComments(User $user, JobPoster $jobPoster): bool
132
    {
133
        // Only the manager that created the job can view the comment.
134
        // Only Hr advisors who have claimed a job can view the comments.
135
        return $this->manage($user, $jobPoster);
136
    }
137
138
    /**
139
     * Determine whether the user can create a comment
140
     *
141
     * @param \App\Models\User      $user      User object making the request.
142
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
143
     * @return boolean
144
     */
145
    public function storeComment(User $user, JobPoster $jobPoster): bool
146
    {
147
        // Only the manager that created the job can view the comment.
148
        // Only Hr advisors who have claimed a job can view the comments.
149
        return $this->viewComments($user, $jobPoster);
150
    }
151
152
    /**
153
     * Determine whether the user can 'claim' this job.
154
     *
155
     * @param \App\Models\User      $user      User object making the request.
156
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
157
     * @return boolean
158
     */
159
    public function claim(User $user, JobPoster $jobPoster): bool
160
    {
161
        return $user->isHrAdvisor() && $this->view($user, $jobPoster);
162
    }
163
164
    /**
165
     * Determine whether the user can 'unclaim' this job.
166
     *
167
     * @param \App\Models\User      $user      User object making the request.
168
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
169
     * @return boolean
170
     */
171
    public function unClaim(User $user, JobPoster $jobPoster): bool
172
    {
173
        return $this->claim($user, $jobPoster);
174
    }
175
176
    /**
177
     * Determine whether the user can view assessment plan.
178
     *
179
     * @param \App\Models\User      $user      User object making the request.
180
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
181
     * @return boolean
182
     */
183
    public function viewAssessmentPlan(User $user, JobPoster $jobPoster): bool
184
    {
185
        return $user->isAdmin() ||
186
            $user->isManager() && $jobPoster->manager->user_id === $user->id ||
187
            $user->isHrAdvisor() && $jobPoster->hr_advisors->contains('user_id', $user->id);
188
    }
189
190
    /**
191
     * Determine whether the user can download CSV file of applicants who have applied to job.
192
     *
193
     * @param \App\Models\User      $user      User object making the request.
194
     * @param \App\Models\JobPoster $jobPoster Job Poster object being acted upon.
195
     * @return boolean
196
     */
197
    public function downloadApplicants(User $user, JobPoster $jobPoster): bool
198
    {
199
        return $user->isAdmin() && $jobPoster->isPublic();
200
    }
201
}
202