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;
16768 efrain 8
 
5866 eleazar 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;
7080 eleazar 24
use PhpOffice\PhpSpreadsheet\Spreadsheet;
25
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
26
use PhpOffice\PhpSpreadsheet\IOFactory;
5866 eleazar 27
 
28
class SurveyReportController extends AbstractActionController {
29
 
30
    /**
31
     *
32
     * @var AdapterInterface
33
     */
34
    private $adapter;
16768 efrain 35
 
5866 eleazar 36
    /**
37
     *
38
     * @var  LoggerInterface
39
     */
40
    private $logger;
16768 efrain 41
 
5866 eleazar 42
    /**
43
     *
44
     * @var array
45
     */
46
    private $config;
16768 efrain 47
 
5866 eleazar 48
    /**
49
     *
50
     * @param AdapterInterface $adapter
51
     * @param LoggerInterface $logger
52
     * @param array $config
53
     */
16768 efrain 54
    public function __construct($adapter, $logger, $config)
55
    {
5866 eleazar 56
        $this->adapter = $adapter;
57
        $this->logger = $logger;
58
        $this->config = $config;
59
    }
60
 
61
    public function indexAction() {
5911 eleazar 62
 
5866 eleazar 63
        $request = $this->getRequest();
64
        $currentUserPlugin = $this->plugin('currentUserPlugin');
65
        $currentCompany = $currentUserPlugin->getCompany();
66
        $currentUser = $currentUserPlugin->getUser();
67
 
6424 eleazar 68
        try{
5866 eleazar 69
        $request = $this->getRequest();
70
        if ($request->isGet()) {
71
 
72
            $headers = $request->getHeaders();
73
 
74
            $isJson = false;
75
            if ($headers->has('Accept')) {
76
                $accept = $headers->get('Accept');
77
 
78
                $prioritized = $accept->getPrioritized();
79
 
80
                foreach ($prioritized as $key => $value) {
81
                    $raw = trim($value->getRaw());
82
 
83
                    if (!$isJson) {
84
                        $isJson = strpos($raw, 'json');
85
                    }
86
                }
87
            }
88
 
89
            if ($isJson) {
5911 eleazar 90
 
5866 eleazar 91
                $search = $this->params()->fromQuery('search', []);
16766 efrain 92
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
5866 eleazar 93
 
15371 efrain 94
                $start = intval($this->params()->fromQuery('start', 0), 10);
5866 eleazar 95
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
15371 efrain 96
                $page =  intval($start / $records_x_page);
97
                $page++;
98
 
5866 eleazar 99
                $order = $this->params()->fromQuery('order', []);
100
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
16766 efrain 101
                $order_direction = empty($order[0]['dir']) ? 'ASC' : Functions::sanitizeFilterString(filter_var($order[0]['dir']));
5866 eleazar 102
 
6411 eleazar 103
                $fields = ['name'];
6416 eleazar 104
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
5866 eleazar 105
 
106
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
107
                    $order_direction = 'ASC';
108
                }
109
 
6411 eleazar 110
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
6412 eleazar 111
                $paginator = $surveyMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
6423 eleazar 112
 
113
                $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
114
 
5866 eleazar 115
                $items = [];
116
                $records = $paginator->getCurrentItems();
6866 eleazar 117
 
5866 eleazar 118
                foreach ($records as $record) {
6423 eleazar 119
                    $surveyForm = $surveyFormMapper->fetchOne($record->form_id);
6451 eleazar 120
                    $params = [
121
 
122
                        'id' => $record->uuid,
123
                    ];
5866 eleazar 124
                    $item = [
14215 kerby 125
                        'id' => $record->id,
6426 eleazar 126
                        'name' => $record->name,
6211 eleazar 127
                        'form' => $surveyForm->name,
6427 eleazar 128
                        'status' => $record->status,
5866 eleazar 129
                        'actions' => [
6496 eleazar 130
                            'link_report_all' => $this->url()->fromRoute('survey/report/all', ['survey_id' => $record->uuid]),
15150 efrain 131
                            'link_report_excel' => $this->url()->fromRoute('survey/report/excel', ['survey_id' => $record->uuid]),
6496 eleazar 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
 
8355 eleazar 205
        if (!$surveyTests) {
206
            $data = [
207
                'success' => false,
208
                'data' => 'No hay respuestas en esta encuesta'
209
            ];
210
 
211
            return new JsonModel($data);
212
        }
213
 
6496 eleazar 214
        $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
215
        $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
216
 
217
        $sections = json_decode($surveyForm->content, true);
218
 
219
        $allTests = array_map(
220
            function($response) {
221
                return json_decode($response->content, true);
222
            },
223
            $surveyTests,
224
        );
225
 
226
        $averages = [];
227
 
228
        foreach($sections as $section) {
229
            foreach($section['questions'] as $question) {
230
                switch ($question['type']) {
231
                    case 'multiple':
232
                        $totals = [];
233
 
234
                        foreach($question['options'] as $option) {
235
                            $totals[$option['slug_option']] = 0;
236
                        }
237
 
238
                        foreach($question['options'] as $option) {
239
                            $totals[$option['slug_option']] = count(array_filter(
240
                                $allTests,
241
                                function ($test) use($option, $question) {
242
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
243
                                }
244
                            ));
245
                        }
246
 
247
                        $averages[$question['slug_question']] = $totals;
248
 
249
                        break;
250
 
251
                    case 'simple':
252
                        $totals = [];
253
 
254
                        foreach($question['options'] as $option) {
255
                            $totals[$option['slug_option']] = 0;
256
                        }
257
 
258
                        foreach ($allTests as $test) {
259
                            $totals[$test[$question['slug_question']]]++;
260
                        }
261
 
262
                        foreach($totals as $slug => $amount) {
263
                            $totals[$slug] = ($amount / count($allTests)) * 100;
264
                        }
265
 
266
                        $averages[$question['slug_question']] = $totals;
267
                    break;
268
 
269
                }
270
            }
271
        }
272
 
273
        $this->layout()->setTemplate('layout/layout-backend.phtml');
274
        $viewModel = new ViewModel();
275
        $viewModel->setTemplate('leaders-linked/survey-report/overview.phtml');
276
        $viewModel->setVariables([
6506 eleazar 277
            'sections' => $sections,
6524 eleazar 278
            'averages' => $averages,
6496 eleazar 279
        ]);
280
        return $viewModel ;
281
 
282
    }
283
 
6447 eleazar 284
    public function allAction() {
5930 eleazar 285
        $request = $this->getRequest();
286
        $currentUserPlugin = $this->plugin('currentUserPlugin');
287
        $currentCompany = $currentUserPlugin->getCompany();
288
        $currentUser = $currentUserPlugin->getUser();
289
 
290
        $request = $this->getRequest();
6043 eleazar 291
        $uuid = $this->params()->fromRoute('survey_id');
5961 eleazar 292
 
5930 eleazar 293
 
294
 
295
        if (!$uuid) {
296
            $data = [
297
                'success' => false,
298
                'data' => 'ERROR_INVALID_PARAMETER'
299
            ];
300
 
301
            return new JsonModel($data);
302
        }
303
 
6039 eleazar 304
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
305
        $survey = $surveyMapper->fetchOneByUuid($uuid);
6044 eleazar 306
 
5965 eleazar 307
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6052 eleazar 308
        $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
5966 eleazar 309
 
6052 eleazar 310
        if (!$surveyTests) {
5930 eleazar 311
            $data = [
312
                'success' => false,
5961 eleazar 313
                'data' => 'ERROR_RECORD_NOT_FOUND'
5930 eleazar 314
            ];
315
 
316
            return new JsonModel($data);
317
        }
318
 
5965 eleazar 319
 
5930 eleazar 320
        if ($request->isGet()) {
15150 efrain 321
 
5930 eleazar 322
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
5965 eleazar 323
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5930 eleazar 324
 
325
            if ($surveyForm) {
326
 
15150 efrain 327
                return $this->renderPDF($currentCompany, $surveyForm, $surveyTests, $survey);
5930 eleazar 328
            } else {
329
 
330
                $data = [
331
                    'success' => false,
332
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
333
                ];
334
 
335
                return new JsonModel($data);
336
            }
337
        } else {
338
            $data = [
339
                'success' => false,
340
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
341
            ];
342
 
343
            return new JsonModel($data);
344
        }
345
 
346
        return new JsonModel($data);
347
    }
348
 
349
 
15150 efrain 350
    public function renderPDF($company, $surveyForm, $surveyTests, $survey) {
5930 eleazar 351
 
15150 efrain 352
 
353
 
5930 eleazar 354
 
355
 
15150 efrain 356
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $company->uuid;
357
 
358
        $header = $company->header ? $target_path . DIRECTORY_SEPARATOR . $company->header : '';
359
        if(empty($header) || !file_exists($header)) {
360
            $header = $this->config['leaderslinked.images_default.company_pdf_header'];
361
        }
362
 
363
        $footer = $company->footer ? $target_path . DIRECTORY_SEPARATOR . $company->footer : '';
364
        if(empty($footer) || !file_exists($footer)) {
365
            $footer = $this->config['leaderslinked.images_default.company_pdf_footer'];
366
        }
367
 
368
 
369
        //Generate New PDF
370
        $pdf = new SurveyReport();
371
 
372
 
373
        $pdf->header = $header;
374
        $pdf->footer = $footer;
375
 
376
 
377
 
378
        $target_path = $this->config[ 'leaderslinked.fullpath.survey'] . DIRECTORY_SEPARATOR . $survey->uuid;
379
        if(!file_exists($target_path)) {
380
            mkdir($target_path, 0755, true);
381
        } else {
5930 eleazar 382
            Functions::deleteFiles($target_path);
383
        }
384
        // Set Data
15150 efrain 385
        $headerFormName = $this->cleanStringToPdf($surveyForm->name);
386
        $headerSurveyName = $this->cleanStringToPdf('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
6052 eleazar 387
        $sections = json_decode($surveyForm->content, true);
388
 
6053 eleazar 389
        $allTests = array_map(
6052 eleazar 390
            function($response) {
391
                return json_decode($response->content, true);
392
            },
393
            $surveyTests,
394
        );
15150 efrain 395
 
396
 
6052 eleazar 397
 
15150 efrain 398
 
6052 eleazar 399
        $averages = [];
400
 
401
        foreach($sections as $section) {
402
            foreach($section['questions'] as $question) {
403
                switch ($question['type']) {
6054 eleazar 404
                    case 'multiple':
6056 eleazar 405
                        $totals = [];
406
 
407
                        foreach($question['options'] as $option) {
408
                            $totals[$option['slug_option']] = 0;
409
                        }
410
 
411
                        foreach($question['options'] as $option) {
6057 eleazar 412
                            $totals[$option['slug_option']] = count(array_filter(
6056 eleazar 413
                                $allTests,
6452 eleazar 414
                                function ($test) use($option, $question) {
6450 eleazar 415
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
6056 eleazar 416
                                }
417
                            ));
418
                        }
6084 eleazar 419
 
6056 eleazar 420
                        $averages[$question['slug_question']] = $totals;
421
 
422
                        break;
6449 eleazar 423
 
6052 eleazar 424
                    case 'simple':
6053 eleazar 425
                        $totals = [];
6052 eleazar 426
 
427
                        foreach($question['options'] as $option) {
6053 eleazar 428
                            $totals[$option['slug_option']] = 0;
6052 eleazar 429
                        }
430
 
6053 eleazar 431
                        foreach ($allTests as $test) {
432
                            $totals[$test[$question['slug_question']]]++;
6052 eleazar 433
                        }
434
 
6053 eleazar 435
                        foreach($totals as $slug => $amount) {
436
                            $totals[$slug] = ($amount / count($allTests)) * 100;
6052 eleazar 437
                        }
438
 
6084 eleazar 439
                        $averages[$question['slug_question']] = $totals;
6052 eleazar 440
                    break;
6071 eleazar 441
 
6052 eleazar 442
                }
443
            }
444
        }
445
 
5930 eleazar 446
 
447
        $pdf->AliasNbPages();
448
        $pdf->AddPage();
449
 
450
        // Set header secundary
6071 eleazar 451
        $pdf->customHeader($headerFormName, $headerSurveyName);
5930 eleazar 452
 
6609 eleazar 453
        $countSection = 0;
454
 
15150 efrain 455
        for ($i = 0, $max = count($sections);  $i < $max ; $i++) {
456
            $headerUserName = '';
457
 
6615 eleazar 458
            if ($countSection > 1) {
459
                $countSection = 0;
460
                $pdf->AddPage();
461
                $pdf->customHeader($headerFormName, $headerUserName);
462
            }
463
            $section = $sections[$i];
6084 eleazar 464
 
465
            foreach ($section['questions'] as $question) {
6615 eleazar 466
 
6614 eleazar 467
                    switch ($question['type']) {
468
                        case 'simple':
469
                            $labels = [];
470
                            $values = [];
6039 eleazar 471
 
6614 eleazar 472
                            foreach($question['options'] as $option) {
15150 efrain 473
                                $label = $this->cleanStringToPdf($option['text']) . "\n(%.1f%%)";
474
                                $value = $averages[$question['slug_question']][$option['slug_option']];
475
                                if(empty($value)) {
476
                                    continue;
477
                                }
478
 
479
                                array_push($labels, $label);
480
 
481
                                array_push($values, $value);
6614 eleazar 482
                            }
483
 
484
                            $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
15150 efrain 485
                            $pdf->Cell(0,10, $this->cleanStringToPdf($question['text'], false),0,1);
6914 eleazar 486
                            $pdf->pieChart($labels, $values, '', $filename);
6614 eleazar 487
                            $pdf->SetFont('Arial', '', 12);
15150 efrain 488
                            $pdf->Image($filename, 10, $pdf->getY(), 190);
6614 eleazar 489
                            $pdf->setY($pdf->getY() + 90);
6912 eleazar 490
 
6614 eleazar 491
 
492
                            break;
493
 
494
                        case 'multiple':
495
                            $labels = [];
496
                            $values = [];
497
 
15150 efrain 498
                            foreach($question['options'] as $option)
499
                            {
500
                                $label = $this->cleanStringToPdf($option['text']) . "\n(%.1f%%)";
501
                                $value = $averages[$question['slug_question']][$option['slug_option']];
502
                                if(empty($value)) {
503
                                    continue;
504
                                }
505
 
506
                                array_push($labels, $label);
6614 eleazar 507
 
15150 efrain 508
                                array_push($values, $value);
6614 eleazar 509
                            }
510
 
511
                            $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
15150 efrain 512
                            $pdf->Cell(0,10,$this->cleanStringToPdf($question['text'], false),0,1);
513
                            $pdf->pieChart($labels, $values, '', $filename);
6614 eleazar 514
                            $pdf->SetFont('Arial', '', 12);
15150 efrain 515
                            $pdf->Image($filename, 10, $pdf->getY(), 190);
6614 eleazar 516
                            $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
517
 
518
                            break;
519
                    }
6615 eleazar 520
                $countSection++;
6084 eleazar 521
            }
6608 eleazar 522
 
6615 eleazar 523
 
5930 eleazar 524
        }
525
 
7021 eleazar 526
        return $pdf->Output();
527
    }
528
 
15150 efrain 529
    public function excelAction() {
7021 eleazar 530
        $request = $this->getRequest();
531
        $currentUserPlugin = $this->plugin('currentUserPlugin');
532
        $currentCompany = $currentUserPlugin->getCompany();
533
        $currentUser = $currentUserPlugin->getUser();
534
 
535
        $request = $this->getRequest();
536
        $uuid = $this->params()->fromRoute('survey_id');
537
 
538
 
539
 
540
        if (!$uuid) {
541
            $data = [
542
                'success' => false,
543
                'data' => 'ERROR_INVALID_PARAMETER'
544
            ];
545
 
546
            return new JsonModel($data);
547
        }
548
 
549
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
550
        $survey = $surveyMapper->fetchOneByUuid($uuid);
551
 
552
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
553
        $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
554
 
555
        if (!$surveyTests) {
556
            $data = [
557
                'success' => false,
558
                'data' => 'ERROR_RECORD_NOT_FOUND'
559
            ];
560
 
561
            return new JsonModel($data);
562
        }
563
 
564
 
565
        if ($request->isGet()) {
15150 efrain 566
 
7021 eleazar 567
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
568
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
569
 
570
            if ($surveyForm) {
571
 
15150 efrain 572
                $filename = $this->excelRender($surveyForm, $surveyTests, $survey);
573
                $content = file_get_contents($filename);
574
 
575
 
576
                $response = $this->getResponse();
577
                $headers = $response->getHeaders();
578
                $headers->clearHeaders();
579
 
580
 
581
                $headers->addHeaderLine('Content-Description: File Transfer');
582
                $headers->addHeaderLine('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
583
                $headers->addHeaderLine('Content-Disposition: attachment; filename='.$survey->uuid.'.xls');
584
                $headers->addHeaderLine('Content-Transfer-Encoding: binary');
585
                $headers->addHeaderLine('Expires: 0');
586
                $headers->addHeaderLine('Cache-Control: must-revalidate');
587
                $headers->addHeaderLine('Pragma: public');
588
 
589
 
590
                $response->setStatusCode(200);
591
                $response->setContent($content);
592
 
593
 
594
                return $response;
7021 eleazar 595
            } else {
596
 
597
                $data = [
598
                    'success' => false,
15150 efrain 599
                    'data' => 'ERROR_SURVEY_NOT_FOUND'
7021 eleazar 600
                ];
601
 
602
                return new JsonModel($data);
603
            }
604
        } else {
605
            $data = [
606
                'success' => false,
607
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
608
            ];
609
 
610
            return new JsonModel($data);
611
        }
612
 
613
        return new JsonModel($data);
614
    }
615
 
616
 
15150 efrain 617
    public function excelRender($surveyForm, $surveyTests, $survey)
7021 eleazar 618
    {
7026 eleazar 619
        $sections = json_decode($surveyForm->content, true);
7020 eleazar 620
 
7088 eleazar 621
        $spreadsheet = new Spreadsheet();
622
        $sheet = $spreadsheet->getActiveSheet();
623
 
7025 eleazar 624
        $allTests = array_map(
625
            function($response) {
626
                return json_decode($response->content, true);
627
            },
628
            $surveyTests,
629
        );
630
 
631
        $averages = [];
632
 
633
        foreach($sections as $section) {
634
            foreach($section['questions'] as $question) {
635
                switch ($question['type']) {
636
                    case 'multiple':
637
                        $totals = [];
638
 
639
                        foreach($question['options'] as $option) {
640
                            $totals[$option['slug_option']] = 0;
641
                        }
642
 
643
                        foreach($question['options'] as $option) {
644
                            $totals[$option['slug_option']] = count(array_filter(
645
                                $allTests,
646
                                function ($test) use($option, $question) {
647
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
648
                                }
649
                            ));
650
                        }
651
 
652
                        $averages[$question['slug_question']] = $totals;
653
 
654
                        break;
655
 
656
                    case 'simple':
657
                        $totals = [];
658
 
659
                        foreach($question['options'] as $option) {
660
                            $totals[$option['slug_option']] = 0;
661
                        }
662
 
663
                        foreach ($allTests as $test) {
664
                            $totals[$test[$question['slug_question']]]++;
665
                        }
666
 
667
                        foreach($totals as $slug => $amount) {
668
                            $totals[$slug] = ($amount / count($allTests)) * 100;
669
                        }
670
 
671
                        $averages[$question['slug_question']] = $totals;
672
                    break;
673
 
674
                }
675
            }
676
        }
677
 
7101 eleazar 678
        $row = 1;
679
 
7025 eleazar 680
        for ($i = 0; $i < count($sections); $i++) {
681
            $section = $sections[$i];
682
 
7096 eleazar 683
           for($j = 0; $j < count($section['questions']); $j++) {
7099 eleazar 684
                $question = $section['questions'][$j];
7095 eleazar 685
 
7101 eleazar 686
                if (!in_array($question['type'], ['simple', 'multiple'])){
687
                    continue;
688
                }
15150 efrain 689
 
690
                $row++;
691
                $sheet->setCellValue('A' . $row , $this->cleanStringToExcel($question['text']));
7101 eleazar 692
 
7028 eleazar 693
                switch ($question['type']) {
7032 eleazar 694
                    case 'simple':
7102 eleazar 695
                        for($k = 0; $k < count($question['options']); $k++) {
15150 efrain 696
                            $row++;
697
 
7102 eleazar 698
                            $option = $question['options'][$k];
15150 efrain 699
 
700
 
701
                            $sheet->setCellValue('B' . $row , $this->cleanStringToExcel($option['text']));
702
                            $sheet->setCellValue('C' . $row , round($averages[$question['slug_question']][$option['slug_option']], 2) . '%');
703
 
7032 eleazar 704
                        }
7025 eleazar 705
 
7032 eleazar 706
                        break;
7025 eleazar 707
 
7032 eleazar 708
                    case 'multiple':
7102 eleazar 709
                        for($k = 0; $k < count($question['options']); $k++) {
15150 efrain 710
 
711
                            $row++;
7102 eleazar 712
                            $option = $question['options'][$k];
15150 efrain 713
                            $sheet->setCellValue('B' . $row , $this->cleanStringToExcel($option['text']));
714
                            $sheet->setCellValue('C' . $row , round($averages[$question['slug_question']][$option['slug_option']]));
715
 
7032 eleazar 716
                        }
7025 eleazar 717
 
7032 eleazar 718
                        break;
719
                }
7025 eleazar 720
            }
721
 
722
 
723
        }
724
 
15150 efrain 725
 
726
 
727
        $target_path = $this->config[ 'leaderslinked.fullpath.survey'] . DIRECTORY_SEPARATOR . $survey->uuid;
728
        if(!file_exists($target_path)) {
729
            mkdir($target_path, 0755, true);
730
        }
731
 
732
        $filename = $target_path  . DIRECTORY_SEPARATOR . $survey->uuid . '.xls';
733
 
7088 eleazar 734
        $writer = new Xlsx($spreadsheet);
15150 efrain 735
        $writer->save($filename);
736
 
737
        return $filename;
738
 
739
    }
740
 
7088 eleazar 741
 
15150 efrain 742
 
743
    private function cleanStringToPdf($s, $mbConvert = true)
744
    {
745
 
746
        $s = html_entity_decode($s);
747
 
748
 
749
        if($mbConvert) {
750
            $detect = mb_detect_encoding($s);
751
            if(strtoupper($detect) != 'UTF8') {
752
 
753
                $s = mb_convert_encoding($s, 'UTF8', $detect);
754
 
755
            }
756
        } else {
16768 efrain 757
            $s = Functions::utf8_decode($s);
15150 efrain 758
        }
759
 
760
 
761
        return strip_tags($s);
5930 eleazar 762
    }
15150 efrain 763
 
764
    private function cleanStringToExcel($s)
765
    {
766
 
767
        $s = html_entity_decode($s);
768
        return strip_tags($s);
769
    }
5866 eleazar 770
}