Proyectos de Subversion LeadersLinked - Services

Rev

Rev 634 | Rev 636 | Ir a la última revisión | | Comparar con el anterior | 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;
283 www 9
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
119 efrain 10
use LeadersLinked\Mapper\QueryMapper;
11
use LeadersLinked\Mapper\UserMapper;
12
use Laminas\Db\Sql\Select;
283 www 13
use LeadersLinked\Mapper\MicrolearningCapsuleCommentMapper;
119 efrain 14
use LeadersLinked\Form\Service\CapsuleCommentForm;
283 www 15
use LeadersLinked\Model\MicrolearningCapsuleComment;
16
use LeadersLinked\Model\MicrolearningAnswer;
17
use LeadersLinked\Mapper\MicrolearningUserProgressMapper;
18
use LeadersLinked\Mapper\MicrolearningSlideMapper;
19
use LeadersLinked\Mapper\MicrolearningUserLogMapper;
20
use LeadersLinked\Model\MicrolearningUserLog;
21
use LeadersLinked\Mapper\MicrolearningTopicMapper;
119 efrain 22
use LeadersLinked\Mapper\CompanyMapper;
283 www 23
use LeadersLinked\Model\MicrolearningUserProgress;
24
use LeadersLinked\Mapper\MicrolearningExtendUserMapper;
25
use LeadersLinked\Mapper\MicrolearningExtendUserCompanyMapper;
26
use LeadersLinked\Mapper\MicrolearningExtendUserFunctionMapper;
27
use LeadersLinked\Mapper\MicrolearningExtendUserGroupMapper;
28
use LeadersLinked\Mapper\MicrolearningExtendUserInstitutionMapper;
29
use LeadersLinked\Mapper\MicrolearningExtendUserPartnerMapper;
30
use LeadersLinked\Mapper\MicrolearningExtendUserProgramMapper;
31
use LeadersLinked\Mapper\MicrolearningExtendUserStudentTypeMapper;
32
use LeadersLinked\Mapper\MicrolearningExtendUserSectorMapper;
33
use LeadersLinked\Mapper\MicrolearningQuizMapper;
34
use LeadersLinked\Mapper\MicrolearningQuestionMapper;
35
use LeadersLinked\Mapper\MicrolearningAnswerMapper;
36
use LeadersLinked\Model\MicrolearningSlide;
37
use LeadersLinked\Library\Storage;
302 www 38
use LeadersLinked\Mapper\MicrolearningTopicCapsuleMapper;
633 stevensc 39
use LeadersLinked\Mapper\MicrolearningTopicUserMapper;
40
use LeadersLinked\Model\MicrolearningTopicUser;
119 efrain 41
 
42
class MicrolearningUserAccessGrantedIds
43
{
44
    public $companies;
45
    public $topics;
46
    public $capsules;
47
 
48
 
49
    public function __construct()
50
    {
51
        $this->companies    = [];
52
        $this->topics       = [];
53
        $this->capsules     = [];
54
    }
55
}
56
 
57
class MicrolearningController extends AbstractActionController
58
{
59
 
60
    /**
61
     *
62
     * @var \Laminas\Db\Adapter\AdapterInterface
63
     */
64
    private $adapter;
65
 
66
    /**
67
     *
68
     * @var \LeadersLinked\Cache\CacheInterface
69
     */
70
    private $cache;
71
 
72
 
73
    /**
74
     *
75
     * @var \Laminas\Log\LoggerInterface
76
     */
77
    private $logger;
78
 
79
    /**
80
     *
81
     * @var array
82
     */
83
    private $config;
84
 
85
 
86
    /**
87
     *
88
     * @var \Laminas\Mvc\I18n\Translator
89
     */
90
    private $translator;
91
 
92
 
93
    /**
94
     *
95
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
96
     * @param \LeadersLinked\Cache\CacheInterface $cache
97
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
98
     * @param array $config
99
     * @param \Laminas\Mvc\I18n\Translator $translator
100
     */
101
    public function __construct($adapter, $cache, $logger, $config, $translator)
102
    {
103
        $this->adapter      = $adapter;
104
        $this->cache        = $cache;
105
        $this->logger       = $logger;
106
        $this->config       = $config;
107
        $this->translator   = $translator;
108
    }
109
 
110
    public function indexAction()
111
    {
112
        $request = $this->getRequest();
113
 
114
        if($request->isGet()) {
115
            return new JsonModel([
116
                'success' => true,
117
                'data' =>  [
118
                    'link_companies' => $this->url()->fromRoute('microlearning/companies',[], ['force_canonical' => true]),
119
                    'link_timeline' => $this->url()->fromRoute('microlearning/timeline',[], ['force_canonical' => true]),
120
                    'link_last_capsule_in_progress' => $this->url()->fromRoute('microlearning/last-capsule-in-progress',[], ['force_canonical' => true]),
121
                    'link_profile' => $this->url()->fromRoute('microlearning/profile',[], ['force_canonical' => true]),
122
                    'link_topics' => $this->url()->fromRoute('microlearning/topics',[], ['force_canonical' => true]),
123
                    'link_capsules_pending' => $this->url()->fromRoute('microlearning/capsules-pending',[], ['force_canonical' => true]),
124
                    'link_capsules_completed' => $this->url()->fromRoute('microlearning/capsules-completed',[], ['force_canonical' => true]),
125
                    'link_capsules_in_progress' => $this->url()->fromRoute('microlearning/capsules-in-progress',[], ['force_canonical' => true]),
126
                ]
127
            ]);
128
        }
129
 
130
        return new JsonModel([
131
            'success' => false,
132
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
133
        ]);
134
    }
590 stevensc 135
 
119 efrain 136
    public function companiesAction()
137
    {
138
 
139
        $request = $this->getRequest();
140
 
141
        if($request->isGet()) {
142
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
143
            $currentNetwork = $currentNetworkPlugin->getNetwork();
144
 
145
 
146
            $accessGrantedIds = $this->getAccessGranted();
147
            $companyMapper = CompanyMapper::getInstance($this->adapter);
148
            $records = $companyMapper->fetchAllByIdsAndNetworkId($accessGrantedIds->companies, $currentNetwork->id);
149
 
333 www 150
            $storage = Storage::getInstance($this->config, $this->adapter);
119 efrain 151
 
152
            $companies = [];
153
            foreach($records as $record)
154
            {
155
                array_push($companies, [
164 efrain 156
                    'uuid' => $record->uuid,
119 efrain 157
                    'name' => $record->name,
283 www 158
                    'image' => $storage->getCompanyImage($record),
119 efrain 159
                    'link_progress' => $this->url()->fromRoute('microlearning/progress',['id' => $record->uuid], ['force_canonical' => true]),
160
                ]);
161
            }
162
 
163
            return new JsonModel([
164
                'success' => true,
165
                'data' =>  $companies
166
            ]);
167
 
168
 
169
        }
170
        return new JsonModel([
171
            'success' => false,
172
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
173
        ]);
174
    }
590 stevensc 175
 
119 efrain 176
    public function capsuleCommentsAction()
177
    {
178
 
179
        $request = $this->getRequest();
180
 
181
        if($request->isGet()) {
182
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
183
 
184
            $currentUserPlugin = $this->plugin('currentUserPlugin');
185
            $currentUser = $currentUserPlugin->getUser();
186
 
187
            $capsule_id = $this->params()->fromRoute('capsule_id');
188
 
283 www 189
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
119 efrain 190
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
191
 
192
            if(!$capsule) {
193
                return new JsonModel([
194
                    'success' => false,
195
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
196
 
197
                ]);
198
            }
199
 
200
            $userMapper = UserMapper::getInstance($this->adapter);
201
            $users = [];
202
 
333 www 203
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 204
 
205
            $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
119 efrain 206
            $records = $capsuleCommentMapper->fetchAllByCapsuleId($capsule->id);
207
 
208
            $comments = [];
209
            foreach($records as $record)
210
            {
211
 
212
                if(isset($users[$record->user_id])) {
213
 
214
                    $user = $users[$record->user_id];
215
 
216
                } else {
217
 
218
                    $user = $userMapper->fetchOne($record->user_id);
219
                    if(!$user) {
220
                        continue;
221
                    }
222
 
223
                    $users[$record->user_id] = $user;
224
 
225
 
226
                }
227
 
228
 
229
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
230
 
231
                array_push($comments, [
232
                    'date' => $dt->format($serviceDatetimeFormat),
283 www 233
                    'image' => $storage->getUserImage($user),
119 efrain 234
                    'fullname' => trim(trim($user->first_name) . ' ' . trim($user->last_name)),
235
                    'rating' => strval($record->rating),
236
                    'comment' => $record->comment,
237
                    '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]) : '',
238
                ]);
239
            }
240
 
302 www 241
            $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->id);
119 efrain 242
 
243
            return new JsonModel([
244
                'success' => true,
245
                'data' => [
246
                    'comments' => $comments,
247
                    'capsule' => [
248
                        'total_comments' => strval($dataCountAndRatingAverage['total_comments']),
249
                        'total_rating' => strval($dataCountAndRatingAverage['total_rating'])
250
                    ]
251
                ]
252
 
253
            ]);
254
 
255
        }
256
 
257
        return new JsonModel([
258
            'success' => false,
259
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
260
        ]);
261
    }
262
 
263
 
264
 
265
    public function capsuleDeleteMyCommentAction()
266
    {
267
 
268
        $request = $this->getRequest();
269
 
270
        if($request->isPost()) {
271
 
272
            $currentUserPlugin = $this->plugin('currentUserPlugin');
273
            $currentUser = $currentUserPlugin->getUser();
274
 
275
            $capsule_id = $this->params()->fromRoute('capsule_id');
276
            $comment_id = $this->params()->fromRoute('comment_id');
277
 
283 www 278
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
119 efrain 279
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
280
 
281
            if(!$capsule) {
282
                return new JsonModel([
283
                    'success' => false,
284
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
285
 
626 stevensc 286
                ]);
119 efrain 287
            }
288
 
283 www 289
            $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
119 efrain 290
            $capsuleComment = $capsuleCommentMapper->fetchOneByUuid($comment_id);
291
 
292
            if(!$capsuleComment) {
293
                return new JsonModel([
294
                    'success' => false,
295
                    'data' => 'ERROR_CAPSULE_COMMENT_NOT_FOUND',
296
                ]);
297
            }
298
 
299
            if($capsuleComment->capsule_id != $capsule->id || $capsuleComment->user_id != $currentUser->id) {
300
                return new JsonModel([
301
                    'success' => false,
302
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE_COMMENT',
303
                ]);
304
            }
305
 
306
 
307
            $result = $capsuleCommentMapper->delete($capsuleComment->id);
308
            if($result) {
302 www 309
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->id);
626 stevensc 310
 
119 efrain 311
                return new JsonModel([
312
                    'success' => true,
313
                    'data' => [
314
                        'message' => 'LABEL_CAPSULE_COMMENT_HAVE_BEEN_SUCCESSFULLY_DELETE',
315
                        'capsule' => [
316
                            'total_comments' => strval($dataCountAndRatingAverage['total_comments']),
317
                            'total_rating' => strval($dataCountAndRatingAverage['total_rating'])
318
                        ]
319
                    ],
320
 
321
                ]);
322
            } else {
323
                return new JsonModel([
324
                    'success' => false,
325
                    'data' => $capsuleCommentMapper->getError()
326
 
327
                ]);
328
            }
329
        }
330
 
331
        return new JsonModel([
332
            'success' => false,
333
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
334
        ]);
335
    }
336
 
337
    public function capsuleAddMyCommentAction()
338
    {
339
 
340
        $request = $this->getRequest();
341
 
342
        if($request->isPost()) {
343
 
344
            $currentUserPlugin = $this->plugin('currentUserPlugin');
345
            $currentUser = $currentUserPlugin->getUser();
346
 
347
            $capsule_id = $this->params()->fromRoute('capsule_id');
348
 
349
 
283 www 350
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
119 efrain 351
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
352
 
353
            if(!$capsule) {
354
                return new JsonModel([
355
                    'success' => false,
356
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
357
 
358
                ]);
359
 
360
            }
361
 
362
            $form = new  CapsuleCommentForm();
363
            $dataPost = $request->getPost()->toArray();
364
            $dataPost['added_on'] = $capsuleMapper->getDatebaseNow();
365
 
366
            $form->setData($dataPost);
367
 
368
            if($form->isValid()) {
369
                $dataPost = (array) $form->getData();
370
 
371
 
283 www 372
                $capsuleComment = new MicrolearningCapsuleComment();
119 efrain 373
                $capsuleComment->company_id = $capsule->company_id;
374
                $capsuleComment->capsule_id = $capsule->id;
375
                $capsuleComment->user_id = $currentUser->id;
376
                $capsuleComment->comment = $dataPost['comment'];
377
                $capsuleComment->rating = strval($dataPost['rating']);
378
                $capsuleComment->added_on =  $dataPost['added_on'];
379
 
380
 
283 www 381
                $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
119 efrain 382
                $result = $capsuleCommentMapper->insert($capsuleComment);
383
                if($result) {
384
 
385
                    $capsuleComment = $capsuleCommentMapper->fetchOne($capsuleComment->id);
386
 
302 www 387
                    $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id,  $capsule->id);
119 efrain 388
 
389
 
390
 
391
                    return new JsonModel([
392
                        'success' => true,
393
                        'data' => [
394
                            'message' =>'LABEL_CAPSULE_COMMENT_HAVE_BEEN_SUCCESSFULLY_ADDED',
395
 
396
                            'comment' => [
397
                                'comment' => $capsuleComment->comment,
398
                                'rating' => $capsuleComment->rating,
399
                                'link_delete' => $this->url()->fromRoute('microlearning/capsules-comments/delete', ['capsule_id' => $capsule->uuid, 'comment_id' => $capsuleComment->uuid], ['force_canonical' => true])
400
                            ],
401
                            'capsule' => [
402
                                'total_comments' => strval($dataCountAndRatingAverage['total_comments']),
403
                                'total_rating' => strval($dataCountAndRatingAverage['total_rating'])
404
                            ]
405
                        ]
406
 
407
                    ]);
408
                } else {
409
                    return new JsonModel([
410
                        'success' => false,
411
                        'data' => $capsuleCommentMapper->getError()
412
 
413
                    ]);
414
                }
415
 
416
 
417
            } else {
418
                $messages = [];
419
                $form_messages = (array) $form->getMessages();
420
                foreach($form_messages  as $fieldname => $field_messages)
421
                {
422
 
423
                    $messages[$fieldname] = array_values($field_messages);
424
                }
425
 
426
                return new JsonModel([
427
                    'success'   => false,
428
                    'data'   => $messages
429
                ]);
430
            }
431
 
432
 
433
 
434
 
435
        }
436
 
437
        return new JsonModel([
438
            'success' => false,
439
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
440
        ]);
441
    }
442
 
443
    public function lastCapsuleInProgressAction()
444
    {
445
        $request = $this->getRequest();
446
 
447
        if($request->isGet())
448
        {
449
            $currentUserPlugin = $this->plugin('currentUserPlugin');
450
            $currentUser = $currentUserPlugin->getUser();
451
 
452
            $accessGrantedIds = $this->getAccessGranted();
453
 
454
 
283 www 455
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
119 efrain 456
            $userProgress = $userProgressMapper->fetchOneLastCapsuleInProgressByUserIdAndCapsuleIds($currentUser->id, $accessGrantedIds->capsules);
283 www 457
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
119 efrain 458
 
459
            if($userProgress) {
333 www 460
                $storage = Storage::getInstance($this->config, $this->adapter);
283 www 461
                $path = $storage->getPathMicrolearningCapsule();
462
 
463
                $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
119 efrain 464
                $capsule = $capsuleMapper->fetchOne($userProgress->capsule_id);
465
 
301 www 466
                $topic = $topicMapper->fetchOne($userProgress->topic_id);
467
 
283 www 468
                $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
302 www 469
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id,  $capsule->id);
576 stevensc 470
                $image = $storage->getGenericImage($path, $topic->uuid, $capsule->image);
471
 
119 efrain 472
                $response = [
473
                    'success' => true,
474
                    'data' => [
164 efrain 475
                        'uuid'              => $capsule->uuid,
119 efrain 476
                        'name'              => $capsule->name ? $capsule->name : '',
477
                        'description'       => $capsule->description ? $capsule->description : '',
575 stevensc 478
                        'image'             => ($capsule->image && $topic) ? $storage->getGenericImage($path,  $topic->uuid, $capsule->image )  : '',
119 efrain 479
                        'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
480
                        'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
481
                        'completed'         => $userProgress->completed,
145 efrain 482
                        'progress'          => $userProgress->progress,
119 efrain 483
                        'added_on'          => $userProgress->added_on,
484
                        'updated_on'        => $userProgress->updated_on
485
                    ]
486
                ];
487
 
488
 
489
            } else {
490
                $response = [
491
                    'success' => true,
575 stevensc 492
                    'data' => []
119 efrain 493
                ];
494
            }
495
 
496
 
497
        } else {
498
 
499
            $response = [
500
                'success' => false,
501
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
502
            ];
503
 
504
 
505
        }
506
 
507
        return new JsonModel($response);
508
    }
509
 
510
    public function capsulesPendingAction()
511
    {
512
        $request = $this->getRequest();
513
        if($request->isGet()) {
514
            $currentUserPlugin = $this->plugin('currentUserPlugin');
515
            $currentUser = $currentUserPlugin->getUser();
516
 
517
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
245 efrain 518
            $order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));
519
            $order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));
119 efrain 520
 
245 efrain 521
            if(!in_array($order_field,['name', 'added_on'] )) {
522
                $order_field = 'name';
523
            }
119 efrain 524
 
245 efrain 525
            if(!in_array( $order_direction,['asc', 'desc'])) {
634 stevensc 526
                $order_direction = 'asc';
245 efrain 527
            }
528
 
283 www 529
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
530
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
558 stevensc 531
            $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter); // Añadido
283 www 532
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
558 stevensc 533
            $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter); // Reordenado
119 efrain 534
 
535
            $accessGranted = $this->getAccessGranted();
558 stevensc 536
 
634 stevensc 537
            $capsulesData = [];
119 efrain 538
 
333 www 539
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 540
            $path = $storage->getPathMicrolearningCapsule();
541
 
634 stevensc 542
            foreach($accessGranted->topics as $topic_id)
119 efrain 543
            {
634 stevensc 544
                $topic = $topicMapper->fetchOne($topic_id);
545
                if(!$topic) {
119 efrain 546
                    continue;
547
                }
634 stevensc 548
 
549
                $capsules = $topicCapsuleMapper->fetchAllActiveByTopicId($topic_id) ?? [];
119 efrain 550
 
634 stevensc 551
                foreach($capsules as $capsule) {
552
                    $capsule = $capsuleMapper->fetchOne($capsule->capsule_id);
553
                    if(!$capsule) {
119 efrain 554
                        continue;
555
                    }
634 stevensc 556
 
557
                    $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
558
                    if($userProgress) {
559
                        continue;
558 stevensc 560
                    }
634 stevensc 561
 
562
                    if($name) {
563
                        if(empty($name) || stripos($capsule->name, $name) === false) {
564
                            continue;
565
                        }
566
                    }
567
 
568
                    $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id,  $capsule->id);
569
                    $link_slides = $topic->uuid ? $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]) : '';
570
 
571
                    array_push($capsulesData, [
572
                        'uuid'              => $capsule->uuid,
573
                        'name'              => $capsule->name ? $capsule->name : '',
574
                        'description'       => $capsule->description ? $capsule->description : '',
575
                        'image'             => $capsule->image ? $storage->getGenericImage($path, $capsule->uuid, $capsule->image)  : '',
576
                        'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
577
                        'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
578
                        'link_slides'       => $link_slides,
579
                        'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
580
                        'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
581
                        'progress'          => 0,
582
                        'added_on'          => $capsule->added_on,
583
                        'updated_on'        => $capsule->updated_on,
584
                    ]);
558 stevensc 585
                }
119 efrain 586
            }
587
 
558 stevensc 588
            // 8. Ordenar
245 efrain 589
            if($order_field == 'name') {
590
                if($order_direction == 'asc') {
558 stevensc 591
                    usort($capsulesData, function($a, $b) {
245 efrain 592
                        return strcasecmp($a['name'], $b['name']);
593
                    });
594
                } else {
558 stevensc 595
                    usort($capsulesData, function($a, $b) {
245 efrain 596
                        $result = strcasecmp($a['name'], $b['name']);
558 stevensc 597
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; } // Simplificado
245 efrain 598
                    });
119 efrain 599
                }
600
 
245 efrain 601
            }
602
 
603
            if($order_field == 'added_on') {
604
                if($order_direction == 'asc') {
558 stevensc 605
                    usort($capsulesData, function($a, $b) {
245 efrain 606
                        return strcasecmp($a['added_on'], $b['added_on']);
607
                    });
608
                } else {
558 stevensc 609
                    usort($capsulesData, function($a, $b) {
245 efrain 610
                        $result = strcasecmp($a['added_on'], $b['added_on']);
558 stevensc 611
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; } // Simplificado
245 efrain 612
                    });
613
                }
119 efrain 614
 
558 stevensc 615
            }
119 efrain 616
 
558 stevensc 617
            // 9. Retornar
119 efrain 618
            return new JsonModel([
619
                'success' => true,
558 stevensc 620
                'data' => $capsulesData
634 stevensc 621
            ]);
119 efrain 622
        }
623
 
624
        return new JsonModel([
625
            'success' => false,
626
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
627
        ]);
628
 
629
    }
630
 
631
    public function capsulesCompletedAction()
632
    {
633
        $request = $this->getRequest();
634
        if($request->isGet()) {
635
            $currentUserPlugin = $this->plugin('currentUserPlugin');
636
            $currentUser = $currentUserPlugin->getUser();
637
 
638
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
245 efrain 639
            $order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));
640
            $order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));
119 efrain 641
 
246 efrain 642
            if(!in_array($order_field,['name', 'added_on','last_access_on'] )) {
245 efrain 643
                $order_field = 'name';
644
            }
119 efrain 645
 
245 efrain 646
            if(!in_array( $order_direction,['asc', 'desc'])) {
647
                $order_field = 'asc';
648
            }
649
 
283 www 650
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
651
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
558 stevensc 652
            $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
653
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
283 www 654
            $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
119 efrain 655
 
656
            $accessGranted = $this->getAccessGranted();
657
 
558 stevensc 658
            $capsulesData = [];
119 efrain 659
 
333 www 660
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 661
            $path = $storage->getPathMicrolearningCapsule();
662
 
635 stevensc 663
            foreach($accessGranted->topics as $topic_id)
119 efrain 664
            {
635 stevensc 665
                $topic = $topicMapper->fetchOne($topic_id);
666
                if(!$topic) {
119 efrain 667
                    continue;
668
                }
669
 
635 stevensc 670
                $capsules = $topicCapsuleMapper->fetchAllActiveByTopicId($topic_id) ?? [];
119 efrain 671
 
635 stevensc 672
                foreach($capsules as $capsule) {
673
                    $capsule = $capsuleMapper->fetchOne($capsule->capsule_id);
674
                    if(!$capsule) {
119 efrain 675
                        continue;
676
                    }
635 stevensc 677
 
678
                    $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
679
                    if($userProgress && $userProgress->completed) {
680
                        continue;
558 stevensc 681
                    }
635 stevensc 682
 
683
                    if($name) {
684
                        if(empty($name) || stripos($capsule->name, $name) === false) {
685
                            continue;
686
                        }
687
                    }
688
 
689
                    $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id,  $capsule->id);
690
                    $link_slides = $topic->uuid ? $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]) : '';
691
 
692
                    array_push($capsulesData, [
693
                        'uuid'              => $capsule->uuid,
694
                        'name'              => $capsule->name ? $capsule->name : '',
695
                        'description'       => $capsule->description ? $capsule->description : '',
696
                        'image'             => $capsule->image ? $storage->getGenericImage($path, $capsule->uuid, $capsule->image)  : '',
697
                        'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
698
                        'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
699
                        'link_slides'       => $link_slides,
700
                        'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
701
                        'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
702
                        'progress'          => $userProgress->progress,
703
                        'added_on'          => $capsule->added_on,
704
                        'last_access_on'    => $userProgress->updated_on,
705
                        'updated_on'        => $capsule->updated_on,
706
                    ]);
558 stevensc 707
                }
119 efrain 708
            }
709
 
635 stevensc 710
            // 8. Ordenar
245 efrain 711
            if($order_field == 'name') {
712
                if($order_direction == 'asc') {
558 stevensc 713
                    usort($capsulesData, function($a, $b) {
245 efrain 714
                        return strcasecmp($a['name'], $b['name']);
715
                    });
716
                } else {
558 stevensc 717
                    usort($capsulesData, function($a, $b) {
245 efrain 718
                        $result = strcasecmp($a['name'], $b['name']);
558 stevensc 719
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; }
245 efrain 720
                    });
119 efrain 721
                }
245 efrain 722
            }
723
 
724
            if($order_field == 'added_on') {
725
                if($order_direction == 'asc') {
558 stevensc 726
                    usort($capsulesData, function($a, $b) {
245 efrain 727
                        return strcasecmp($a['added_on'], $b['added_on']);
728
                    });
729
                } else {
558 stevensc 730
                    usort($capsulesData, function($a, $b) {
245 efrain 731
                        $result = strcasecmp($a['added_on'], $b['added_on']);
558 stevensc 732
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; }
245 efrain 733
                    });
734
                }
735
            }
246 efrain 736
 
737
            if($order_field == 'last_access_on') {
738
                if($order_direction == 'asc') {
558 stevensc 739
                    usort($capsulesData, function($a, $b) {
246 efrain 740
                        return strcasecmp($a['last_access_on'], $b['last_access_on']);
741
                    });
742
                } else {
558 stevensc 743
                    usort($capsulesData, function($a, $b) {
246 efrain 744
                        $result = strcasecmp($a['last_access_on'], $b['last_access_on']);
558 stevensc 745
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; }
246 efrain 746
                    });
747
                }
748
            }
749
 
119 efrain 750
            return new JsonModel([
751
                'success' => true,
558 stevensc 752
                'data' => $capsulesData
119 efrain 753
            ]);
754
 
755
        }
756
 
757
        return new JsonModel([
758
            'success' => false,
759
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
760
        ]);
761
    }
762
 
763
    public function capsulesInProgressAction()
764
    {
765
        $request = $this->getRequest();
766
        if($request->isGet()) {
767
            $currentUserPlugin = $this->plugin('currentUserPlugin');
768
            $currentUser = $currentUserPlugin->getUser();
769
 
770
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
245 efrain 771
            $order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));
772
            $order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));
119 efrain 773
 
246 efrain 774
            if(!in_array($order_field,['name', 'added_on', 'last_access_on'] )) {
245 efrain 775
                $order_field = 'name';
776
            }
119 efrain 777
 
245 efrain 778
            if(!in_array( $order_direction,['asc', 'desc'])) {
558 stevensc 779
                $order_direction = 'asc';
245 efrain 780
            }
781
 
283 www 782
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
783
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
558 stevensc 784
            $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
785
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
283 www 786
            $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
119 efrain 787
 
788
            $accessGranted = $this->getAccessGranted();
789
 
558 stevensc 790
            $capsulesData = [];
119 efrain 791
 
333 www 792
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 793
            $path = $storage->getPathMicrolearningCapsule();
794
 
635 stevensc 795
            foreach($accessGranted->topics as $topic_id)
119 efrain 796
            {
635 stevensc 797
                $topic = $topicMapper->fetchOne($topic_id);
798
                if(!$topic) {
119 efrain 799
                    continue;
800
                }
801
 
635 stevensc 802
                $capsules = $topicCapsuleMapper->fetchAllActiveByTopicId($topic_id) ?? [];
803
 
804
                foreach($capsules as $capsule) {
805
                    $capsule = $capsuleMapper->fetchOne($capsule->capsule_id);
806
                    if(!$capsule) {
119 efrain 807
                        continue;
808
                    }
635 stevensc 809
 
810
                    $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
811
                    if($userProgress && !$userProgress->completed) {
812
                        continue;
558 stevensc 813
                    }
635 stevensc 814
 
815
                    if($name) {
816
                        if(empty($name) || stripos($capsule->name, $name) === false) {
817
                            continue;
818
                        }
819
                    }
820
 
821
                    $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id,  $capsule->id);
822
                    $link_slides = $topic->uuid ? $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]) : '';
823
 
824
                    array_push($capsulesData, [
825
                        'uuid'              => $capsule->uuid,
826
                        'name'              => $capsule->name ? $capsule->name : '',
827
                        'description'       => $capsule->description ? $capsule->description : '',
828
                        'image'             => $capsule->image ? $storage->getGenericImage($path, $capsule->uuid, $capsule->image)  : '',
829
                        'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
830
                        'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
831
                        'link_slides'       => $link_slides,
832
                        'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
833
                        'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
834
                        'progress'          => $userProgress->progress,
835
                        'added_on'          => $capsule->added_on,
836
                        'last_access_on'    => $userProgress->updated_on,
837
                        'updated_on'        => $capsule->updated_on,
838
                    ]);
558 stevensc 839
                }
119 efrain 840
            }
841
 
635 stevensc 842
            // 8. Ordenar
245 efrain 843
            if($order_field == 'name') {
844
                if($order_direction == 'asc') {
558 stevensc 845
                    usort($capsulesData, function($a, $b) {
245 efrain 846
                        return strcasecmp($a['name'], $b['name']);
847
                    });
848
                } else {
558 stevensc 849
                    usort($capsulesData, function($a, $b) {
245 efrain 850
                        $result = strcasecmp($a['name'], $b['name']);
558 stevensc 851
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; }
245 efrain 852
                    });
119 efrain 853
                }
245 efrain 854
            }
855
 
856
            if($order_field == 'added_on') {
857
                if($order_direction == 'asc') {
558 stevensc 858
                    usort($capsulesData, function($a, $b) {
245 efrain 859
                        return strcasecmp($a['added_on'], $b['added_on']);
860
                    });
861
                } else {
558 stevensc 862
                    usort($capsulesData, function($a, $b) {
245 efrain 863
                        $result = strcasecmp($a['added_on'], $b['added_on']);
558 stevensc 864
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; }
245 efrain 865
                    });
866
                }
867
            }
246 efrain 868
 
869
            if($order_field == 'last_access_on') {
870
                if($order_direction == 'asc') {
558 stevensc 871
                    usort($capsulesData, function($a, $b) {
246 efrain 872
                        return strcasecmp($a['last_access_on'], $b['last_access_on']);
873
                    });
874
                } else {
558 stevensc 875
                    usort($capsulesData, function($a, $b) {
246 efrain 876
                        $result = strcasecmp($a['last_access_on'], $b['last_access_on']);
558 stevensc 877
                        if($result < 0) { return 1; } else if($result > 0) { return -1; } else { return 0; }
246 efrain 878
                    });
879
                }
880
            }
245 efrain 881
 
246 efrain 882
 
119 efrain 883
            return new JsonModel([
884
                'success' => true,
558 stevensc 885
                'data' => $capsulesData
119 efrain 886
            ]);
887
        }
888
 
889
        return new JsonModel([
890
            'success' => false,
891
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
892
        ]);
893
    }
894
 
895
 
896
    public function timelineAction()
897
    {
898
 
899
        $request = $this->getRequest();
900
        if($request->isGet()) {
901
            $currentUserPlugin = $this->plugin('currentUserPlugin');
902
            $currentUser = $currentUserPlugin->getUser();
903
 
904
 
905
            $page = intval($this->params()->fromQuery('page'), 10);
906
 
907
            $activities = [
283 www 908
                MicrolearningUserLog::ACTIVITY_SIGNIN            => 'LABEL_MICROLEARNING_ACTIVITY_SIGNIN',
909
                MicrolearningUserLog::ACTIVITY_SIGNOUT           => 'LABEL_MICROLEARNING_ACTIVITY_SIGNOUT',
910
                MicrolearningUserLog::ACTIVITY_START_TOPIC       => 'LABEL_MICROLEARNING_ACTIVITY_START_TOPIC',
911
                MicrolearningUserLog::ACTIVITY_START_CAPSULE     => 'LABEL_MICROLEARNING_ACTIVITY_START_CAPSULE',
912
                MicrolearningUserLog::ACTIVITY_VIEW_SLIDE        => 'LABEL_MICROLEARNING_ACTIVITY_VIEW_SLIDE',
913
                MicrolearningUserLog::ACTIVITY_TAKE_A_TEST       => 'LABEL_MICROLEARNING_ACTIVITY_TAKE_A_TEST',
914
                MicrolearningUserLog::ACTIVITY_RETAKE_A_TEST     => 'LABEL_MICROLEARNING_ACTIVITY_RETAKE_A_TEST',
915
                MicrolearningUserLog::ACTIVITY_APPROVED_TEST     => 'LABEL_MICROLEARNING_ACTIVITY_APPROVED_TEST',
916
                MicrolearningUserLog::ACTIVITY_COMPLETED_CAPSULE => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_CAPSULE',
917
                MicrolearningUserLog::ACTIVITY_COMPLETED_TOPIC   => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_TOPIC',
119 efrain 918
            ];
919
 
920
 
921
 
283 www 922
            $microlearningUserLogMapper = MicrolearningUserLogMapper::getInstance($this->adapter);
923
            $paginator = $microlearningUserLogMapper->getAllMessagesPaginatorByUserId($currentUser->id, $page);
119 efrain 924
 
925
            $items = [];
926
            foreach($paginator as $record)
927
            {
928
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
929
 
930
                array_push($items, [
931
                    'activity' => $activities[$record->activity],
932
                    'added_on' => $dt->format('d/m/Y H:i a')
933
                ]);
934
            }
935
 
936
 
937
            return new JsonModel([
938
                'success' => true,
939
                'data' => [
940
                    'total' => [
941
                        'count' => $paginator->getTotalItemCount(),
942
                        'pages' => $paginator->getPages()->pageCount,
943
                    ],
944
                    'current' => [
945
                        'items'    => $items,
946
                        'page'     => $paginator->getCurrentPageNumber(),
947
                        'count'    => $paginator->getCurrentItemCount(),
948
                    ]
949
                ]
950
            ]);
951
 
952
 
953
        } else {
954
            return new JsonModel([
955
                'success' => false,
956
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
957
            ]);
958
        }
959
    }
960
 
961
    /**
962
     * Valores para la generación de los gráficos de progreso
963
     * Para las repuesta afirmativa
964
     * [
965
     *  'success' => true,
966
     *      'data' => [
967
     *          'topicTotal' => cantidad total de tópicos,
968
     *          'topicStarted' => cantidad de tópicos iniciados,
969
     *          'topicIncompleted' => cantidad de tópicos incompletos,
970
     *          'topicCompleted' => cantidad de tópicos completos,
971
     *          'percentCompleted' => % de diapositivas completados ,
972
     *          'percentIncompleted' => % de diapositivas incompletos ,
973
     *          'percentWithoutReturning' => % de cápsulas sin retorno después de completada,
974
     *          'percentWithReturning' => % de cápsulas con retorno después de completada,
558 stevensc 975
     *      ],
119 efrain 976
     * ]
977
     *
978
     *
979
     *  En caso contrario
980
     *  [
981
     *      'success' => false,
982
     *      'data' => mensaje de error
983
     *  ]
984
     *
985
     *
986
     * @return \Laminas\View\Model\JsonModel
987
     */
988
    public function progressAction()
989
    {
990
 
991
        $request = $this->getRequest();
992
        if($request->isGet()) {
993
            $currentUserPlugin = $this->plugin('currentUserPlugin');
994
            $currentUser = $currentUserPlugin->getUser();
995
 
996
 
997
            $accessGrantedIds = $this->getAccessGranted();
998
            $id = $this->params()->fromRoute('id');
999
 
1000
            $companyMapper = CompanyMapper::getInstance($this->adapter);
1001
            $company = $companyMapper->fetchOneByUuid($id);
1002
 
1003
            if(!$company) {
1004
                $response = [
1005
                    'success' => false,
1006
                    'data' => 'ERROR_COMPANY_NOT_FOUND',
1007
                ];
1008
 
1009
 
1010
                return new JsonModel($response);
1011
            }
1012
 
1013
            if(!in_array($company->id, $accessGrantedIds->companies)) {
1014
                $response = [
1015
                    'success' => false,
1016
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_COMPANY',
1017
                ];
1018
 
1019
 
1020
                return new JsonModel($response);
1021
            }
1022
 
1023
            $capsuleTotal              = 0;
1024
            $capsuleCompleted          = 0;
1025
            $capsuleWithReturning      = 0;
1026
            $capsuleWithoutReturning   = 0;
1027
            $capsuleStarted            = 0;
1028
            $capsuleToStart            = 0;
1029
            $percentCompleted          = 0;
1030
            $percentIncompleted        = 100;
1031
 
283 www 1032
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
119 efrain 1033
            $topics = $topicMapper->fetchAllActiveByCompanyIdAndIds($company->id, $accessGrantedIds->topics);
1034
 
283 www 1035
            $progressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
119 efrain 1036
 
302 www 1037
            $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
119 efrain 1038
 
1039
            foreach($topics as $topic)
1040
            {
302 www 1041
                $resultCount = $topicCapsuleMapper->fetchCountByCompanyIdAndTopicId($company->id, $topic->id);
119 efrain 1042
                $capsuleTotal =  $capsuleTotal + $resultCount;
1043
 
1044
                $resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);
1045
                $capsuleCompleted = $capsuleCompleted + $resultCount;
1046
 
1047
                $resultCount = $progressMapper->fetchCountCapsulesCompletedWithReturningByIdAndTopicId($currentUser->id, $topic->id);
1048
                $capsuleWithReturning = $capsuleWithReturning + $resultCount;
1049
 
1050
                $resultCount = $progressMapper->fetchCountCapsulesCompletedWithoutReturningByIdAndTopicId($currentUser->id, $topic->id);
1051
                $capsuleWithoutReturning = $capsuleWithoutReturning + $resultCount;
1052
 
1053
                $resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);
1054
                $capsuleStarted = $capsuleStarted + $resultCount;
1055
            }
1056
 
1057
            $capsuleToStart = $capsuleTotal -  $capsuleStarted;
1058
 
1059
            if($capsuleTotal > 0) {
1060
                $percentCompleted = ($capsuleCompleted * 100) /  $capsuleTotal;
1061
                $percentIncompleted = 100 - $percentCompleted;
1062
            }
1063
 
1064
            return new JsonModel([
1065
                'success' => true,
1066
                'data' => [
1067
                    'capsuleTotal' => $capsuleTotal,
1068
                    'capsuleCompleted' => $capsuleCompleted,
1069
                    'capsuleStarted' => $capsuleStarted,
1070
                    'capsuleToStart' => $capsuleToStart,
1071
                    'percentCompleted' => number_format($percentCompleted, 2, '.', ','),
1072
                    'percentIncompleted' => number_format($percentIncompleted, 2, '.', ','),
1073
                    'capsuleWithReturning' => $capsuleWithReturning,
1074
                    'capsuleWithoutReturning' => $capsuleWithoutReturning,
1075
                ],
1076
            ]);
1077
 
1078
 
1079
        } else {
1080
            return new JsonModel([
1081
                'success' => false,
1082
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1083
            ]);
1084
        }
1085
    }
1086
 
1087
 
1088
    public function topicsAction()
1089
    {
1090
        $request = $this->getRequest();
626 stevensc 1091
 
119 efrain 1092
        if($request->isGet()) {
1093
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1094
            $currentUser = $currentUserPlugin->getUser();
1095
 
1096
            $data = [];
1097
            $accessGrantedIds = $this->getAccessGranted();
1098
 
283 www 1099
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
1100
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
119 efrain 1101
 
333 www 1102
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1103
            $path = $storage->getPathMicrolearningTopic();
119 efrain 1104
 
1105
            foreach($accessGrantedIds->topics as $id)
1106
            {
1107
                $topic = $topicMapper->fetchOne($id);
1108
                if(!$topic) {
1109
                    continue;
1110
                }
1111
 
1112
                $userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $id);
1113
                if($userProgress) {
1114
                    $progress = $userProgress->progress;
1115
                    $completed = $userProgress->completed;
1116
                } else {
1117
                    $progress = 0;
1118
                    $completed = 0;
1119
                }
1120
 
1121
 
1122
 
1123
                array_push($data, [
164 efrain 1124
                    'uuid'          => $topic->uuid,
119 efrain 1125
                    'name'          => $topic->name ? $topic->name : '',
1126
                    'description'   => $topic->description ? $topic->description : '',
283 www 1127
                    'image'         => $topic->image ? $storage->getGenericImage($path, $topic->uuid, $topic->image) : '',
119 efrain 1128
                    'progress'      => $progress,
1129
                    'completed'     => $completed,
1130
                    'order'         => $topic->order,
1131
                    'added_on'      => $topic->added_on,
564 stevensc 1132
                    'updated_on'    => $topic->updated_on
119 efrain 1133
                ]);
1134
            }
1135
 
1136
            usort($data, function($a, $b) {
1137
 
1138
                $result =  $a['order'] <=> $b['order'];
1139
                if(0 == $result) {
1140
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1141
                    if(0 == $result) {
1142
                        $result = strcasecmp($a['name'], $b['name']);
1143
                    }
1144
                }
1145
 
1146
                if($result < 0) {
1147
                    return 1;
1148
                } else if($result > 0) {
1149
                    return -1;
1150
                } else  {
1151
                    return  0;
1152
                }
1153
            });
1154
 
1155
 
1156
 
1157
                return new JsonModel([
1158
                    'success' => true,
1159
                    'data' => $data
1160
                ]);
1161
 
1162
        } else {
1163
            return new JsonModel([
1164
                'success' => false,
1165
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1166
            ]);
1167
        }
1168
    }
1169
 
161 efrain 1170
    public function getTopicAction()
1171
    {
563 stevensc 1172
        // Handle GET request
161 efrain 1173
        $request = $this->getRequest();
1174
        if($request->isGet()) {
563 stevensc 1175
            // Get current user
161 efrain 1176
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1177
            $currentUser = $currentUserPlugin->getUser();
563 stevensc 1178
 
1179
            // Get topic ID from route
161 efrain 1180
            $id = $this->params()->fromRoute('id');
283 www 1181
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
161 efrain 1182
            $topic = $topicMapper->fetchOneByUuid($id);
563 stevensc 1183
 
1184
            // Return error if topic not found
161 efrain 1185
            if(!$topic) {
1186
                return new JsonModel([
1187
                    'success' => false,
1188
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1189
                ]);
1190
            }
563 stevensc 1191
 
1192
            // Check if current user has access to the topic
161 efrain 1193
            $accessGrantedIds = $this->getAccessGranted();
1194
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1195
                return new JsonModel([
1196
                    'success' => false,
1197
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1198
                ]);
1199
            }
563 stevensc 1200
 
1201
            // Get user progress for this topic
283 www 1202
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
563 stevensc 1203
            $userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);
161 efrain 1204
 
580 stevensc 1205
            $progress = $userProgress->progress ?? 0;
1206
            $completed = $userProgress->completed ?? 0;
563 stevensc 1207
 
1208
            // Initialize storage service to get image paths
333 www 1209
            $storage = Storage::getInstance($this->config, $this->adapter);
563 stevensc 1210
            $pathTopic = $storage->getPathMicrolearningTopic();
1211
 
1212
            // Fetch associated capsules using the private helper method
1213
            $capsulesData = $this->_getCapsulesByTopic($topic, $storage);
1214
 
1215
            // Prepare data for JSON response
161 efrain 1216
            $data = [
165 efrain 1217
                'uuid'          => $topic->uuid,
161 efrain 1218
                'name'          => $topic->name ? $topic->name : '',
1219
                'description'   => $topic->description ? $topic->description : '',
563 stevensc 1220
                'image'         => $topic->image ? $storage->getGenericImage($pathTopic, $topic->uuid, $topic->image) : '',
161 efrain 1221
                'progress'      => $progress,
1222
                'completed'     => $completed,
1223
                'order'         => $topic->order,
1224
                'added_on'      => $topic->added_on,
1225
                'updated_on'    => $topic->updated_on,
563 stevensc 1226
                'total_capsules' => count($capsulesData),
1227
                'capsules'      => $capsulesData,
161 efrain 1228
            ];
563 stevensc 1229
 
161 efrain 1230
            return new JsonModel([
1231
                'success' => true,
1232
                'data' => $data
1233
            ]);
563 stevensc 1234
 
161 efrain 1235
        } else {
563 stevensc 1236
            // Return error if not a GET request
161 efrain 1237
            return new JsonModel([
1238
                'success' => false,
1239
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1240
            ]);
1241
        }
1242
    }
563 stevensc 1243
 
1244
    /**
580 stevensc 1245
     * @param MicrolearningTopic $topic The topic object.
1246
     * @param Storage $storage The storage object.
1247
     * @return array The capsules data.
563 stevensc 1248
     */
1249
    private function _getCapsulesByTopic($topic, $storage)
1250
    {
578 stevensc 1251
        $data = [];
584 stevensc 1252
        $accessGrantedIds = $this->getAccessGranted();
563 stevensc 1253
 
578 stevensc 1254
        if (!$topic) {
1255
            return $data;
1256
        }
1257
 
584 stevensc 1258
        if (!in_array($topic->id, $accessGrantedIds->topics)) {
578 stevensc 1259
            return $data;
584 stevensc 1260
        }
578 stevensc 1261
 
1262
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1263
        $currentUser = $currentUserPlugin->getUser();
1264
 
1265
        $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
574 stevensc 1266
        $topicCapsuleRelations = $topicCapsuleMapper->fetchAllActiveByTopicId($topic->id);
1267
 
581 stevensc 1268
        $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
1269
        $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
578 stevensc 1270
 
581 stevensc 1271
        $path = $storage->getPathMicrolearningCapsule();
1272
 
578 stevensc 1273
        foreach ($topicCapsuleRelations as $relation) {
584 stevensc 1274
            if(!in_array($relation->capsule_id, $accessGrantedIds->capsules)) {
1275
                continue;
1276
            }
578 stevensc 1277
 
581 stevensc 1278
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1279
            $capsule = $capsuleMapper->fetchOne($relation->capsule_id);
563 stevensc 1280
 
581 stevensc 1281
            if(!$capsule) {
1282
                continue;
1283
            }
1284
 
578 stevensc 1285
            $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
1286
            $progress = $userProgress->progress ?? 0;
1287
            $completed = $userProgress->completed ?? 0;
1288
            $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->id);
1289
            $image = $capsule->image ? $storage->getGenericImage($path, $capsule->uuid, $capsule->image) : '';
1290
            $total_comments = strval($dataCountAndRatingAverage['total_comments']);
1291
            $total_rating = strval($dataCountAndRatingAverage['total_rating']);
1292
 
581 stevensc 1293
            array_push($data, [
578 stevensc 1294
                'uuid'              => $capsule->uuid,
1295
                'name'              => $capsule->name ? $capsule->name : '',
1296
                'description'       => $capsule->description ? $capsule->description : '',
1297
                'image'             => $image,
1298
                'total_comments'    => $total_comments,
1299
                'total_rating'      => $total_rating,
1300
                'progress'          => $progress,
1301
                'completed'         => $completed,
1302
                'added_on'          => $capsule->added_on,
1303
                'updated_on'        => $capsule->updated_on,
581 stevensc 1304
            ]);
563 stevensc 1305
        }
578 stevensc 1306
 
581 stevensc 1307
        return $data;
563 stevensc 1308
    }
586 stevensc 1309
 
1310
    /**
1311
     * @param MicrolearningCapsule $capsule The capsule object.
1312
     * @param Storage $storage The storage object.
1313
     * @return array The slides data.
1314
     */
1315
    private function _getSlidesByCapsule($capsule, $storage)
1316
    {
1317
        $data = [];
1318
        $accessGrantedIds = $this->getAccessGranted();
1319
 
1320
        if (!$capsule) {
1321
            return $data;
1322
        }
1323
 
1324
        if (!in_array($capsule->id, $accessGrantedIds->capsules)) {
1325
            return $data;
1326
        }
1327
 
1328
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1329
        $currentUser = $currentUserPlugin->getUser();
1330
 
1331
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1332
        $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
1333
        $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
1334
 
1335
        $path = $storage->getPathMicrolearningSlide();
587 stevensc 1336
        $slides = $slideMapper->fetchAllByCompanyIdAndCapsuleId($capsule->company_id, $capsule->id);
586 stevensc 1337
 
1338
        foreach ($slides as $slide) {
1339
            $userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
1340
            $completed = $userProgress ? $userProgress->completed : 0;
1341
 
1342
            $quiz_uuid = '';
1343
            $quiz_data = [];
1344
            $link_take_a_test = '';
1345
 
1346
            if ($slide->quiz_id) {
1347
                $quiz = $quizMapper->fetchOne($slide->quiz_id);
1348
                if ($quiz) {
1349
                    $quiz_uuid = $quiz->uuid;
1350
                    $quiz_data = $this->getQuiz($slide->quiz_id);
1351
                    $link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);
1352
                }
1353
            }
1354
 
1355
            array_push($data, [
1356
                'quiz'                  => $quiz_uuid,
1357
                'quiz_data'             => $quiz_data,
1358
                'uuid'                  => $slide->uuid,
1359
                'name'                  => $slide->name ? $slide->name : '',
1360
                'description'           => $slide->description ? $slide->description : '',
1361
                'type'                  => $slide->type,
1362
                'background'            => $slide->background ? $storage->getGenericImage($path, $slide->uuid, $slide->background) : '',
1363
                'file'                  => $slide->file ? $storage->getGenericFile($path, $slide->uuid, $slide->file) : '',
1364
                'order'                 => $slide->order,
1365
                'completed'             => $completed,
1366
                'link_take_a_test'      => $link_take_a_test,
1367
                'added_on'              => $slide->added_on,
1368
                'updated_on'            => $slide->updated_on,
1369
            ]);
1370
        }
1371
 
1372
        // Sort slides by order, then by added_on, then by name
1373
        usort($data, function($a, $b) {
1374
            $result = $a['order'] <=> $b['order'];
1375
            if (0 == $result) {
1376
                $result = strcasecmp($a['added_on'], $b['added_on']);
1377
                if (0 == $result) {
1378
                    $result = strcasecmp($a['name'], $b['name']);
1379
                }
1380
            }
1381
 
1382
            if ($result < 0) {
1383
                return 1;
1384
            } else if ($result > 0) {
1385
                return -1;
1386
            } else {
1387
                return 0;
1388
            }
1389
        });
1390
 
1391
        return $data;
1392
    }
1393
 
119 efrain 1394
    public function capsulesAction()
1395
    {
1396
        $request = $this->getRequest();
1397
        if($request->isGet()) {
580 stevensc 1398
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1399
            $currentUser = $currentUserPlugin->getUser();
584 stevensc 1400
 
1401
            $topic_id_param = $this->params()->fromRoute('topic_id');
283 www 1402
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
580 stevensc 1403
            $topic = $topicMapper->fetchOneByUuid($topic_id_param);
584 stevensc 1404
 
119 efrain 1405
            if(!$topic) {
1406
                return new JsonModel([
1407
                    'success' => false,
1408
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1409
                ]);
1410
            }
584 stevensc 1411
 
580 stevensc 1412
            $accessGrantedIds = $this->getAccessGranted();
584 stevensc 1413
 
119 efrain 1414
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1415
                return new JsonModel([
1416
                    'success' => false,
1417
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1418
                ]);
1419
            }
584 stevensc 1420
 
333 www 1421
            $storage = Storage::getInstance($this->config, $this->adapter);
584 stevensc 1422
            // Use the _getCapsulesByTopic method to fetch capsules
1423
            $data = $this->_getCapsulesByTopic($topic, $storage);
580 stevensc 1424
 
584 stevensc 1425
            // The _getCapsulesByTopic method already returns capsules with the required data structure.
1426
            // We just need to sort them.
1427
 
580 stevensc 1428
            usort($data, function($a, $b) {
584 stevensc 1429
 
580 stevensc 1430
                $result =  $a['order'] <=> $b['order'];
1431
                if(0 == $result) {
1432
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1433
                    if(0 == $result) {
1434
                        $result = strcasecmp($a['name'], $b['name']);
1435
                    }
1436
                }
584 stevensc 1437
 
580 stevensc 1438
                if($result < 0) {
1439
                    return 1;
1440
                } else if($result > 0) {
1441
                    return -1;
1442
                } else  {
1443
                    return  0;
1444
                }
1445
            });
584 stevensc 1446
 
1447
            return new JsonModel([
1448
                'success' => true,
1449
                'data' => $data
1450
            ]);
1451
 
119 efrain 1452
        } else {
1453
            return new JsonModel([
1454
                'success' => false,
1455
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1456
            ]);
1457
        }
1458
    }
1459
 
235 efrain 1460
    public function takeTestAction()
1461
    {
1462
        $request = $this->getRequest();
1463
        if($request->isPost()) {
1464
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1465
            $currentUser = $currentUserPlugin->getUser();
1466
 
1467
            $slide_id = $this->params()->fromRoute('slide_id');
283 www 1468
            $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
235 efrain 1469
            $slide = $slideMapper->fetchOneByUuid($slide_id);
1470
 
1471
            if(!$slide) {
1472
                return new JsonModel([
1473
                    'success' => false,
1474
                    'data' => 'ERROR_SLIDE_NOT_FOUND'
1475
                ]);
1476
            }
1477
 
283 www 1478
            if($slide->type != MicrolearningSlide::TYPE_QUIZ) {
235 efrain 1479
                return new JsonModel([
1480
                    'success' => false,
1481
                    'data' => 'ERROR_SLIDE_IS_NOT_QUIZ'
1482
                ]);
1483
            }
1484
 
1485
 
1486
 
283 www 1487
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
235 efrain 1488
            $capsule = $capsuleMapper->fetchOne($slide->capsule_id);
1489
 
1490
            if(!$capsule) {
1491
                return new JsonModel([
1492
                    'success' => false,
1493
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1494
                ]);
1495
            }
1496
 
1497
            $accessGrantedIds = $this->getAccessGranted();
1498
 
1499
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1500
                return new JsonModel([
1501
                    'success' => false,
1502
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1503
                ]);
1504
            }
1505
 
283 www 1506
            $userLogMapper = MicrolearningUserLogMapper::getInstance($this->adapter);
235 efrain 1507
            $userLog = $userLogMapper->fetchOneTakeATestByUserIdAndSlideId($currentUser->id, $slide->id);
1508
 
1509
            if($userLog) {
283 www 1510
                $activity = MicrolearningUserLog::ACTIVITY_RETAKE_A_TEST;
235 efrain 1511
            } else {
283 www 1512
                $activity = MicrolearningUserLog::ACTIVITY_TAKE_A_TEST;
235 efrain 1513
            }
1514
 
1515
            $added_on = $userLogMapper->getDatebaseNow();
1516
 
283 www 1517
            $userLog = new MicrolearningUserLog();
235 efrain 1518
            $userLog->activity      = $activity;
1519
            $userLog->user_id       = $currentUser->id;
1520
            $userLog->company_id    = $slide->company_id;
1521
            $userLog->topic_id      = $slide->topic_id;
1522
            $userLog->capsule_id    = $slide->capsule_id;
1523
            $userLog->slide_id      = $slide->id;
1524
            $userLog->added_on      = $added_on;
1525
 
1526
            if($userLogMapper->insert($userLog)) {
1527
                return new JsonModel([
1528
                    'success' => true,
1529
                ]);
1530
            } else {
1531
                return new JsonModel([
1532
                    'success' => false,
1533
                    'data' => $userLogMapper->getError()
1534
                ]);
1535
            }
1536
 
1537
 
1538
 
1539
 
1540
 
1541
 
1542
 
1543
        } else {
1544
            return new JsonModel([
1545
                'success' => false,
1546
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1547
            ]);
1548
        }
1549
    }
1550
 
161 efrain 1551
    public function getCapsuleAction()
1552
    {
1553
        $request = $this->getRequest();
587 stevensc 1554
 
161 efrain 1555
        if($request->isGet()) {
1556
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1557
            $currentUser = $currentUserPlugin->getUser();
1558
 
558 stevensc 1559
            $capsule_uuid = $this->params()->fromRoute('id');
283 www 1560
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
558 stevensc 1561
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
161 efrain 1562
 
1563
            if(!$capsule) {
1564
                return new JsonModel([
1565
                    'success' => false,
1566
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1567
                ]);
1568
            }
1569
 
1570
            $accessGrantedIds = $this->getAccessGranted();
1571
 
1572
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1573
                return new JsonModel([
1574
                    'success' => false,
1575
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1576
                ]);
1577
            }
1578
 
283 www 1579
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
1580
            $capsuleCommentMapper = MicrolearningCapsuleCommentMapper::getInstance($this->adapter);
161 efrain 1581
 
1582
            $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
587 stevensc 1583
            $progress = $userProgress->progress ?? 0;
1584
            $completed = $userProgress->completed ?? 0;
244 efrain 1585
 
586 stevensc 1586
            $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->id);
244 efrain 1587
 
587 stevensc 1588
            // Get comments data
1589
            $userMapper = UserMapper::getInstance($this->adapter);
333 www 1590
            $storage = Storage::getInstance($this->config, $this->adapter);
587 stevensc 1591
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1592
 
1593
            $comments = [];
1594
            $records = $capsuleCommentMapper->fetchAllByCapsuleId($capsule->id);
1595
            foreach($records as $record) {
1596
                $user = $userMapper->fetchOne($record->user_id);
1597
                if(!$user) {
1598
                    continue;
1599
                }
1600
 
1601
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
1602
 
1603
                array_push($comments, [
597 stevensc 1604
                    'uuid' => $record->uuid,
587 stevensc 1605
                    'date' => $dt->format($serviceDatetimeFormat),
1606
                    'image' => $storage->getUserImage($user),
1607
                    'fullname' => trim(trim($user->first_name) . ' ' . trim($user->last_name)),
1608
                    'rating' => strval($record->rating),
1609
                    'comment' => $record->comment,
597 stevensc 1610
                    '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]) : ''
587 stevensc 1611
                ]);
1612
            }
1613
 
1614
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1615
            $path = $storage->getPathMicrolearningCapsule();
244 efrain 1616
 
586 stevensc 1617
            $slides = $this->_getSlidesByCapsule($capsule, $storage);
1618
 
161 efrain 1619
            $data = [
586 stevensc 1620
                'uuid'              => $capsule->uuid,
1621
                'name'              => $capsule->name ? $capsule->name : '',
1622
                'description'       => $capsule->description ? $capsule->description : '',
1623
                'image'             => $capsule->image ? $storage->getGenericImage($path, $capsule->uuid, $capsule->image) : '',
1624
                'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
1625
                'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
1626
                'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
587 stevensc 1627
                'comments'          => $comments,
586 stevensc 1628
                'progress'          => $progress,
1629
                'completed'         => $completed,
1630
                'total_slides'      => count($slides),
1631
                'slides'            => $slides,
1632
                'order'             => $capsule->order,
1633
                'added_on'          => $capsule->added_on,
1634
                'updated_on'        => $capsule->updated_on,
161 efrain 1635
            ];
586 stevensc 1636
 
161 efrain 1637
            return new JsonModel([
1638
                'success' => true,
1639
                'data' => $data
1640
            ]);
1641
        }
586 stevensc 1642
 
1643
        return new JsonModel([
1644
            'success' => false,
1645
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1646
        ]);
161 efrain 1647
    }
1648
 
119 efrain 1649
    public function slidesAction()
1650
    {
1651
        $request = $this->getRequest();
1652
        if($request->isGet()) {
1653
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1654
            $currentUser = $currentUserPlugin->getUser();
1655
 
1656
 
1657
 
1658
            $topic_id = $this->params()->fromRoute('topic_id');
283 www 1659
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
119 efrain 1660
            $topic = $topicMapper->fetchOneByUuid($topic_id);
1661
 
1662
            if(!$topic) {
1663
                return new JsonModel([
1664
                    'success' => false,
1665
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1666
                ]);
1667
            }
1668
 
1669
            $accessGrantedIds = $this->getAccessGranted();
1670
 
1671
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1672
                return new JsonModel([
1673
                    'success' => false,
1674
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1675
                ]);
1676
            }
1677
 
1678
            $capsule_id = $this->params()->fromRoute('capsule_id');
283 www 1679
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
119 efrain 1680
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
1681
 
1682
            if(!$capsule) {
1683
                return new JsonModel([
1684
                    'success' => false,
1685
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1686
                ]);
1687
            }
1688
 
1689
 
1690
 
1691
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1692
                return new JsonModel([
1693
                    'success' => false,
1694
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1695
                ]);
1696
            }
1697
 
1698
 
1699
 
1700
            $data = [];
1701
 
283 www 1702
            $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
119 efrain 1703
 
283 www 1704
            $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1705
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
119 efrain 1706
 
333 www 1707
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1708
            $path = $storage->getPathMicrolearningSlide();
119 efrain 1709
 
1710
            $slides = $slideMapper->fetchAllByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
1711
            foreach($slides as $slide)
1712
            {
1713
 
1714
 
1715
                $userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
1716
                if($userProgress) {
224 efrain 1717
                    $completed =  $userProgress->completed ;
119 efrain 1718
                } else {
1719
                    $completed = 0;
1720
                }
1721
 
235 efrain 1722
 
230 efrain 1723
 
235 efrain 1724
                $link_take_a_test = '';
230 efrain 1725
                if($slide->quiz_id) {
235 efrain 1726
 
283 www 1727
                    $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
230 efrain 1728
                    $quiz = $quizMapper->fetchOne($slide->quiz_id);
1729
                    if($quiz) {
1730
                        $quiz_uuid = $quiz->uuid;
235 efrain 1731
                        $quiz_data = $this->getQuiz($slide->quiz_id);
1732
                        $link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);
230 efrain 1733
                    }
235 efrain 1734
 
1735
                }
119 efrain 1736
 
1737
 
1738
                array_push($data, [
235 efrain 1739
                    'quiz'                  => $quiz_uuid,
1740
                    'quiz_data'             => $quiz_data,
1741
                    'uuid'                  => $slide->uuid,
1742
                    'name'                  => $slide->name ? $slide->name : '',
1743
                    'description'           => $slide->description ? $slide->description : '',
1744
                    'type'                  => $slide->type,
283 www 1745
                    'background'            => $slide->background ? $storage->getGenericImage($path, $slide->uuid, $slide->background) : '',
1746
                    'file'                  => $slide->file ? $storage->getGenericFile($path, $slide->uuid, $slide->file) : '',
235 efrain 1747
                    'order'                 => $slide->order,
1748
                    'completed'             => $completed,
236 efrain 1749
                    'link_take_a_test'      => $link_take_a_test,
235 efrain 1750
                    'added_on'              => $slide->added_on,
1751
                    'updated_on'            => $slide->updated_on,
119 efrain 1752
                ]);
1753
 
1754
 
1755
 
1756
            }
1757
 
1758
            usort($data, function($a, $b) {
1759
 
1760
                $result =  $a['order'] <=> $b['order'];
1761
                if(0 == $result) {
1762
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1763
                    if(0 == $result) {
1764
                        $result = strcasecmp($a['name'], $b['name']);
1765
                    }
1766
                }
1767
 
1768
                if($result < 0) {
1769
                    return 1;
1770
                } else if($result > 0) {
1771
                    return -1;
1772
                } else  {
1773
                    return  0;
1774
                }
1775
            });
1776
 
1777
 
1778
 
1779
                return new JsonModel([
1780
                    'success' => true,
1781
                    'data' => $data
1782
                ]);
1783
 
1784
        } else {
1785
            return new JsonModel([
1786
                'success' => false,
1787
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1788
            ]);
1789
        }
1790
    }
1791
 
229 efrain 1792
    private function getQuiz($id)
1793
    {
1794
        $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1795
 
1796
        $data = [];
1797
 
283 www 1798
        $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
229 efrain 1799
        $quiz = $quizMapper->fetchOne($id);
1800
 
1801
        if(!$quiz) {
1802
            return [];
1803
        }
1804
 
1805
        $companyMapper = CompanyMapper::getInstance($this->adapter);
1806
        $company = $companyMapper->fetchOne($quiz->company_id);
1807
 
283 www 1808
        $questionMapper = MicrolearningQuestionMapper::getInstance($this->adapter);
1809
        $answerMapper = MicrolearningAnswerMapper::getInstance($this->adapter);
229 efrain 1810
 
1811
        $record_questions = [];
1812
        $questions = $questionMapper->fetchAllByQuizId($quiz->id);
1813
        foreach($questions as $question)
1814
        {
1815
            $record_answers = [];
1816
 
1817
            $answers = $answerMapper->fetchAllByQuizIdAndQuestionId($question->quiz_id, $question->id);
1818
            foreach($answers as $answer)
1819
            {
1820
                $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->added_on);
1821
                $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->updated_on);
1822
 
1823
                array_push($record_answers, [
1824
                    'uuid' => $answer->uuid,
1825
                    'text' => trim($answer->text),
1826
                    'correct' => $answer->correct ? $answer->correct  : 0 ,
1827
                    'points' => strval(intval($answer->points, 10)),
1828
                    'added_on'  => $dtAddedOn->format($serviceDatetimeFormat),
1829
                    'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1830
                ]);
1831
            }
1832
 
1833
            $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->added_on);
1834
            $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->updated_on);
1835
 
1836
            array_push($record_questions, [
1837
                'uuid'          => $question->uuid,
1838
                'text'          => trim($question->text),
1839
                'type'          => $question->type,
1840
                'maxlength'     => strval($question->maxlength),
1841
                'points'        => strval($question->points),
1842
                'answers'       => $record_answers,
1843
                'added_on'      => $dtAddedOn->format($serviceDatetimeFormat),
1844
                'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1845
            ]);
1846
        }
1847
 
1848
        $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->added_on);
1849
        $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->updated_on);
1850
 
1851
        array_push($data, [
1852
            'uuid' => $quiz->uuid,
1853
            'name' => $quiz->name,
1854
            'text' => trim($quiz->text ? $quiz->text : ''),
1855
            'failed' => trim($quiz->failed ? $quiz->failed : ''),
1856
            'points' => strval($quiz->points),
1857
            'minimum_points_required' => strval($quiz->minimum_points_required),
1858
            'max_time' => $quiz->max_time ? $quiz->max_time : 5,
1859
            'company_uuid' => $company->uuid,
1860
            'company_name' => $company->name,
1861
            'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
1862
            'questions'     => $record_questions,
1863
            'added_on'      => $dtAddedOn->format($serviceDatetimeFormat),
1864
            'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1865
        ]);
1866
 
1867
        return $data;
1868
 
1869
    }
161 efrain 1870
 
229 efrain 1871
 
161 efrain 1872
    public function getSlideAction()
1873
    {
1874
        $request = $this->getRequest();
1875
        if($request->isGet()) {
1876
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1877
            $currentUser = $currentUserPlugin->getUser();
1878
 
1879
            $id = $this->params()->fromRoute('id');
283 www 1880
            $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
161 efrain 1881
            $slide = $slideMapper->fetchOneByUuid($id);
1882
 
1883
            if(!$slide) {
1884
                return new JsonModel([
1885
                    'success' => false,
1886
                    'data' => 'ERROR_SLIDE_NOT_FOUND'
1887
                ]);
1888
            }
1889
 
1890
            $accessGrantedIds = $this->getAccessGranted();
1891
 
1892
 
1893
 
1894
            if(!in_array($slide->capsule_id, $accessGrantedIds->capsules)) {
1895
                return new JsonModel([
1896
                    'success' => false,
1897
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1898
                ]);
1899
            }
1900
 
283 www 1901
            $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1902
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
161 efrain 1903
 
1904
            $userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
1905
            if($userProgress) {
1906
                $completed = $userProgress->completed;
1907
            } else {
1908
                $completed = 0;
1909
            }
235 efrain 1910
 
1911
            $quiz_uuid = '';
1912
            $quiz_data = [];
1913
            $link_take_a_test = '';
1914
            if($slide->quiz_id) {
1915
 
283 www 1916
                $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
235 efrain 1917
                $quiz = $quizMapper->fetchOne($slide->quiz_id);
1918
                if($quiz) {
1919
                    $quiz_uuid = $quiz->uuid;
1920
                    $quiz_data = $this->getQuiz($slide->quiz_id);
1921
                    $link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);
1922
                }
161 efrain 1923
 
235 efrain 1924
            }
161 efrain 1925
 
333 www 1926
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1927
            $path = $storage->getPathMicrolearningSlide();
618 stevensc 1928
 
1929
            $image = $storage->getGenericImage($path, $slide->uuid, $slide->background);
1930
            $file = $storage->getGenericFile($path, $slide->uuid, $slide->file);
161 efrain 1931
 
1932
            $data =[
235 efrain 1933
                'quiz'              => $quiz_uuid,
1934
                'quiz_data'         => $quiz_data,
1935
                'uuid'              => $slide->uuid,
1936
                'name'              => $slide->name ? $slide->name : '',
1937
                'description'       => $slide->description ? $slide->description : '',
1938
                'type'              => $slide->type,
618 stevensc 1939
                'background'        => $image,
1940
                'file'              => $file,
235 efrain 1941
                'order'             => $slide->order,
1942
                'completed'         => $completed,
1943
                'link_take_a_test'  => $link_take_a_test,
1944
                'added_on'          => $slide->added_on,
1945
                'updated_on'        => $slide->updated_on,
161 efrain 1946
            ];
1947
 
1948
            return new JsonModel([
1949
                'success' => true,
1950
                'data' => $data
1951
            ]);
1952
 
1953
        } else {
1954
            return new JsonModel([
1955
                'success' => false,
1956
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1957
            ]);
1958
        }
1959
    }
1960
 
119 efrain 1961
    public function profileAction()
1962
    {
1963
        $request = $this->getRequest();
1964
        if($request->isGet()) {
1965
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1966
            $currentUser = $currentUserPlugin->getUser();
1967
 
1968
 
1969
            $accessGrantedIds = $this->getAccessGranted();
1970
 
1971
            $companyMapper = CompanyMapper::getInstance($this->adapter);
283 www 1972
            $companyExtendUserMapper = MicrolearningExtendUserMapper::getInstance($this->adapter);
1973
            $companyExtendUserCompanyMapper = MicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
1974
            $companyExtendUserFunctionMapper = MicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
1975
            $companyExtendUserGroupMapper = MicrolearningExtendUserGroupMapper::getInstance($this->adapter);
1976
            $companyExtendUserInstitutionMapper = MicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
1977
            $companyExtendUserPartnerMapper = MicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
1978
            $companyExtendUserProgramMapper = MicrolearningExtendUserProgramMapper::getInstance($this->adapter);
1979
            $companyExtendUserStudentTypeMapper = MicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
1980
            $companyExtendUserSectorMapper = MicrolearningExtendUserSectorMapper::getInstance($this->adapter);
119 efrain 1981
 
333 www 1982
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1983
 
119 efrain 1984
 
1985
            $data = [];
1986
            foreach($accessGrantedIds->companies as $company_id)
1987
            {
1988
                $company = $companyMapper->fetchOne($company_id);
1989
                if(!$company) {
1990
                    continue;
1991
                }
1992
 
1993
                $record = [
1994
                    'name' => $company->name,
283 www 1995
                    'image' => $storage->getCompanyImage($company),
119 efrain 1996
                    'details' => [],
1997
                ];
1998
 
1999
                $companyExtendUser = $companyExtendUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
2000
                if(!$companyExtendUser) {
2001
                    continue;
2002
                }
2003
 
2004
                if($companyExtendUser->extend_company_id) {
2005
 
2006
                    $extendedCompany = $companyExtendUserCompanyMapper->fetchOne($companyExtendUser->company_id);
2007
                    if($extendedCompany) {
2008
                        array_push($record['details'],[
2009
                            'uuid' => $extendedCompany->uuid,
2010
                            'label' => 'LABEL_COMPANY',
2011
                            'value' => $extendedCompany->name
2012
                        ]);
2013
                    }
2014
                }
2015
 
2016
                if($companyExtendUser->extend_function_id) {
2017
                    $extendedFunction = $companyExtendUserFunctionMapper->fetchOne($companyExtendUser->extend_function_id);
2018
                    if($extendedFunction) {
2019
                        array_push($record['details'],[
2020
                            'uuid' => $extendedFunction->uuid,
2021
                            'label' => 'LABEL_FUNCTION',
2022
                            'value' => $extendedFunction->name
2023
                        ]);
2024
                    }
2025
                }
2026
 
2027
                if($companyExtendUser->extend_group_id) {
2028
                    $extendedGroup = $companyExtendUserGroupMapper->fetchOne($companyExtendUser->extend_group_id);
2029
                    if($extendedGroup) {
2030
                        array_push($record['details'],[
2031
                            'uuid' => $extendedGroup->uuid,
2032
                            'label' => 'LABEL_GROUP',
2033
                            'value' => $extendedGroup->name
2034
                        ]);
2035
                    }
2036
                }
2037
 
2038
                if($companyExtendUser->extend_institution_id) {
2039
                    $extendedInstitution= $companyExtendUserInstitutionMapper->fetchOne($companyExtendUser->extend_institution_id);
2040
                    if($extendedInstitution) {
2041
                        array_push($record['details'],[
2042
                            'uuid' => $extendedInstitution->uuid,
2043
                            'label' => 'LABEL_INSTITUTION',
2044
                            'value' => $extendedInstitution->name
2045
                        ]);
2046
                    }
2047
                }
2048
 
2049
                if($companyExtendUser->extend_program_id) {
2050
                    $extendedProgram = $companyExtendUserProgramMapper->fetchOne($companyExtendUser->extend_program_id);
2051
                    if($extendedProgram) {
2052
                        array_push($record['details'],[
2053
                            'uuid' => $extendedProgram->uuid,
2054
                            'label' => 'LABEL_PROGRAM',
2055
                            'value' => $extendedProgram->name
2056
                        ]);
2057
 
2058
                    }
2059
                }
2060
 
2061
                if($companyExtendUser->extend_sector_id) {
2062
                    $extendedSector = $companyExtendUserSectorMapper->fetchOne($companyExtendUser->extend_sector_id);
2063
                    if($extendedSector) {
2064
                        array_push($record['details'],[
2065
                            'uuid' => $extendedSector->uuid,
2066
                            'label' => 'LABEL_SECTOR',
2067
                            'value' => $extendedSector->name
2068
                        ]);
2069
                    }
2070
                }
2071
 
2072
                if($companyExtendUser->extend_partner_id) {
2073
                    $extendedPartner = $companyExtendUserPartnerMapper->fetchOne($companyExtendUser->extend_partner_id);
2074
                    if($extendedPartner) {
2075
                        array_push($record['details'],[
2076
                            'uuid' => $extendedPartner->uuid,
2077
                            'label' => 'LABEL_PARTNER',
2078
                            'value' => $extendedPartner->name
2079
                        ]);
2080
                    }
2081
                }
2082
 
2083
                if($companyExtendUser->extend_student_type_id) {
2084
                    $extendedStudentType = $companyExtendUserStudentTypeMapper->fetchOne($companyExtendUser->extend_student_type_id);
2085
                    if($extendedStudentType) {
2086
                        array_push($record['details'],[
2087
                            'uuid' => $extendedStudentType->uuid,
2088
                            'label' => 'LABEL_TYPE',
2089
                            'value' => $extendedStudentType->name
2090
                        ]);
2091
                    }
2092
                }
2093
 
2094
                array_push($data, $record);
2095
            }
2096
 
2097
            return new JsonModel([
2098
                'success' => true,
2099
                'data' => $data
2100
            ]);
2101
 
2102
        } else {
2103
            return new JsonModel([
2104
                'success' => false,
2105
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2106
            ]);
2107
        }
2108
    }
590 stevensc 2109
 
2110
    /**
2111
     *
2112
     * @return \Laminas\View\Model\JsonModel
2113
     */
167 efrain 2114
    public function syncAction()
2115
    {
2116
        $request = $this->getRequest();
590 stevensc 2117
        if (!$request->isPost()) {
2118
            return new JsonModel(['success' => false, 'data' => 'ERROR_INVALID_REQUEST']);
2119
        }
167 efrain 2120
 
590 stevensc 2121
        $slide_uuid = $this->params()->fromRoute('slide_uuid');
2122
        $topic_uuid = $this->params()->fromRoute('topic_uuid');
283 www 2123
 
590 stevensc 2124
        if (empty($slide_uuid) || empty($topic_uuid)) {
2125
            return new JsonModel(['success' => false, 'data' => 'ERROR_MISSING_PARAMETERS']);
167 efrain 2126
        }
590 stevensc 2127
 
2128
        $currentUser = $this->plugin('currentUserPlugin')->getUser();
2129
        $user_id = $currentUser->id ?? null;
2130
        if (!$user_id) {
2131
            return new JsonModel(['success' => false, 'data' => 'ERROR_USER_NOT_FOUND']);
2132
        }
2133
 
2134
        $accessGrantedIds = $this->getAccessGranted();
2135
 
2136
        // Obtener Slide
2137
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
2138
        $slide = $slideMapper->fetchOneByUuid($slide_uuid);
2139
        if (!$slide) {
2140
            return new JsonModel(['success' => false, 'data' => 'ERROR_SLIDE_NOT_FOUND']);
2141
        }
2142
 
2143
        // Obtener Cápsula
2144
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
2145
        $capsule = $capsuleMapper->fetchById($slide->capsule_id);
2146
        if (!$capsule || !in_array($capsule->id, $accessGrantedIds->capsules)) {
2147
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_ACCESS_DENIED']);
2148
        }
2149
 
2150
        // Obtener Tópico
2151
        $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
2152
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2153
        if (!$topic || !in_array($topic->id, $accessGrantedIds->topics)) {
2154
            return new JsonModel(['success' => false, 'data' => 'ERROR_TOPIC_ACCESS_DENIED']);
2155
        }
2156
 
2157
        // Validar que la cápsula pertenece al tópico
2158
        $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
2159
        $relation = $topicCapsuleMapper->fetchOneByTopicIdAndCapsuleId($topic->id, $capsule->id);
2160
        if (!$relation) {
2161
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_DOES_NOT_BELONG_TO_TOPIC']);
2162
        }
2163
 
2164
        // Marcar slide como visto
2165
        $progressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
2166
        $progressMapper->markSlideViewed($user_id, $topic->id, $capsule->id, $slide->id);
2167
 
2168
        $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED';
2169
 
2170
        // Si vio todos los slides → marcar cápsula como completada
2171
        if ($progressMapper->hasViewedAllSlidesInCapsule($user_id, $capsule->id)) {
2172
            $progressMapper->markCapsuleCompleted($user_id, $topic->id, $capsule->id);
2173
            $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED';
2174
        }
2175
 
2176
        // Si completó todas las cápsulas del tópico → marcar tópico como completado
2177
        if ($progressMapper->hasCompletedAllCapsulesInTopic($user_id, $topic->id)) {
2178
            $progressMapper->markTopicCompleted($user_id, $topic->id);
2179
            $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED';
2180
        }
2181
 
2182
        return new JsonModel(['success' => true, 'data' => $data]);
2183
    }
167 efrain 2184
 
119 efrain 2185
    /**
2186
     *
2187
     * @return \LeadersLinked\Controller\MicrolearningUserAccessGrantedIds
2188
     */
2189
    private function getAccessGranted()
2190
    {
2191
        $currentUserPlugin = $this->plugin('currentUserPlugin');
2192
        $currentUser = $currentUserPlugin->getUser();
2193
 
626 stevensc 2194
        $topicUserMapper = MicrolearningTopicUserMapper::getInstance($this->adapter);
2195
        $now = $topicUserMapper->getDatebaseNow();
119 efrain 2196
 
626 stevensc 2197
        $records = $topicUserMapper->fetchAllActiveByUserId($currentUser->id);
119 efrain 2198
 
2199
        $accessGrantedIds = new MicrolearningUserAccessGrantedIds();
2200
 
2201
        foreach($records as $record)
2202
        {
626 stevensc 2203
            if($record->access != MicrolearningTopicUser::ACCESS_UNLIMITED && $record->access != MicrolearningTopicUser::ACCESS_PAY_PERIOD) {
119 efrain 2204
                continue;
2205
            }
626 stevensc 2206
            if($record->access == MicrolearningTopicUser::ACCESS_PAY_PERIOD) {
119 efrain 2207
                if($now < $record->paid_from || $now > $record->paid_to) {
2208
                    continue;
2209
                }
2210
            }
626 stevensc 2211
 
2212
            // Verificar si la empresa está en la lista de empresas permitidas
119 efrain 2213
            if(!in_array($record->company_id, $accessGrantedIds->companies )) {
2214
                array_push($accessGrantedIds->companies, $record->company_id);
2215
            }
2216
 
626 stevensc 2217
            // Verificar si el tópico está en la lista de tópicos permitidos
119 efrain 2218
            if(!in_array($record->topic_id, $accessGrantedIds->topics )) {
2219
                array_push( $accessGrantedIds->topics, $record->topic_id);
2220
            }
2221
        }
2222
 
2223
        return $accessGrantedIds;
2224
    }
2225
 
590 stevensc 2226
    /**
2227
     * Marks a slide as completed and cascades completion status to capsule and topic if needed
2228
     *
2229
     * @return \Laminas\View\Model\JsonModel
2230
     */
2231
    public function completeSlideAction()
2232
    {
2233
        $request = $this->getRequest();
2234
        if($request->isPost()) {
2235
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2236
            $currentUser = $currentUserPlugin->getUser();
2237
 
2238
            $slide_uuid = $this->params()->fromRoute('slide_uuid');
2239
            $topic_uuid = $this->params()->fromRoute('topic_uuid');
2240
            $capsule_uuid = $this->params()->fromRoute('capsule_uuid');
2241
 
2242
            if(empty($slide_uuid) || empty($topic_uuid) || empty($capsule_uuid)) {
2243
                return new JsonModel([
2244
                    'success' => false,
2245
                    'data' => 'ERROR_INVALID_PARAMETERS'
2246
                ]);
2247
            }
2248
 
2249
            // Get slide
2250
            $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
2251
            $slide = $slideMapper->fetchOneByUuid($slide_uuid);
2252
 
2253
            if(!$slide) {
2254
                return new JsonModel([
2255
                    'success' => false,
2256
                    'data' => 'ERROR_SLIDE_NOT_FOUND'
2257
                ]);
2258
            }
2259
 
2260
            // Get capsule
2261
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
2262
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
2263
 
2264
            if(!$capsule) {
2265
                return new JsonModel([
2266
                    'success' => false,
2267
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
2268
                ]);
2269
            }
2270
 
2271
            // Get topic
2272
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
2273
            $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2274
 
2275
            if(!$topic) {
2276
                return new JsonModel([
2277
                    'success' => false,
2278
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
2279
                ]);
2280
            }
2281
 
2282
            // Update slide progress
2283
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
2284
            $slideProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
2285
            $updated_on = $userProgressMapper->getDatebaseNow();
2286
 
2287
            if(!$slideProgress) {
2288
                $slideProgress = new MicrolearningUserProgress();
2289
                $slideProgress->user_id = $currentUser->id;
2290
                $slideProgress->slide_id = $slide->id;
2291
                $slideProgress->topic_id = $topic->id;
2292
                $slideProgress->capsule_id = $capsule->id;
2293
            }
2294
 
2295
            $slideProgress->completed = 1;
2296
            $slideProgress->updated_on = $updated_on;
2297
 
2298
            if($userProgressMapper->update($slideProgress)) {
2299
                $closeCapsule = false;
2300
                $closeTopic = false;
2301
            }
2302
 
2303
            // Check if capsule is completed
2304
            $capsuleProgress = $userProgressMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);
2305
 
2306
            $capsuleProgress->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndCapsuleId($capsule->company_id, $capsule->id);
2307
            $capsuleProgress->view_slides = $userProgressMapper->fetchCountAllSlideCompletedByUserIdAndCapsuleId($currentUser->id, $capsule->id);
2308
 
2309
            if($capsuleProgress->total_slides) {
2310
                $capsuleProgress->progress = ($capsuleProgress->view_slides * 100) / $capsuleProgress->total_slides;
2311
                $capsuleProgress->progress = $capsuleProgress->progress > 100 ? 100 : $capsuleProgress->progress;
2312
            }
2313
 
2314
            if(!$userProgressMapper->update($capsuleProgress)) {
2315
                return new JsonModel([
2316
                    'success' => false,
2317
                    'data' => $userProgressMapper->getError()
2318
                ]);
2319
            }
2320
 
2321
            if($capsuleProgress->progress >= 100) {
2322
                $closeCapsule = true;
2323
            }
2324
 
2325
            // Check if topic is completed
2326
            $topicProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);
2327
            if($topicProgress->completed) {
2328
                $closeTopic = true;
2329
            }
2330
 
2331
 
2332
            // Prepare response
2333
            $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED';
2334
 
2335
            if($closeCapsule) {
2336
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED';
2337
            }
2338
 
2339
            if($closeTopic) {
2340
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED';
2341
            }
2342
 
2343
            return new JsonModel([
2344
                'success' => true,
2345
                'data' => $data
2346
            ]);
2347
        }
2348
 
2349
        return new JsonModel([
2350
            'success' => false,
2351
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2352
        ]);
2353
    }
119 efrain 2354
}