Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 120
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
ProcessChange
0.00% covered (danger)
0.00%
0 / 120
0.00% covered (danger)
0.00%
0 / 6
240
0.00% covered (danger)
0.00%
0 / 1
 readResponse
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
12
 getNewProcess
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getValidatedForm
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 1
20
 writeChangedProcess
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
20
 writeDeletedMail
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 writeConfirmedMail
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
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;
16
17/**
18 * Change process data but keep id
19 */
20class ProcessChange extends BaseController
21{
22    /**
23     * @SuppressWarnings(Param)
24     * @return String
25     */
26    public function readResponse(
27        \Psr\Http\Message\RequestInterface $request,
28        \Psr\Http\Message\ResponseInterface $response,
29        array $args
30    ) {
31        $workstation = \App::$http->readGetResult('/workstation/', ['resolveReferences' => 2])->getEntity();
32        $input = $request->getParams();
33        $scope = Helper\AppointmentFormHelper::readSelectedScope($request, $workstation);
34        $oldProcess = \App::$http
35            ->readGetResult('/process/' . $input['selectedprocess'] . '/')->getEntity();
36        $newProcess = $this->getNewProcess($input, $oldProcess, $scope);
37        $validatedForm = static::getValidatedForm($request->getAttribute('validator'), $newProcess);
38        if ($validatedForm['failed']) {
39            return \BO\Slim\Render::withJson(
40                $response,
41                $validatedForm
42            );
43        }
44
45        $process = static::writeChangedProcess($input, $oldProcess, $newProcess);
46        $queryParams = ('confirmed' == $process->getStatus()) ?
47            ['selectedprocess' => $process, 'success' => 'process_changed'] :
48            [];
49
50        return \BO\Slim\Render::withHtml(
51            $response,
52            'element/helper/messageHandler.twig',
53            $queryParams
54        );
55    }
56
57    protected function getNewProcess($input, $process, $scope)
58    {
59        $newProcess = clone $process;
60        $selectedTime = str_replace('-', ':', $input['selectedtime']);
61        $dateTime = \DateTime::createFromFormat('Y-m-d H:i', $input['selecteddate'] . ' ' . $selectedTime);
62        return $newProcess->withUpdatedData($input, $dateTime, $scope);
63    }
64
65    protected static function getValidatedForm($validator, $process)
66    {
67        $processValidator = new ProcessValidator($process);
68        $delegatedProcess = $processValidator->getDelegatedProcess();
69        $processValidator
70            ->validateName(
71                $validator->getParameter('familyName'),
72                $delegatedProcess->setter('clients', 0, 'familyName')
73            )
74            ->validateRequests(
75                $validator->getParameter('requests'),
76                function () use ($process, $delegatedProcess) {
77                    $arrayKeys = array_keys(json_decode(json_encode($process->requests), true));
78                    foreach ($arrayKeys as $key) {
79                        $delegatedProcess->setter('requests', $key, 'id');
80                        $delegatedProcess->setter('requests', $key, 'source');
81                    }
82                }
83            )
84            ->validateMail(
85                $validator->getParameter('email'),
86                $delegatedProcess->setter('clients', 0, 'email'),
87                new Condition(
88                    $validator->getParameter('sendMailConfirmation')->isNumber()->isNotEqualTo(1),
89                    $validator->getParameter('surveyAccepted')->isString()->isDevoidOf([1])
90                )
91            )
92            ->validateTelephone(
93                $validator->getParameter('telephone'),
94                $delegatedProcess->setter('clients', 0, 'telephone'),
95                new Condition(
96                    $validator->getParameter('sendConfirmation')->isNumber()->isNotEqualTo(1),
97                    $validator->getParameter('sendReminder')->isNumber()->isNotEqualTo(1)
98                )
99            )
100            ->validateSurvey(
101                $validator->getParameter('surveyAccepted'),
102                $delegatedProcess->setter('clients', 0, 'surveyAccepted')
103            )
104            ->validateText(
105                $validator->getParameter('amendment'),
106                $delegatedProcess->setter('amendment')
107            )
108        ;
109
110        $scope = $process->getCurrentScope();
111        if ((int) $scope->getCustomTextfieldActivated()) {
112            $processValidator->validateCustomTextfield(
113                $validator->getParameter('customTextfield'),
114                $delegatedProcess->setter('customTextfield'),
115                (bool) (int) $scope->getCustomTextfieldRequired()
116            );
117        }
118        if ((int) $scope->getCustomTextfield2Activated()) {
119            $processValidator->validateCustomTextfield(
120                $validator->getParameter('customTextfield2'),
121                $delegatedProcess->setter('customTextfield2'),
122                (bool) (int) $scope->getCustomTextfield2Required()
123            );
124        }
125
126        $processValidator
127            ->validateReminderTimestamp(
128                $validator->getParameter('headsUpTime'),
129                $delegatedProcess->setter('reminderTimestamp'),
130                new Condition(
131                    $validator->getParameter('sendReminder')->isNumber()->isNotEqualTo(1)
132                )
133            )
134        ;
135
136
137        $processValidator->getCollection()->addValid(
138            $validator->getParameter('sendConfirmation')->isNumber(),
139            $validator->getParameter('sendReminder')->isNumber()
140        );
141
142        $form = $processValidator->getCollection()->getStatus(null, true);
143        $form['failed'] = $processValidator->getCollection()->hasFailed();
144        return $form;
145    }
146
147    protected static function writeChangedProcess($input, $oldProcess, $newProcess)
148    {
149        $oldAppointment = $oldProcess->getFirstAppointment();
150        $newAppointment = $newProcess->getFirstAppointment();
151        \App::$http->readPostResult(
152            '/process/' . $newProcess['id'] . '/' . $newProcess['authKey'] . '/',
153            $newProcess,
154            ['initiator' => 'admin']
155        );
156        if (! $oldAppointment->isMatching($newAppointment)) {
157            $newProcess = \App::$http->readPostResult(
158                '/process/' . $oldProcess->id . '/' . $oldProcess->authKey . '/appointment/',
159                $newAppointment,
160                [
161                    'resolveReferences' => 1,
162                    'slotType' => 'intern',
163                    'clientkey' => \App::CLIENTKEY,
164                    'slotsRequired' => (isset($input['slotCount']) && 1 < $input['slotCount']) ? $input['slotCount'] : 0
165                ]
166            )->getEntity();
167        }
168        static::writeDeletedMail($oldProcess);
169        static::writeConfirmedMail($input, $newProcess);
170        return $newProcess;
171    }
172
173    protected static function writeDeletedMail($oldProcess)
174    {
175            $oldProcess->status = 'deleted';
176            ProcessDelete::writeDeleteMailNotifications($oldProcess);
177    }
178
179    protected static function writeConfirmedMail($input, $newProcess)
180    {
181        if ('confirmed' == $newProcess->getStatus()) {
182            Helper\AppointmentFormHelper::updateMail($input, $newProcess);
183        }
184    }
185}