Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

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