Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
5287 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Library\Functions;
5572 eleazar 13
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
14
use LeadersLinked\Mapper\UserMapper;
15
use LeadersLinked\Mapper\CompanyMapper;
16
use LeadersLinked\Model\Company;
17
use Laminas\Hydrator\ArraySerializableHydrator;
18
use Laminas\Db\ResultSet\HydratingResultSet;
19
use LeadersLinked\Mapper\QueryMapper;
20
use Laminas\Paginator\Adapter\DbSelect;
21
use Laminas\Paginator\Paginator;
22
use Laminas\Db\Adapter\AdapterInterface;
5287 eleazar 23
use LeadersLinked\Mapper\SurveyTestMapper;
5557 eleazar 24
use LeadersLinked\Mapper\SurveyMapper;
25
use LeadersLinked\Mapper\SurveyFormMapper;
5287 eleazar 26
use LeadersLinked\Form\SurveyTestForm;
27
use LeadersLinked\Model\SurveyTest;
28
class SurveyTestController extends AbstractActionController {
29
 
30
    /**
31
     *
32
     * @var AdapterInterface
33
     */
34
    private $adapter;
35
 
36
    /**
37
     *
38
     * @var AbstractAdapter
39
     */
40
    private $cache;
41
 
42
    /**
43
     *
44
     * @var  LoggerInterface
45
     */
46
    private $logger;
47
 
48
    /**
49
     *
50
     * @var array
51
     */
52
    private $config;
53
 
54
    /**
55
     *
56
     * @param AdapterInterface $adapter
57
     * @param AbstractAdapter $cache
58
     * @param LoggerInterface $logger
59
     * @param array $config
60
     */
61
    public function __construct($adapter, $cache, $logger, $config) {
62
        $this->adapter = $adapter;
63
        $this->cache = $cache;
64
        $this->logger = $logger;
65
        $this->config = $config;
66
    }
67
 
68
    public function indexAction() {
5889 eleazar 69
 
5287 eleazar 70
        $request = $this->getRequest();
71
        $currentUserPlugin = $this->plugin('currentUserPlugin');
72
        $currentCompany = $currentUserPlugin->getCompany();
73
        $currentUser = $currentUserPlugin->getUser();
74
 
5887 eleazar 75
        try{
5287 eleazar 76
        $request = $this->getRequest();
77
        if ($request->isGet()) {
78
 
79
            $headers = $request->getHeaders();
80
 
81
            $isJson = false;
82
            if ($headers->has('Accept')) {
83
                $accept = $headers->get('Accept');
84
 
85
                $prioritized = $accept->getPrioritized();
86
 
87
                foreach ($prioritized as $key => $value) {
88
                    $raw = trim($value->getRaw());
89
 
90
                    if (!$isJson) {
91
                        $isJson = strpos($raw, 'json');
92
                    }
93
                }
94
            }
95
 
96
            if ($isJson) {
5885 eleazar 97
                $survey_uuid = $this->params()->fromRoute('survey_id');
98
 
99
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
100
                $survey = $surveyMapper->fetchOneByUuid($survey_uuid);
6804 eleazar 101
 
5607 eleazar 102
                $search = $this->params()->fromQuery('search', []);
5287 eleazar 103
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
104
 
105
                $page = intval($this->params()->fromQuery('start', 1), 10);
106
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
107
                $order = $this->params()->fromQuery('order', []);
108
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
109
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
110
 
6801 eleazar 111
                $fields = ['first_name'];
112
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
5613 eleazar 113
 
5614 eleazar 114
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
115
                    $order_direction = 'ASC';
116
                }
117
 
6808 eleazar 118
                $queryMapper = QueryMapper::getInstance($this->adapter);
119
                $sql = $queryMapper->getSql();
120
                $select = $sql->select();
6810 eleazar 121
                $select->columns(['id', 'uuid', 'first_name', 'added_on']);
6808 eleazar 122
                $select->from(['tb1' => SurveyTestMapper::_TABLE]);
6815 eleazar 123
                $select->where->equalTo('tb1.survey_id', $survey->id);
6808 eleazar 124
 
6809 eleazar 125
                if($search) {
126
                    $select->where->nest()
127
                    ->like('first_name', '%' . $search . '%')
128
                    ->unnest();
129
                }
130
 
131
                $select->order($order_field . ' ' . $order_direction);
132
 
133
                $hydrator = new ArraySerializableHydrator();
134
                $resultset = new HydratingResultSet($hydrator);
135
 
136
                $adapter = new DbSelect($select, $sql, $resultset);
137
                $paginator = new Paginator($adapter);
138
                $paginator->setItemCountPerPage($records_x_page);
139
                $paginator->setCurrentPageNumber($page);
140
 
141
 
5287 eleazar 142
                $items = [];
143
                $records = $paginator->getCurrentItems();
6822 eleazar 144
 
5287 eleazar 145
                foreach ($records as $record) {
5569 eleazar 146
                    $params = [
6804 eleazar 147
                        'survey_id' => $survey_uuid,
6812 eleazar 148
                        'uuid' => $record['uuid'],
5569 eleazar 149
                    ];
6822 eleazar 150
                    return new JsonModel([
151
                    'success' => false,
152
                    'data' => $params
153
                    ]);
6668 eleazar 154
 
5287 eleazar 155
                    $item = [
6813 eleazar 156
                        'id' => $record['id'],
157
                        'first_name' => $record['first_name'],
158
                        'date' => $record['added_on'],
5288 eleazar 159
 
5287 eleazar 160
                        'actions' => [
6821 eleazar 161
                            'link_delete' => $this->url()->fromRoute('survey/test/delete', 'id'),
6813 eleazar 162
                            'link_report' => $this->url()->fromRoute('survey/test/report', ['uuid' => $record['uuid']])
5287 eleazar 163
                        ]
164
                    ];
165
 
166
                    array_push($items, $item);
167
                }
168
 
169
                return new JsonModel([
170
                    'success' => true,
171
                    'data' => [
172
                        'items' => $items,
173
                        'total' => $paginator->getTotalItemCount(),
174
                    ]
175
                ]);
176
            } else {
5564 eleazar 177
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
178
                $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
179
 
5287 eleazar 180
                $form = new SurveyTestForm($this->adapter, $currentCompany->id);
181
 
182
                $this->layout()->setTemplate('layout/layout-backend');
183
                $viewModel = new ViewModel();
184
                $viewModel->setTemplate('leaders-linked/survey-test/index.phtml');
5564 eleazar 185
                $viewModel->setVariables([
186
                    'form'      => $form,
187
                    'survies' => $survies
188
                ]);
5287 eleazar 189
                return $viewModel;
190
            }
191
        } else {
192
            return new JsonModel([
193
                'success' => false,
194
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
195
            ]);
5663 eleazar 196
 
5287 eleazar 197
        }
5894 eleazar 198
        } catch (\Throwable $e) {
5887 eleazar 199
            $e->getMessage();
5888 eleazar 200
            return new JsonModel([
201
                'success' => false,
202
                'data' => $e
203
            ]);
5887 eleazar 204
        }
5287 eleazar 205
    }
206
 
207
    public function addAction() {
208
        $request = $this->getRequest();
209
        $currentUserPlugin = $this->plugin('currentUserPlugin');
210
        $currentCompany = $currentUserPlugin->getCompany();
211
        $currentUser = $currentUserPlugin->getUser();
212
 
213
        $request = $this->getRequest();
214
 
5732 eleazar 215
        $survey_id = $this->params()->fromRoute('survey_id');
5823 eleazar 216
 
5452 eleazar 217
        if ($request->isGet()) {
5649 eleazar 218
            $surveyMapper = SurveyMapper::getInstance($this->adapter);
5732 eleazar 219
            $survey = $surveyMapper->fetchOneByUuid($survey_id);
5570 eleazar 220
 
5452 eleazar 221
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
222
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5570 eleazar 223
 
5452 eleazar 224
            $data = [
225
                'survey' => [
226
                    'id' => $survey->uuid,
227
                    'content' => $surveyForm->content ? json_decode($surveyForm->content) : [],
228
                    'description' => $surveyForm->description,
229
                    'text' => $surveyForm->text,
230
                ],
231
            ];
5663 eleazar 232
            return new JsonModel([
233
                'success' => true,
234
                'data' => $data,
235
            ]);
5563 eleazar 236
 
5452 eleazar 237
 
238
        } else if ($request->isPost()) {
5287 eleazar 239
 
240
            $form = new SurveyTestForm($this->adapter, $currentCompany->id);
241
 
242
            $dataPost = $request->getPost()->toArray();
243
 
244
            $form->setData($dataPost);
245
 
246
            if ($form->isValid()) {
247
                $dataPost = (array) $form->getData();
248
 
249
                $hydrator = new ObjectPropertyHydrator();
250
                $survey = new SurveyTest();
251
                $hydrator->hydrate($dataPost, $survey);
252
 
5831 eleazar 253
                $surveyDoneMapper = SurveyMapper::getInstance($this->adapter);
254
                $surveyDone = $surveyDoneMapper->fetchOneByUuid($survey_id);
255
 
5287 eleazar 256
                $survey->company_id = $currentCompany->id;
5831 eleazar 257
                $survey->survey_id = $surveyDone->id;
5287 eleazar 258
 
259
                $surveyMapper = SurveyTestMapper::getInstance($this->adapter);
260
                $result = $surveyMapper->insert($survey);
261
 
262
                if ($result) {
5832 eleazar 263
                    $this->logger->info('Se agrego el formulario' . $survey->first_name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
5287 eleazar 264
 
265
                    // Get record by id
266
                    $record = $surveyMapper->fetchOne($survey->id);
267
 
268
                    if ($record) {
269
 
270
                        $data = [
271
                            'success' => true,
272
                            'id' => $record->id,
273
                            'data' => 'LABEL_RECORD_ADDED'
274
                        ];
275
                    } else {
276
 
277
                        $data = [
278
                            'success' => false,
279
                            'data' => 'ERROR_RECORD_NOT_FOUND'
280
                        ];
281
                    }
282
                } else {
283
                    $data = [
284
                        'success' => false,
285
                        'data' => $surveyMapper->getError()
286
                    ];
287
                }
288
 
289
                return new JsonModel($data);
290
            } else {
291
                $messages = [];
292
                $form_messages = (array) $form->getMessages();
293
                foreach ($form_messages as $fieldname => $field_messages) {
294
 
295
                    $messages[$fieldname] = array_values($field_messages);
296
                }
297
 
298
                return new JsonModel([
299
                    'success' => false,
300
                    'data' => $messages
301
                ]);
302
            }
303
        } else {
304
            $data = [
305
                'success' => false,
306
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
307
            ];
308
 
309
            return new JsonModel($data);
310
        }
311
 
312
        return new JsonModel($data);
313
    }
314
 
6668 eleazar 315
    public function reportAction() {
316
        $request = $this->getRequest();
317
        $currentUserPlugin = $this->plugin('currentUserPlugin');
318
        $currentCompany = $currentUserPlugin->getCompany();
319
        $currentUser = $currentUserPlugin->getUser();
320
 
321
        $request = $this->getRequest();
6805 eleazar 322
        $uuid = $this->params()->fromRoute('uuid');
6668 eleazar 323
 
324
 
325
 
326
        if (!$uuid) {
327
            $data = [
328
                'success' => false,
329
                'data' => 'ERROR_INVALID_PARAMETER'
330
            ];
331
 
332
            return new JsonModel($data);
333
        }
334
 
335
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
336
        $surveyTests = $surveyTestMapper->fetchOneByuuid($uuid);
337
 
338
 
339
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
340
        $survey = $surveyMapper->fetchOne($surveyTests->survey_id);
341
 
342
        if (!$surveyTests) {
343
            $data = [
344
                'success' => false,
345
                'data' => 'ERROR_RECORD_NOT_FOUND'
346
            ];
347
 
348
            return new JsonModel($data);
349
        }
350
 
351
 
352
        if ($request->isGet()) {
353
            $hydrator = new ObjectPropertyHydrator();
354
 
355
            //get form data
356
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
357
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
358
 
359
            if ($surveyForm) {
360
 
361
                return $this->renderPDF($surveyForm, $surveyTests, $survey);
362
            } else {
363
 
364
                $data = [
365
                    'success' => false,
366
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
367
                ];
368
 
369
                return new JsonModel($data);
370
            }
371
        } else {
372
            $data = [
373
                'success' => false,
374
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
375
            ];
376
 
377
            return new JsonModel($data);
378
        }
379
 
380
        return new JsonModel($data);
381
    }
382
 
383
 
384
 
5287 eleazar 385
    public function deleteAction() {
386
        $request = $this->getRequest();
387
        $currentUserPlugin = $this->plugin('currentUserPlugin');
388
        $currentCompany = $currentUserPlugin->getCompany();
389
        $currentUser = $currentUserPlugin->getUser();
6817 eleazar 390
        try{
5287 eleazar 391
        $request = $this->getRequest();
6819 eleazar 392
        $uuid = $this->params()->fromRoute('id');
393
 
5287 eleazar 394
        if (!$uuid) {
395
            $data = [
396
                'success' => false,
397
                'data' => 'ERROR_INVALID_PARAMETER'
398
            ];
399
 
400
            return new JsonModel($data);
401
        }
402
 
6805 eleazar 403
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6807 eleazar 404
        $survey = $surveyTestMapper->fetchOne($uuid);
5287 eleazar 405
        if (!$survey) {
406
            $data = [
407
                'success' => false,
408
                'data' => 'ERROR_RECORD_NOT_FOUND'
409
            ];
410
 
411
            return new JsonModel($data);
412
        }
413
 
414
        if ($survey->company_id != $currentCompany->id) {
415
            return new JsonModel([
416
                'success' => false,
417
                'data' => 'ERROR_UNAUTHORIZED'
418
            ]);
419
        }
420
 
421
        if ($request->isPost()) {
422
 
6805 eleazar 423
            $result = $surveyTestMapper->delete($survey->id);
5287 eleazar 424
            if ($result) {
425
                $this->logger->info('Se borro el formulario ' . $survey->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
426
 
427
                $data = [
428
                    'success' => true,
429
                    'data' => 'LABEL_RECORD_DELETED'
430
                ];
431
            } else {
432
 
433
                $data = [
434
                    'success' => false,
6805 eleazar 435
                    'data' => $surveyTestMapper->getError()
5287 eleazar 436
                ];
437
 
438
                return new JsonModel($data);
439
            }
440
        } else {
441
            $data = [
442
                'success' => false,
443
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
444
            ];
445
 
446
            return new JsonModel($data);
447
        }
448
 
449
        return new JsonModel($data);
6817 eleazar 450
        } catch (\Throwable $e) {
451
            $e->getMessage();
452
            return new JsonModel([
453
                'success' => false,
454
                'data' => $e
455
            ]);
456
        }
457
 
5287 eleazar 458
    }
459
 
460
}