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