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