Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
89.74% covered (warning)
89.74%
35 / 39
40.00% covered (danger)
40.00%
2 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
StoreUserService
89.74% covered (warning)
89.74%
35 / 39
40.00% covered (danger)
40.00%
2 / 5
9.09
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 store
90.00% covered (success)
90.00%
18 / 20
0.00% covered (danger)
0.00%
0 / 1
3.01
 mountUserModel
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 processTeamDefaultToUser
85.71% covered (warning)
85.71%
6 / 7
0.00% covered (danger)
0.00%
0 / 1
3.03
 fetchUser
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Domain\User\Services;
4
5use App\Events\ServiceProcessed;
6use App\Models\Team\Team;
7use App\Models\User;
8
9use Domain\User\DTOs\UserDTO;
10use Domain\User\Enums\UserLogOperationEnum;
11use Domain\User\Exceptions\UserSectorDoesNotMatchException;
12
13readonly class StoreUserService
14{
15    private UserDTO $userDTO;
16    private User $user;
17
18    /**
19     * @param UserDTO $userDTO
20     * @param User $user
21     */
22    public function __construct(UserDTO $userDTO, User $user)
23    {
24        $this->userDTO = $userDTO;
25        $this->user = $user;
26    }
27
28    public function store(): User
29    {
30        (new UserAccessValidatorService())->validate($this->userDTO->accessLevel);
31
32        $keysIntersect = array_intersect(
33            array_keys($this->user->currentAccessToken()->abilities),
34            array_keys($this->userDTO->accessLevel)
35        );
36
37        if(empty($keysIntersect)){
38            throw new UserSectorDoesNotMatchException(__('Cannot create a user from a different sector'));
39        }
40
41        $userData = $this->mountUserModel();
42
43        /** @var User $user */
44        $user = User::create($userData);
45
46        $this->processTeamDefaultToUser(array_keys($this->userDTO->accessLevel), $user);
47
48        (new StoreUserLogService())->store(
49            $user,
50            $this->user,
51            UserLogOperationEnum::INSERT,
52            $user->getAttributes()
53        );
54
55        if ($this->userDTO->erp_user) {
56            $this->fetchUser($this->userDTO->erp_user, $user);
57        }
58
59        ServiceProcessed::dispatch(self::class, $this->user);
60        return $user;
61    }
62
63    /**
64     * @return array
65     */
66    private function mountUserModel(): array
67    {
68        $userData = $this->userDTO->toArray();
69        $userData['password'] = $this->userDTO->password();
70        $userData['integrations'] = [
71            'senior' => [
72                'user' => $this->userDTO->erp_user,
73                'password' => null
74            ]
75        ];
76
77        return $userData;
78    }
79
80    private function processTeamDefaultToUser(array $sectors, User $user)
81    {
82        foreach ($sectors as $sector) {
83            $team = Team::query()
84                ->where('sector', $sector)
85                ->where('default', true)
86                ->first();
87
88            if ($team) {
89                (new StoreTeamUserService($user, $team))->store();
90            }
91        }
92    }
93
94    /**
95     * @return string $erp_user
96     * @return User $user
97     * @throws IntegrationSoapSeniorException
98     */
99    private function fetchUser(string $erp_user, User $user)
100    {
101        (new ImportSeniorUSerService())->import($erp_user, 'username', $user);
102    }
103}