Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.57% covered (success)
90.57%
48 / 53
85.71% covered (warning)
85.71%
6 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
AvailableDaysListService
90.57% covered (success)
90.57%
48 / 53
85.71% covered (warning)
85.71%
6 / 7
15.19
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
 getAvailableDaysList
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 extractClientData
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
5
 isCaptchaRequired
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 validateClientData
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 getAvailableDays
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 getAvailableDaysListByOffice
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3declare(strict_types=1);
4
5namespace BO\Zmscitizenapi\Services\Availability;
6
7use BO\Zmscitizenapi\Models\AvailableDays;
8use BO\Zmscitizenapi\Models\AvailableDaysByOffice;
9use BO\Zmscitizenapi\Services\Captcha\TokenValidationService;
10use BO\Zmscitizenapi\Services\Core\ValidationService;
11use BO\Zmscitizenapi\Services\Core\ZmsApiFacadeService;
12
13class AvailableDaysListService
14{
15    use ServiceLocationValidationTrait;
16
17    private TokenValidationService $tokenValidator;
18    private ZmsApiFacadeService $zmsApiFacadeService;
19
20    public function __construct()
21    {
22        $this->tokenValidator = new TokenValidationService();
23        $this->zmsApiFacadeService = new ZmsApiFacadeService();
24    }
25
26    public function getAvailableDaysList(array $queryParams): AvailableDays|array
27    {
28        $clientData = $this->extractClientData($queryParams);
29        $errors = $this->validateClientData($clientData);
30        if (!empty($errors['errors'])) {
31            return $errors;
32        }
33
34        $errors = $this->validateServiceLocations($clientData->officeIds, $clientData->serviceIds);
35        if ($errors !== null) {
36            return $errors;
37        }
38
39        return $this->getAvailableDays($clientData);
40    }
41
42    private function extractClientData(array $queryParams): object
43    {
44        $queryParams['officeId'] = isset($queryParams['officeId']) ? (string) $queryParams['officeId'] : '';
45        $queryParams['serviceId'] = isset($queryParams['serviceId']) ? (string) $queryParams['serviceId'] : '';
46        $serviceCount = $queryParams['serviceCount'] ?? '';
47        $serviceCounts = !empty($serviceCount)
48            ? array_map('trim', explode(',', (string) $serviceCount))
49            : [];
50        return (object) [
51            'officeIds' => array_map('trim', explode(',', $queryParams['officeId'])),
52            'serviceIds' => array_map('trim', explode(',', $queryParams['serviceId'])),
53            'serviceCounts' => $serviceCounts,
54            'startDate' => $queryParams['startDate'] ?? null,
55            'endDate' => $queryParams['endDate'] ?? null,
56            'captchaToken' => isset($queryParams['captchaToken']) ? (string) $queryParams['captchaToken'] : null
57        ];
58    }
59
60    private function isCaptchaRequired(array $officeIds): bool
61    {
62        $officeId = (int)($officeIds[0] ?? 0);
63
64        try {
65            $scope = $this->zmsApiFacadeService->getScopeByOfficeId($officeId);
66            return $scope->captchaActivatedRequired ?? false;
67        } catch (\Throwable $e) {
68            return false;
69        }
70    }
71
72    private function validateClientData(object $data): array
73    {
74        $captchaRequired = $this->isCaptchaRequired($data->officeIds);
75
76        return ValidationService::validateGetBookableFreeDays(
77            $data->officeIds,
78            $data->serviceIds,
79            $data->startDate,
80            $data->endDate,
81            $data->serviceCounts,
82            $captchaRequired,
83            $data->captchaToken,
84            $this->tokenValidator
85        );
86    }
87
88    private function getAvailableDays(object $data, ?bool $groupByOffice = false): AvailableDays|AvailableDaysByOffice|array
89    {
90        return ZmsApiFacadeService::getBookableFreeDays(
91            $data->officeIds,
92            $data->serviceIds,
93            $data->serviceCounts,
94            $data->startDate,
95            $data->endDate,
96            $groupByOffice
97        );
98    }
99
100    public function getAvailableDaysListByOffice($queryParams)
101    {
102        $clientData = $this->extractClientData($queryParams);
103        $errors = $this->validateClientData($clientData);
104        if (!empty($errors['errors'])) {
105            return $errors;
106        }
107
108        return $this->getAvailableDays($clientData, true);
109    }
110}