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');
6879 eleazar 98
 
99
                if(!$survey_uuid){
100
                    return new JsonModel([
101
                        'success' => true,
102
                        'data' => [
103
                            'items' => [],
104
                            'total' => 0
105
                        ]
106
                    ]);
107
                }
5885 eleazar 108
 
109
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
110
                $survey = $surveyMapper->fetchOneByUuid($survey_uuid);
6878 eleazar 111
 
5607 eleazar 112
                $search = $this->params()->fromQuery('search', []);
5287 eleazar 113
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
114
 
115
                $page = intval($this->params()->fromQuery('start', 1), 10);
116
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
117
                $order = $this->params()->fromQuery('order', []);
118
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
119
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
120
 
6801 eleazar 121
                $fields = ['first_name'];
122
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
5613 eleazar 123
 
5614 eleazar 124
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
125
                    $order_direction = 'ASC';
126
                }
127
 
6837 eleazar 128
                $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
129
                $paginator = $surveyTestMapper->fetchAllDataTableBySurveyId($survey->id, $search, $page, $records_x_page, $order_field, $order_direction);
130
 
5287 eleazar 131
                $items = [];
132
                $records = $paginator->getCurrentItems();
6822 eleazar 133
 
5287 eleazar 134
                foreach ($records as $record) {
6668 eleazar 135
 
5287 eleazar 136
                    $item = [
6873 eleazar 137
                        'id' => $record->id,
138
                        'first_name' => $record->first_name,
139
                        'date' => $record->added_on,
5288 eleazar 140
 
5287 eleazar 141
                        'actions' => [
6882 eleazar 142
                            'link_delete' => $this->url()->fromRoute('survey/test/delete', ['id' => $record->id, 'survey_id' => $survey->uuid]),
143
                            'link_report' => $this->url()->fromRoute('survey/test/report', ['uuid' => $record->uuid, 'survey_id' => $survey->uuid])
5287 eleazar 144
                        ]
145
                    ];
146
 
147
                    array_push($items, $item);
148
                }
149
 
150
                return new JsonModel([
151
                    'success' => true,
152
                    'data' => [
153
                        'items' => $items,
154
                        'total' => $paginator->getTotalItemCount(),
155
                    ]
156
                ]);
157
            } else {
5564 eleazar 158
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
159
                $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
160
 
5287 eleazar 161
                $form = new SurveyTestForm($this->adapter, $currentCompany->id);
162
 
163
                $this->layout()->setTemplate('layout/layout-backend');
164
                $viewModel = new ViewModel();
165
                $viewModel->setTemplate('leaders-linked/survey-test/index.phtml');
5564 eleazar 166
                $viewModel->setVariables([
6839 eleazar 167
                    'form'      => $form,
168
                    'survies' => $survies
5564 eleazar 169
                ]);
5287 eleazar 170
                return $viewModel;
171
            }
172
        } else {
173
            return new JsonModel([
174
                'success' => false,
175
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
176
            ]);
5663 eleazar 177
 
5287 eleazar 178
        }
5894 eleazar 179
        } catch (\Throwable $e) {
5887 eleazar 180
            $e->getMessage();
5888 eleazar 181
            return new JsonModel([
182
                'success' => false,
183
                'data' => $e
184
            ]);
5887 eleazar 185
        }
5287 eleazar 186
    }
187
 
188
    public function addAction() {
189
        $request = $this->getRequest();
190
        $currentUserPlugin = $this->plugin('currentUserPlugin');
191
        $currentCompany = $currentUserPlugin->getCompany();
192
        $currentUser = $currentUserPlugin->getUser();
193
 
194
        $request = $this->getRequest();
195
 
5732 eleazar 196
        $survey_id = $this->params()->fromRoute('survey_id');
5823 eleazar 197
 
5452 eleazar 198
        if ($request->isGet()) {
5649 eleazar 199
            $surveyMapper = SurveyMapper::getInstance($this->adapter);
5732 eleazar 200
            $survey = $surveyMapper->fetchOneByUuid($survey_id);
5570 eleazar 201
 
5452 eleazar 202
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
203
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5570 eleazar 204
 
5452 eleazar 205
            $data = [
206
                'survey' => [
207
                    'id' => $survey->uuid,
208
                    'content' => $surveyForm->content ? json_decode($surveyForm->content) : [],
209
                    'description' => $surveyForm->description,
210
                    'text' => $surveyForm->text,
211
                ],
6865 eleazar 212
            ];
5452 eleazar 213
 
214
        } else if ($request->isPost()) {
5287 eleazar 215
 
216
            $form = new SurveyTestForm($this->adapter, $currentCompany->id);
217
 
218
            $dataPost = $request->getPost()->toArray();
219
 
220
            $form->setData($dataPost);
221
 
222
            if ($form->isValid()) {
223
                $dataPost = (array) $form->getData();
224
 
225
                $hydrator = new ObjectPropertyHydrator();
226
                $survey = new SurveyTest();
227
                $hydrator->hydrate($dataPost, $survey);
228
 
5831 eleazar 229
                $surveyDoneMapper = SurveyMapper::getInstance($this->adapter);
230
                $surveyDone = $surveyDoneMapper->fetchOneByUuid($survey_id);
231
 
5287 eleazar 232
                $survey->company_id = $currentCompany->id;
5831 eleazar 233
                $survey->survey_id = $surveyDone->id;
5287 eleazar 234
 
235
                $surveyMapper = SurveyTestMapper::getInstance($this->adapter);
236
                $result = $surveyMapper->insert($survey);
237
 
238
                if ($result) {
5832 eleazar 239
                    $this->logger->info('Se agrego el formulario' . $survey->first_name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
5287 eleazar 240
 
241
                    // Get record by id
242
                    $record = $surveyMapper->fetchOne($survey->id);
243
 
244
                    if ($record) {
245
 
246
                        $data = [
247
                            'success' => true,
248
                            'id' => $record->id,
249
                            'data' => 'LABEL_RECORD_ADDED'
250
                        ];
251
                    } else {
252
 
253
                        $data = [
254
                            'success' => false,
255
                            'data' => 'ERROR_RECORD_NOT_FOUND'
256
                        ];
257
                    }
258
                } else {
259
                    $data = [
260
                        'success' => false,
261
                        'data' => $surveyMapper->getError()
262
                    ];
263
                }
264
 
265
                return new JsonModel($data);
266
            } else {
267
                $messages = [];
268
                $form_messages = (array) $form->getMessages();
269
                foreach ($form_messages as $fieldname => $field_messages) {
270
 
271
                    $messages[$fieldname] = array_values($field_messages);
272
                }
273
 
274
                return new JsonModel([
275
                    'success' => false,
276
                    'data' => $messages
277
                ]);
278
            }
279
        } else {
280
            $data = [
281
                'success' => false,
282
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
283
            ];
284
 
285
            return new JsonModel($data);
286
        }
287
 
288
        return new JsonModel($data);
289
    }
290
 
6908 eleazar 291
    public function deleteAction() {
6668 eleazar 292
        $request = $this->getRequest();
293
        $currentUserPlugin = $this->plugin('currentUserPlugin');
294
        $currentCompany = $currentUserPlugin->getCompany();
295
        $currentUser = $currentUserPlugin->getUser();
6908 eleazar 296
        try{
6668 eleazar 297
        $request = $this->getRequest();
6908 eleazar 298
        $id = $this->params()->fromRoute('id');
6668 eleazar 299
 
6908 eleazar 300
        if (!$id) {
6668 eleazar 301
            $data = [
302
                'success' => false,
303
                'data' => 'ERROR_INVALID_PARAMETER'
304
            ];
305
 
306
            return new JsonModel($data);
307
        }
6908 eleazar 308
 
6668 eleazar 309
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6908 eleazar 310
        $survey = $surveyTestMapper->fetchOne($id);
311
        if (!$survey) {
6668 eleazar 312
            $data = [
313
                'success' => false,
314
                'data' => 'ERROR_RECORD_NOT_FOUND'
315
            ];
316
 
317
            return new JsonModel($data);
318
        }
319
 
6908 eleazar 320
        if ($survey->company_id != $currentCompany->id) {
321
            return new JsonModel([
322
                'success' => false,
323
                'data' => 'ERROR_UNAUTHORIZED'
324
            ]);
325
        }
6668 eleazar 326
 
6908 eleazar 327
        if ($request->isPost()) {
6668 eleazar 328
 
6908 eleazar 329
            $result = $surveyTestMapper->delete($survey->id);
330
            if ($result) {
331
               // $this->logger->info('Se borro el formulario ' . $survey->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
6668 eleazar 332
 
6908 eleazar 333
                $data = [
334
                    'success' => true,
335
                    'data' => 'LABEL_RECORD_DELETED'
336
                ];
6668 eleazar 337
            } else {
338
 
339
                $data = [
340
                    'success' => false,
6908 eleazar 341
                    'data' => $surveyTestMapper->getError()
6668 eleazar 342
                ];
343
 
344
                return new JsonModel($data);
345
            }
346
        } else {
347
            $data = [
348
                'success' => false,
349
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
350
            ];
351
 
352
            return new JsonModel($data);
353
        }
354
 
355
        return new JsonModel($data);
6908 eleazar 356
        } catch (\Throwable $e) {
357
            $e->getMessage();
358
            return new JsonModel([
359
                'success' => false,
360
                'data' => $e
361
            ]);
362
        }
363
 
6668 eleazar 364
    }
365
 
6908 eleazar 366
    public function reportAction() {
5287 eleazar 367
        $request = $this->getRequest();
368
        $currentUserPlugin = $this->plugin('currentUserPlugin');
369
        $currentCompany = $currentUserPlugin->getCompany();
370
        $currentUser = $currentUserPlugin->getUser();
6908 eleazar 371
 
5287 eleazar 372
        $request = $this->getRequest();
6908 eleazar 373
        $uuid = $this->params()->fromRoute('uuid');
6819 eleazar 374
 
6908 eleazar 375
 
376
 
377
        if (!$uuid) {
5287 eleazar 378
            $data = [
379
                'success' => false,
380
                'data' => 'ERROR_INVALID_PARAMETER'
381
            ];
382
 
383
            return new JsonModel($data);
384
        }
6908 eleazar 385
 
386
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
387
        $surveyTests = $surveyTestMapper->fetchOneByuuid($uuid);
5287 eleazar 388
 
6908 eleazar 389
 
390
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
391
        $survey = $surveyMapper->fetchOne($surveyTests->survey_id);
392
 
393
        if (!$surveyTests) {
5287 eleazar 394
            $data = [
395
                'success' => false,
396
                'data' => 'ERROR_RECORD_NOT_FOUND'
397
            ];
398
 
399
            return new JsonModel($data);
400
        }
401
 
402
 
6908 eleazar 403
        if ($request->isGet()) {
404
            $hydrator = new ObjectPropertyHydrator();
5287 eleazar 405
 
6908 eleazar 406
            //get form data
407
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
408
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5287 eleazar 409
 
6908 eleazar 410
            if ($surveyForm) {
411
 
412
                return $this->renderPDF($surveyForm, $surveyTests, $survey);
5287 eleazar 413
            } else {
414
 
415
                $data = [
416
                    'success' => false,
6908 eleazar 417
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
5287 eleazar 418
                ];
419
 
420
                return new JsonModel($data);
421
            }
422
        } else {
423
            $data = [
424
                'success' => false,
425
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
426
            ];
427
 
428
            return new JsonModel($data);
429
        }
430
 
431
        return new JsonModel($data);
6908 eleazar 432
    }
433
 
434
    public function renderPDF($surveyForm, $surveyTests, $survey) {
435
 
436
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
437
 
438
 
439
        if(file_exists($target_path)) {
440
            Functions::deleteFiles($target_path);
441
        } else {
442
            @mkdir($target_path, 0755, true);
6817 eleazar 443
        }
444
 
6908 eleazar 445
        // Set Data
446
        $headerFormName = utf8_decode($surveyForm->name);
447
        $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
448
        $sections = json_decode($surveyForm->content, true);
449
 
450
        $allTests = array_map(
451
            function($response) {
452
                return json_decode($response->content, true);
453
            },
454
            $surveyTests,
455
        );
456
 
457
        $averages = [];
458
 
459
        foreach($sections as $section) {
460
            foreach($section['questions'] as $question) {
461
                switch ($question['type']) {
462
                    case 'multiple':
463
                        $totals = [];
464
 
465
                        foreach($question['options'] as $option) {
466
                            $totals[$option['slug_option']] = 0;
467
                        }
468
 
469
                        foreach($question['options'] as $option) {
470
                            $totals[$option['slug_option']] = count(array_filter(
471
                                $allTests,
472
                                function ($test) use($option, $question) {
473
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
474
                                }
475
                            ));
476
                        }
477
 
478
                        $averages[$question['slug_question']] = $totals;
479
 
480
                        break;
481
 
482
                    case 'simple':
483
                        $totals = [];
484
 
485
                        foreach($question['options'] as $option) {
486
                            $totals[$option['slug_option']] = 0;
487
                        }
488
 
489
                        foreach ($allTests as $test) {
490
                            $totals[$test[$question['slug_question']]]++;
491
                        }
492
 
493
                        foreach($totals as $slug => $amount) {
494
                            $totals[$slug] = ($amount / count($allTests)) * 100;
495
                        }
496
 
497
                        $averages[$question['slug_question']] = $totals;
498
                    break;
499
 
500
                    case 'open':
501
                        $totals = [];
502
 
503
                        foreach($question['options'] as $option) {
504
                            $totals[$option['slug_option']] = 0;
505
                        }
506
 
507
                        foreach ($allTests as $test) {
508
                            $totals[$test[$question['slug_question']]]++;
509
                        }
510
 
511
                        foreach($totals as $slug => $amount) {
512
                            $totals[$slug] = ($amount / count($allTests)) * 100;
513
                        }
514
 
515
                        $averages[$question['slug_question']] = $totals;
516
                    break;
517
 
518
                }
519
            }
520
        }
521
 
522
        //Generate New PDF
523
        $pdf = new SurveyReport();
524
 
525
        $pdf->AliasNbPages();
526
        $pdf->AddPage();
527
 
528
        // Set header secundary
529
        $pdf->customHeader($headerFormName, $headerSurveyName);
530
 
531
        $countSection = 0;
532
 
533
        for ($i = 0; $i < count($sections); $i++) {
534
            if ($countSection > 1) {
535
                $countSection = 0;
536
                $pdf->AddPage();
537
                $pdf->customHeader($headerFormName, $headerUserName);
538
            }
539
            $section = $sections[$i];
540
 
541
            foreach ($section['questions'] as $question) {
542
 
543
                    switch ($question['type']) {
544
                        case 'simple':
545
                            $labels = [];
546
                            $values = [];
547
 
548
                            foreach($question['options'] as $option) {
549
                                $labels []= strip_tags($option['text']) . "\n(%.1f%%)";
550
 
551
                                $values []= $averages[$question['slug_question']][$option['slug_option']];
552
                            }
553
 
554
                            $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
555
                            $pdf->Cell(0,10,strip_tags(trim(str_replace(' ', ' ', html_entity_decode($question['text'])))),0,1);
556
                            $pdf->pieChart($labels, $values, '', $filename);
557
                            $pdf->SetFont('Arial', '', 12);
558
                            $pdf->Image($filename, 45, $pdf->getY(), 120);
559
                            $pdf->setY($pdf->getY() + 90);
560
 
561
                            break;
562
 
563
                        case 'multiple':
564
                            $labels = [];
565
                            $values = [];
566
 
567
                            foreach($question['options'] as $option) {
568
                                $labels []= strip_tags($option['text']);
569
 
570
                                $values []= $averages[$question['slug_question']][$option['slug_option']];
571
                            }
572
 
573
                            $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
574
                            $pdf->Cell(0,10,strip_tags($question['text']),0,1);
575
                            $pdf->barChart($labels, $values, '', $filename);
576
                            $pdf->SetFont('Arial', '', 12);
577
                            $pdf->Image($filename, 12, $pdf->getY());
578
                            $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
579
 
580
                            break;
581
                    }
582
                $countSection++;
583
            }
584
 
585
 
586
        }
587
 
588
        return $pdf->Output();
5287 eleazar 589
    }
590
 
6908 eleazar 591
 
5287 eleazar 592
}