Lines 100.00% 27 / 27
Functions and Methods 100.00% 2 / 2
Classes and Traits 100.00% 1 / 1
Name Lines Functions and Methods CRAP Classes and Traits
AvailabilityConflicts 100.00% 27 / 27 100.00% 2 / 2 8 100.00% 1 / 1
 readResponse 100.00% 7 / 7 100.00% 1 / 1 1
 getAvailabilityData 100.00% 20 / 20 100.00% 1 / 1 7
1<?php
2
3/**
4 * @package Zmsadmin
5 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
6 **/
7
8namespace BO\Zmsadmin\Helper;
9
10use BO\Slim\Render;
11use BO\Zmsadmin\BaseController;
12use BO\Zmsentities\Availability;
13use BO\Zmsentities\Collection\AvailabilityList;
14use Psr\Http\Message\RequestInterface;
15use Psr\Http\Message\ResponseInterface;
16use DateTimeImmutable;
17
18class AvailabilityConflicts extends BaseController
19{
20    /**
21     * @SuppressWarnings(Param)
22     * @return ResponseInterface
23     */
24    #[\Override]
25    public function readResponse(
26        RequestInterface $request,
27        ResponseInterface $response,
28        array $args
29    ): ResponseInterface {
30        $validator = $request->getAttribute('validator');
31        $input = $validator->getInput()->isJson()->assertValid()->getValue();
32        $data = static::getAvailabilityData($input);
33        return Render::withJson(
34            $response,
35            $data
36        );
37    }
38
39    /**
40     * @return (array|mixed)[]
41     *
42     */
43    protected static function getAvailabilityData($input): array
44    {
45        $availabilityList = (new AvailabilityList())->addData($input['availabilityList']);
46        $conflictedList = [];
47
48        $selectedDateTime = (new DateTimeImmutable($input['selectedDate']))->modify(\App::$now->format('H:i:s'));
49        $selectedAvailability = new Availability($input['selectedAvailability']);
50        $startDateTime = ($selectedAvailability->getStartDateTime() >= \App::$now) ?
51            $selectedAvailability->getStartDateTime() : $selectedDateTime;
52        $endDateTime = ($input['selectedAvailability']) ?
53            $selectedAvailability->getEndDateTime() : $selectedDateTime;
54
55        $availabilityList = $availabilityList->sortByCustomStringKey('endTime');
56        $conflictList = $availabilityList->getConflicts($startDateTime, $endDateTime);
57
58        foreach ($conflictList as $conflict) {
59            $availabilityId = ($conflict->getFirstAppointment()->getAvailability()->getId()) ?
60                $conflict->getFirstAppointment()->getAvailability()->getId() :
61                $conflict->getFirstAppointment()->getAvailability()->tempId;
62            if (! in_array($availabilityId, $conflictedList)) {
63                $conflictedList[] = $availabilityId;
64            }
65        }
66
67        return [
68            'conflictList' => $conflictList->toConflictListByDay(),
69            'conflictIdList' => (count($conflictedList)) ? $conflictedList : []
70        ];
71    }
72}