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' => [
6458 eleazar 131
                            'link_report_all' => $this->url()->fromRoute('survey/report/all', ['survey_id' => $record->uuid])
5866 eleazar 132
                        ]
133
                    ];
134
 
135
                    array_push($items, $item);
136
                }
137
 
138
                return new JsonModel([
139
                    'success' => true,
140
                    'data' => [
141
                        'items' => $items,
142
                        'total' => $paginator->getTotalItemCount(),
143
                    ]
144
                ]);
5911 eleazar 145
            } else {
146
                $surveyMapper = SurveyMapper::getInstance($this->adapter);
147
                $survies = $surveyMapper->fetchAllByCompanyId($currentCompany->id);
148
 
5866 eleazar 149
                $form = new SurveyTestForm($this->adapter, $currentCompany->id);
150
 
151
                $this->layout()->setTemplate('layout/layout-backend');
152
                $viewModel = new ViewModel();
5933 eleazar 153
                $viewModel->setTemplate('leaders-linked/survey-report/index.phtml');
5866 eleazar 154
                $viewModel->setVariables([
5911 eleazar 155
                    'form'      => $form,
156
                    'survies' => $survies
5866 eleazar 157
                ]);
158
                return $viewModel;
159
            }
160
        } else {
161
            return new JsonModel([
162
                'success' => false,
163
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
164
            ]);
165
 
6424 eleazar 166
        }
167
        } catch (\Throwable $e) {
168
            $e->getMessage();
169
            return new JsonModel([
170
                'success' => false,
171
                'data' => $e
172
            ]);
5866 eleazar 173
        }
6212 eleazar 174
 
5866 eleazar 175
    }
5911 eleazar 176
 
6447 eleazar 177
    public function allAction() {
5930 eleazar 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,
6452 eleazar 283
                                function ($test) use($option, $question) {
6450 eleazar 284
                                    return in_array($option['slug_option'], $test[$question['slug_question']]);
6056 eleazar 285
                                }
286
                            ));
287
                        }
6084 eleazar 288
 
6056 eleazar 289
                        $averages[$question['slug_question']] = $totals;
290
 
291
                        break;
6449 eleazar 292
 
6052 eleazar 293
                    case 'simple':
6053 eleazar 294
                        $totals = [];
6052 eleazar 295
 
296
                        foreach($question['options'] as $option) {
6053 eleazar 297
                            $totals[$option['slug_option']] = 0;
6052 eleazar 298
                        }
299
 
6053 eleazar 300
                        foreach ($allTests as $test) {
301
                            $totals[$test[$question['slug_question']]]++;
6052 eleazar 302
                        }
303
 
6053 eleazar 304
                        foreach($totals as $slug => $amount) {
305
                            $totals[$slug] = ($amount / count($allTests)) * 100;
6052 eleazar 306
                        }
307
 
6084 eleazar 308
                        $averages[$question['slug_question']] = $totals;
6052 eleazar 309
                    break;
6071 eleazar 310
 
6052 eleazar 311
                }
312
            }
313
        }
314
 
5930 eleazar 315
        //Generate New PDF
5971 eleazar 316
        $pdf = new SurveyReport();
5930 eleazar 317
 
318
        $pdf->AliasNbPages();
319
        $pdf->AddPage();
320
 
321
        // Set header secundary
6071 eleazar 322
        $pdf->customHeader($headerFormName, $headerSurveyName);
5930 eleazar 323
 
324
        for ($i = 0; $i < count($sections); $i++) {
6084 eleazar 325
            if ($i != 0 && $i % 2 == 0) {
5930 eleazar 326
                $pdf->AddPage();
6084 eleazar 327
                $pdf->customHeader($headerFormName, $headerUserName);
5930 eleazar 328
            }
329
 
6084 eleazar 330
            $section = $sections[$i];
331
 
332
            foreach ($section['questions'] as $question) {
333
                switch ($question['type']) {
334
                    case 'simple':
335
                        $labels = [];
336
                        $values = [];
337
 
338
                        foreach($question['options'] as $option) {
6130 eleazar 339
                            $labels []= strip_tags($option['text']) . "\n(%.1f%%)";
6084 eleazar 340
 
341
                            $values []= $averages[$question['slug_question']][$option['slug_option']];
342
                        }
343
 
344
                        $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
6209 eleazar 345
                        $pdf->Cell(0,10,strip_tags($question['text']),0,1);
6084 eleazar 346
                        $pdf->pieChart($labels, $values, '', $filename);
6107 eleazar 347
                        $pdf->SetFont('Arial', '', 12);
6106 eleazar 348
                        $pdf->Image($filename, 45, $pdf->getY(), 120);
6155 eleazar 349
                        $pdf->setY($pdf->getY() + 90);
6039 eleazar 350
 
6084 eleazar 351
                        break;
6133 eleazar 352
 
353
                    case 'multiple':
354
                        $labels = [];
355
                        $values = [];
356
 
357
                        foreach($question['options'] as $option) {
6152 eleazar 358
                            $labels []= strip_tags($option['text']);
6133 eleazar 359
 
360
                            $values []= $averages[$question['slug_question']][$option['slug_option']];
361
                        }
362
 
363
                        $filename = $target_path . DIRECTORY_SEPARATOR .  $question['slug_question'] . '.png';
6209 eleazar 364
                        $pdf->Cell(0,10,strip_tags($question['text']),0,1);
6145 eleazar 365
                        $pdf->barChart($labels, $values, '', $filename);
6133 eleazar 366
                        $pdf->SetFont('Arial', '', 12);
6177 eleazar 367
                        $pdf->Image($filename, 12, $pdf->getY());
6175 eleazar 368
                        $pdf->setY($pdf->getY() + (count($values) * 13) + 10);
6133 eleazar 369
 
370
                        break;
6084 eleazar 371
                }
372
            }
5930 eleazar 373
        }
374
 
375
        return $pdf->Output();
376
    }
377
 
5866 eleazar 378
}