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([
268
        ]);
269
        return $viewModel ;
270
 
271
    }
272
 
6447 eleazar 273
    public function allAction() {
5930 eleazar 274
        $request = $this->getRequest();
275
        $currentUserPlugin = $this->plugin('currentUserPlugin');
276
        $currentCompany = $currentUserPlugin->getCompany();
277
        $currentUser = $currentUserPlugin->getUser();
278
 
279
        $request = $this->getRequest();
6043 eleazar 280
        $uuid = $this->params()->fromRoute('survey_id');
5961 eleazar 281
 
5930 eleazar 282
 
283
 
284
        if (!$uuid) {
285
            $data = [
286
                'success' => false,
287
                'data' => 'ERROR_INVALID_PARAMETER'
288
            ];
289
 
290
            return new JsonModel($data);
291
        }
292
 
6039 eleazar 293
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
294
        $survey = $surveyMapper->fetchOneByUuid($uuid);
6044 eleazar 295
 
5965 eleazar 296
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6052 eleazar 297
        $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
5966 eleazar 298
 
6052 eleazar 299
        if (!$surveyTests) {
5930 eleazar 300
            $data = [
301
                'success' => false,
5961 eleazar 302
                'data' => 'ERROR_RECORD_NOT_FOUND'
5930 eleazar 303
            ];
304
 
305
            return new JsonModel($data);
306
        }
307
 
5965 eleazar 308
 
5930 eleazar 309
        if ($request->isGet()) {
310
            $hydrator = new ObjectPropertyHydrator();
311
 
312
            //get form data
313
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
5965 eleazar 314
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5930 eleazar 315
 
316
            if ($surveyForm) {
317
 
6052 eleazar 318
                return $this->renderPDF($surveyForm, $surveyTests, $survey);
5930 eleazar 319
            } else {
320
 
321
                $data = [
322
                    'success' => false,
323
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
324
                ];
325
 
326
                return new JsonModel($data);
327
            }
328
        } else {
329
            $data = [
330
                'success' => false,
331
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
332
            ];
333
 
334
            return new JsonModel($data);
335
        }
336
 
337
        return new JsonModel($data);
338
    }
339
 
340
 
6052 eleazar 341
    public function renderPDF($surveyForm, $surveyTests, $survey) {
5930 eleazar 342
 
6052 eleazar 343
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
5930 eleazar 344
 
345
 
346
        if(file_exists($target_path)) {
347
            Functions::deleteFiles($target_path);
348
        } else {
349
            @mkdir($target_path, 0755, true);
350
        }
351
 
352
        // Set Data
353
        $headerFormName = utf8_decode($surveyForm->name);
6071 eleazar 354
        $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
6052 eleazar 355
        $sections = json_decode($surveyForm->content, true);
356
 
6053 eleazar 357
        $allTests = array_map(
6052 eleazar 358
            function($response) {
359
                return json_decode($response->content, true);
360
            },
361
            $surveyTests,
362
        );
363
 
364
        $averages = [];
365
 
366
        foreach($sections as $section) {
367
            foreach($section['questions'] as $question) {
368
                switch ($question['type']) {
6054 eleazar 369
                    case 'multiple':
6056 eleazar 370
                        $totals = [];
371
 
372
                        foreach($question['options'] as $option) {
373
                            $totals[$option['slug_option']] = 0;
374
                        }
375
 
376
                        foreach($question['options'] as $option) {
6057 eleazar 377
                            $totals[$option['slug_option']] = count(array_filter(
6056 eleazar 378
                                $allTests,
6452 eleazar 379
                                function ($test) use($option, $question) {
6450 eleazar 380
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
6056 eleazar 381
                                }
382
                            ));
383
                        }
6084 eleazar 384
 
6056 eleazar 385
                        $averages[$question['slug_question']] = $totals;
386
 
387
                        break;
6449 eleazar 388
 
6052 eleazar 389
                    case 'simple':
6053 eleazar 390
                        $totals = [];
6052 eleazar 391
 
392
                        foreach($question['options'] as $option) {
6053 eleazar 393
                            $totals[$option['slug_option']] = 0;
6052 eleazar 394
                        }
395
 
6053 eleazar 396
                        foreach ($allTests as $test) {
397
                            $totals[$test[$question['slug_question']]]++;
6052 eleazar 398
                        }
399
 
6053 eleazar 400
                        foreach($totals as $slug => $amount) {
401
                            $totals[$slug] = ($amount / count($allTests)) * 100;
6052 eleazar 402
                        }
403
 
6084 eleazar 404
                        $averages[$question['slug_question']] = $totals;
6052 eleazar 405
                    break;
6071 eleazar 406
 
6052 eleazar 407
                }
408
            }
409
        }
410
 
5930 eleazar 411
        //Generate New PDF
5971 eleazar 412
        $pdf = new SurveyReport();
5930 eleazar 413
 
414
        $pdf->AliasNbPages();
415
        $pdf->AddPage();
416
 
417
        // Set header secundary
6071 eleazar 418
        $pdf->customHeader($headerFormName, $headerSurveyName);
5930 eleazar 419
 
420
        for ($i = 0; $i < count($sections); $i++) {
6084 eleazar 421
            if ($i != 0 && $i % 2 == 0) {
5930 eleazar 422
                $pdf->AddPage();
6084 eleazar 423
                $pdf->customHeader($headerFormName, $headerUserName);
5930 eleazar 424
            }
425
 
6084 eleazar 426
            $section = $sections[$i];
427
 
428
            foreach ($section['questions'] as $question) {
429
                switch ($question['type']) {
430
                    case 'simple':
431
                        $labels = [];
432
                        $values = [];
433
 
434
                        foreach($question['options'] as $option) {
6130 eleazar 435
                            $labels []= strip_tags($option['text']) . "\n(%.1f%%)";
6084 eleazar 436
 
437
                            $values []= $averages[$question['slug_question']][$option['slug_option']];
438
                        }
439
 
440
                        $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
6209 eleazar 441
                        $pdf->Cell(0,10,strip_tags($question['text']),0,1);
6084 eleazar 442
                        $pdf->pieChart($labels, $values, '', $filename);
6107 eleazar 443
                        $pdf->SetFont('Arial', '', 12);
6106 eleazar 444
                        $pdf->Image($filename, 45, $pdf->getY(), 120);
6155 eleazar 445
                        $pdf->setY($pdf->getY() + 90);
6039 eleazar 446
 
6084 eleazar 447
                        break;
6133 eleazar 448
 
449
                    case 'multiple':
450
                        $labels = [];
451
                        $values = [];
452
 
453
                        foreach($question['options'] as $option) {
6152 eleazar 454
                            $labels []= strip_tags($option['text']);
6133 eleazar 455
 
456
                            $values []= $averages[$question['slug_question']][$option['slug_option']];
457
                        }
458
 
459
                        $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
6209 eleazar 460
                        $pdf->Cell(0,10,strip_tags($question['text']),0,1);
6145 eleazar 461
                        $pdf->barChart($labels, $values, '', $filename);
6133 eleazar 462
                        $pdf->SetFont('Arial', '', 12);
6177 eleazar 463
                        $pdf->Image($filename, 12, $pdf->getY());
6175 eleazar 464
                        $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
6133 eleazar 465
 
466
                        break;
6084 eleazar 467
                }
468
            }
5930 eleazar 469
        }
470
 
471
        return $pdf->Output();
472
    }
473
 
5866 eleazar 474
}