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;
7039 eleazar 28
use LeadersLinked\Library\UniqueSurveyReport;
5287 eleazar 29
class SurveyTestController extends AbstractActionController {
30
 
31
    /**
32
     *
33
     * @var AdapterInterface
34
     */
35
    private $adapter;
36
 
37
    /**
38
     *
39
     * @var AbstractAdapter
40
     */
41
    private $cache;
42
 
43
    /**
44
     *
45
     * @var  LoggerInterface
46
     */
47
    private $logger;
48
 
49
    /**
50
     *
51
     * @var array
52
     */
53
    private $config;
54
 
55
    /**
56
     *
57
     * @param AdapterInterface $adapter
58
     * @param AbstractAdapter $cache
59
     * @param LoggerInterface $logger
60
     * @param array $config
61
     */
62
    public function __construct($adapter, $cache, $logger, $config) {
63
        $this->adapter = $adapter;
64
        $this->cache = $cache;
65
        $this->logger = $logger;
66
        $this->config = $config;
67
    }
68
 
69
    public function indexAction() {
5889 eleazar 70
 
5287 eleazar 71
        $request = $this->getRequest();
72
        $currentUserPlugin = $this->plugin('currentUserPlugin');
73
        $currentCompany = $currentUserPlugin->getCompany();
74
        $currentUser = $currentUserPlugin->getUser();
75
 
5887 eleazar 76
        try{
5287 eleazar 77
        $request = $this->getRequest();
78
        if ($request->isGet()) {
79
 
80
            $headers = $request->getHeaders();
81
 
82
            $isJson = false;
83
            if ($headers->has('Accept')) {
84
                $accept = $headers->get('Accept');
85
 
86
                $prioritized = $accept->getPrioritized();
87
 
88
                foreach ($prioritized as $key => $value) {
89
                    $raw = trim($value->getRaw());
90
 
91
                    if (!$isJson) {
92
                        $isJson = strpos($raw, 'json');
93
                    }
94
                }
95
            }
96
 
97
            if ($isJson) {
5885 eleazar 98
                $survey_uuid = $this->params()->fromRoute('survey_id');
6879 eleazar 99
 
100
                if(!$survey_uuid){
101
                    return new JsonModel([
102
                        'success' => true,
103
                        'data' => [
104
                            'items' => [],
105
                            'total' => 0
106
                        ]
107
                    ]);
108
                }
5885 eleazar 109
 
110
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
111
                $survey = $surveyMapper->fetchOneByUuid($survey_uuid);
6878 eleazar 112
 
5607 eleazar 113
                $search = $this->params()->fromQuery('search', []);
5287 eleazar 114
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
115
 
116
                $page = intval($this->params()->fromQuery('start', 1), 10);
117
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
118
                $order = $this->params()->fromQuery('order', []);
119
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
120
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
121
 
6801 eleazar 122
                $fields = ['first_name'];
123
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
5613 eleazar 124
 
5614 eleazar 125
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
126
                    $order_direction = 'ASC';
127
                }
128
 
6837 eleazar 129
                $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
130
                $paginator = $surveyTestMapper->fetchAllDataTableBySurveyId($survey->id, $search, $page, $records_x_page, $order_field, $order_direction);
131
 
5287 eleazar 132
                $items = [];
133
                $records = $paginator->getCurrentItems();
6822 eleazar 134
 
5287 eleazar 135
                foreach ($records as $record) {
6668 eleazar 136
 
5287 eleazar 137
                    $item = [
6873 eleazar 138
                        'id' => $record->id,
139
                        'first_name' => $record->first_name,
11234 eleazar 140
                        'last_name' => $record->last_name,
6873 eleazar 141
                        'date' => $record->added_on,
5288 eleazar 142
 
5287 eleazar 143
                        'actions' => [
6882 eleazar 144
                            'link_delete' => $this->url()->fromRoute('survey/test/delete', ['id' => $record->id, 'survey_id' => $survey->uuid]),
145
                            'link_report' => $this->url()->fromRoute('survey/test/report', ['uuid' => $record->uuid, 'survey_id' => $survey->uuid])
5287 eleazar 146
                        ]
147
                    ];
148
 
149
                    array_push($items, $item);
150
                }
151
 
152
                return new JsonModel([
153
                    'success' => true,
154
                    'data' => [
155
                        'items' => $items,
156
                        'total' => $paginator->getTotalItemCount(),
157
                    ]
158
                ]);
159
            } else {
5564 eleazar 160
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
161
                $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
162
 
5287 eleazar 163
                $form = new SurveyTestForm($this->adapter, $currentCompany->id);
164
 
165
                $this->layout()->setTemplate('layout/layout-backend');
166
                $viewModel = new ViewModel();
167
                $viewModel->setTemplate('leaders-linked/survey-test/index.phtml');
5564 eleazar 168
                $viewModel->setVariables([
6839 eleazar 169
                    'form'      => $form,
170
                    'survies' => $survies
5564 eleazar 171
                ]);
5287 eleazar 172
                return $viewModel;
173
            }
174
        } else {
175
            return new JsonModel([
176
                'success' => false,
177
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
178
            ]);
5663 eleazar 179
 
5287 eleazar 180
        }
5894 eleazar 181
        } catch (\Throwable $e) {
5887 eleazar 182
            $e->getMessage();
5888 eleazar 183
            return new JsonModel([
184
                'success' => false,
185
                'data' => $e
186
            ]);
5887 eleazar 187
        }
5287 eleazar 188
    }
189
 
190
    public function addAction() {
191
        $request = $this->getRequest();
192
        $currentUserPlugin = $this->plugin('currentUserPlugin');
193
        $currentCompany = $currentUserPlugin->getCompany();
194
        $currentUser = $currentUserPlugin->getUser();
195
 
196
        $request = $this->getRequest();
197
 
5732 eleazar 198
        $survey_id = $this->params()->fromRoute('survey_id');
5823 eleazar 199
 
5452 eleazar 200
        if ($request->isGet()) {
5649 eleazar 201
            $surveyMapper = SurveyMapper::getInstance($this->adapter);
5732 eleazar 202
            $survey = $surveyMapper->fetchOneByUuid($survey_id);
5570 eleazar 203
 
5452 eleazar 204
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
205
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5570 eleazar 206
 
5452 eleazar 207
            $data = [
208
                'survey' => [
209
                    'id' => $survey->uuid,
210
                    'content' => $surveyForm->content ? json_decode($surveyForm->content) : [],
211
                    'description' => $surveyForm->description,
212
                    'text' => $surveyForm->text,
213
                ],
6865 eleazar 214
            ];
5452 eleazar 215
 
216
        } else if ($request->isPost()) {
5287 eleazar 217
 
218
            $form = new SurveyTestForm($this->adapter, $currentCompany->id);
219
 
220
            $dataPost = $request->getPost()->toArray();
221
 
222
            $form->setData($dataPost);
223
 
224
            if ($form->isValid()) {
225
                $dataPost = (array) $form->getData();
226
 
227
                $hydrator = new ObjectPropertyHydrator();
228
                $survey = new SurveyTest();
229
                $hydrator->hydrate($dataPost, $survey);
230
 
5831 eleazar 231
                $surveyDoneMapper = SurveyMapper::getInstance($this->adapter);
232
                $surveyDone = $surveyDoneMapper->fetchOneByUuid($survey_id);
233
 
5287 eleazar 234
                $survey->company_id = $currentCompany->id;
5831 eleazar 235
                $survey->survey_id = $surveyDone->id;
5287 eleazar 236
 
237
                $surveyMapper = SurveyTestMapper::getInstance($this->adapter);
238
                $result = $surveyMapper->insert($survey);
239
 
240
                if ($result) {
5832 eleazar 241
                    $this->logger->info('Se agrego el formulario' . $survey->first_name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
5287 eleazar 242
 
243
                    // Get record by id
244
                    $record = $surveyMapper->fetchOne($survey->id);
245
 
246
                    if ($record) {
247
 
248
                        $data = [
249
                            'success' => true,
250
                            'id' => $record->id,
251
                            'data' => 'LABEL_RECORD_ADDED'
252
                        ];
253
                    } else {
254
 
255
                        $data = [
256
                            'success' => false,
257
                            'data' => 'ERROR_RECORD_NOT_FOUND'
258
                        ];
259
                    }
260
                } else {
261
                    $data = [
262
                        'success' => false,
263
                        'data' => $surveyMapper->getError()
264
                    ];
265
                }
266
 
267
                return new JsonModel($data);
268
            } else {
269
                $messages = [];
270
                $form_messages = (array) $form->getMessages();
271
                foreach ($form_messages as $fieldname => $field_messages) {
272
 
273
                    $messages[$fieldname] = array_values($field_messages);
274
                }
275
 
276
                return new JsonModel([
277
                    'success' => false,
278
                    'data' => $messages
279
                ]);
280
            }
281
        } else {
282
            $data = [
283
                'success' => false,
284
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
285
            ];
286
 
287
            return new JsonModel($data);
288
        }
289
 
290
        return new JsonModel($data);
291
    }
292
 
6908 eleazar 293
    public function deleteAction() {
6668 eleazar 294
        $request = $this->getRequest();
295
        $currentUserPlugin = $this->plugin('currentUserPlugin');
296
        $currentCompany = $currentUserPlugin->getCompany();
297
        $currentUser = $currentUserPlugin->getUser();
6908 eleazar 298
        try{
6668 eleazar 299
        $request = $this->getRequest();
6908 eleazar 300
        $id = $this->params()->fromRoute('id');
6668 eleazar 301
 
6908 eleazar 302
        if (!$id) {
6668 eleazar 303
            $data = [
304
                'success' => false,
305
                'data' => 'ERROR_INVALID_PARAMETER'
306
            ];
307
 
308
            return new JsonModel($data);
309
        }
6908 eleazar 310
 
6668 eleazar 311
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6908 eleazar 312
        $survey = $surveyTestMapper->fetchOne($id);
313
        if (!$survey) {
6668 eleazar 314
            $data = [
315
                'success' => false,
316
                'data' => 'ERROR_RECORD_NOT_FOUND'
317
            ];
318
 
319
            return new JsonModel($data);
320
        }
321
 
6908 eleazar 322
        if ($survey->company_id != $currentCompany->id) {
323
            return new JsonModel([
324
                'success' => false,
325
                'data' => 'ERROR_UNAUTHORIZED'
326
            ]);
327
        }
6668 eleazar 328
 
6908 eleazar 329
        if ($request->isPost()) {
6668 eleazar 330
 
6908 eleazar 331
            $result = $surveyTestMapper->delete($survey->id);
332
            if ($result) {
333
               // $this->logger->info('Se borro el formulario ' . $survey->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
6668 eleazar 334
 
6908 eleazar 335
                $data = [
336
                    'success' => true,
337
                    'data' => 'LABEL_RECORD_DELETED'
338
                ];
6668 eleazar 339
            } else {
340
 
341
                $data = [
342
                    'success' => false,
6908 eleazar 343
                    'data' => $surveyTestMapper->getError()
6668 eleazar 344
                ];
345
 
346
                return new JsonModel($data);
347
            }
348
        } else {
349
            $data = [
350
                'success' => false,
351
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
352
            ];
353
 
354
            return new JsonModel($data);
355
        }
356
 
357
        return new JsonModel($data);
6908 eleazar 358
        } catch (\Throwable $e) {
359
            $e->getMessage();
360
            return new JsonModel([
361
                'success' => false,
362
                'data' => $e
363
            ]);
364
        }
365
 
6668 eleazar 366
    }
367
 
6908 eleazar 368
    public function reportAction() {
5287 eleazar 369
        $request = $this->getRequest();
370
        $currentUserPlugin = $this->plugin('currentUserPlugin');
371
        $currentCompany = $currentUserPlugin->getCompany();
372
        $currentUser = $currentUserPlugin->getUser();
6908 eleazar 373
 
5287 eleazar 374
        $request = $this->getRequest();
6908 eleazar 375
        $uuid = $this->params()->fromRoute('uuid');
6819 eleazar 376
 
6908 eleazar 377
 
378
 
379
        if (!$uuid) {
5287 eleazar 380
            $data = [
381
                'success' => false,
382
                'data' => 'ERROR_INVALID_PARAMETER'
383
            ];
384
 
385
            return new JsonModel($data);
386
        }
6908 eleazar 387
 
388
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
7033 eleazar 389
        $surveyTest = $surveyTestMapper->fetchOneByuuid($uuid);
5287 eleazar 390
 
6908 eleazar 391
 
392
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
7037 eleazar 393
        $survey = $surveyMapper->fetchOne($surveyTest->survey_id);
6908 eleazar 394
 
7033 eleazar 395
        if (!$surveyTest) {
5287 eleazar 396
            $data = [
397
                'success' => false,
398
                'data' => 'ERROR_RECORD_NOT_FOUND'
399
            ];
400
 
401
            return new JsonModel($data);
402
        }
403
 
404
 
6908 eleazar 405
        if ($request->isGet()) {
406
            $hydrator = new ObjectPropertyHydrator();
5287 eleazar 407
 
6908 eleazar 408
            //get form data
409
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
410
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5287 eleazar 411
 
6908 eleazar 412
            if ($surveyForm) {
413
 
7033 eleazar 414
                return $this->renderPDF($surveyForm, $surveyTest, $survey);
5287 eleazar 415
            } else {
416
 
417
                $data = [
418
                    'success' => false,
6908 eleazar 419
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
5287 eleazar 420
                ];
421
 
422
                return new JsonModel($data);
423
            }
424
        } else {
425
            $data = [
426
                'success' => false,
427
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
428
            ];
429
 
430
            return new JsonModel($data);
431
        }
432
 
433
        return new JsonModel($data);
6908 eleazar 434
    }
435
 
7033 eleazar 436
    public function renderPDF($surveyForm, $surveyTest, $survey) {
6908 eleazar 437
 
438
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
439
 
440
 
441
        if(file_exists($target_path)) {
442
            Functions::deleteFiles($target_path);
443
        } else {
444
            @mkdir($target_path, 0755, true);
6817 eleazar 445
        }
446
 
6908 eleazar 447
        // Set Data
448
        $headerFormName = utf8_decode($surveyForm->name);
449
        $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
450
        $sections = json_decode($surveyForm->content, true);
451
 
7033 eleazar 452
        $test = json_decode($surveyTest->content, true);
6908 eleazar 453
 
454
        //Generate New PDF
7038 eleazar 455
        $pdf = new UniqueSurveyReport();
6908 eleazar 456
 
457
        $pdf->AliasNbPages();
458
        $pdf->AddPage();
459
 
460
        // Set header secundary
461
        $pdf->customHeader($headerFormName, $headerSurveyName);
462
 
463
        $countSection = 0;
464
 
465
        for ($i = 0; $i < count($sections); $i++) {
466
            if ($countSection > 1) {
467
                $countSection = 0;
468
                $pdf->AddPage();
7053 eleazar 469
                $pdf->customHeader($headerFormName);
6908 eleazar 470
            }
471
            $section = $sections[$i];
472
 
473
            foreach ($section['questions'] as $question) {
474
 
475
                    switch ($question['type']) {
476
                        case 'simple':
7061 eleazar 477
                            $options = [];
478
 
6908 eleazar 479
                            foreach($question['options'] as $option) {
7061 eleazar 480
                                $options []= [
481
                                    'text' => strip_tags($option['text']),
482
                                    'selected' => $option['slug_option'] == $test[$question['slug_question']],
483
                                ];
6908 eleazar 484
                            }
485
 
7061 eleazar 486
                            $pdf->optionTable(strip_tags($question['text']), $options);
7033 eleazar 487
 
6908 eleazar 488
                            break;
489
 
490
                        case 'multiple':
7064 eleazar 491
                            $options = [];
6908 eleazar 492
 
493
                            foreach($question['options'] as $option) {
7064 eleazar 494
                                $options []= [
495
                                    'text' => strip_tags($option['text']),
496
                                    'selected' => in_array($option['slug_option'], $test[$question['slug_question']]),
497
                                ];
6908 eleazar 498
                            }
499
 
7064 eleazar 500
                            $pdf->optionTable(strip_tags($question['text']), $options);
501
 
6908 eleazar 502
                            break;
7055 eleazar 503
                        case 'open':
7059 eleazar 504
                            $pdf->borderTable(strip_tags($question['text']), [['content' => $test[$question['slug_question']]]]);
7055 eleazar 505
 
506
 
507
                            break;
6908 eleazar 508
                    }
509
                $countSection++;
510
            }
511
 
512
 
513
        }
514
 
515
        return $pdf->Output();
5287 eleazar 516
    }
517
 
6908 eleazar 518
 
5287 eleazar 519
}