Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
27 / 27
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
AvailabilityConflicts
100.00% covered (success)
100.00%
27 / 27
100.00% covered (success)
100.00%
2 / 2
8
100.00% covered (success)
100.00%
1 / 1
 readResponse
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 getAvailabilityData
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
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}