Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
AvailabilityConflicts
100.00% covered (success)
100.00%
28 / 28
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%
21 / 21
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;
9
10use BO\Zmsentities\Availability;
11use BO\Zmsentities\Collection\AvailabilityList;
12
13/**
14 * Check if new Availability is in conflict with existing availability
15 *
16 */
17class AvailabilityConflicts extends BaseController
18{
19    /**
20     * @SuppressWarnings(Param)
21     * @return String
22     */
23    public function readResponse(
24        \Psr\Http\Message\RequestInterface $request,
25        \Psr\Http\Message\ResponseInterface $response,
26        array $args
27    ) {
28        $validator = $request->getAttribute('validator');
29        $input = $validator->getInput()->isJson()->assertValid()->getValue();
30        $data = static::getAvailabilityData($input);
31        return \BO\Slim\Render::withJson(
32            $response,
33            $data
34        );
35    }
36
37    protected static function getAvailabilityData($input)
38    {
39        $conflictList = new \BO\Zmsentities\Collection\ProcessList();
40        $availabilityList = (new AvailabilityList())->addData($input['availabilityList']);
41        $conflictedList = [];
42
43        $selectedDateTime = (new \DateTimeImmutable($input['selectedDate']))->modify(\App::$now->format('H:i:s'));
44        $selectedAvailability = new Availability($input['selectedAvailability']);
45        $startDateTime = ($selectedAvailability->getStartDateTime() >= \App::$now) ?
46            $selectedAvailability->getStartDateTime() : $selectedDateTime;
47        $endDateTime = ($input['selectedAvailability']) ?
48            $selectedAvailability->getEndDateTime() : $selectedDateTime;
49
50        $availabilityList = $availabilityList->sortByCustomStringKey('endTime');
51        $conflictList = $availabilityList->getConflicts($startDateTime, $endDateTime);
52
53        foreach ($conflictList as $conflict) {
54            $availabilityId = ($conflict->getFirstAppointment()->getAvailability()->getId()) ?
55                $conflict->getFirstAppointment()->getAvailability()->getId() :
56                $conflict->getFirstAppointment()->getAvailability()->tempId;
57            if (! in_array($availabilityId, $conflictedList)) {
58                $conflictedList[] = $availabilityId;
59            }
60        }
61
62        return [
63            'conflictList' => $conflictList->toConflictListByDay(),
64            'conflictIdList' => (count($conflictedList)) ? $conflictedList : []
65        ];
66    }
67
68    /*
69    protected static function getAvailabilityList($scope, $dateTime)
70    {
71        try {
72            $availabilityList = \App::$http
73                ->readGetResult(
74                    '/scope/' . $scope->getId() . '/availability/',
75                    [
76                        'resolveReferences' => 0,
77                        'startDate' => $dateTime->format('Y-m-d') //for skipping old availabilities
78                    ]
79                )
80                ->getCollection();
81        } catch (\BO\Zmsclient\Exception $exception) {
82            if ($exception->template != 'BO\Zmsapi\Exception\Availability\AvailabilityNotFound') {
83                throw $exception;
84            }
85            $availabilityList = new \BO\Zmsentities\Collection\AvailabilityList();
86        }
87        return $availabilityList->withScope($scope);
88    }
89    */
90}