Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
64.29% covered (warning)
64.29%
27 / 42
16.67% covered (danger)
16.67%
1 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
CustomHasRoles
64.29% covered (warning)
64.29%
27 / 42
16.67% covered (danger)
16.67%
1 / 6
27.66
0.00% covered (danger)
0.00%
0 / 1
 hasRole
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 roles
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 assignRole
76.92% covered (warning)
76.92%
20 / 26
0.00% covered (danger)
0.00%
0 / 1
10.00
 removeRole
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 removeAllRoles
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isAdmin
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Traits;
4
5use App\Http\Models\Admin\CompanyGroup;
6use App\Http\Models\Auth\Role;
7use App\Http\Models\Auth\UserRole;
8use App\Http\Models\SalesProTeamManager;
9
10trait CustomHasRoles
11{
12    /**
13     * Determine if the User has the given role.
14     */
15    public function hasRole(string $roleName): bool
16    {
17        $role = Role::firstWhere('name', trim($roleName));
18
19        if (empty($role)){
20            throw new \Error('Unsupported role.');
21        }
22
23        return UserRole::where([['user_id', $this->id], ['role_id', $role->id]])->exists();
24    }
25
26    /**
27     * Retrieve roles the User has
28     */
29    public function roles(): array
30    {
31        return UserRole::where('user_id', $this->id)
32            ->get()
33            ->pluck('role.name')
34            ->toArray();
35    }
36
37    /**
38     * Assign Role by name to User
39     */
40    public function assignRole(string $roleName, array $group_ids): ?UserRole
41    {
42        if ($this->hasRole($roleName)) {
43            return null;
44        }
45
46        $role = Role::firstWhere('name', trim($roleName));
47
48        $role = UserRole::create([
49            'user_id' => $this->id,
50            'role_id' => $role->id,
51        ]);
52
53        if ($role->name == Role::GROUP_ADMIN || $role->name = Role::REPORTING_ADMIN) {
54            $management_record = $this->sales_pro_team_manager;
55            if (!$management_record) {
56                $management_record = new SalesProTeamManager();
57                $management_record->user_id = $this->id;
58                $management_record->company_id = $this->company_id;
59                $management_record->first_name = $this->first_name;
60                $management_record->last_name = $this->last_name;
61                $management_record->email = $this->email;
62                $management_record->save();
63            }
64
65            if (!empty($group_ids)) {
66                $groups = CompanyGroup::whereIn('_id', $group_ids)->get();
67                if ($groups->isNotEmpty()) {
68                    $management_record->groups()->sync($groups);
69                }
70            }
71
72            $new_group_id = !empty($group_ids) ? $group_ids[0] : null;
73            if ($this->company_group_id !== $new_group_id) {
74                $this->company_group_id = $new_group_id;
75                $this->save();
76            }
77        }
78
79        return $role;
80    }
81
82    /**
83     * Revoke the given role from the User.
84     */
85    public function removeRole(string $roleName) : ?bool
86    {
87        if (! $this->hasRole($roleName)) {
88            return null;
89        }
90
91        $role = Role::firstWhere('name', trim($roleName));
92
93        return UserRole::where([['user_id', $this->id], ['role_id', $role->id]])->delete();
94    }
95
96    /**
97     * Revoke all roles from the User.
98     */
99    public function removeAllRoles() : ?bool
100    {
101        return UserRole::where('user_id', $this->id)->delete();
102    }
103
104    /**
105     * Check if the user is an admin
106     */
107    public function isAdmin(): bool
108    {
109        return !empty(array_intersect(
110            $this->roles(), [Role::REPORTING_ADMIN, Role::GROUP_ADMIN, Role::GLOBAL_ADMIN, Role::VENGRESO_ADMIN])
111        );
112    }
113}