Proyectos de Subversion LeadersLinked - Services

Rev

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