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