Lines 97.29% 72 / 74
Functions and Methods 60.00% 3 / 5
Classes and Traits 0.00% 0 / 1
Name Lines Functions and Methods CRAP Classes and Traits
ProcessSave 97.29% 72 / 74 60.00% 3 / 5 21 0.00% 0 / 1
 readResponse 97.36% 37 / 38 0.00% 0 / 1 5
 getSuccessMessage 100.00% 1 / 1 100.00% 1 / 1 2
 getConflictList 100.00% 9 / 9 100.00% 1 / 1 5
 writeUpdatedProcess 100.00% 13 / 13 100.00% 1 / 1 4
 shouldSendNotifications 92.30% 12 / 13 0.00% 0 / 1 5.01
1<?php
2
3/**
4 *
5 * @package Zmsadmin
6 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
7 *
8 */
9
10namespace BO\Zmsadmin;
11
12use BO\Mellon\Condition;
13use BO\Slim\Render;
14use BO\Zmsentities\Validator\ProcessValidator;
15use BO\Zmsentities\Process;
16use BO\Zmsadmin\Helper\AppointmentFormHelper;
17
18/**
19 * Update a process
20 */
21class ProcessSave extends BaseController
22{
23    /**
24     * @SuppressWarnings(Param)
25     * @return \Psr\Http\Message\ResponseInterface
26     */
27    #[\Override]
28    public function readResponse(
29        \Psr\Http\Message\RequestInterface $request,
30        \Psr\Http\Message\ResponseInterface $response,
31        array $args
32    ): \Psr\Http\Message\ResponseInterface {
33        $workstation = \App::$http->readGetResult('/workstation/', ['resolveReferences' => 2])->getEntity();
34
35        $validator = $request->getAttribute('validator');
36        $input = $request->getParams();
37
38        $scope = Helper\AppointmentFormHelper::readSelectedScope($request, $workstation);
39        $processId = $validator->value($args['id'])->isNumber()->getValue();
40        $process = \App::$http->readGetResult('/process/' . $processId . '/')->getEntity();
41        $dateTime = ($process->isWithAppointment()) ?
42            (new \DateTime())->setTimestamp($process->getFirstAppointment()->date) :
43            \App::$now;
44        $shouldNotify = $this->shouldSendNotifications($input, $process);
45        $process->withUpdatedData($input, $dateTime, $scope);
46
47        $validatedForm = ($process->isWithAppointment()) ?
48            ProcessReserve::getValidatedForm($validator, $process) :
49            ProcessQueue::getValidatedForm($validator, $process);
50
51        if ($validatedForm['failed']) {
52            return \BO\Slim\Render::withJson(
53                $response,
54                $validatedForm
55            );
56        }
57
58        $process = $this->writeUpdatedProcess(
59            $input,
60            $process,
61            $validator,
62            $shouldNotify
63        );
64        $appointment = $process->getFirstAppointment();
65        $conflictList = ($process->isWithAppointment()) ?
66            static::getConflictList($scope->getId(), $appointment) :
67            null;
68        return \BO\Slim\Render::withHtml(
69            $response,
70            'element/helper/messageHandler.twig',
71            array(
72                'selectedprocess' => $process,
73                'success' => $this->getSuccessMessage($process),
74                'conflictlist' => $conflictList
75            )
76        );
77    }
78
79    protected function getSuccessMessage(Process $process): string
80    {
81        return ($process->isWithAppointment()) ? 'process_updated' : 'process_withoutappointment_updated';
82    }
83
84    public static function getConflictList($scopeId, $appointment)
85    {
86        $conflictList = ScopeAvailabilityDay::readConflictList($scopeId, $appointment->getStartTime());
87        $conflictList = ($conflictList && $conflictList->count()) ?
88            $conflictList
89                ->withTimeRangeByAppointment($appointment)
90                ->setConflictAmendment()
91                ->toConflictListByDay() :
92            null;
93        $dayKey = $appointment->getStartTime()->format('Y-m-d');
94        return ($conflictList && isset($conflictList[$dayKey])) ? $conflictList[$dayKey] : null;
95    }
96
97    protected function writeUpdatedProcess($input, Process $process, $validator, bool $notify = true)
98    {
99        $initiator = $validator->getParameter('initiator')->isString()->getValue();
100        $process = \App::$http->readPostResult(
101            '/process/' . $process->id . '/' . $process->authKey . '/',
102            $process,
103            [
104                'initiator' => $initiator ?? 'admin',
105                'slotType' => 'intern',
106                'slotsRequired' => (isset($input['slotCount']) && 1 < $input['slotCount']) ? $input['slotCount'] : 0
107            ]
108        )->getEntity();
109
110        if ($notify) {
111            AppointmentFormHelper::updateMail($input, $process);
112        }
113
114        return $process;
115    }
116
117    private function shouldSendNotifications($requestData, Process $process): bool
118    {
119        $requestIds = $requestData['requests'] ?? [];
120        $currentRequestIds = [];
121        foreach ($process->getRequests() as $request) {
122            $currentRequestIds[] = $request['id'];
123        }
124
125        if (array_merge(array_diff($requestIds, $currentRequestIds), array_diff($currentRequestIds, $requestIds))) {
126            return true;
127        }
128
129        if ($process->getFirstClient()['familyName'] !== $requestData['familyName']) {
130            return true;
131        }
132
133        $newDate = $requestData['selecteddate'] . ' '
134            . str_replace('-', ':', $requestData['selectedtime']);
135
136        if ($process->getFirstAppointment()->toDateTime()->format('Y-m-d H:i') !== $newDate) {
137            return true;
138        }
139
140        return false;
141    }
142}