Proyectos de Subversion LeadersLinked - Services

Rev

Rev 145 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
119 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Mvc\Controller\AbstractActionController;
7
use Laminas\View\Model\JsonModel;
8
use LeadersLinked\Library\Functions;
9
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleMapper;
10
use LeadersLinked\Mapper\QueryMapper;
11
use LeadersLinked\Mapper\UserMapper;
12
use Laminas\Db\Sql\Select;
13
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleUserMapper;
14
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleCommentMapper;
15
use LeadersLinked\Form\Service\CapsuleCommentForm;
16
use LeadersLinked\Model\CompanyMicrolearningCapsuleComment;
17
use LeadersLinked\Model\CompanyMicrolearningCapsuleUser;
18
use LeadersLinked\Model\CompanyMicrolearningAnswer;
19
use LeadersLinked\Mapper\CompanyMicrolearningUserProgressMapper;
20
use LeadersLinked\Mapper\CompanyMicrolearningSlideMapper;
21
use LeadersLinked\Mapper\CompanyMicrolearningUserLogMapper;
22
use LeadersLinked\Model\CompanyMicrolearningUserLog;
23
use LeadersLinked\Mapper\CompanyMicrolearningTopicMapper;
24
use LeadersLinked\Mapper\CompanyMapper;
25
use LeadersLinked\Model\CompanyMicrolearningUserProgress;
26
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserMapper;
27
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserCompanyMapper;
28
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserFunctionMapper;
29
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserGroupMapper;
30
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserInstitutionMapper;
31
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserPartnerMapper;
32
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserProgramMapper;
33
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserStudentTypeMapper;
34
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserSectorMapper;
35
 
36
 
37
class MicrolearningUserAccessGrantedIds
38
{
39
    public $companies;
40
    public $topics;
41
    public $capsules;
42
 
43
 
44
    public function __construct()
45
    {
46
        $this->companies    = [];
47
        $this->topics       = [];
48
        $this->capsules     = [];
49
    }
50
}
51
 
52
class MicrolearningController extends AbstractActionController
53
{
54
 
55
    /**
56
     *
57
     * @var \Laminas\Db\Adapter\AdapterInterface
58
     */
59
    private $adapter;
60
 
61
    /**
62
     *
63
     * @var \LeadersLinked\Cache\CacheInterface
64
     */
65
    private $cache;
66
 
67
 
68
    /**
69
     *
70
     * @var \Laminas\Log\LoggerInterface
71
     */
72
    private $logger;
73
 
74
    /**
75
     *
76
     * @var array
77
     */
78
    private $config;
79
 
80
 
81
    /**
82
     *
83
     * @var \Laminas\Mvc\I18n\Translator
84
     */
85
    private $translator;
86
 
87
 
88
    /**
89
     *
90
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
91
     * @param \LeadersLinked\Cache\CacheInterface $cache
92
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
93
     * @param array $config
94
     * @param \Laminas\Mvc\I18n\Translator $translator
95
     */
96
    public function __construct($adapter, $cache, $logger, $config, $translator)
97
    {
98
        $this->adapter      = $adapter;
99
        $this->cache        = $cache;
100
        $this->logger       = $logger;
101
        $this->config       = $config;
102
        $this->translator   = $translator;
103
    }
104
 
105
    public function indexAction()
106
    {
107
        $request = $this->getRequest();
108
 
109
        if($request->isGet()) {
110
            return new JsonModel([
111
                'success' => true,
112
                'data' =>  [
113
                    'link_companies' => $this->url()->fromRoute('microlearning/companies',[], ['force_canonical' => true]),
114
                    'link_timeline' => $this->url()->fromRoute('microlearning/timeline',[], ['force_canonical' => true]),
115
                    'link_last_capsule_in_progress' => $this->url()->fromRoute('microlearning/last-capsule-in-progress',[], ['force_canonical' => true]),
116
                    'link_profile' => $this->url()->fromRoute('microlearning/profile',[], ['force_canonical' => true]),
117
                    'link_topics' => $this->url()->fromRoute('microlearning/topics',[], ['force_canonical' => true]),
118
                    'link_capsules_pending' => $this->url()->fromRoute('microlearning/capsules-pending',[], ['force_canonical' => true]),
119
                    'link_capsules_completed' => $this->url()->fromRoute('microlearning/capsules-completed',[], ['force_canonical' => true]),
120
                    'link_capsules_in_progress' => $this->url()->fromRoute('microlearning/capsules-in-progress',[], ['force_canonical' => true]),
121
 
122
 
123
                ]
124
            ]);
125
        }
126
 
127
        return new JsonModel([
128
            'success' => false,
129
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
130
        ]);
131
    }
132
 
133
    public function companiesAction()
134
    {
135
 
136
        $request = $this->getRequest();
137
 
138
        if($request->isGet()) {
139
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
140
            $currentNetwork = $currentNetworkPlugin->getNetwork();
141
 
142
 
143
            $accessGrantedIds = $this->getAccessGranted();
144
            $companyMapper = CompanyMapper::getInstance($this->adapter);
145
            $records = $companyMapper->fetchAllByIdsAndNetworkId($accessGrantedIds->companies, $currentNetwork->id);
146
 
147
 
148
            $companies = [];
149
            foreach($records as $record)
150
            {
151
                array_push($companies, [
152
                    'name' => $record->name,
153
                    'image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $record->uuid, 'filename' => $record->image], ['force_canonical' => true]),
154
                    'link_progress' => $this->url()->fromRoute('microlearning/progress',['id' => $record->uuid], ['force_canonical' => true]),
155
                ]);
156
            }
157
 
158
            return new JsonModel([
159
                'success' => true,
160
                'data' =>  $companies
161
            ]);
162
 
163
 
164
        }
165
        return new JsonModel([
166
            'success' => false,
167
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
168
        ]);
169
    }
170
 
171
 
172
 
173
    public function capsuleCommentsAction()
174
    {
175
 
176
        $request = $this->getRequest();
177
 
178
        if($request->isGet()) {
179
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
180
 
181
            $currentUserPlugin = $this->plugin('currentUserPlugin');
182
            $currentUser = $currentUserPlugin->getUser();
183
 
184
            $capsule_id = $this->params()->fromRoute('capsule_id');
185
 
186
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
187
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
188
 
189
            if(!$capsule) {
190
                return new JsonModel([
191
                    'success' => false,
192
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
193
 
194
                ]);
195
 
196
            }
197
 
198
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
199
            $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);
200
            if(! $capsuleUser) {
201
                return new JsonModel([
202
                    'success' => false,
203
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
204
                ]);
205
            }
206
 
207
            $userMapper = UserMapper::getInstance($this->adapter);
208
            $users = [];
209
 
210
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
211
            $records = $capsuleCommentMapper->fetchAllByCapsuleId($capsule->id);
212
 
213
            $comments = [];
214
            foreach($records as $record)
215
            {
216
 
217
                if(isset($users[$record->user_id])) {
218
 
219
                    $user = $users[$record->user_id];
220
 
221
                } else {
222
 
223
                    $user = $userMapper->fetchOne($record->user_id);
224
                    if(!$user) {
225
                        continue;
226
                    }
227
 
228
                    $users[$record->user_id] = $user;
229
 
230
 
231
                }
232
 
233
 
234
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
235
 
236
                array_push($comments, [
237
                    'date' => $dt->format($serviceDatetimeFormat),
238
                    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
239
                    'fullname' => trim(trim($user->first_name) . ' ' . trim($user->last_name)),
240
                    'rating' => strval($record->rating),
241
                    'comment' => $record->comment,
242
                    'link_delete' => $record->user_id == $currentUser->id ? $this->url()->fromRoute('microlearning/capsules-comments/delete', ['capsule_id' => $capsule->uuid, 'comment_id' => $record->uuid], ['force_canonical' => true]) : '',
243
                ]);
244
            }
245
 
246
            $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
247
 
248
            return new JsonModel([
249
                'success' => true,
250
                'data' => [
251
                    'comments' => $comments,
252
                    'capsule' => [
253
                        'total_comments' => strval($dataCountAndRatingAverage['total_comments']),
254
                        'total_rating' => strval($dataCountAndRatingAverage['total_rating'])
255
                    ]
256
                ]
257
 
258
            ]);
259
 
260
        }
261
 
262
        return new JsonModel([
263
            'success' => false,
264
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
265
        ]);
266
    }
267
 
268
 
269
 
270
    public function capsuleDeleteMyCommentAction()
271
    {
272
 
273
        $request = $this->getRequest();
274
 
275
        if($request->isPost()) {
276
 
277
            $currentUserPlugin = $this->plugin('currentUserPlugin');
278
            $currentUser = $currentUserPlugin->getUser();
279
 
280
            $capsule_id = $this->params()->fromRoute('capsule_id');
281
            $comment_id = $this->params()->fromRoute('comment_id');
282
 
283
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
284
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
285
 
286
            if(!$capsule) {
287
                return new JsonModel([
288
                    'success' => false,
289
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
290
 
291
                ]);
292
 
293
            }
294
 
295
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
296
            $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);
297
            if(! $capsuleUser) {
298
                return new JsonModel([
299
                    'success' => false,
300
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
301
                ]);
302
            }
303
 
304
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
305
            $capsuleComment = $capsuleCommentMapper->fetchOneByUuid($comment_id);
306
 
307
            if(!$capsuleComment) {
308
                return new JsonModel([
309
                    'success' => false,
310
                    'data' => 'ERROR_CAPSULE_COMMENT_NOT_FOUND',
311
                ]);
312
            }
313
 
314
            if($capsuleComment->capsule_id != $capsule->id || $capsuleComment->user_id != $currentUser->id) {
315
                return new JsonModel([
316
                    'success' => false,
317
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE_COMMENT',
318
                ]);
319
            }
320
 
321
 
322
            $result = $capsuleCommentMapper->delete($capsuleComment->id);
323
            if($result) {
324
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
325
 
326
 
327
 
328
 
329
                return new JsonModel([
330
                    'success' => true,
331
                    'data' => [
332
                        'message' => 'LABEL_CAPSULE_COMMENT_HAVE_BEEN_SUCCESSFULLY_DELETE',
333
                        'capsule' => [
334
                            'total_comments' => strval($dataCountAndRatingAverage['total_comments']),
335
                            'total_rating' => strval($dataCountAndRatingAverage['total_rating'])
336
                        ]
337
                    ],
338
 
339
                ]);
340
            } else {
341
                return new JsonModel([
342
                    'success' => false,
343
                    'data' => $capsuleCommentMapper->getError()
344
 
345
                ]);
346
            }
347
 
348
 
349
 
350
        }
351
 
352
        return new JsonModel([
353
            'success' => false,
354
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
355
        ]);
356
    }
357
 
358
    public function capsuleAddMyCommentAction()
359
    {
360
 
361
        $request = $this->getRequest();
362
 
363
        if($request->isPost()) {
364
 
365
            $currentUserPlugin = $this->plugin('currentUserPlugin');
366
            $currentUser = $currentUserPlugin->getUser();
367
 
368
            $capsule_id = $this->params()->fromRoute('capsule_id');
369
 
370
 
371
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
372
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
373
 
374
            if(!$capsule) {
375
                return new JsonModel([
376
                    'success' => false,
377
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
378
 
379
                ]);
380
 
381
            }
382
 
383
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
384
            $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);
385
            if(! $capsuleUser) {
386
                return new JsonModel([
387
                    'success' => false,
388
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
389
                ]);
390
            }
391
 
392
            //$rawdata = file_get_contents("php://input");
393
            //  error_log('$rawdata = ' . $rawdata );
394
 
395
 
396
            $form = new  CapsuleCommentForm();
397
            $dataPost = $request->getPost()->toArray();
398
            $dataPost['added_on'] = $capsuleMapper->getDatebaseNow();
399
 
400
 
401
            $form->setData($dataPost);
402
 
403
            if($form->isValid()) {
404
                $dataPost = (array) $form->getData();
405
 
406
 
407
                $capsuleComment = new CompanyMicrolearningCapsuleComment();
408
                $capsuleComment->company_id = $capsule->company_id;
409
                $capsuleComment->topic_id = $capsule->topic_id;
410
                $capsuleComment->capsule_id = $capsule->id;
411
                $capsuleComment->user_id = $currentUser->id;
412
                $capsuleComment->comment = $dataPost['comment'];
413
                $capsuleComment->rating = strval($dataPost['rating']);
414
                $capsuleComment->added_on =  $dataPost['added_on'];
415
 
416
 
417
                $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
418
                $result = $capsuleCommentMapper->insert($capsuleComment);
419
                if($result) {
420
 
421
                    $capsuleComment = $capsuleCommentMapper->fetchOne($capsuleComment->id);
422
 
423
                    $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
424
 
425
 
426
 
427
                    return new JsonModel([
428
                        'success' => true,
429
                        'data' => [
430
                            'message' =>'LABEL_CAPSULE_COMMENT_HAVE_BEEN_SUCCESSFULLY_ADDED',
431
 
432
                            'comment' => [
433
                                'comment' => $capsuleComment->comment,
434
                                'rating' => $capsuleComment->rating,
435
                                'link_delete' => $this->url()->fromRoute('microlearning/capsules-comments/delete', ['capsule_id' => $capsule->uuid, 'comment_id' => $capsuleComment->uuid], ['force_canonical' => true])
436
                            ],
437
                            'capsule' => [
438
                                'total_comments' => strval($dataCountAndRatingAverage['total_comments']),
439
                                'total_rating' => strval($dataCountAndRatingAverage['total_rating'])
440
                            ]
441
                        ]
442
 
443
                    ]);
444
                } else {
445
                    return new JsonModel([
446
                        'success' => false,
447
                        'data' => $capsuleCommentMapper->getError()
448
 
449
                    ]);
450
                }
451
 
452
 
453
            } else {
454
                $messages = [];
455
                $form_messages = (array) $form->getMessages();
456
                foreach($form_messages  as $fieldname => $field_messages)
457
                {
458
 
459
                    $messages[$fieldname] = array_values($field_messages);
460
                }
461
 
462
                return new JsonModel([
463
                    'success'   => false,
464
                    'data'   => $messages
465
                ]);
466
            }
467
 
468
 
469
 
470
 
471
        }
472
 
473
        return new JsonModel([
474
            'success' => false,
475
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
476
        ]);
477
    }
478
 
479
    public function lastCapsuleInProgressAction()
480
    {
481
        $request = $this->getRequest();
482
 
483
        if($request->isGet())
484
        {
485
            $currentUserPlugin = $this->plugin('currentUserPlugin');
486
            $currentUser = $currentUserPlugin->getUser();
487
 
488
            $accessGrantedIds = $this->getAccessGranted();
489
 
490
 
491
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
492
            $userProgress = $userProgressMapper->fetchOneLastCapsuleInProgressByUserIdAndCapsuleIds($currentUser->id, $accessGrantedIds->capsules);
493
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
494
 
495
            if($userProgress) {
496
                $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
497
                $capsule = $capsuleMapper->fetchOne($userProgress->capsule_id);
498
 
499
                $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
500
 
501
 
502
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
503
 
504
                $topic = $topicMapper->fetchOne($capsule->topic_id);
505
 
506
                $response = [
507
                    'success' => true,
508
                    'data' => [
509
                        'name'              => $capsule->name ? $capsule->name : '',
510
                        'description'       => $capsule->description ? $capsule->description : '',
511
                        'image'             => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
512
                        'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
513
                        'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
514
                        'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
515
                        'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
516
                        'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
517
                        'completed'         => $userProgress->completed,
518
                        'added_on'          => $userProgress->added_on,
519
                        'updated_on'        => $userProgress->updated_on
520
                    ]
521
                ];
522
 
523
 
524
            } else {
525
                $response = [
526
                    'success' => true,
527
                    'data' => [
528
 
529
                    ]
530
                ];
531
            }
532
 
533
 
534
        } else {
535
 
536
            $response = [
537
                'success' => false,
538
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
539
            ];
540
 
541
 
542
        }
543
 
544
        return new JsonModel($response);
545
    }
546
 
547
    public function capsulesPendingAction()
548
    {
549
        $request = $this->getRequest();
550
        if($request->isGet()) {
551
            $currentUserPlugin = $this->plugin('currentUserPlugin');
552
            $currentUser = $currentUserPlugin->getUser();
553
 
554
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
555
 
556
 
557
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
558
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
559
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
560
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
561
 
562
            $accessGranted = $this->getAccessGranted();
563
 
564
 
565
            $topics = [];
566
            $capsules = [];
567
 
568
            foreach($accessGranted->capsules as $capsule_id)
569
            {
570
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);
571
                if($userProgress) {
572
                    continue;
573
                }
574
 
575
                $capsule = $capsuleMapper->fetchOne($capsule_id);
576
 
577
                if($name) {
578
                    if(empty($name) || stripos($capsule->name, $name) === false) {
579
                        continue;
580
                    }
581
                }
582
 
583
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
584
 
585
                if(isset($topics[$capsule->topic_id])) {
586
                    $topic = $topics[$capsule->topic_id];
587
                } else {
588
                    $topic = $topicMapper->fetchOne($capsule->topic_id);
589
                    $topics[ $capsule->topic_id ] = $topic;
590
                }
591
 
592
 
593
                array_push($capsules, [
594
                    'uuid'              => $capsule->uuid,
595
                    'name'              => $capsule->name ? $capsule->name : '',
596
                    'description'       => $capsule->description ? $capsule->description : '',
597
                    'image'             => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
598
                    'position'          => $capsule->order,
599
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
600
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
601
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
602
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
603
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
604
                    'added_on'          => $capsule->added_on,
605
                    'updated_on'        => $capsule->updated_on,
606
                ]);
607
            }
608
 
609
            usort($capsules, function($a, $b) {
610
                $result = strcasecmp($a['name'], $b['name']);
611
                if($result < 0) {
612
                    return 1;
613
                } else if($result > 0) {
614
                    return -1;
615
                } else  {
616
                    return  0;
617
                }
618
 
619
            });
620
 
621
 
622
            return new JsonModel([
623
                'success' => true,
624
                'data' => $capsules
625
            ]);
626
 
627
 
628
 
629
        }
630
 
631
        return new JsonModel([
632
            'success' => false,
633
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
634
        ]);
635
 
636
    }
637
 
638
    public function capsulesCompletedAction()
639
    {
640
        $request = $this->getRequest();
641
        if($request->isGet()) {
642
            $currentUserPlugin = $this->plugin('currentUserPlugin');
643
            $currentUser = $currentUserPlugin->getUser();
644
 
645
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
646
 
647
 
648
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
649
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
650
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
651
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
652
 
653
            $accessGranted = $this->getAccessGranted();
654
 
655
            $topics = [];
656
            $capsules = [];
657
 
658
            foreach($accessGranted->capsules as $capsule_id)
659
            {
660
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);
661
                if(!$userProgress) {
662
                    continue;
663
                }
664
 
665
                if(!$userProgress->completed) {
666
                    continue;
667
                }
668
 
669
 
670
 
671
                $capsule = $capsuleMapper->fetchOne($capsule_id);
672
 
673
                if($name) {
674
                    if(empty($name) || stripos($capsule->name, $name) === false) {
675
                        continue;
676
                    }
677
                }
678
 
679
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
680
 
681
                if(isset($topics[$capsule->topic_id])) {
682
                    $topic = $topics[$capsule->topic_id];
683
                } else {
684
                    $topic = $topicMapper->fetchOne($capsule->topic_id);
685
                    $topics[ $capsule->topic_id ] = $topic;
686
                }
687
 
688
 
689
 
690
                array_push($capsules, [
691
                    'uuid'              => $capsule->uuid,
692
                    'name'              => $capsule->name ? $capsule->name : '',
693
                    'description'       => $capsule->description ? $capsule->description : '',
694
                    'image'             => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
695
                    'position'          => $capsule->order,
696
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
697
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
698
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
699
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
700
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
701
                    'added_on'          => $capsule->added_on,
702
                    'updated_on'        => $capsule->updated_on,
703
                ]);
704
            }
705
 
706
            usort($capsules, function($a, $b) {
707
                $result = strcasecmp($a['name'], $b['name']);
708
                if($result < 0) {
709
                    return 1;
710
                } else if($result > 0) {
711
                    return -1;
712
                } else  {
713
                    return  0;
714
                }
715
 
716
            });
717
 
718
 
719
            return new JsonModel([
720
                'success' => true,
721
                'data' => $capsules
722
            ]);
723
 
724
        }
725
 
726
        return new JsonModel([
727
            'success' => false,
728
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
729
        ]);
730
    }
731
 
732
    public function capsulesInProgressAction()
733
    {
734
        $request = $this->getRequest();
735
        if($request->isGet()) {
736
            $currentUserPlugin = $this->plugin('currentUserPlugin');
737
            $currentUser = $currentUserPlugin->getUser();
738
 
739
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
740
 
741
 
742
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
743
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
744
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
745
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
746
 
747
            $accessGranted = $this->getAccessGranted();
748
 
749
            $topics = [];
750
            $capsules = [];
751
 
752
            foreach($accessGranted->capsules as $capsule_id)
753
            {
754
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);
755
                if(!$userProgress) {
756
                    continue;
757
                }
758
 
759
                if($userProgress->completed) {
760
                    continue;
761
                }
762
 
763
 
764
 
765
                $capsule = $capsuleMapper->fetchOne($capsule_id);
766
 
767
                if($name) {
768
                    if(empty($name) || stripos($capsule->name, $name) === false) {
769
                        continue;
770
                    }
771
                }
772
 
773
 
774
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
775
 
776
                if(isset($topics[$capsule->topic_id])) {
777
                    $topic = $topics[$capsule->topic_id];
778
                } else {
779
                    $topic = $topicMapper->fetchOne($capsule->topic_id);
780
                    $topics[ $capsule->topic_id ] = $topic;
781
                }
782
 
783
 
784
 
785
 
786
                array_push($capsules, [
787
                    'uuid'              => $capsule->uuid,
788
                    'name'              => $capsule->name ? $capsule->name : '',
789
                    'description'       => $capsule->description ? $capsule->description : '',
790
                    'image'             => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
791
                    'position'          => $capsule->order,
792
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
793
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
794
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
795
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
796
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
797
                    'added_on'          => $capsule->added_on,
798
                    'updated_on'        => $capsule->updated_on,
799
                ]);
800
            }
801
 
802
            usort($capsules, function($a, $b) {
803
                $result = strcasecmp($a['name'], $b['name']);
804
                if($result < 0) {
805
                    return 1;
806
                } else if($result > 0) {
807
                    return -1;
808
                } else  {
809
                    return  0;
810
                }
811
 
812
            });
813
 
814
 
815
            return new JsonModel([
816
                'success' => true,
817
                'data' => $capsules
818
            ]);
819
 
820
 
821
 
822
        }
823
 
824
        return new JsonModel([
825
            'success' => false,
826
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
827
        ]);
828
    }
829
 
830
 
831
    public function timelineAction()
832
    {
833
 
834
        $request = $this->getRequest();
835
        if($request->isGet()) {
836
            $currentUserPlugin = $this->plugin('currentUserPlugin');
837
            $currentUser = $currentUserPlugin->getUser();
838
 
839
 
840
            $page = intval($this->params()->fromQuery('page'), 10);
841
 
842
            $activities = [
843
                CompanyMicrolearningUserLog::ACTIVITY_SIGNIN            => 'LABEL_MICROLEARNING_ACTIVITY_SIGNIN',
844
                CompanyMicrolearningUserLog::ACTIVITY_SIGNOUT           => 'LABEL_MICROLEARNING_ACTIVITY_SIGNOUT',
845
                CompanyMicrolearningUserLog::ACTIVITY_START_TOPIC       => 'LABEL_MICROLEARNING_ACTIVITY_START_TOPIC',
846
                CompanyMicrolearningUserLog::ACTIVITY_START_CAPSULE     => 'LABEL_MICROLEARNING_ACTIVITY_START_CAPSULE',
847
                CompanyMicrolearningUserLog::ACTIVITY_VIEW_SLIDE        => 'LABEL_MICROLEARNING_ACTIVITY_VIEW_SLIDE',
848
                CompanyMicrolearningUserLog::ACTIVITY_TAKE_A_TEST       => 'LABEL_MICROLEARNING_ACTIVITY_TAKE_A_TEST',
849
                CompanyMicrolearningUserLog::ACTIVITY_RETAKE_A_TEST     => 'LABEL_MICROLEARNING_ACTIVITY_RETAKE_A_TEST',
850
                CompanyMicrolearningUserLog::ACTIVITY_APPROVED_TEST     => 'LABEL_MICROLEARNING_ACTIVITY_APPROVED_TEST',
851
                CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_CAPSULE => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_CAPSULE',
852
                CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_TOPIC   => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_TOPIC',
853
            ];
854
 
855
 
856
 
857
            $companyMicrolearningUserLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
858
            $paginator = $companyMicrolearningUserLogMapper->getAllMessagesPaginatorByUserId($currentUser->id, $page);
859
 
860
            $items = [];
861
            foreach($paginator as $record)
862
            {
863
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
864
 
865
                array_push($items, [
866
                    'activity' => $activities[$record->activity],
867
                    'added_on' => $dt->format('d/m/Y H:i a')
868
                ]);
869
            }
870
 
871
 
872
            return new JsonModel([
873
                'success' => true,
874
                'data' => [
875
                    'total' => [
876
                        'count' => $paginator->getTotalItemCount(),
877
                        'pages' => $paginator->getPages()->pageCount,
878
                    ],
879
                    'current' => [
880
                        'items'    => $items,
881
                        'page'     => $paginator->getCurrentPageNumber(),
882
                        'count'    => $paginator->getCurrentItemCount(),
883
                    ]
884
                ]
885
            ]);
886
 
887
 
888
        } else {
889
            return new JsonModel([
890
                'success' => false,
891
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
892
            ]);
893
        }
894
    }
895
 
896
    /**
897
     * Valores para la generación de los gráficos de progreso
898
     * Para las repuesta afirmativa
899
     * [
900
     *  'success' => true,
901
     *      'data' => [
902
     *          'topicTotal' => cantidad total de tópicos,
903
     *          'topicStarted' => cantidad de tópicos iniciados,
904
     *          'topicIncompleted' => cantidad de tópicos incompletos,
905
     *          'topicCompleted' => cantidad de tópicos completos,
906
     *          'percentCompleted' => % de diapositivas completados ,
907
     *          'percentIncompleted' => % de diapositivas incompletos ,
908
     *          'percentWithoutReturning' => % de cápsulas sin retorno después de completada,
909
     *          'percentWithReturning' => % de cápsulas con retorno después de completada,
910
     *       ],
911
     * ]
912
     *
913
     *
914
     *  En caso contrario
915
     *  [
916
     *      'success' => false,
917
     *      'data' => mensaje de error
918
     *  ]
919
     *
920
     *
921
     * @return \Laminas\View\Model\JsonModel
922
     */
923
    public function progressAction()
924
    {
925
 
926
        $request = $this->getRequest();
927
        if($request->isGet()) {
928
            $currentUserPlugin = $this->plugin('currentUserPlugin');
929
            $currentUser = $currentUserPlugin->getUser();
930
 
931
 
932
            $accessGrantedIds = $this->getAccessGranted();
933
            $id = $this->params()->fromRoute('id');
934
 
935
            $companyMapper = CompanyMapper::getInstance($this->adapter);
936
            $company = $companyMapper->fetchOneByUuid($id);
937
 
938
            if(!$company) {
939
                $response = [
940
                    'success' => false,
941
                    'data' => 'ERROR_COMPANY_NOT_FOUND',
942
                ];
943
 
944
 
945
                return new JsonModel($response);
946
            }
947
 
948
            if(!in_array($company->id, $accessGrantedIds->companies)) {
949
                $response = [
950
                    'success' => false,
951
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_COMPANY',
952
                ];
953
 
954
 
955
                return new JsonModel($response);
956
            }
957
 
958
            $capsuleTotal              = 0;
959
            $capsuleCompleted          = 0;
960
            $capsuleWithReturning      = 0;
961
            $capsuleWithoutReturning   = 0;
962
            $capsuleStarted            = 0;
963
            $capsuleToStart            = 0;
964
            $percentCompleted          = 0;
965
            $percentIncompleted        = 100;
966
 
967
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
968
            $topics = $topicMapper->fetchAllActiveByCompanyIdAndIds($company->id, $accessGrantedIds->topics);
969
 
970
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
971
            $progressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
972
 
973
 
974
            foreach($topics as $topic)
975
            {
976
                $resultCount = $capsuleMapper->fetchCountByCompanyIdAndTopicId($company->id, $topic->id);
977
                $capsuleTotal =  $capsuleTotal + $resultCount;
978
 
979
                $resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);
980
                $capsuleCompleted = $capsuleCompleted + $resultCount;
981
 
982
                $resultCount = $progressMapper->fetchCountCapsulesCompletedWithReturningByIdAndTopicId($currentUser->id, $topic->id);
983
                $capsuleWithReturning = $capsuleWithReturning + $resultCount;
984
 
985
                $resultCount = $progressMapper->fetchCountCapsulesCompletedWithoutReturningByIdAndTopicId($currentUser->id, $topic->id);
986
                $capsuleWithoutReturning = $capsuleWithoutReturning + $resultCount;
987
 
988
                $resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);
989
                $capsuleStarted = $capsuleStarted + $resultCount;
990
            }
991
 
992
            $capsuleToStart = $capsuleTotal -  $capsuleStarted;
993
 
994
 
995
            if($capsuleTotal > 0) {
996
                $percentCompleted = ($capsuleCompleted * 100) /  $capsuleTotal;
997
                $percentIncompleted = 100 - $percentCompleted;
998
            }
999
 
1000
 
1001
 
1002
            return new JsonModel([
1003
                'success' => true,
1004
                'data' => [
1005
                    'capsuleTotal' => $capsuleTotal,
1006
                    'capsuleCompleted' => $capsuleCompleted,
1007
                    'capsuleStarted' => $capsuleStarted,
1008
                    'capsuleToStart' => $capsuleToStart,
1009
                    'percentCompleted' => number_format($percentCompleted, 2, '.', ','),
1010
                    'percentIncompleted' => number_format($percentIncompleted, 2, '.', ','),
1011
                    'capsuleWithReturning' => $capsuleWithReturning,
1012
                    'capsuleWithoutReturning' => $capsuleWithoutReturning,
1013
                ],
1014
            ]);
1015
 
1016
 
1017
        } else {
1018
            return new JsonModel([
1019
                'success' => false,
1020
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1021
            ]);
1022
        }
1023
    }
1024
 
1025
 
1026
    public function topicsAction()
1027
    {
1028
        $request = $this->getRequest();
1029
        if($request->isGet()) {
1030
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1031
            $currentUser = $currentUserPlugin->getUser();
1032
 
1033
 
1034
            $data = [];
1035
            $accessGrantedIds = $this->getAccessGranted();
1036
 
1037
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1038
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1039
 
1040
 
1041
            foreach($accessGrantedIds->topics as $id)
1042
            {
1043
                $topic = $topicMapper->fetchOne($id);
1044
                if(!$topic) {
1045
                    continue;
1046
                }
1047
 
1048
                $userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $id);
1049
                if($userProgress) {
1050
                    $progress = $userProgress->progress;
1051
                    $completed = $userProgress->completed;
1052
                } else {
1053
                    $progress = 0;
1054
                    $completed = 0;
1055
                }
1056
 
1057
 
1058
 
1059
                array_push($data, [
1060
                    'name'          => $topic->name ? $topic->name : '',
1061
                    'description'   => $topic->description ? $topic->description : '',
1062
                    'image'         => $topic->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '',
1063
                    'progress'      => $progress,
1064
                    'completed'     => $completed,
1065
                    'order'         => $topic->order,
1066
                    'added_on'      => $topic->added_on,
1067
                    'updated_on'    => $topic->updated_on,
1068
                    'link_capsules' => $this->url()->fromRoute('microlearning/capsules', ['topic_id' => $topic->uuid], ['force_canonical' => true]),
1069
 
1070
                ]);
1071
            }
1072
 
1073
            usort($data, function($a, $b) {
1074
 
1075
                $result =  $a['order'] <=> $b['order'];
1076
                if(0 == $result) {
1077
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1078
                    if(0 == $result) {
1079
                        $result = strcasecmp($a['name'], $b['name']);
1080
                    }
1081
                }
1082
 
1083
                if($result < 0) {
1084
                    return 1;
1085
                } else if($result > 0) {
1086
                    return -1;
1087
                } else  {
1088
                    return  0;
1089
                }
1090
            });
1091
 
1092
 
1093
 
1094
                return new JsonModel([
1095
                    'success' => true,
1096
                    'data' => $data
1097
                ]);
1098
 
1099
        } else {
1100
            return new JsonModel([
1101
                'success' => false,
1102
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1103
            ]);
1104
        }
1105
    }
1106
 
1107
 
1108
    public function capsulesAction()
1109
    {
1110
        $request = $this->getRequest();
1111
        if($request->isGet()) {
1112
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1113
            $currentUser = $currentUserPlugin->getUser();
1114
 
1115
 
1116
 
1117
            $topic_id = $this->params()->fromRoute('topic_id');
1118
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1119
            $topic = $topicMapper->fetchOneByUuid($topic_id);
1120
 
1121
            if(!$topic) {
1122
                return new JsonModel([
1123
                    'success' => false,
1124
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1125
                ]);
1126
            }
1127
 
1128
            $accessGrantedIds = $this->getAccessGranted();
1129
 
1130
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1131
                return new JsonModel([
1132
                    'success' => false,
1133
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1134
                ]);
1135
            }
1136
 
1137
 
1138
 
1139
            $data = [];
1140
 
1141
 
1142
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1143
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1144
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
1145
 
1146
 
1147
            $capsules = $capsuleMapper->fetchAllActiveByCompanyIdAndTopicId($topic->company_id, $topic->id);
1148
            foreach($capsules as $capsule)
1149
            {
1150
 
1151
                if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1152
                    continue;
1153
                }
1154
 
1155
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
1156
                if($userProgress) {
1157
                    $progress = $userProgress->progress;
1158
                    $completed = $userProgress->completed;
1159
                } else {
1160
                    $progress = 0;
1161
                    $completed = 0;
1162
                }
1163
 
1164
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
1165
 
1166
 
1167
 
1168
                array_push($data, [
1169
                    'name'              => $capsule->name ? $capsule->name : '',
1170
                    'description'       => $capsule->description ? $capsule->description : '',
1171
                    'image'             => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
1172
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
1173
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
1174
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
1175
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
1176
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
1177
                    'progress'          => $progress,
1178
                    'completed'         => $completed,
1179
                    'order'             => $capsule->order,
1180
                    'added_on'          => $capsule->added_on,
1181
                    'updated_on'        => $capsule->updated_on,
1182
                ]);
1183
 
1184
 
1185
 
1186
            }
1187
 
1188
            usort($data, function($a, $b) {
1189
 
1190
                $result =  $a['order'] <=> $b['order'];
1191
                if(0 == $result) {
1192
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1193
                    if(0 == $result) {
1194
                        $result = strcasecmp($a['name'], $b['name']);
1195
                    }
1196
                }
1197
 
1198
                if($result < 0) {
1199
                    return 1;
1200
                } else if($result > 0) {
1201
                    return -1;
1202
                } else  {
1203
                    return  0;
1204
                }
1205
            });
1206
 
1207
 
1208
 
1209
                return new JsonModel([
1210
                    'success' => true,
1211
                    'data' => $data
1212
                ]);
1213
 
1214
        } else {
1215
            return new JsonModel([
1216
                'success' => false,
1217
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1218
            ]);
1219
        }
1220
    }
1221
 
1222
    public function slidesAction()
1223
    {
1224
        $request = $this->getRequest();
1225
        if($request->isGet()) {
1226
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1227
            $currentUser = $currentUserPlugin->getUser();
1228
 
1229
 
1230
 
1231
            $topic_id = $this->params()->fromRoute('topic_id');
1232
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1233
            $topic = $topicMapper->fetchOneByUuid($topic_id);
1234
 
1235
            if(!$topic) {
1236
                return new JsonModel([
1237
                    'success' => false,
1238
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1239
                ]);
1240
            }
1241
 
1242
            $accessGrantedIds = $this->getAccessGranted();
1243
 
1244
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1245
                return new JsonModel([
1246
                    'success' => false,
1247
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1248
                ]);
1249
            }
1250
 
1251
            $capsule_id = $this->params()->fromRoute('capsule_id');
1252
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1253
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
1254
 
1255
            if(!$capsule) {
1256
                return new JsonModel([
1257
                    'success' => false,
1258
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1259
                ]);
1260
            }
1261
 
1262
 
1263
 
1264
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1265
                return new JsonModel([
1266
                    'success' => false,
1267
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1268
                ]);
1269
            }
1270
 
1271
 
1272
 
1273
            $data = [];
1274
 
1275
 
1276
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1277
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1278
 
1279
 
1280
            $slides = $slideMapper->fetchAllByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
1281
            foreach($slides as $slide)
1282
            {
1283
 
1284
 
1285
                $userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
1286
                if($userProgress) {
1287
                    $completed = 0;
1288
                } else {
1289
                    $completed = 0;
1290
                }
1291
 
1292
 
1293
 
1294
                array_push($data, [
1295
                    'quiz'          => '',
1296
                    'name'          => $slide->name ? $slide->name : '',
1297
                    'description'   => $slide->description ? $slide->description : '',
1298
                    'type'          => $slide->type,
1299
                    'background'    => $slide->background ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '',
1300
                    'file'          => $slide->file ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '',
1301
                    'order'         => $slide->order,
1302
                    'completed'     => $completed,
1303
                    'added_on'      => $slide->added_on,
1304
                    'updated_on'    => $slide->updated_on,
1305
                ]);
1306
 
1307
 
1308
 
1309
            }
1310
 
1311
            usort($data, function($a, $b) {
1312
 
1313
                $result =  $a['order'] <=> $b['order'];
1314
                if(0 == $result) {
1315
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1316
                    if(0 == $result) {
1317
                        $result = strcasecmp($a['name'], $b['name']);
1318
                    }
1319
                }
1320
 
1321
                if($result < 0) {
1322
                    return 1;
1323
                } else if($result > 0) {
1324
                    return -1;
1325
                } else  {
1326
                    return  0;
1327
                }
1328
            });
1329
 
1330
 
1331
 
1332
                return new JsonModel([
1333
                    'success' => true,
1334
                    'data' => $data
1335
                ]);
1336
 
1337
        } else {
1338
            return new JsonModel([
1339
                'success' => false,
1340
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1341
            ]);
1342
        }
1343
    }
1344
 
1345
    public function profileAction()
1346
    {
1347
        $request = $this->getRequest();
1348
        if($request->isGet()) {
1349
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1350
            $currentUser = $currentUserPlugin->getUser();
1351
 
1352
 
1353
            $accessGrantedIds = $this->getAccessGranted();
1354
 
1355
            $companyMapper = CompanyMapper::getInstance($this->adapter);
1356
            $companyExtendUserMapper = CompanyMicrolearningExtendUserMapper::getInstance($this->adapter);
1357
            $companyExtendUserCompanyMapper = CompanyMicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
1358
            $companyExtendUserFunctionMapper = CompanyMicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
1359
            $companyExtendUserGroupMapper = CompanyMicrolearningExtendUserGroupMapper::getInstance($this->adapter);
1360
            $companyExtendUserInstitutionMapper = CompanyMicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
1361
            $companyExtendUserPartnerMapper = CompanyMicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
1362
            $companyExtendUserProgramMapper = CompanyMicrolearningExtendUserProgramMapper::getInstance($this->adapter);
1363
            $companyExtendUserStudentTypeMapper = CompanyMicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
1364
            $companyExtendUserSectorMapper = CompanyMicrolearningExtendUserSectorMapper::getInstance($this->adapter);
1365
 
1366
 
1367
            $data = [];
1368
            foreach($accessGrantedIds->companies as $company_id)
1369
            {
1370
                $company = $companyMapper->fetchOne($company_id);
1371
                if(!$company) {
1372
                    continue;
1373
                }
1374
 
1375
                $record = [
1376
                    'name' => $company->name,
1377
                    'image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
1378
                    'details' => [],
1379
                ];
1380
 
1381
                $companyExtendUser = $companyExtendUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1382
                if(!$companyExtendUser) {
1383
                    continue;
1384
                }
1385
 
1386
                if($companyExtendUser->extend_company_id) {
1387
 
1388
                    $extendedCompany = $companyExtendUserCompanyMapper->fetchOne($companyExtendUser->company_id);
1389
                    if($extendedCompany) {
1390
                        array_push($record['details'],[
1391
                            'uuid' => $extendedCompany->uuid,
1392
                            'label' => 'LABEL_COMPANY',
1393
                            'value' => $extendedCompany->name
1394
                        ]);
1395
                    }
1396
                }
1397
 
1398
                if($companyExtendUser->extend_function_id) {
1399
                    $extendedFunction = $companyExtendUserFunctionMapper->fetchOne($companyExtendUser->extend_function_id);
1400
                    if($extendedFunction) {
1401
                        array_push($record['details'],[
1402
                            'uuid' => $extendedFunction->uuid,
1403
                            'label' => 'LABEL_FUNCTION',
1404
                            'value' => $extendedFunction->name
1405
                        ]);
1406
                    }
1407
                }
1408
 
1409
                if($companyExtendUser->extend_group_id) {
1410
                    $extendedGroup = $companyExtendUserGroupMapper->fetchOne($companyExtendUser->extend_group_id);
1411
                    if($extendedGroup) {
1412
                        array_push($record['details'],[
1413
                            'uuid' => $extendedGroup->uuid,
1414
                            'label' => 'LABEL_GROUP',
1415
                            'value' => $extendedGroup->name
1416
                        ]);
1417
                    }
1418
                }
1419
 
1420
                if($companyExtendUser->extend_institution_id) {
1421
                    $extendedInstitution= $companyExtendUserInstitutionMapper->fetchOne($companyExtendUser->extend_institution_id);
1422
                    if($extendedInstitution) {
1423
                        array_push($record['details'],[
1424
                            'uuid' => $extendedInstitution->uuid,
1425
                            'label' => 'LABEL_INSTITUTION',
1426
                            'value' => $extendedInstitution->name
1427
                        ]);
1428
                    }
1429
                }
1430
 
1431
                if($companyExtendUser->extend_program_id) {
1432
                    $extendedProgram = $companyExtendUserProgramMapper->fetchOne($companyExtendUser->extend_program_id);
1433
                    if($extendedProgram) {
1434
                        array_push($record['details'],[
1435
                            'uuid' => $extendedProgram->uuid,
1436
                            'label' => 'LABEL_PROGRAM',
1437
                            'value' => $extendedProgram->name
1438
                        ]);
1439
 
1440
                    }
1441
                }
1442
 
1443
                if($companyExtendUser->extend_sector_id) {
1444
                    $extendedSector = $companyExtendUserSectorMapper->fetchOne($companyExtendUser->extend_sector_id);
1445
                    if($extendedSector) {
1446
                        array_push($record['details'],[
1447
                            'uuid' => $extendedSector->uuid,
1448
                            'label' => 'LABEL_SECTOR',
1449
                            'value' => $extendedSector->name
1450
                        ]);
1451
                    }
1452
                }
1453
 
1454
                if($companyExtendUser->extend_partner_id) {
1455
                    $extendedPartner = $companyExtendUserPartnerMapper->fetchOne($companyExtendUser->extend_partner_id);
1456
                    if($extendedPartner) {
1457
                        array_push($record['details'],[
1458
                            'uuid' => $extendedPartner->uuid,
1459
                            'label' => 'LABEL_PARTNER',
1460
                            'value' => $extendedPartner->name
1461
                        ]);
1462
                    }
1463
                }
1464
 
1465
                if($companyExtendUser->extend_student_type_id) {
1466
                    $extendedStudentType = $companyExtendUserStudentTypeMapper->fetchOne($companyExtendUser->extend_student_type_id);
1467
                    if($extendedStudentType) {
1468
                        array_push($record['details'],[
1469
                            'uuid' => $extendedStudentType->uuid,
1470
                            'label' => 'LABEL_TYPE',
1471
                            'value' => $extendedStudentType->name
1472
                        ]);
1473
                    }
1474
                }
1475
 
1476
                array_push($data, $record);
1477
            }
1478
 
1479
            return new JsonModel([
1480
                'success' => true,
1481
                'data' => $data
1482
            ]);
1483
 
1484
        } else {
1485
            return new JsonModel([
1486
                'success' => false,
1487
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1488
            ]);
1489
        }
1490
    }
1491
 
1492
 
1493
    /**
1494
     *
1495
     * @return \LeadersLinked\Controller\MicrolearningUserAccessGrantedIds
1496
     */
1497
    private function getAccessGranted()
1498
    {
1499
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1500
        $currentUser = $currentUserPlugin->getUser();
1501
 
1502
        $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1503
        $now = $capsuleUserMapper->getDatebaseNow();
1504
 
1505
        $records = $capsuleUserMapper->fetchAllActiveByUserId($currentUser->id);
1506
 
1507
        $accessGrantedIds = new MicrolearningUserAccessGrantedIds();
1508
 
1509
 
1510
        foreach($records as $record)
1511
        {
1512
            if($record->access != CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED && $record->access != CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
1513
                continue;
1514
            }
1515
            if($record->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
1516
                if($now < $record->paid_from || $now > $record->paid_to) {
1517
                    continue;
1518
                }
1519
            }
1520
 
1521
 
1522
            if(!in_array($record->company_id, $accessGrantedIds->companies )) {
1523
                array_push($accessGrantedIds->companies, $record->company_id);
1524
            }
1525
 
1526
            if(!in_array($record->topic_id, $accessGrantedIds->topics )) {
1527
                array_push( $accessGrantedIds->topics, $record->topic_id);
1528
            }
1529
 
1530
            if(!in_array($record->capsule_id, $accessGrantedIds->capsules)) {
1531
                array_push( $accessGrantedIds->capsules, $record->capsule_id);
1532
            }
1533
        }
1534
 
1535
        return $accessGrantedIds;
1536
    }
1537
 
1538
 
1539
}