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 = [
14215 kerby 138
                        'idOLD' => $record->id,
139
                        'id' => $record->uuid,
6873 eleazar 140
                        'first_name' => $record->first_name,
11234 eleazar 141
                        'last_name' => $record->last_name,
6873 eleazar 142
                        'date' => $record->added_on,
5288 eleazar 143
 
5287 eleazar 144
                        'actions' => [
6882 eleazar 145
                            'link_delete' => $this->url()->fromRoute('survey/test/delete', ['id' => $record->id, 'survey_id' => $survey->uuid]),
146
                            'link_report' => $this->url()->fromRoute('survey/test/report', ['uuid' => $record->uuid, 'survey_id' => $survey->uuid])
5287 eleazar 147
                        ]
148
                    ];
149
 
150
                    array_push($items, $item);
151
                }
152
 
153
                return new JsonModel([
154
                    'success' => true,
155
                    'data' => [
156
                        'items' => $items,
157
                        'total' => $paginator->getTotalItemCount(),
158
                    ]
159
                ]);
160
            } else {
5564 eleazar 161
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
162
                $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
163
 
5287 eleazar 164
                $form = new SurveyTestForm($this->adapter, $currentCompany->id);
165
 
166
                $this->layout()->setTemplate('layout/layout-backend');
167
                $viewModel = new ViewModel();
168
                $viewModel->setTemplate('leaders-linked/survey-test/index.phtml');
5564 eleazar 169
                $viewModel->setVariables([
6839 eleazar 170
                    'form'      => $form,
171
                    'survies' => $survies
5564 eleazar 172
                ]);
5287 eleazar 173
                return $viewModel;
174
            }
175
        } else {
176
            return new JsonModel([
177
                'success' => false,
178
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
179
            ]);
5663 eleazar 180
 
5287 eleazar 181
        }
5894 eleazar 182
        } catch (\Throwable $e) {
5887 eleazar 183
            $e->getMessage();
5888 eleazar 184
            return new JsonModel([
185
                'success' => false,
186
                'data' => $e
187
            ]);
5887 eleazar 188
        }
5287 eleazar 189
    }
190
 
191
    public function addAction() {
192
        $request = $this->getRequest();
193
        $currentUserPlugin = $this->plugin('currentUserPlugin');
194
        $currentCompany = $currentUserPlugin->getCompany();
195
        $currentUser = $currentUserPlugin->getUser();
196
 
197
        $request = $this->getRequest();
198
 
5732 eleazar 199
        $survey_id = $this->params()->fromRoute('survey_id');
5823 eleazar 200
 
5452 eleazar 201
        if ($request->isGet()) {
5649 eleazar 202
            $surveyMapper = SurveyMapper::getInstance($this->adapter);
5732 eleazar 203
            $survey = $surveyMapper->fetchOneByUuid($survey_id);
5570 eleazar 204
 
5452 eleazar 205
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
206
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5570 eleazar 207
 
5452 eleazar 208
            $data = [
209
                'survey' => [
210
                    'id' => $survey->uuid,
211
                    'content' => $surveyForm->content ? json_decode($surveyForm->content) : [],
212
                    'description' => $surveyForm->description,
213
                    'text' => $surveyForm->text,
214
                ],
6865 eleazar 215
            ];
5452 eleazar 216
 
217
        } else if ($request->isPost()) {
5287 eleazar 218
 
219
            $form = new SurveyTestForm($this->adapter, $currentCompany->id);
220
 
221
            $dataPost = $request->getPost()->toArray();
222
 
223
            $form->setData($dataPost);
224
 
225
            if ($form->isValid()) {
226
                $dataPost = (array) $form->getData();
227
 
228
                $hydrator = new ObjectPropertyHydrator();
229
                $survey = new SurveyTest();
230
                $hydrator->hydrate($dataPost, $survey);
231
 
5831 eleazar 232
                $surveyDoneMapper = SurveyMapper::getInstance($this->adapter);
233
                $surveyDone = $surveyDoneMapper->fetchOneByUuid($survey_id);
234
 
5287 eleazar 235
                $survey->company_id = $currentCompany->id;
5831 eleazar 236
                $survey->survey_id = $surveyDone->id;
5287 eleazar 237
 
238
                $surveyMapper = SurveyTestMapper::getInstance($this->adapter);
239
                $result = $surveyMapper->insert($survey);
240
 
241
                if ($result) {
5832 eleazar 242
                    $this->logger->info('Se agrego el formulario' . $survey->first_name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
5287 eleazar 243
 
244
                    // Get record by id
245
                    $record = $surveyMapper->fetchOne($survey->id);
246
 
247
                    if ($record) {
248
 
249
                        $data = [
250
                            'success' => true,
251
                            'id' => $record->id,
252
                            'data' => 'LABEL_RECORD_ADDED'
253
                        ];
254
                    } else {
255
 
256
                        $data = [
257
                            'success' => false,
258
                            'data' => 'ERROR_RECORD_NOT_FOUND'
259
                        ];
260
                    }
261
                } else {
262
                    $data = [
263
                        'success' => false,
264
                        'data' => $surveyMapper->getError()
265
                    ];
266
                }
267
 
268
                return new JsonModel($data);
269
            } else {
270
                $messages = [];
271
                $form_messages = (array) $form->getMessages();
272
                foreach ($form_messages as $fieldname => $field_messages) {
273
 
274
                    $messages[$fieldname] = array_values($field_messages);
275
                }
276
 
277
                return new JsonModel([
278
                    'success' => false,
279
                    'data' => $messages
280
                ]);
281
            }
282
        } else {
283
            $data = [
284
                'success' => false,
285
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
286
            ];
287
 
288
            return new JsonModel($data);
289
        }
290
 
291
        return new JsonModel($data);
292
    }
293
 
6908 eleazar 294
    public function deleteAction() {
6668 eleazar 295
        $request = $this->getRequest();
296
        $currentUserPlugin = $this->plugin('currentUserPlugin');
297
        $currentCompany = $currentUserPlugin->getCompany();
298
        $currentUser = $currentUserPlugin->getUser();
6908 eleazar 299
        try{
6668 eleazar 300
        $request = $this->getRequest();
6908 eleazar 301
        $id = $this->params()->fromRoute('id');
6668 eleazar 302
 
6908 eleazar 303
        if (!$id) {
6668 eleazar 304
            $data = [
305
                'success' => false,
306
                'data' => 'ERROR_INVALID_PARAMETER'
307
            ];
308
 
309
            return new JsonModel($data);
310
        }
6908 eleazar 311
 
6668 eleazar 312
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6908 eleazar 313
        $survey = $surveyTestMapper->fetchOne($id);
314
        if (!$survey) {
6668 eleazar 315
            $data = [
316
                'success' => false,
317
                'data' => 'ERROR_RECORD_NOT_FOUND'
318
            ];
319
 
320
            return new JsonModel($data);
321
        }
322
 
6908 eleazar 323
        if ($survey->company_id != $currentCompany->id) {
324
            return new JsonModel([
325
                'success' => false,
326
                'data' => 'ERROR_UNAUTHORIZED'
327
            ]);
328
        }
6668 eleazar 329
 
6908 eleazar 330
        if ($request->isPost()) {
6668 eleazar 331
 
6908 eleazar 332
            $result = $surveyTestMapper->delete($survey->id);
333
            if ($result) {
334
               // $this->logger->info('Se borro el formulario ' . $survey->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
6668 eleazar 335
 
6908 eleazar 336
                $data = [
337
                    'success' => true,
338
                    'data' => 'LABEL_RECORD_DELETED'
339
                ];
6668 eleazar 340
            } else {
341
 
342
                $data = [
343
                    'success' => false,
6908 eleazar 344
                    'data' => $surveyTestMapper->getError()
6668 eleazar 345
                ];
346
 
347
                return new JsonModel($data);
348
            }
349
        } else {
350
            $data = [
351
                'success' => false,
352
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
353
            ];
354
 
355
            return new JsonModel($data);
356
        }
357
 
358
        return new JsonModel($data);
6908 eleazar 359
        } catch (\Throwable $e) {
360
            $e->getMessage();
361
            return new JsonModel([
362
                'success' => false,
363
                'data' => $e
364
            ]);
365
        }
366
 
6668 eleazar 367
    }
368
 
6908 eleazar 369
    public function reportAction() {
5287 eleazar 370
        $request = $this->getRequest();
371
        $currentUserPlugin = $this->plugin('currentUserPlugin');
372
        $currentCompany = $currentUserPlugin->getCompany();
373
        $currentUser = $currentUserPlugin->getUser();
6908 eleazar 374
 
5287 eleazar 375
        $request = $this->getRequest();
6908 eleazar 376
        $uuid = $this->params()->fromRoute('uuid');
6819 eleazar 377
 
6908 eleazar 378
 
379
 
380
        if (!$uuid) {
5287 eleazar 381
            $data = [
382
                'success' => false,
383
                'data' => 'ERROR_INVALID_PARAMETER'
384
            ];
385
 
386
            return new JsonModel($data);
387
        }
6908 eleazar 388
 
389
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
7033 eleazar 390
        $surveyTest = $surveyTestMapper->fetchOneByuuid($uuid);
5287 eleazar 391
 
6908 eleazar 392
 
393
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
7037 eleazar 394
        $survey = $surveyMapper->fetchOne($surveyTest->survey_id);
6908 eleazar 395
 
7033 eleazar 396
        if (!$surveyTest) {
5287 eleazar 397
            $data = [
398
                'success' => false,
399
                'data' => 'ERROR_RECORD_NOT_FOUND'
400
            ];
401
 
402
            return new JsonModel($data);
403
        }
404
 
405
 
6908 eleazar 406
        if ($request->isGet()) {
407
            $hydrator = new ObjectPropertyHydrator();
5287 eleazar 408
 
6908 eleazar 409
            //get form data
410
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
411
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5287 eleazar 412
 
6908 eleazar 413
            if ($surveyForm) {
414
 
7033 eleazar 415
                return $this->renderPDF($surveyForm, $surveyTest, $survey);
5287 eleazar 416
            } else {
417
 
418
                $data = [
419
                    'success' => false,
6908 eleazar 420
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
5287 eleazar 421
                ];
422
 
423
                return new JsonModel($data);
424
            }
425
        } else {
426
            $data = [
427
                'success' => false,
428
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
429
            ];
430
 
431
            return new JsonModel($data);
432
        }
433
 
434
        return new JsonModel($data);
6908 eleazar 435
    }
436
 
7033 eleazar 437
    public function renderPDF($surveyForm, $surveyTest, $survey) {
6908 eleazar 438
 
439
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
440
 
441
 
442
        if(file_exists($target_path)) {
443
            Functions::deleteFiles($target_path);
444
        } else {
445
            @mkdir($target_path, 0755, true);
6817 eleazar 446
        }
447
 
6908 eleazar 448
        // Set Data
449
        $headerFormName = utf8_decode($surveyForm->name);
450
        $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
451
        $sections = json_decode($surveyForm->content, true);
452
 
7033 eleazar 453
        $test = json_decode($surveyTest->content, true);
6908 eleazar 454
 
455
        //Generate New PDF
7038 eleazar 456
        $pdf = new UniqueSurveyReport();
6908 eleazar 457
 
458
        $pdf->AliasNbPages();
459
        $pdf->AddPage();
460
 
461
        // Set header secundary
462
        $pdf->customHeader($headerFormName, $headerSurveyName);
463
 
464
        $countSection = 0;
465
 
466
        for ($i = 0; $i < count($sections); $i++) {
467
            if ($countSection > 1) {
468
                $countSection = 0;
469
                $pdf->AddPage();
7053 eleazar 470
                $pdf->customHeader($headerFormName);
6908 eleazar 471
            }
472
            $section = $sections[$i];
473
 
474
            foreach ($section['questions'] as $question) {
475
 
476
                    switch ($question['type']) {
477
                        case 'simple':
7061 eleazar 478
                            $options = [];
479
 
6908 eleazar 480
                            foreach($question['options'] as $option) {
7061 eleazar 481
                                $options []= [
482
                                    'text' => strip_tags($option['text']),
483
                                    'selected' => $option['slug_option'] == $test[$question['slug_question']],
484
                                ];
6908 eleazar 485
                            }
486
 
7061 eleazar 487
                            $pdf->optionTable(strip_tags($question['text']), $options);
7033 eleazar 488
 
6908 eleazar 489
                            break;
490
 
491
                        case 'multiple':
7064 eleazar 492
                            $options = [];
6908 eleazar 493
 
494
                            foreach($question['options'] as $option) {
7064 eleazar 495
                                $options []= [
496
                                    'text' => strip_tags($option['text']),
497
                                    'selected' => in_array($option['slug_option'], $test[$question['slug_question']]),
498
                                ];
6908 eleazar 499
                            }
500
 
7064 eleazar 501
                            $pdf->optionTable(strip_tags($question['text']), $options);
502
 
6908 eleazar 503
                            break;
7055 eleazar 504
                        case 'open':
7059 eleazar 505
                            $pdf->borderTable(strip_tags($question['text']), [['content' => $test[$question['slug_question']]]]);
7055 eleazar 506
 
507
 
508
                            break;
6908 eleazar 509
                    }
510
                $countSection++;
511
            }
512
 
513
 
514
        }
515
 
516
        return $pdf->Output();
5287 eleazar 517
    }
518
 
6908 eleazar 519
 
5287 eleazar 520
}