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    protected static function getAvailabilityData($input)
40    {
41        $availabilityList = (new AvailabilityList())->addData($input['availabilityList']);
42        $conflictedList = [];
43
44        $selectedDateTime = (new DateTimeImmutable($input['selectedDate']))->modify(\App::$now->format('H:i:s'));
45        $selectedAvailability = new Availability($input['selectedAvailability']);
46        $startDateTime = ($selectedAvailability->getStartDateTime() >= \App::$now) ?
47            $selectedAvailability->getStartDateTime() : $selectedDateTime;
48        $endDateTime = ($input['selectedAvailability']) ?
49            $selectedAvailability->getEndDateTime() : $selectedDateTime;
50
51        $availabilityList = $availabilityList->sortByCustomStringKey('endTime');
52        $conflictList = $availabilityList->getConflicts($startDateTime, $endDateTime);
53
54        foreach ($conflictList as $conflict) {
55            $availabilityId = ($conflict->getFirstAppointment()->getAvailability()->getId()) ?
56                $conflict->getFirstAppointment()->getAvailability()->getId() :
57                $conflict->getFirstAppointment()->getAvailability()->tempId;
58            if (! in_array($availabilityId, $conflictedList)) {
59                $conflictedList[] = $availabilityId;
60            }
61        }
62
63        return [
64            'conflictList' => $conflictList->toConflictListByDay(),
65            'conflictIdList' => (count($conflictedList)) ? $conflictedList : []
66        ];
67    }
68}