Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15545 | Rev 15808 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
15540 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Library\Functions;
13
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
14
use LeadersLinked\Mapper\CompanyMapper;
15
use LeadersLinked\Mapper\DailyPulseEmojiMapper;
16
use LeadersLinked\Form\DailyPulse\DailyPulseAddEmojiForm;
17
use LeadersLinked\Form\DailyPulse\DailyPulseEditEmojiForm;
18
use LeadersLinked\Model\DailyPulseEmoji;
19
use LeadersLinked\Library\Image;
20
use LeadersLinked\Mapper\DailyPulseRecordMapper;
21
use LeadersLinked\Model\DailyPulseRecord;
22
use PhpOffice\PhpSpreadsheet\IOFactory;
23
use PhpOffice\PhpSpreadsheet\Spreadsheet;
24
 
25
class DailyPulseReportsController extends AbstractActionController
26
{
27
    /**
28
     *
29
     * @var AdapterInterface
30
     */
31
    private $adapter;
32
 
33
 
34
    /**
35
     *
36
     * @var AbstractAdapter
37
     */
38
    private $cache;
39
 
40
    /**
41
     *
42
     * @var  LoggerInterface
43
     */
44
    private $logger;
45
 
46
 
47
    /**
48
     *
49
     * @var array
50
     */
51
    private $config;
52
 
53
    /**
54
     *
55
     * @param AdapterInterface $adapter
56
     * @param AbstractAdapter $cache
57
     * @param LoggerInterface $logger
58
     * @param array $config
59
     */
60
    public function __construct($adapter, $cache , $logger, $config)
61
    {
62
        $this->adapter      = $adapter;
63
        $this->cache        = $cache;
64
        $this->logger       = $logger;
65
        $this->config       = $config;
66
 
67
    }
68
 
69
    public function indexAction()
70
    {
71
        return new JsonModel([
72
            'success' => false,
73
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
74
        ]);
75
    }
76
 
77
    public function overviewAction()
78
    {
79
        $currentUserPlugin = $this->plugin('currentUserPlugin');
80
        $currentUser = $currentUserPlugin->getUser();
81
 
82
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
83
        $currentNetwork = $currentNetworkPlugin->getNetwork();
84
 
85
        $companyMapper = CompanyMapper::getInstance($this->adapter);
86
        $company = $companyMapper->fetchDefaultForNetworkByNetworkId($currentNetwork->id);
87
 
88
        $request = $this->getRequest();
89
        if($request->isGet()) {
90
 
91
            $headers  = $request->getHeaders();
92
 
93
            $isJson = false;
94
            if($headers->has('Accept')) {
95
                $accept = $headers->get('Accept');
96
 
97
                $prioritized = $accept->getPrioritized();
98
 
99
                foreach($prioritized as $key => $value) {
100
                    $raw = trim($value->getRaw());
101
 
102
                    if(!$isJson) {
103
                        $isJson = strpos($raw, 'json');
104
                    }
105
 
106
                }
107
            }
108
 
15546 efrain 109
 
15540 efrain 110
            if($isJson) {
111
 
112
                $startDate = $this->params()->fromQuery('startDate');
113
                if(empty($startDate)) {
114
                    $startDate = date('Y-m-d');
115
                }
116
 
117
 
118
                $endDate = $this->params()->fromQuery('endDate');
15546 efrain 119
                if(empty($endDate)) {
15540 efrain 120
                    $endDate = date('Y-m-d');
121
                }
122
 
15546 efrain 123
                $startDate = '2023-03-01';
124
                $endDate = '2023-03-19';
15540 efrain 125
 
126
                $dtStartDate = \DateTime::createFromFormat('Y-n-d', $startDate);
127
                $dtEndDate = \DateTime::createFromFormat('Y-n-d', $endDate);
128
 
129
                if(!$dtStartDate || !$dtEndDate) {
130
                    $startDate = date('Y-m-d');
131
                    $endDate = date('Y-m-d');
132
                } else {
133
 
134
                    if($dtStartDate->getTimestamp() > $dtEndDate->getTimestamp()) {
135
                        $startDate = date('Y-m-d');
136
                        $endDate = date('Y-m-d');
137
                    }
138
                }
139
 
140
                $dailyPulseRecordMapper = DailyPulseRecordMapper::getInstance($this->adapter);
141
                $how_are_you_feel = $dailyPulseRecordMapper->fetchAllDataChartOrExcelByCompanyIdAndTypeAndDateRange($company->id, DailyPulseRecord::TYPE_HOW_ARE_YOU_FEEL, $startDate, $endDate);
142
 
143
                $climate_on_your_organization = $dailyPulseRecordMapper->fetchAllDataChartOrExcelByCompanyIdAndTypeAndDateRange($company->id, DailyPulseRecord::TYPE_CLIMATE_ON_YOUR_ORGANIZATION, $startDate, $endDate);
144
 
145
 
146
 
147
                $data = [
15544 efrain 148
                    'labels'             => [],
149
                    'users' => [
150
                        'how_are_you_feel' => [],
151
                        'climate_on_your_organization' => [],
152
                    ],
153
                    'points' => [
154
                        'how_are_you_feel' => [],
155
                        'climate_on_your_organization' => [],
156
                    ],
15545 efrain 157
                    'average' => [
158
                        'how_are_you_feel' => [],
159
                        'climate_on_your_organization' => [],
160
                    ],
15544 efrain 161
                    'how_are_you_feel' => [
162
                        'average_points'     => 0,
163
                        'average_users'      => 0,
164
                    ],
15540 efrain 165
                    'climate_on_your_organization' => [
166
                        'average_points'    => 0,
167
                        'average_users'     => 0,
168
                    ]
15544 efrain 169
 
170
 
15540 efrain 171
                ];
15544 efrain 172
 
15540 efrain 173
 
174
 
175
                $how_are_you_feel_points = 0;
176
                $how_are_you_feel_users = 0;
177
 
178
                $climate_on_your_organization_points = 0;
179
                $climate_on_your_organization_users = 0;
180
 
181
                $count = 0;
182
 
183
 
184
                $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
185
                do {
186
                    $count++;
187
                    $date = $dt->format('Y-m-d');
188
                    $label = $dt->format('d/m/Y');
189
 
15544 efrain 190
                    array_push($data['labels'], $label);
191
 
15540 efrain 192
 
15544 efrain 193
                    $points = 0;
194
                    $users = 0;
15540 efrain 195
                    foreach($how_are_you_feel as $record)
196
                    {
197
                        if($date == $record['date']) {
15544 efrain 198
                            $points = $record['points'];
199
                            $users = $record['users'];
15540 efrain 200
                        }
201
                    }
202
 
203
 
15544 efrain 204
 
205
                    array_push($data['points']['how_are_you_feel'], $points);
206
                    array_push($data['users']['how_are_you_feel'], $users);
15545 efrain 207
                    array_push($data['average']['how_are_you_feel'], $users ?  $points / $users : 0);
15544 efrain 208
 
209
 
210
                    $how_are_you_feel_points += $points;
211
                    $how_are_you_feel_users += $users;
15540 efrain 212
 
15544 efrain 213
                    $points = 0;
214
                    $users = 0;
15540 efrain 215
                    foreach($climate_on_your_organization as $record)
216
                    {
217
                        if($date == $record['date']) {
15544 efrain 218
                            $points = $record['points'];
219
                            $users = $record['users'];
15540 efrain 220
                        }
221
                    }
222
 
223
 
15544 efrain 224
                    array_push($data['points']['climate_on_your_organization'], $points);
225
                    array_push($data['users']['climate_on_your_organization'], $users);
15545 efrain 226
                    array_push($data['average']['climate_on_your_organization'], $users ?  $points / $users : 0);
15540 efrain 227
 
228
 
15544 efrain 229
                    $climate_on_your_organization_points += $points;
230
                    $climate_on_your_organization_users += $users;
15540 efrain 231
 
232
 
233
                    $dt->add(new \DateInterval('P1D'));
234
 
235
 
236
                } while($date < $endDate);
15546 efrain 237
 
238
 
239
 
15540 efrain 240
 
241
                $data['how_are_you_feel']['average_points'] =  number_format($how_are_you_feel_points / $count, 2);
242
                $data['how_are_you_feel']['average_users'] = number_format($how_are_you_feel_users / $count, 2);
243
 
244
                $data['climate_on_your_organization']['average_points'] = number_format($climate_on_your_organization_points / $count, 2);
245
                $data['climate_on_your_organization']['average_users'] = number_format($climate_on_your_organization_users / $count, 2);
246
 
247
 
15546 efrain 248
 
249
 
15540 efrain 250
 
251
                return new JsonModel([
252
                   'success' => true,
253
                   'data' => $data,
254
                ]);
255
 
256
 
257
 
258
 
259
 
260
            } else {
261
                $this->layout()->setTemplate('layout/layout-backend');
262
                $viewModel = new ViewModel();
263
                $viewModel->setTemplate('leaders-linked/daily-pulse-reports/overview.phtml');
264
                return $viewModel ;
265
            }
266
 
267
        } else {
268
 
269
 
270
            return new JsonModel([
271
                'success' => false,
272
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
273
            ]);
274
        }
275
    }
276
 
277
    public function overviewDownloadAction()
278
    {
279
        $currentUserPlugin = $this->plugin('currentUserPlugin');
280
        $currentUser = $currentUserPlugin->getUser();
281
 
282
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
283
        $currentNetwork = $currentNetworkPlugin->getNetwork();
284
 
285
        $companyMapper = CompanyMapper::getInstance($this->adapter);
286
        $company = $companyMapper->fetchDefaultForNetworkByNetworkId($currentNetwork->id);
287
 
288
        $request = $this->getRequest();
289
 
290
        if($request->isGet())
291
        {
292
 
293
            $startDate = $this->params()->fromQuery('startDate');
294
            if(empty($startDate)) {
295
                $startDate = date('Y-m-d');
296
            }
297
 
298
 
299
            $endDate = $this->params()->fromQuery('endDate');
300
            if(empty($startDate)) {
301
                $endDate = date('Y-m-d');
302
            }
303
 
15541 efrain 304
            //$startDate = '2023-03-01';
305
            //$endDate = '2023-03-19';
15540 efrain 306
 
307
            $dtStartDate = \DateTime::createFromFormat('Y-n-d', $startDate);
308
            $dtEndDate = \DateTime::createFromFormat('Y-n-d', $endDate);
309
 
310
            if(!$dtStartDate || !$dtEndDate) {
311
                $startDate = date('Y-m-d');
312
                $endDate = date('Y-m-d');
313
            } else {
314
 
315
                if($dtStartDate->getTimestamp() > $dtEndDate->getTimestamp()) {
316
                    $startDate = date('Y-m-d');
317
                    $endDate = date('Y-m-d');
318
                }
319
            }
320
 
321
            $dailyPulseRecordMapper = DailyPulseRecordMapper::getInstance($this->adapter);
322
            $how_are_you_feel = $dailyPulseRecordMapper->fetchAllDataChartOrExcelByCompanyIdAndTypeAndDateRange($company->id, DailyPulseRecord::TYPE_HOW_ARE_YOU_FEEL, $startDate, $endDate);
323
 
324
            $climate_on_your_organization = $dailyPulseRecordMapper->fetchAllDataChartOrExcelByCompanyIdAndTypeAndDateRange($company->id, DailyPulseRecord::TYPE_CLIMATE_ON_YOUR_ORGANIZATION, $startDate, $endDate);
325
 
326
 
327
 
328
            $data = [
15544 efrain 329
                'labels'             => [],
15545 efrain 330
                'average' => [
331
                    'how_are_you_feel' => [],
332
                    'climate_on_your_organization' => [],
333
                ],
15544 efrain 334
                'users' => [
335
                    'how_are_you_feel' => [],
336
                    'climate_on_your_organization' => [],
337
                ],
338
                'points' => [
339
                    'how_are_you_feel' => [],
340
                    'climate_on_your_organization' => [],
341
                ],
15540 efrain 342
                'how_are_you_feel' => [
15544 efrain 343
                    'average_points'     => 0,
344
                    'average_users'      => 0,
15540 efrain 345
                ],
346
                'climate_on_your_organization' => [
347
                    'average_points'    => 0,
348
                    'average_users'     => 0,
349
                ]
15544 efrain 350
 
351
 
15540 efrain 352
            ];
353
 
354
 
15544 efrain 355
 
15540 efrain 356
            $how_are_you_feel_points = 0;
357
            $how_are_you_feel_users = 0;
358
 
359
            $climate_on_your_organization_points = 0;
360
            $climate_on_your_organization_users = 0;
361
 
362
            $count = 0;
363
 
364
 
365
            $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
366
            do {
367
                $count++;
368
                $date = $dt->format('Y-m-d');
369
                $label = $dt->format('d/m/Y');
370
 
15544 efrain 371
                array_push($data['labels'], $label);
372
 
15540 efrain 373
 
15544 efrain 374
                $points = 0;
375
                $users = 0;
15540 efrain 376
                foreach($how_are_you_feel as $record)
377
                {
378
                    if($date == $record['date']) {
15544 efrain 379
                        $points = $record['points'];
380
                        $users = $record['users'];
15540 efrain 381
                    }
382
                }
383
 
384
 
385
 
15544 efrain 386
                array_push($data['points']['how_are_you_feel'], $points);
387
                array_push($data['users']['how_are_you_feel'], $users);
15545 efrain 388
                array_push($data['average']['how_are_you_feel'], $users ?  $points / $users : 0);
15540 efrain 389
 
15544 efrain 390
 
391
                $how_are_you_feel_points += $points;
392
                $how_are_you_feel_users += $users;
393
 
394
                $points = 0;
395
                $users = 0;
15540 efrain 396
                foreach($climate_on_your_organization as $record)
397
                {
398
                    if($date == $record['date']) {
15544 efrain 399
                        $points = $record['points'];
400
                        $users = $record['users'];
15540 efrain 401
                    }
402
                }
403
 
404
 
15544 efrain 405
                array_push($data['points']['climate_on_your_organization'], $points);
406
                array_push($data['users']['climate_on_your_organization'], $users);
15545 efrain 407
                array_push($data['average']['climate_on_your_organization'], $users ?  $points / $users : 0);
15540 efrain 408
 
409
 
15544 efrain 410
                $climate_on_your_organization_points += $points;
411
                $climate_on_your_organization_users += $users;
412
 
413
 
15540 efrain 414
                $dt->add(new \DateInterval('P1D'));
415
 
416
 
417
            } while($date < $endDate);
418
 
419
            $data['how_are_you_feel']['average_points'] =  number_format($how_are_you_feel_points / $count, 2);
420
            $data['how_are_you_feel']['average_users'] = number_format($how_are_you_feel_users / $count, 2);
421
 
422
            $data['climate_on_your_organization']['average_points'] = number_format($climate_on_your_organization_points / $count, 2);
423
            $data['climate_on_your_organization']['average_users'] = number_format($climate_on_your_organization_users / $count, 2);
424
 
425
 
426
 
427
 
428
 
429
            $spreadsheet = new Spreadsheet();
430
            $spreadsheet->getProperties()->setTitle('Pulso Diario');
431
 
432
 
433
 
434
            $spreadsheet->setActiveSheetIndex(0);
435
            $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
436
 
437
            $spreadsheet->getActiveSheet()->SetCellValue('A1', 'Desde:');
438
            $spreadsheet->getActiveSheet()->SetCellValue('B1', $dt->format('d/m/Y'));
439
 
440
 
441
            $dt = \DateTime::createFromFormat('Y-m-d', $startDate);
442
            $spreadsheet->getActiveSheet()->SetCellValue('C1', 'Hasta:');
443
            $spreadsheet->getActiveSheet()->SetCellValue('D1', $dt->format('d/m/Y'));
444
 
445
 
446
            $spreadsheet->getActiveSheet()->SetCellValue('A3', 'Como te sientes hoy');
15544 efrain 447
            $spreadsheet->getActiveSheet()->setMergeCells(['A3', 'B3', 'C3', 'D3']);
15540 efrain 448
            $spreadsheet->getActiveSheet()->SetCellValue('A4', 'Puntos promedios');
449
            $spreadsheet->getActiveSheet()->SetCellValue('B4',  $data['how_are_you_feel']['average_points']);
450
            $spreadsheet->getActiveSheet()->SetCellValue('C4', 'Usuarios promedios');
451
            $spreadsheet->getActiveSheet()->SetCellValue('D4',  $data['how_are_you_feel']['average_users']);
452
 
453
 
454
            $spreadsheet->getActiveSheet()->SetCellValue('F3', 'Clima en su organización');
15544 efrain 455
            $spreadsheet->getActiveSheet()->setMergeCells(['F3', 'G3', 'H3', 'I3']);
15540 efrain 456
            $spreadsheet->getActiveSheet()->SetCellValue('F4', 'Puntos promedios');
457
            $spreadsheet->getActiveSheet()->SetCellValue('G4',  $data['climate_on_your_organization']['average_points']);
458
            $spreadsheet->getActiveSheet()->SetCellValue('H4', 'Usuarios promedios');
459
            $spreadsheet->getActiveSheet()->SetCellValue('I4',  $data['climate_on_your_organization']['average_users']);
460
 
461
 
15544 efrain 462
            $spreadsheet->getActiveSheet()->SetCellValue('A6', 'Usuarios');
463
            $spreadsheet->getActiveSheet()->setMergeCells(['A6', 'B6', 'C6']);
464
            $spreadsheet->getActiveSheet()->SetCellValue('A7', 'Fecha');
465
            $spreadsheet->getActiveSheet()->SetCellValue('B7', 'Puntos promedios');
466
            $spreadsheet->getActiveSheet()->SetCellValue('C7', 'Cantidad de usuarios');
467
 
468
            $row = 8;
469
            $max = count($data['labels']);
470
 
471
            for($i = 0; $i< $max; $i++)
15540 efrain 472
            {
15544 efrain 473
                $spreadsheet->getActiveSheet()->SetCellValue('A' . $row, $data['labels'][$i]);
474
                $spreadsheet->getActiveSheet()->SetCellValue('B' . $row, $data['users']['how_are_you_feel'][$i]);
475
                $spreadsheet->getActiveSheet()->SetCellValue('C' . $row, $data['users']['climate_on_your_organization'][$i]);
476
                $row++;
15540 efrain 477
            }
15544 efrain 478
 
15540 efrain 479
 
15544 efrain 480
            $spreadsheet->getActiveSheet()->SetCellValue('F6', 'Puntos');
481
            $spreadsheet->getActiveSheet()->setMergeCells(['F6', 'G6', 'H6']);
482
            $spreadsheet->getActiveSheet()->SetCellValue('F7', 'Fecha');
483
            $spreadsheet->getActiveSheet()->SetCellValue('G7', 'Puntos promedios');
484
            $spreadsheet->getActiveSheet()->SetCellValue('H7', 'Cantidad de usuarios');
15540 efrain 485
 
15544 efrain 486
 
15540 efrain 487
 
15544 efrain 488
            $row = 8;
489
            $max = count($data['labels']);
490
 
491
            for($i = 0; $i< $max; $i++)
15540 efrain 492
            {
15544 efrain 493
                $spreadsheet->getActiveSheet()->SetCellValue('F' . $row, $data['labels'][$i]);
494
                $spreadsheet->getActiveSheet()->SetCellValue('G' . $row, $data['points']['how_are_you_feel'][$i]);
495
                $spreadsheet->getActiveSheet()->SetCellValue('H' . $row, $data['points']['climate_on_your_organization'][$i]);
496
                $row++;
15540 efrain 497
            }
498
 
15545 efrain 499
            $spreadsheet->getActiveSheet()->SetCellValue('J6', 'Puntos promedios ( puntos / usuarios ) ');
500
            $spreadsheet->getActiveSheet()->setMergeCells(['J6', 'K6', 'L6']);
501
            $spreadsheet->getActiveSheet()->SetCellValue('J7', 'Fecha');
502
            $spreadsheet->getActiveSheet()->SetCellValue('K7', 'Puntos promedios');
503
            $spreadsheet->getActiveSheet()->SetCellValue('L7', 'Cantidad de usuarios');
504
 
505
 
506
 
507
            $row = 8;
508
            $max = count($data['labels']);
509
 
510
            for($i = 0; $i< $max; $i++)
511
            {
512
                $spreadsheet->getActiveSheet()->SetCellValue('J' . $row, $data['labels'][$i]);
513
                $spreadsheet->getActiveSheet()->SetCellValue('K' . $row, number_format($data['average']['how_are_you_feel'][$i], 2));
514
                $spreadsheet->getActiveSheet()->SetCellValue('L' . $row, number_format($data['average']['climate_on_your_organization'][$i], 2));
515
                $row++;
516
            }
517
 
15540 efrain 518
 
519
            $fileName = 'reporte_pulso_diario_'  . date('d-m-Y-h-i-a', time()) . '.xls';
520
            $tempFilename = tempnam(sys_get_temp_dir(), 'reporte_pulso_diario_' . time());
521
 
522
            $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
523
            $writer->save($tempFilename);
524
 
525
            $content = file_get_contents($tempFilename);
526
            @unlink($tempFilename);
527
 
528
            return new JsonModel([
529
                'success' => true,
530
                'data' => [
531
                    'content' => base64_encode($content),
532
                    'basename' => $fileName
533
 
534
                ]
535
            ]);
536
 
537
 
538
 
539
 
540
        } else {
541
            return new JsonModel([
542
                'success' => false,
543
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
544
            ]);
545
        }
546
    }
547
 
548
 
549
}