Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.30% covered (success)
97.30%
72 / 74
60.00% covered (warning)
60.00%
3 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
ProcessSave
97.30% covered (success)
97.30%
72 / 74
60.00% covered (warning)
60.00%
3 / 5
21
0.00% covered (danger)
0.00%
0 / 1
 readResponse
97.37% covered (success)
97.37%
37 / 38
0.00% covered (danger)
0.00%
0 / 1
5
 getSuccessMessage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 getConflictList
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
5
 writeUpdatedProcess
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
4
 shouldSendNotifications
92.31% covered (success)
92.31%
12 / 13
0.00% covered (danger)
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 as Entity;
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(Entity $process)
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, Entity $process, $validator, $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, \BO\Zmsentities\Schema\Entity $process)
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}