Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 60
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
CompanyResource
0.00% covered (danger)
0.00%
0 / 60
0.00% covered (danger)
0.00%
0 / 7
342
0.00% covered (danger)
0.00%
0 / 1
 toArray
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
30
 findClosestDate
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 getLicenseCount
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
 processGroups
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
12
 getAllUsers
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 getActiveLicense
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 formatDate
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Http\Resources;
4
5use Illuminate\Http\Request;
6use Illuminate\Http\Resources\Json\JsonResource;
7use Illuminate\Support\Carbon;
8use Illuminate\Support\Str;
9
10class CompanyResource extends JsonResource
11{
12    /**
13     * Transform the resource into an array.
14     *
15     * @return array<string, mixed>
16     */
17    public function toArray(Request $request): array
18    {
19        $license = $this->getActiveLicense($this);
20        $lastModifiedDate = $this->findClosestDate($license?->updated_at, $this->updated_at);
21
22        $statusDate = match (true) {
23            ! is_null($this->deleted_at) => $this->deleted_at->toFormattedDateString(),
24            ! is_null($this->created_at) => $this->created_at->toFormattedDateString(),
25            default => null,
26        };
27
28        $licenseCount = $this->getLicenseCount($license);
29
30        return [
31            'id' => $this->id,
32            'name' => $this->name,
33            'licenses' => $licenseCount,
34            'contract_term' => $license?->term_of_contract,
35            'contract_start_date' => $license ? $this->formatDate($license->contract_start_date) : null,
36            'contract_end_date' => $license ? $this->formatDate($license->contract_end_date) : null,
37            'auto_renewal' => $license?->auto_renew_license === true ? 'Yes' : 'No',
38            'payment_options' => $license?->auto_renew_license === true ? 'Auto-Pay' : 'Invoice',
39            'account_status' => $license?->status ?? 'Inactive',
40            'last_modified_on' => $this->formatDate($lastModifiedDate),
41            'status_date' => $statusDate,
42            'created_at' => $this->created_at,
43            'slug' => Str::slug($this->name),
44            'groups' => $this->processGroups($this->groupsAndSubgroups),
45        ];
46    }
47
48    private function findClosestDate($date1, $date2)
49    {
50        $now = now();
51
52        if ($date1 === null) {
53            return $date2;
54        }
55
56        $diff1 = $now->diffInSeconds($date1);
57        $diff2 = $now->diffInSeconds($date2);
58
59        return $diff1 < $diff2 ? $date1 : $date2;
60    }
61
62    private function getLicenseCount($license)
63    {
64        if (is_null($license)) {
65            return 0;
66        }
67
68        $licenseCounts = array_filter($license->toArray(), function ($key) {
69            return str_ends_with($key, '_license_count');
70        }, ARRAY_FILTER_USE_KEY);
71
72        return array_sum($licenseCounts);
73    }
74
75    private function processGroups($groups)
76    {
77        if (empty($groups)) {
78            return null;
79        }
80
81        return $groups->map(function ($group) {
82            $allGroupUsers = $this->getAllUsers($group);
83
84            return [
85                'name' => $group->name,
86                'users' => $allGroupUsers->count(),
87                'subgroups' => filled($group->subgroups) ? $group->subgroups->map(function ($subgroup) {
88                    return [
89                        'name' => $subgroup->name,
90                        'users' => $subgroup->users()->count(),
91                    ];
92                }) : null,
93            ];
94        });
95    }
96
97    private function getAllUsers($group)
98    {
99        $users = $group->users;
100        $users = $users->merge($group->groupInvitedUsers);
101        $users = $users->merge($group->subgroupInvitedUsers);
102
103        if (filled($group->subgroups)) {
104            foreach ($group->subgroups as $subgroup) {
105                $users = $users->merge($this->getAllUsers($subgroup));
106            }
107        }
108
109        return $users;
110    }
111
112    private function getActiveLicense($company)
113    {
114        return $company->licenses->first() ?? $company->licenses()->latest()->first();
115    }
116
117    private function formatDate($date)
118    {
119        return Carbon::parse($date)->format('m/d/y');
120    }
121}