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
 
5911 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
                $survey_uuid = $this->params()->fromRoute('survey_id');
95
 
96
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
97
                $survey = $surveyMapper->fetchOneByUuid($survey_uuid);
98
 
5866 eleazar 99
                $search = $this->params()->fromQuery('search', []);
100
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
101
 
102
                $page = intval($this->params()->fromQuery('start', 1), 10);
103
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
104
                $order = $this->params()->fromQuery('order', []);
105
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
106
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
107
 
108
                $fields = ['first_name'];
109
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
110
 
111
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
112
                    $order_direction = 'ASC';
113
                }
114
 
115
                $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6040 eleazar 116
                $paginator = $surveyTestMapper->fetchAllDataTableBySurveyId($survey->id, $search, $page, $records_x_page, $order_field, $order_direction);
5866 eleazar 117
 
118
                $items = [];
119
                $records = $paginator->getCurrentItems();
120
 
121
                foreach ($records as $record) {
5911 eleazar 122
                    $params = [
5936 eleazar 123
                        'survey_id' => $survey_uuid,
5911 eleazar 124
                        'id' => $record->uuid,
125
                    ];
5866 eleazar 126
 
127
                    $item = [
128
                        'id' => $record->id,
129
                        'first_name' => $record->first_name,
5911 eleazar 130
 
5866 eleazar 131
                        'actions' => [
5952 eleazar 132
                            'link_report_one' => $this->url()->fromRoute('survey/report/one', ['id' => $record->uuid, 'survey_id' => $survey_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
 
167
        }
5911 eleazar 168
        } catch (\Throwable $e) {
169
            $e->getMessage();
170
            return new JsonModel([
171
                'success' => false,
172
                'data' => $e
173
            ]);
174
        }
5866 eleazar 175
    }
5911 eleazar 176
 
5930 eleazar 177
    public function oneAction() {
178
        $request = $this->getRequest();
179
        $currentUserPlugin = $this->plugin('currentUserPlugin');
180
        $currentCompany = $currentUserPlugin->getCompany();
181
        $currentUser = $currentUserPlugin->getUser();
182
 
183
        $request = $this->getRequest();
6043 eleazar 184
        $uuid = $this->params()->fromRoute('survey_id');
5961 eleazar 185
 
5930 eleazar 186
 
187
 
188
        if (!$uuid) {
189
            $data = [
190
                'success' => false,
191
                'data' => 'ERROR_INVALID_PARAMETER'
192
            ];
193
 
194
            return new JsonModel($data);
195
        }
196
 
6039 eleazar 197
        $surveyMapper = SurveyMapper::getInstance($this->adapter);
198
        $survey = $surveyMapper->fetchOneByUuid($uuid);
6044 eleazar 199
 
5965 eleazar 200
        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
6052 eleazar 201
        $surveyTests = $surveyTestMapper->fetchAllBySurveyId($survey->id);
5966 eleazar 202
 
6052 eleazar 203
        if (!$surveyTests) {
5930 eleazar 204
            $data = [
205
                'success' => false,
5961 eleazar 206
                'data' => 'ERROR_RECORD_NOT_FOUND'
5930 eleazar 207
            ];
208
 
209
            return new JsonModel($data);
210
        }
211
 
5965 eleazar 212
 
5930 eleazar 213
        if ($request->isGet()) {
214
            $hydrator = new ObjectPropertyHydrator();
215
 
216
            //get form data
217
            $surveyFormMapper = SurveyFormMapper::getInstance($this->adapter);
5965 eleazar 218
            $surveyForm = $surveyFormMapper->fetchOne($survey->form_id);
5930 eleazar 219
 
220
            if ($surveyForm) {
221
 
6052 eleazar 222
                return $this->renderPDF($surveyForm, $surveyTests, $survey);
5930 eleazar 223
            } else {
224
 
225
                $data = [
226
                    'success' => false,
227
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
228
                ];
229
 
230
                return new JsonModel($data);
231
            }
232
        } else {
233
            $data = [
234
                'success' => false,
235
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
236
            ];
237
 
238
            return new JsonModel($data);
239
        }
240
 
241
        return new JsonModel($data);
242
    }
243
 
244
 
6052 eleazar 245
    public function renderPDF($surveyForm, $surveyTests, $survey) {
5930 eleazar 246
 
6052 eleazar 247
        $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $survey->uuid;
5930 eleazar 248
 
249
 
250
        if(file_exists($target_path)) {
251
            Functions::deleteFiles($target_path);
252
        } else {
253
            @mkdir($target_path, 0755, true);
254
        }
255
 
256
        // Set Data
257
        $headerFormName = utf8_decode($surveyForm->name);
6071 eleazar 258
        $headerSurveyName = utf8_decode('Informe de Encuesta: ' . trim($survey->name) . ' al ' . date("m-d-Y H:i:s", strtotime($survey->added_on)));
6052 eleazar 259
        $sections = json_decode($surveyForm->content, true);
260
 
6053 eleazar 261
        $allTests = array_map(
6052 eleazar 262
            function($response) {
263
                return json_decode($response->content, true);
264
            },
265
            $surveyTests,
266
        );
267
 
268
        $averages = [];
269
 
270
        foreach($sections as $section) {
271
            foreach($section['questions'] as $question) {
272
                switch ($question['type']) {
6054 eleazar 273
                    case 'multiple':
6056 eleazar 274
                        $totals = [];
275
 
276
                        foreach($question['options'] as $option) {
277
                            $totals[$option['slug_option']] = 0;
278
                        }
279
 
280
                        foreach($question['options'] as $option) {
6057 eleazar 281
                            $totals[$option['slug_option']] = count(array_filter(
6056 eleazar 282
                                $allTests,
6058 eleazar 283
                                function ($test) use($option, $question) {
6056 eleazar 284
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
285
                                }
286
                            ));
287
                        }
6084 eleazar 288
 
6056 eleazar 289
                        $averages[$question['slug_question']] = $totals;
290
 
291
                        break;
6052 eleazar 292
                    case 'simple':
6053 eleazar 293
                        $totals = [];
6052 eleazar 294
 
295
                        foreach($question['options'] as $option) {
6053 eleazar 296
                            $totals[$option['slug_option']] = 0;
6052 eleazar 297
                        }
298
 
6053 eleazar 299
                        foreach ($allTests as $test) {
300
                            $totals[$test[$question['slug_question']]]++;
6052 eleazar 301
                        }
302
 
6053 eleazar 303
                        foreach($totals as $slug => $amount) {
304
                            $totals[$slug] = ($amount / count($allTests)) * 100;
6052 eleazar 305
                        }
306
 
6084 eleazar 307
                        $averages[$question['slug_question']] = $totals;
6052 eleazar 308
                    break;
6071 eleazar 309
 
6084 eleazar 310
                    case 'rate-range':
6071 eleazar 311
                    case 'rate-open':
6084 eleazar 312
                        $total = 0;
6071 eleazar 313
 
314
                        foreach ($allTests as $test) {
6084 eleazar 315
                            $totals[$question['slug_question']] += $test[$question['slug_question']];
6071 eleazar 316
                        }
317
 
6084 eleazar 318
                        $averages[$question['slug_question']] = $total / count($allTests);
6071 eleazar 319
                    break;
6052 eleazar 320
                }
321
            }
322
        }
323
 
5930 eleazar 324
        //Generate New PDF
5971 eleazar 325
        $pdf = new SurveyReport();
5930 eleazar 326
 
327
        $pdf->AliasNbPages();
328
        $pdf->AddPage();
329
 
330
        // Set header secundary
6071 eleazar 331
        $pdf->customHeader($headerFormName, $headerSurveyName);
5930 eleazar 332
 
333
        for ($i = 0; $i < count($sections); $i++) {
6084 eleazar 334
            if ($i != 0 && $i % 2 == 0) {
5930 eleazar 335
                $pdf->AddPage();
6084 eleazar 336
                $pdf->customHeader($headerFormName, $headerUserName);
5930 eleazar 337
            }
338
 
6084 eleazar 339
            $section = $sections[$i];
340
 
341
            foreach ($section['questions'] as $question) {
342
                switch ($question['type']) {
343
                    case 'simple':
344
                        $labels = [];
345
                        $values = [];
346
 
347
                        foreach($question['options'] as $option) {
6130 eleazar 348
                            $labels []= strip_tags($option['text']) . "\n(%.1f%%)";
6084 eleazar 349
 
350
                            $values []= $averages[$question['slug_question']][$option['slug_option']];
351
                        }
352
 
353
                        $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
354
                        $pdf->pieChart($labels, $values, '', $filename);
6107 eleazar 355
                        $pdf->SetFont('Arial', '', 12);
6106 eleazar 356
                        $pdf->Image($filename, 45, $pdf->getY(), 120);
6155 eleazar 357
                        $pdf->setY($pdf->getY() + 90);
6039 eleazar 358
 
6084 eleazar 359
                        break;
6133 eleazar 360
 
361
                    case 'multiple':
362
                        $labels = [];
363
                        $values = [];
364
 
365
                        foreach($question['options'] as $option) {
6152 eleazar 366
                            $labels []= strip_tags($option['text']);
6133 eleazar 367
 
368
                            $values []= $averages[$question['slug_question']][$option['slug_option']];
369
                        }
370
 
371
                        $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
6145 eleazar 372
                        $pdf->barChart($labels, $values, '', $filename);
6133 eleazar 373
                        $pdf->SetFont('Arial', '', 12);
6177 eleazar 374
                        $pdf->Image($filename, 12, $pdf->getY());
6175 eleazar 375
                        $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
6133 eleazar 376
 
377
                        break;
6084 eleazar 378
                }
379
            }
5930 eleazar 380
        }
381
 
382
        return $pdf->Output();
383
    }
384
 
5866 eleazar 385
}