Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
5866 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Mapper\QueryMapper;
14
use Laminas\Db\Sql\Select;
15
use LeadersLinked\Library\Functions;
16
use LeadersLinked\Mapper\SurveyTestMapper;
17
use LeadersLinked\Mapper\SurveyMapper;
18
use LeadersLinked\Mapper\SurveyFormMapper;
19
use LeadersLinked\Form\SurveyTestForm;
20
use LeadersLinked\Model\SurveyTest;
21
use LeadersLinked\Mapper\UserMapper;
22
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
23
use LeadersLinked\Library\SurveyReport;
24
 
25
class SurveyReportController extends AbstractActionController {
26
 
27
    /**
28
     *
29
     * @var AdapterInterface
30
     */
31
    private $adapter;
32
 
33
    /**
34
     *
35
     * @var AbstractAdapter
36
     */
37
    private $cache;
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 AbstractAdapter $cache
55
     * @param LoggerInterface $logger
56
     * @param array $config
57
     */
58
    public function __construct($adapter, $cache, $logger, $config) {
59
        $this->adapter = $adapter;
60
        $this->cache = $cache;
61
        $this->logger = $logger;
62
        $this->config = $config;
63
    }
64
 
65
    public function indexAction() {
5911 eleazar 66
 
5866 eleazar 67
        $request = $this->getRequest();
68
        $currentUserPlugin = $this->plugin('currentUserPlugin');
69
        $currentCompany = $currentUserPlugin->getCompany();
70
        $currentUser = $currentUserPlugin->getUser();
71
 
6424 eleazar 72
        try{
5866 eleazar 73
        $request = $this->getRequest();
74
        if ($request->isGet()) {
75
 
76
            $headers = $request->getHeaders();
77
 
78
            $isJson = false;
79
            if ($headers->has('Accept')) {
80
                $accept = $headers->get('Accept');
81
 
82
                $prioritized = $accept->getPrioritized();
83
 
84
                foreach ($prioritized as $key => $value) {
85
                    $raw = trim($value->getRaw());
86
 
87
                    if (!$isJson) {
88
                        $isJson = strpos($raw, 'json');
89
                    }
90
                }
91
            }
92
 
93
            if ($isJson) {
5911 eleazar 94
 
5866 eleazar 95
                $search = $this->params()->fromQuery('search', []);
96
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
97
 
98
                $page = intval($this->params()->fromQuery('start', 1), 10);
99
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
100
                $order = $this->params()->fromQuery('order', []);
101
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
102
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
103
 
6411 eleazar 104
                $fields = ['name'];
6416 eleazar 105
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
5866 eleazar 106
 
107
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
108
                    $order_direction = 'ASC';
109
                }
110
 
6411 eleazar 111
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
6412 eleazar 112
                $paginator = $surveyMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
6423 eleazar 113
 
114
                $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
115
 
5866 eleazar 116
                $items = [];
117
                $records = $paginator->getCurrentItems();
6212 eleazar 118
 
5866 eleazar 119
                foreach ($records as $record) {
6423 eleazar 120
                    $surveyForm = $surveyFormMapper->fetchOne($record->form_id);
6451 eleazar 121
                    $params = [
122
 
123
                        'id' => $record->uuid,
124
                    ];
5866 eleazar 125
                    $item = [
126
                        'id' => $record->id,
6426 eleazar 127
                        'name' => $record->name,
6211 eleazar 128
                        'form' => $surveyForm->name,
6427 eleazar 129
                        'status' => $record->status,
5866 eleazar 130
                        'actions' => [
6496 eleazar 131
                            'link_report_all' => $this->url()->fromRoute('survey/report/all', ['survey_id' => $record->uuid]),
132
                            'link_overview' => $this->url()->fromRoute('survey/report/overview', ['survey_id' => $record->uuid])
5866 eleazar 133
                        ]
134
                    ];
135
 
136
                    array_push($items, $item);
137
                }
138
 
139
                return new JsonModel([
140
                    'success' => true,
141
                    'data' => [
142
                        'items' => $items,
143
                        'total' => $paginator->getTotalItemCount(),
144
                    ]
145
                ]);
5911 eleazar 146
            } else {
147
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
148
                $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
149
 
5866 eleazar 150
                $form = new SurveyTestForm($this->adapter, $currentCompany->id);
151
 
152
                $this->layout()->setTemplate('layout/layout-backend');
153
                $viewModel = new ViewModel();
5933 eleazar 154
                $viewModel->setTemplate('leaders-linked/survey-report/index.phtml');
5866 eleazar 155
                $viewModel->setVariables([
5911 eleazar 156
                    'form'      => $form,
157
                    'survies' => $survies
5866 eleazar 158
                ]);
159
                return $viewModel;
160
            }
161
        } else {
162
            return new JsonModel([
163
                'success' => false,
164
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
165
            ]);
166
 
6424 eleazar 167
        }
168
        } catch (\Throwable $e) {
169
            $e->getMessage();
170
            return new JsonModel([
171
                'success' => false,
172
                'data' => $e
173
            ]);
5866 eleazar 174
        }
6212 eleazar 175
 
5866 eleazar 176
    }
5911 eleazar 177
 
6496 eleazar 178
    public function overviewAction(){
179
        $request = $this->getRequest();
180
        $currentUserPlugin = $this->plugin('currentUserPlugin');
181
        $currentCompany = $currentUserPlugin->getCompany();
182
        $currentUser = $currentUserPlugin->getUser();
183
 
184
        $request = $this->getRequest();
185
        $uuid = $this->params()->fromRoute('survey_id');
186
 
187
        if (!$uuid) {
188
            $data = [
189
                'success' => false,
190
                'data' => 'ERROR_INVALID_PARAMETER'
191
            ];
192
 
193
            return new JsonModel($data);
194
        }
195
 
196
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
197
        $survey = $surveyMapper->fetchOneByUuid($uuid);
198
 
199
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
200
        $survey = $surveyMapper->fetchOneByUuid($uuid);
201
 
202
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
203
        $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
204
 
205
        $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
206
        $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
207
 
208
        $sections = json_decode($surveyForm->content, true);
209
 
210
        $allTests = array_map(
211
            function($response) {
212
                return json_decode($response->content, true);
213
            },
214
            $surveyTests,
215
        );
216
 
217
        $averages = [];
218
 
219
        foreach($sections as $section) {
220
            foreach($section['questions'] as $question) {
221
                switch ($question['type']) {
222
                    case 'multiple':
223
                        $totals = [];
224
 
225
                        foreach($question['options'] as $option) {
226
                            $totals[$option['slug_option']] = 0;
227
                        }
228
 
229
                        foreach($question['options'] as $option) {
230
                            $totals[$option['slug_option']] = count(array_filter(
231
                                $allTests,
232
                                function ($test) use($option, $question) {
233
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
234
                                }
235
                            ));
236
                        }
237
 
238
                        $averages[$question['slug_question']] = $totals;
239
 
240
                        break;
241
 
242
                    case 'simple':
243
                        $totals = [];
244
 
245
                        foreach($question['options'] as $option) {
246
                            $totals[$option['slug_option']] = 0;
247
                        }
248
 
249
                        foreach ($allTests as $test) {
250
                            $totals[$test[$question['slug_question']]]++;
251
                        }
252
 
253
                        foreach($totals as $slug => $amount) {
254
                            $totals[$slug] = ($amount / count($allTests)) * 100;
255
                        }
256
 
257
                        $averages[$question['slug_question']] = $totals;
258
                    break;
259
 
260
                }
261
            }
262
        }
263
 
264
        $this->layout()->setTemplate('layout/layout-backend.phtml');
265
        $viewModel = new ViewModel();
266
        $viewModel->setTemplate('leaders-linked/survey-report/overview.phtml');
267
        $viewModel->setVariables([
6506 eleazar 268
            'sections' => $sections,
6524 eleazar 269
            'averages' => $averages,
6496 eleazar 270
        ]);
271
        return $viewModel ;
272
 
273
    }
274
 
6447 eleazar 275
    public function allAction() {
5930 eleazar 276
        $request = $this->getRequest();
277
        $currentUserPlugin = $this->plugin('currentUserPlugin');
278
        $currentCompany = $currentUserPlugin->getCompany();
279
        $currentUser = $currentUserPlugin->getUser();
280
 
281
        $request = $this->getRequest();
6043 eleazar 282
        $uuid = $this->params()->fromRoute('survey_id');
5961 eleazar 283
 
5930 eleazar 284
 
285
 
286
        if (!$uuid) {
287
            $data = [
288
                'success' => false,
289
                'data' => 'ERROR_INVALID_PARAMETER'
290
            ];
291
 
292
            return new JsonModel($data);
293
        }
294
 
6039 eleazar 295
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
296
        $survey = $surveyMapper->fetchOneByUuid($uuid);
6044 eleazar 297
 
5965 eleazar 298
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6052 eleazar 299
        $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
5966 eleazar 300
 
6052 eleazar 301
        if (!$surveyTests) {
5930 eleazar 302
            $data = [
303
                'success' => false,
5961 eleazar 304
                'data' => 'ERROR_RECORD_NOT_FOUND'
5930 eleazar 305
            ];
306
 
307
            return new JsonModel($data);
308
        }
309
 
5965 eleazar 310
 
5930 eleazar 311
        if ($request->isGet()) {
312
            $hydrator = new ObjectPropertyHydrator();
313
 
314
            //get form data
315
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
5965 eleazar 316
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5930 eleazar 317
 
318
            if ($surveyForm) {
319
 
6052 eleazar 320
                return $this->renderPDF($surveyForm, $surveyTests, $survey);
5930 eleazar 321
            } else {
322
 
323
                $data = [
324
                    'success' => false,
325
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
326
                ];
327
 
328
                return new JsonModel($data);
329
            }
330
        } else {
331
            $data = [
332
                'success' => false,
333
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
334
            ];
335
 
336
            return new JsonModel($data);
337
        }
338
 
339
        return new JsonModel($data);
340
    }
341
 
342
 
6052 eleazar 343
    public function renderPDF($surveyForm, $surveyTests, $survey) {
5930 eleazar 344
 
6052 eleazar 345
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
5930 eleazar 346
 
347
 
348
        if(file_exists($target_path)) {
349
            Functions::deleteFiles($target_path);
350
        } else {
351
            @mkdir($target_path, 0755, true);
352
        }
353
 
354
        // Set Data
355
        $headerFormName = utf8_decode($surveyForm->name);
6071 eleazar 356
        $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
6052 eleazar 357
        $sections = json_decode($surveyForm->content, true);
358
 
6053 eleazar 359
        $allTests = array_map(
6052 eleazar 360
            function($response) {
361
                return json_decode($response->content, true);
362
            },
363
            $surveyTests,
364
        );
365
 
366
        $averages = [];
367
 
368
        foreach($sections as $section) {
369
            foreach($section['questions'] as $question) {
370
                switch ($question['type']) {
6054 eleazar 371
                    case 'multiple':
6056 eleazar 372
                        $totals = [];
373
 
374
                        foreach($question['options'] as $option) {
375
                            $totals[$option['slug_option']] = 0;
376
                        }
377
 
378
                        foreach($question['options'] as $option) {
6057 eleazar 379
                            $totals[$option['slug_option']] = count(array_filter(
6056 eleazar 380
                                $allTests,
6452 eleazar 381
                                function ($test) use($option, $question) {
6450 eleazar 382
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
6056 eleazar 383
                                }
384
                            ));
385
                        }
6084 eleazar 386
 
6056 eleazar 387
                        $averages[$question['slug_question']] = $totals;
388
 
389
                        break;
6449 eleazar 390
 
6052 eleazar 391
                    case 'simple':
6053 eleazar 392
                        $totals = [];
6052 eleazar 393
 
394
                        foreach($question['options'] as $option) {
6053 eleazar 395
                            $totals[$option['slug_option']] = 0;
6052 eleazar 396
                        }
397
 
6053 eleazar 398
                        foreach ($allTests as $test) {
399
                            $totals[$test[$question['slug_question']]]++;
6052 eleazar 400
                        }
401
 
6053 eleazar 402
                        foreach($totals as $slug => $amount) {
403
                            $totals[$slug] = ($amount / count($allTests)) * 100;
6052 eleazar 404
                        }
405
 
6084 eleazar 406
                        $averages[$question['slug_question']] = $totals;
6052 eleazar 407
                    break;
6071 eleazar 408
 
6052 eleazar 409
                }
410
            }
411
        }
412
 
5930 eleazar 413
        //Generate New PDF
5971 eleazar 414
        $pdf = new SurveyReport();
5930 eleazar 415
 
416
        $pdf->AliasNbPages();
417
        $pdf->AddPage();
418
 
419
        // Set header secundary
6071 eleazar 420
        $pdf->customHeader($headerFormName, $headerSurveyName);
5930 eleazar 421
 
6609 eleazar 422
        $countSection = 0;
423
 
6615 eleazar 424
        for ($i = 0; $i < count($sections); $i++) {
425
            if ($countSection > 1) {
426
                $countSection = 0;
427
                $pdf->AddPage();
428
                $pdf->customHeader($headerFormName, $headerUserName);
429
            }
430
            $section = $sections[$i];
6084 eleazar 431
 
432
            foreach ($section['questions'] as $question) {
6615 eleazar 433
 
6614 eleazar 434
                    switch ($question['type']) {
435
                        case 'simple':
436
                            $labels = [];
437
                            $values = [];
6039 eleazar 438
 
6614 eleazar 439
                            foreach($question['options'] as $option) {
440
                                $labels []= strip_tags($option['text']) . "\n(%.1f%%)";
6133 eleazar 441
 
6614 eleazar 442
                                $values []= $averages[$question['slug_question']][$option['slug_option']];
443
                            }
444
 
445
                            $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
6635 eleazar 446
                            $pdf->Cell(0,10,strip_tags(trim(str_replace(' ', ' ', html_entity_decode($question['text'])))),0,1);
6614 eleazar 447
                            $pdf->pieChart($labels, $values, '', $filename);
448
                            $pdf->SetFont('Arial', '', 12);
449
                            $pdf->Image($filename, 45, $pdf->getY(), 120);
450
                            $pdf->setY($pdf->getY() + 90);
451
 
452
                            break;
453
 
454
                        case 'multiple':
455
                            $labels = [];
456
                            $values = [];
457
 
458
                            foreach($question['options'] as $option) {
459
                                $labels []= strip_tags($option['text']);
460
 
461
                                $values []= $averages[$question['slug_question']][$option['slug_option']];
462
                            }
463
 
464
                            $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
465
                            $pdf->Cell(0,10,strip_tags($question['text']),0,1);
466
                            $pdf->barChart($labels, $values, '', $filename);
467
                            $pdf->SetFont('Arial', '', 12);
468
                            $pdf->Image($filename, 12, $pdf->getY());
469
                            $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
470
 
471
                            break;
472
                    }
6615 eleazar 473
                $countSection++;
6084 eleazar 474
            }
6608 eleazar 475
 
6615 eleazar 476
 
5930 eleazar 477
        }
478
 
479
        return $pdf->Output();
480
    }
481
 
5866 eleazar 482
}