Proyectos de Subversion LeadersLinked - Services

Rev

Rev 245 | Rev 283 | 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'));
245 efrain 563
            $order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));
564
            $order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));
119 efrain 565
 
245 efrain 566
            if(!in_array($order_field,['name', 'added_on'] )) {
567
                $order_field = 'name';
568
            }
119 efrain 569
 
245 efrain 570
            if(!in_array( $order_direction,['asc', 'desc'])) {
571
                $order_field = 'asc';
572
            }
573
 
574
 
119 efrain 575
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
576
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
577
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
578
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
579
 
580
            $accessGranted = $this->getAccessGranted();
581
 
582
 
583
            $topics = [];
584
            $capsules = [];
585
 
586
            foreach($accessGranted->capsules as $capsule_id)
587
            {
588
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);
589
                if($userProgress) {
590
                    continue;
591
                }
592
 
593
                $capsule = $capsuleMapper->fetchOne($capsule_id);
594
 
595
                if($name) {
596
                    if(empty($name) || stripos($capsule->name, $name) === false) {
597
                        continue;
598
                    }
599
                }
600
 
601
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
602
 
603
                if(isset($topics[$capsule->topic_id])) {
604
                    $topic = $topics[$capsule->topic_id];
605
                } else {
606
                    $topic = $topicMapper->fetchOne($capsule->topic_id);
607
                    $topics[ $capsule->topic_id ] = $topic;
608
                }
609
 
610
 
611
                array_push($capsules, [
612
                    'uuid'              => $capsule->uuid,
613
                    'name'              => $capsule->name ? $capsule->name : '',
614
                    'description'       => $capsule->description ? $capsule->description : '',
164 efrain 615
                    'image'             => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
119 efrain 616
                    'position'          => $capsule->order,
617
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
618
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
619
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
620
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
621
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
191 efrain 622
                    'progress'          => 0,
162 efrain 623
                    'link_get'          => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),
119 efrain 624
                    'added_on'          => $capsule->added_on,
625
                    'updated_on'        => $capsule->updated_on,
626
                ]);
627
            }
628
 
245 efrain 629
 
630
            if($order_field == 'name') {
631
                if($order_direction == 'asc') {
632
                    usort($capsules, function($a, $b) {
633
                        return strcasecmp($a['name'], $b['name']);
634
                    });
635
                } else {
636
                    usort($capsules, function($a, $b) {
637
                        $result = strcasecmp($a['name'], $b['name']);
638
                        if($result < 0) {
639
                            return 1;
640
                        } else if($result > 0) {
641
                            return -1;
642
                        } else  {
643
                            return  0;
644
                        }
645
                    });
119 efrain 646
                }
647
 
245 efrain 648
            }
649
 
650
            if($order_field == 'added_on') {
651
                if($order_direction == 'asc') {
652
                    usort($capsules, function($a, $b) {
653
                        return strcasecmp($a['added_on'], $b['added_on']);
654
                    });
655
                } else {
656
                    usort($capsules, function($a, $b) {
657
                        $result = strcasecmp($a['added_on'], $b['added_on']);
658
                        if($result < 0) {
659
                            return 1;
660
                        } else if($result > 0) {
661
                            return -1;
662
                        } else  {
663
                            return  0;
664
                        }
665
                    });
666
                }
119 efrain 667
 
245 efrain 668
            }
669
 
670
 
671
 
672
 
673
 
119 efrain 674
 
245 efrain 675
 
119 efrain 676
            return new JsonModel([
677
                'success' => true,
678
                'data' => $capsules
679
            ]);
680
 
681
 
682
 
683
        }
684
 
685
        return new JsonModel([
686
            'success' => false,
687
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
688
        ]);
689
 
690
    }
691
 
692
    public function capsulesCompletedAction()
693
    {
694
        $request = $this->getRequest();
695
        if($request->isGet()) {
696
            $currentUserPlugin = $this->plugin('currentUserPlugin');
697
            $currentUser = $currentUserPlugin->getUser();
698
 
699
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
245 efrain 700
            $order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));
701
            $order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));
119 efrain 702
 
246 efrain 703
            if(!in_array($order_field,['name', 'added_on','last_access_on'] )) {
245 efrain 704
                $order_field = 'name';
705
            }
119 efrain 706
 
245 efrain 707
            if(!in_array( $order_direction,['asc', 'desc'])) {
708
                $order_field = 'asc';
709
            }
710
 
119 efrain 711
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
712
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
713
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
714
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
715
 
716
            $accessGranted = $this->getAccessGranted();
717
 
718
            $topics = [];
719
            $capsules = [];
720
 
721
            foreach($accessGranted->capsules as $capsule_id)
722
            {
723
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);
724
                if(!$userProgress) {
725
                    continue;
726
                }
727
 
728
                if(!$userProgress->completed) {
729
                    continue;
730
                }
731
 
732
 
733
 
734
                $capsule = $capsuleMapper->fetchOne($capsule_id);
735
 
736
                if($name) {
737
                    if(empty($name) || stripos($capsule->name, $name) === false) {
738
                        continue;
739
                    }
740
                }
741
 
742
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
743
 
744
                if(isset($topics[$capsule->topic_id])) {
745
                    $topic = $topics[$capsule->topic_id];
746
                } else {
747
                    $topic = $topicMapper->fetchOne($capsule->topic_id);
748
                    $topics[ $capsule->topic_id ] = $topic;
749
                }
750
 
751
 
752
 
753
                array_push($capsules, [
754
                    'uuid'              => $capsule->uuid,
755
                    'name'              => $capsule->name ? $capsule->name : '',
756
                    'description'       => $capsule->description ? $capsule->description : '',
164 efrain 757
                    'image'             => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
119 efrain 758
                    'position'          => $capsule->order,
759
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
760
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
761
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
762
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
763
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
145 efrain 764
                    'progress'          => $userProgress->progress,
162 efrain 765
                    'link_get'          => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),
119 efrain 766
                    'added_on'          => $capsule->added_on,
246 efrain 767
                    'last_access_on'    => $userProgress->updated_on,
119 efrain 768
                    'updated_on'        => $capsule->updated_on,
769
                ]);
770
            }
771
 
245 efrain 772
            if($order_field == 'name') {
773
                if($order_direction == 'asc') {
774
                    usort($capsules, function($a, $b) {
775
                        return strcasecmp($a['name'], $b['name']);
776
                    });
777
                } else {
778
                    usort($capsules, function($a, $b) {
779
                        $result = strcasecmp($a['name'], $b['name']);
780
                        if($result < 0) {
781
                            return 1;
782
                        } else if($result > 0) {
783
                            return -1;
784
                        } else  {
785
                            return  0;
786
                        }
787
                    });
119 efrain 788
                }
789
 
245 efrain 790
            }
791
 
792
            if($order_field == 'added_on') {
793
                if($order_direction == 'asc') {
794
                    usort($capsules, function($a, $b) {
795
                        return strcasecmp($a['added_on'], $b['added_on']);
796
                    });
797
                } else {
798
                    usort($capsules, function($a, $b) {
799
                        $result = strcasecmp($a['added_on'], $b['added_on']);
800
                        if($result < 0) {
801
                            return 1;
802
                        } else if($result > 0) {
803
                            return -1;
804
                        } else  {
805
                            return  0;
806
                        }
807
                    });
808
                }
119 efrain 809
 
245 efrain 810
            }
246 efrain 811
 
812
            if($order_field == 'last_access_on') {
813
                if($order_direction == 'asc') {
814
                    usort($capsules, function($a, $b) {
815
                        return strcasecmp($a['last_access_on'], $b['last_access_on']);
816
                    });
817
                } else {
818
                    usort($capsules, function($a, $b) {
819
                        $result = strcasecmp($a['last_access_on'], $b['last_access_on']);
820
                        if($result < 0) {
821
                            return 1;
822
                        } else if($result > 0) {
823
                            return -1;
824
                        } else  {
825
                            return  0;
826
                        }
827
                    });
828
                }
245 efrain 829
 
246 efrain 830
            }
831
 
832
 
833
 
834
 
119 efrain 835
 
836
            return new JsonModel([
837
                'success' => true,
838
                'data' => $capsules
839
            ]);
840
 
841
        }
842
 
843
        return new JsonModel([
844
            'success' => false,
845
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
846
        ]);
847
    }
848
 
849
    public function capsulesInProgressAction()
850
    {
851
        $request = $this->getRequest();
852
        if($request->isGet()) {
853
            $currentUserPlugin = $this->plugin('currentUserPlugin');
854
            $currentUser = $currentUserPlugin->getUser();
855
 
856
            $name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));
245 efrain 857
            $order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));
858
            $order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));
119 efrain 859
 
246 efrain 860
            if(!in_array($order_field,['name', 'added_on', 'last_access_on'] )) {
245 efrain 861
                $order_field = 'name';
862
            }
119 efrain 863
 
245 efrain 864
            if(!in_array( $order_direction,['asc', 'desc'])) {
865
                $order_field = 'asc';
866
            }
867
 
119 efrain 868
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
869
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
870
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
871
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
872
 
873
            $accessGranted = $this->getAccessGranted();
874
 
875
            $topics = [];
876
            $capsules = [];
877
 
878
            foreach($accessGranted->capsules as $capsule_id)
879
            {
880
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);
881
                if(!$userProgress) {
882
                    continue;
883
                }
884
 
885
                if($userProgress->completed) {
886
                    continue;
887
                }
246 efrain 888
 
119 efrain 889
                $capsule = $capsuleMapper->fetchOne($capsule_id);
890
 
891
                if($name) {
892
                    if(empty($name) || stripos($capsule->name, $name) === false) {
893
                        continue;
894
                    }
895
                }
896
 
897
 
898
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
899
 
900
                if(isset($topics[$capsule->topic_id])) {
901
                    $topic = $topics[$capsule->topic_id];
902
                } else {
903
                    $topic = $topicMapper->fetchOne($capsule->topic_id);
904
                    $topics[ $capsule->topic_id ] = $topic;
905
                }
906
 
907
 
908
 
909
 
910
                array_push($capsules, [
911
                    'uuid'              => $capsule->uuid,
912
                    'name'              => $capsule->name ? $capsule->name : '',
913
                    'description'       => $capsule->description ? $capsule->description : '',
164 efrain 914
                    'image'             => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
119 efrain 915
                    'position'          => $capsule->order,
916
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
917
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
918
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
919
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
920
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
145 efrain 921
                    'progress'          => $userProgress->progress,
162 efrain 922
                    'link_get'          => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),
246 efrain 923
                    'last_access_on'    => $userProgress->updated_on,
119 efrain 924
                    'added_on'          => $capsule->added_on,
925
                    'updated_on'        => $capsule->updated_on,
926
                ]);
927
            }
928
 
245 efrain 929
            if($order_field == 'name') {
930
                if($order_direction == 'asc') {
931
                    usort($capsules, function($a, $b) {
932
                        return strcasecmp($a['name'], $b['name']);
933
                    });
934
                } else {
935
                    usort($capsules, function($a, $b) {
936
                        $result = strcasecmp($a['name'], $b['name']);
937
                        if($result < 0) {
938
                            return 1;
939
                        } else if($result > 0) {
940
                            return -1;
941
                        } else  {
942
                            return  0;
943
                        }
944
                    });
119 efrain 945
                }
946
 
245 efrain 947
            }
948
 
949
            if($order_field == 'added_on') {
950
                if($order_direction == 'asc') {
951
                    usort($capsules, function($a, $b) {
952
                        return strcasecmp($a['added_on'], $b['added_on']);
953
                    });
954
                } else {
955
                    usort($capsules, function($a, $b) {
956
                        $result = strcasecmp($a['added_on'], $b['added_on']);
957
                        if($result < 0) {
958
                            return 1;
959
                        } else if($result > 0) {
960
                            return -1;
961
                        } else  {
962
                            return  0;
963
                        }
964
                    });
965
                }
119 efrain 966
 
245 efrain 967
            }
246 efrain 968
 
969
            if($order_field == 'last_access_on') {
970
                if($order_direction == 'asc') {
971
                    usort($capsules, function($a, $b) {
972
                        return strcasecmp($a['last_access_on'], $b['last_access_on']);
973
                    });
974
                } else {
975
                    usort($capsules, function($a, $b) {
976
                        $result = strcasecmp($a['last_access_on'], $b['last_access_on']);
977
                        if($result < 0) {
978
                            return 1;
979
                        } else if($result > 0) {
980
                            return -1;
981
                        } else  {
982
                            return  0;
983
                        }
984
                    });
985
                }
119 efrain 986
 
246 efrain 987
            }
245 efrain 988
 
246 efrain 989
 
119 efrain 990
            return new JsonModel([
991
                'success' => true,
992
                'data' => $capsules
993
            ]);
994
 
995
 
996
 
997
        }
998
 
999
        return new JsonModel([
1000
            'success' => false,
1001
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1002
        ]);
1003
    }
1004
 
1005
 
1006
    public function timelineAction()
1007
    {
1008
 
1009
        $request = $this->getRequest();
1010
        if($request->isGet()) {
1011
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1012
            $currentUser = $currentUserPlugin->getUser();
1013
 
1014
 
1015
            $page = intval($this->params()->fromQuery('page'), 10);
1016
 
1017
            $activities = [
1018
                CompanyMicrolearningUserLog::ACTIVITY_SIGNIN            => 'LABEL_MICROLEARNING_ACTIVITY_SIGNIN',
1019
                CompanyMicrolearningUserLog::ACTIVITY_SIGNOUT           => 'LABEL_MICROLEARNING_ACTIVITY_SIGNOUT',
1020
                CompanyMicrolearningUserLog::ACTIVITY_START_TOPIC       => 'LABEL_MICROLEARNING_ACTIVITY_START_TOPIC',
1021
                CompanyMicrolearningUserLog::ACTIVITY_START_CAPSULE     => 'LABEL_MICROLEARNING_ACTIVITY_START_CAPSULE',
1022
                CompanyMicrolearningUserLog::ACTIVITY_VIEW_SLIDE        => 'LABEL_MICROLEARNING_ACTIVITY_VIEW_SLIDE',
1023
                CompanyMicrolearningUserLog::ACTIVITY_TAKE_A_TEST       => 'LABEL_MICROLEARNING_ACTIVITY_TAKE_A_TEST',
1024
                CompanyMicrolearningUserLog::ACTIVITY_RETAKE_A_TEST     => 'LABEL_MICROLEARNING_ACTIVITY_RETAKE_A_TEST',
1025
                CompanyMicrolearningUserLog::ACTIVITY_APPROVED_TEST     => 'LABEL_MICROLEARNING_ACTIVITY_APPROVED_TEST',
1026
                CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_CAPSULE => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_CAPSULE',
1027
                CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_TOPIC   => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_TOPIC',
1028
            ];
1029
 
1030
 
1031
 
1032
            $companyMicrolearningUserLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
1033
            $paginator = $companyMicrolearningUserLogMapper->getAllMessagesPaginatorByUserId($currentUser->id, $page);
1034
 
1035
            $items = [];
1036
            foreach($paginator as $record)
1037
            {
1038
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
1039
 
1040
                array_push($items, [
1041
                    'activity' => $activities[$record->activity],
1042
                    'added_on' => $dt->format('d/m/Y H:i a')
1043
                ]);
1044
            }
1045
 
1046
 
1047
            return new JsonModel([
1048
                'success' => true,
1049
                'data' => [
1050
                    'total' => [
1051
                        'count' => $paginator->getTotalItemCount(),
1052
                        'pages' => $paginator->getPages()->pageCount,
1053
                    ],
1054
                    'current' => [
1055
                        'items'    => $items,
1056
                        'page'     => $paginator->getCurrentPageNumber(),
1057
                        'count'    => $paginator->getCurrentItemCount(),
1058
                    ]
1059
                ]
1060
            ]);
1061
 
1062
 
1063
        } else {
1064
            return new JsonModel([
1065
                'success' => false,
1066
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1067
            ]);
1068
        }
1069
    }
1070
 
1071
    /**
1072
     * Valores para la generación de los gráficos de progreso
1073
     * Para las repuesta afirmativa
1074
     * [
1075
     *  'success' => true,
1076
     *      'data' => [
1077
     *          'topicTotal' => cantidad total de tópicos,
1078
     *          'topicStarted' => cantidad de tópicos iniciados,
1079
     *          'topicIncompleted' => cantidad de tópicos incompletos,
1080
     *          'topicCompleted' => cantidad de tópicos completos,
1081
     *          'percentCompleted' => % de diapositivas completados ,
1082
     *          'percentIncompleted' => % de diapositivas incompletos ,
1083
     *          'percentWithoutReturning' => % de cápsulas sin retorno después de completada,
1084
     *          'percentWithReturning' => % de cápsulas con retorno después de completada,
1085
     *       ],
1086
     * ]
1087
     *
1088
     *
1089
     *  En caso contrario
1090
     *  [
1091
     *      'success' => false,
1092
     *      'data' => mensaje de error
1093
     *  ]
1094
     *
1095
     *
1096
     * @return \Laminas\View\Model\JsonModel
1097
     */
1098
    public function progressAction()
1099
    {
1100
 
1101
        $request = $this->getRequest();
1102
        if($request->isGet()) {
1103
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1104
            $currentUser = $currentUserPlugin->getUser();
1105
 
1106
 
1107
            $accessGrantedIds = $this->getAccessGranted();
1108
            $id = $this->params()->fromRoute('id');
1109
 
1110
            $companyMapper = CompanyMapper::getInstance($this->adapter);
1111
            $company = $companyMapper->fetchOneByUuid($id);
1112
 
1113
            if(!$company) {
1114
                $response = [
1115
                    'success' => false,
1116
                    'data' => 'ERROR_COMPANY_NOT_FOUND',
1117
                ];
1118
 
1119
 
1120
                return new JsonModel($response);
1121
            }
1122
 
1123
            if(!in_array($company->id, $accessGrantedIds->companies)) {
1124
                $response = [
1125
                    'success' => false,
1126
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_COMPANY',
1127
                ];
1128
 
1129
 
1130
                return new JsonModel($response);
1131
            }
1132
 
1133
            $capsuleTotal              = 0;
1134
            $capsuleCompleted          = 0;
1135
            $capsuleWithReturning      = 0;
1136
            $capsuleWithoutReturning   = 0;
1137
            $capsuleStarted            = 0;
1138
            $capsuleToStart            = 0;
1139
            $percentCompleted          = 0;
1140
            $percentIncompleted        = 100;
1141
 
1142
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1143
            $topics = $topicMapper->fetchAllActiveByCompanyIdAndIds($company->id, $accessGrantedIds->topics);
1144
 
1145
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1146
            $progressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1147
 
1148
 
1149
            foreach($topics as $topic)
1150
            {
1151
                $resultCount = $capsuleMapper->fetchCountByCompanyIdAndTopicId($company->id, $topic->id);
1152
                $capsuleTotal =  $capsuleTotal + $resultCount;
1153
 
1154
                $resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);
1155
                $capsuleCompleted = $capsuleCompleted + $resultCount;
1156
 
1157
                $resultCount = $progressMapper->fetchCountCapsulesCompletedWithReturningByIdAndTopicId($currentUser->id, $topic->id);
1158
                $capsuleWithReturning = $capsuleWithReturning + $resultCount;
1159
 
1160
                $resultCount = $progressMapper->fetchCountCapsulesCompletedWithoutReturningByIdAndTopicId($currentUser->id, $topic->id);
1161
                $capsuleWithoutReturning = $capsuleWithoutReturning + $resultCount;
1162
 
1163
                $resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);
1164
                $capsuleStarted = $capsuleStarted + $resultCount;
1165
            }
1166
 
1167
            $capsuleToStart = $capsuleTotal -  $capsuleStarted;
1168
 
1169
 
1170
            if($capsuleTotal > 0) {
1171
                $percentCompleted = ($capsuleCompleted * 100) /  $capsuleTotal;
1172
                $percentIncompleted = 100 - $percentCompleted;
1173
            }
1174
 
1175
 
1176
 
1177
            return new JsonModel([
1178
                'success' => true,
1179
                'data' => [
1180
                    'capsuleTotal' => $capsuleTotal,
1181
                    'capsuleCompleted' => $capsuleCompleted,
1182
                    'capsuleStarted' => $capsuleStarted,
1183
                    'capsuleToStart' => $capsuleToStart,
1184
                    'percentCompleted' => number_format($percentCompleted, 2, '.', ','),
1185
                    'percentIncompleted' => number_format($percentIncompleted, 2, '.', ','),
1186
                    'capsuleWithReturning' => $capsuleWithReturning,
1187
                    'capsuleWithoutReturning' => $capsuleWithoutReturning,
1188
                ],
1189
            ]);
1190
 
1191
 
1192
        } else {
1193
            return new JsonModel([
1194
                'success' => false,
1195
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1196
            ]);
1197
        }
1198
    }
1199
 
1200
 
1201
    public function topicsAction()
1202
    {
1203
        $request = $this->getRequest();
1204
        if($request->isGet()) {
1205
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1206
            $currentUser = $currentUserPlugin->getUser();
1207
 
1208
 
1209
            $data = [];
1210
            $accessGrantedIds = $this->getAccessGranted();
1211
 
1212
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1213
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1214
 
1215
 
1216
            foreach($accessGrantedIds->topics as $id)
1217
            {
1218
                $topic = $topicMapper->fetchOne($id);
1219
                if(!$topic) {
1220
                    continue;
1221
                }
1222
 
1223
                $userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $id);
1224
                if($userProgress) {
1225
                    $progress = $userProgress->progress;
1226
                    $completed = $userProgress->completed;
1227
                } else {
1228
                    $progress = 0;
1229
                    $completed = 0;
1230
                }
1231
 
1232
 
1233
 
1234
                array_push($data, [
164 efrain 1235
                    'uuid'          => $topic->uuid,
119 efrain 1236
                    'name'          => $topic->name ? $topic->name : '',
1237
                    'description'   => $topic->description ? $topic->description : '',
164 efrain 1238
                    'image'         => $topic->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '',
119 efrain 1239
                    'progress'      => $progress,
1240
                    'completed'     => $completed,
1241
                    'order'         => $topic->order,
1242
                    'added_on'      => $topic->added_on,
1243
                    'updated_on'    => $topic->updated_on,
1244
                    'link_capsules' => $this->url()->fromRoute('microlearning/capsules', ['topic_id' => $topic->uuid], ['force_canonical' => true]),
161 efrain 1245
                    'link_get'      => $this->url()->fromRoute('microlearning/get-topic', ['id' => $topic->uuid], ['force_canonical' => true]),
119 efrain 1246
 
1247
                ]);
1248
            }
1249
 
1250
            usort($data, function($a, $b) {
1251
 
1252
                $result =  $a['order'] <=> $b['order'];
1253
                if(0 == $result) {
1254
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1255
                    if(0 == $result) {
1256
                        $result = strcasecmp($a['name'], $b['name']);
1257
                    }
1258
                }
1259
 
1260
                if($result < 0) {
1261
                    return 1;
1262
                } else if($result > 0) {
1263
                    return -1;
1264
                } else  {
1265
                    return  0;
1266
                }
1267
            });
1268
 
1269
 
1270
 
1271
                return new JsonModel([
1272
                    'success' => true,
1273
                    'data' => $data
1274
                ]);
1275
 
1276
        } else {
1277
            return new JsonModel([
1278
                'success' => false,
1279
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1280
            ]);
1281
        }
1282
    }
1283
 
161 efrain 1284
    public function getTopicAction()
1285
    {
1286
        $request = $this->getRequest();
1287
        if($request->isGet()) {
1288
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1289
            $currentUser = $currentUserPlugin->getUser();
1290
 
1291
 
1292
            $id = $this->params()->fromRoute('id');
1293
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1294
            $topic = $topicMapper->fetchOneByUuid($id);
1295
 
1296
            if(!$topic) {
1297
                return new JsonModel([
1298
                    'success' => false,
1299
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1300
                ]);
1301
            }
1302
 
1303
            $accessGrantedIds = $this->getAccessGranted();
1304
 
1305
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1306
                return new JsonModel([
1307
                    'success' => false,
1308
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1309
                ]);
1310
            }
1311
 
1312
 
1313
            $data = [];
1314
            $accessGrantedIds = $this->getAccessGranted();
1315
 
1316
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1317
 
1318
            $userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $id);
1319
            if($userProgress) {
1320
                $progress = $userProgress->progress;
1321
                $completed = $userProgress->completed;
1322
            } else {
1323
                $progress = 0;
1324
                $completed = 0;
1325
            }
1326
 
1327
 
1328
 
1329
            $data = [
165 efrain 1330
                'uuid'          => $topic->uuid,
161 efrain 1331
                'name'          => $topic->name ? $topic->name : '',
1332
                'description'   => $topic->description ? $topic->description : '',
164 efrain 1333
                'image'         => $topic->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '',
161 efrain 1334
                'progress'      => $progress,
1335
                'completed'     => $completed,
1336
                'order'         => $topic->order,
1337
                'added_on'      => $topic->added_on,
1338
                'updated_on'    => $topic->updated_on,
1339
                'link_capsules' => $this->url()->fromRoute('microlearning/capsules', ['topic_id' => $topic->uuid], ['force_canonical' => true]),
1340
 
1341
            ];
1342
 
1343
 
1344
 
1345
            return new JsonModel([
1346
                'success' => true,
1347
                'data' => $data
1348
            ]);
1349
 
1350
        } else {
1351
            return new JsonModel([
1352
                'success' => false,
1353
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1354
            ]);
1355
        }
1356
    }
119 efrain 1357
 
161 efrain 1358
 
119 efrain 1359
    public function capsulesAction()
1360
    {
1361
        $request = $this->getRequest();
1362
        if($request->isGet()) {
1363
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1364
            $currentUser = $currentUserPlugin->getUser();
1365
 
1366
 
1367
 
1368
            $topic_id = $this->params()->fromRoute('topic_id');
1369
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1370
            $topic = $topicMapper->fetchOneByUuid($topic_id);
1371
 
1372
            if(!$topic) {
1373
                return new JsonModel([
1374
                    'success' => false,
1375
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1376
                ]);
1377
            }
1378
 
1379
            $accessGrantedIds = $this->getAccessGranted();
1380
 
1381
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1382
                return new JsonModel([
1383
                    'success' => false,
1384
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1385
                ]);
1386
            }
1387
 
1388
 
1389
 
1390
            $data = [];
1391
 
1392
 
1393
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1394
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1395
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
1396
 
1397
 
1398
            $capsules = $capsuleMapper->fetchAllActiveByCompanyIdAndTopicId($topic->company_id, $topic->id);
1399
            foreach($capsules as $capsule)
1400
            {
1401
 
1402
                if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1403
                    continue;
1404
                }
1405
 
1406
                $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
1407
                if($userProgress) {
1408
                    $progress = $userProgress->progress;
1409
                    $completed = $userProgress->completed;
1410
                } else {
1411
                    $progress = 0;
1412
                    $completed = 0;
1413
                }
1414
 
1415
                $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
1416
 
1417
 
1418
 
1419
                array_push($data, [
166 efrain 1420
                    'uuid'              => $capsule->uuid,
119 efrain 1421
                    'name'              => $capsule->name ? $capsule->name : '',
1422
                    'description'       => $capsule->description ? $capsule->description : '',
164 efrain 1423
                    'image'             => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
119 efrain 1424
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
1425
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
1426
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
161 efrain 1427
                    'link_get'          => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),
119 efrain 1428
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
1429
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
1430
                    'progress'          => $progress,
1431
                    'completed'         => $completed,
1432
                    'order'             => $capsule->order,
1433
                    'added_on'          => $capsule->added_on,
1434
                    'updated_on'        => $capsule->updated_on,
1435
                ]);
1436
 
1437
 
1438
 
1439
            }
1440
 
1441
            usort($data, function($a, $b) {
1442
 
1443
                $result =  $a['order'] <=> $b['order'];
1444
                if(0 == $result) {
1445
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1446
                    if(0 == $result) {
1447
                        $result = strcasecmp($a['name'], $b['name']);
1448
                    }
1449
                }
1450
 
1451
                if($result < 0) {
1452
                    return 1;
1453
                } else if($result > 0) {
1454
                    return -1;
1455
                } else  {
1456
                    return  0;
1457
                }
1458
            });
1459
 
1460
 
1461
 
1462
                return new JsonModel([
1463
                    'success' => true,
1464
                    'data' => $data
1465
                ]);
1466
 
1467
        } else {
1468
            return new JsonModel([
1469
                'success' => false,
1470
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1471
            ]);
1472
        }
1473
    }
1474
 
235 efrain 1475
    public function takeTestAction()
1476
    {
1477
        $request = $this->getRequest();
1478
        if($request->isPost()) {
1479
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1480
            $currentUser = $currentUserPlugin->getUser();
1481
 
1482
            $slide_id = $this->params()->fromRoute('slide_id');
1483
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1484
            $slide = $slideMapper->fetchOneByUuid($slide_id);
1485
 
1486
            if(!$slide) {
1487
                return new JsonModel([
1488
                    'success' => false,
1489
                    'data' => 'ERROR_SLIDE_NOT_FOUND'
1490
                ]);
1491
            }
1492
 
1493
            if($slide->type != CompanyMicrolearningSlide::TYPE_QUIZ) {
1494
                return new JsonModel([
1495
                    'success' => false,
1496
                    'data' => 'ERROR_SLIDE_IS_NOT_QUIZ'
1497
                ]);
1498
            }
1499
 
1500
 
1501
 
1502
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1503
            $capsule = $capsuleMapper->fetchOne($slide->capsule_id);
1504
 
1505
            if(!$capsule) {
1506
                return new JsonModel([
1507
                    'success' => false,
1508
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1509
                ]);
1510
            }
1511
 
1512
            $accessGrantedIds = $this->getAccessGranted();
1513
 
1514
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1515
                return new JsonModel([
1516
                    'success' => false,
1517
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1518
                ]);
1519
            }
1520
 
1521
            $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
1522
            $userLog = $userLogMapper->fetchOneTakeATestByUserIdAndSlideId($currentUser->id, $slide->id);
1523
 
1524
            if($userLog) {
1525
                $activity = CompanyMicrolearningUserLog::ACTIVITY_RETAKE_A_TEST;
1526
            } else {
1527
                $activity = CompanyMicrolearningUserLog::ACTIVITY_TAKE_A_TEST;
1528
            }
1529
 
1530
            $added_on = $userLogMapper->getDatebaseNow();
1531
 
1532
            $userLog = new CompanyMicrolearningUserLog();
1533
            $userLog->activity      = $activity;
1534
            $userLog->user_id       = $currentUser->id;
1535
            $userLog->company_id    = $slide->company_id;
1536
            $userLog->topic_id      = $slide->topic_id;
1537
            $userLog->capsule_id    = $slide->capsule_id;
1538
            $userLog->slide_id      = $slide->id;
1539
            $userLog->added_on      = $added_on;
1540
 
1541
            if($userLogMapper->insert($userLog)) {
1542
                return new JsonModel([
1543
                    'success' => true,
1544
                ]);
1545
            } else {
1546
                return new JsonModel([
1547
                    'success' => false,
1548
                    'data' => $userLogMapper->getError()
1549
                ]);
1550
            }
1551
 
1552
 
1553
 
1554
 
1555
 
1556
 
1557
 
1558
        } else {
1559
            return new JsonModel([
1560
                'success' => false,
1561
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1562
            ]);
1563
        }
1564
    }
1565
 
161 efrain 1566
    public function getCapsuleAction()
1567
    {
1568
        $request = $this->getRequest();
1569
        if($request->isGet()) {
1570
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1571
            $currentUser = $currentUserPlugin->getUser();
1572
 
1573
 
1574
 
1575
            $capsule_id = $this->params()->fromRoute('id');
1576
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1577
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
1578
 
1579
            if(!$capsule) {
1580
                return new JsonModel([
1581
                    'success' => false,
1582
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1583
                ]);
1584
            }
1585
 
1586
            $accessGrantedIds = $this->getAccessGranted();
1587
 
1588
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1589
                return new JsonModel([
1590
                    'success' => false,
1591
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1592
                ]);
1593
            }
1594
 
1595
 
1596
 
1597
 
1598
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1599
            $topic = $topicMapper->fetchOne($capsule->topic_id);
1600
 
1601
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1602
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
1603
 
1604
 
1605
 
1606
            $userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
1607
            if($userProgress) {
1608
                $progress = $userProgress->progress;
1609
                $completed = $userProgress->completed;
1610
            } else {
1611
                $progress = 0;
1612
                $completed = 0;
1613
            }
1614
 
1615
            $dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
1616
 
244 efrain 1617
 
1618
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1619
            $totalSlides = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
1620
 
1621
 
1622
            $slide = $slideMapper->fetchFirstByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
1623
            if($slide) {
1624
 
1625
                $link_first_slide = $this->url()->fromRoute('microlearning/get-slide', ['id' => $slide->uuid], ['force_canonical' => true]);
1626
                $type_first_slide = $slide->type;
161 efrain 1627
 
1628
 
244 efrain 1629
            } else {
1630
                $link_first_slide = '';
1631
                $type_first_slide = '';
1632
            }
1633
 
1634
 
1635
 
1636
 
161 efrain 1637
            $data = [
164 efrain 1638
                    'uuid'              => $capsule->uuid,
161 efrain 1639
                    'name'              => $capsule->name ? $capsule->name : '',
1640
                    'description'       => $capsule->description ? $capsule->description : '',
164 efrain 1641
                    'image'             => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
161 efrain 1642
                    'link_comments'     => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
1643
                    'link_comment_add'  => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
1644
                    'link_slides'       => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid,  'capsule_id' => $capsule->uuid], ['force_canonical' => true]),
1645
                    'total_comments'    => strval($dataCountAndRatingAverage['total_comments']),
1646
                    'total_rating'      => strval($dataCountAndRatingAverage['total_rating']),
1647
                    'progress'          => $progress,
1648
                    'completed'         => $completed,
245 efrain 1649
                    'total_slides'      => $totalSlides,
244 efrain 1650
                    'link_first_slide'  => $link_first_slide,
1651
                    'type_first_slide'  => $type_first_slide,
161 efrain 1652
                    'order'             => $capsule->order,
1653
                    'added_on'          => $capsule->added_on,
1654
                    'updated_on'        => $capsule->updated_on,
1655
            ];
1656
 
1657
 
1658
 
1659
            return new JsonModel([
1660
                'success' => true,
1661
                'data' => $data
1662
            ]);
1663
 
1664
        } else {
1665
            return new JsonModel([
1666
                'success' => false,
1667
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1668
            ]);
1669
        }
1670
    }
1671
 
119 efrain 1672
    public function slidesAction()
1673
    {
1674
        $request = $this->getRequest();
1675
        if($request->isGet()) {
1676
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1677
            $currentUser = $currentUserPlugin->getUser();
1678
 
1679
 
1680
 
1681
            $topic_id = $this->params()->fromRoute('topic_id');
1682
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1683
            $topic = $topicMapper->fetchOneByUuid($topic_id);
1684
 
1685
            if(!$topic) {
1686
                return new JsonModel([
1687
                    'success' => false,
1688
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
1689
                ]);
1690
            }
1691
 
1692
            $accessGrantedIds = $this->getAccessGranted();
1693
 
1694
            if(!in_array($topic->id, $accessGrantedIds->topics)) {
1695
                return new JsonModel([
1696
                    'success' => false,
1697
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
1698
                ]);
1699
            }
1700
 
1701
            $capsule_id = $this->params()->fromRoute('capsule_id');
1702
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1703
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_id);
1704
 
1705
            if(!$capsule) {
1706
                return new JsonModel([
1707
                    'success' => false,
1708
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
1709
                ]);
1710
            }
1711
 
1712
 
1713
 
1714
            if(!in_array($capsule->id, $accessGrantedIds->capsules)) {
1715
                return new JsonModel([
1716
                    'success' => false,
1717
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1718
                ]);
1719
            }
1720
 
1721
 
1722
 
1723
            $data = [];
1724
 
230 efrain 1725
            $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
119 efrain 1726
 
1727
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1728
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1729
 
1730
 
1731
            $slides = $slideMapper->fetchAllByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
1732
            foreach($slides as $slide)
1733
            {
1734
 
1735
 
1736
                $userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
1737
                if($userProgress) {
224 efrain 1738
                    $completed =  $userProgress->completed ;
119 efrain 1739
                } else {
1740
                    $completed = 0;
1741
                }
1742
 
235 efrain 1743
 
230 efrain 1744
 
235 efrain 1745
                $link_take_a_test = '';
230 efrain 1746
                if($slide->quiz_id) {
235 efrain 1747
 
1748
                    $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
230 efrain 1749
                    $quiz = $quizMapper->fetchOne($slide->quiz_id);
1750
                    if($quiz) {
1751
                        $quiz_uuid = $quiz->uuid;
235 efrain 1752
                        $quiz_data = $this->getQuiz($slide->quiz_id);
1753
                        $link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);
230 efrain 1754
                    }
235 efrain 1755
 
1756
                }
119 efrain 1757
 
1758
 
1759
                array_push($data, [
235 efrain 1760
                    'quiz'                  => $quiz_uuid,
1761
                    'quiz_data'             => $quiz_data,
1762
                    'uuid'                  => $slide->uuid,
1763
                    'name'                  => $slide->name ? $slide->name : '',
1764
                    'description'           => $slide->description ? $slide->description : '',
1765
                    'type'                  => $slide->type,
1766
                    'background'            => $slide->background ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '',
1767
                    'file'                  => $slide->file ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '',
1768
                    'order'                 => $slide->order,
1769
                    'completed'             => $completed,
1770
                    'link_get'              => $this->url()->fromRoute('microlearning/get-slide', ['id' => $slide->uuid], ['force_canonical' => true]),
1771
                    '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 1772
                    'link_take_a_test'      => $link_take_a_test,
235 efrain 1773
                    'added_on'              => $slide->added_on,
1774
                    'updated_on'            => $slide->updated_on,
119 efrain 1775
                ]);
1776
 
1777
 
1778
 
1779
            }
1780
 
1781
            usort($data, function($a, $b) {
1782
 
1783
                $result =  $a['order'] <=> $b['order'];
1784
                if(0 == $result) {
1785
                    $result = strcasecmp($a['added_on'], $b['added_on']);
1786
                    if(0 == $result) {
1787
                        $result = strcasecmp($a['name'], $b['name']);
1788
                    }
1789
                }
1790
 
1791
                if($result < 0) {
1792
                    return 1;
1793
                } else if($result > 0) {
1794
                    return -1;
1795
                } else  {
1796
                    return  0;
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
 
229 efrain 1815
    private function getQuiz($id)
1816
    {
1817
        $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1818
 
1819
        $data = [];
1820
 
1821
        $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
1822
        $quiz = $quizMapper->fetchOne($id);
1823
 
1824
        if(!$quiz) {
1825
            return [];
1826
        }
1827
 
1828
        $companyMapper = CompanyMapper::getInstance($this->adapter);
1829
        $company = $companyMapper->fetchOne($quiz->company_id);
1830
 
1831
        $questionMapper = CompanyMicrolearningQuestionMapper::getInstance($this->adapter);
1832
        $answerMapper = CompanyMicrolearningAnswerMapper::getInstance($this->adapter);
1833
 
1834
        $record_questions = [];
1835
        $questions = $questionMapper->fetchAllByQuizId($quiz->id);
1836
        foreach($questions as $question)
1837
        {
1838
            $record_answers = [];
1839
 
1840
            $answers = $answerMapper->fetchAllByQuizIdAndQuestionId($question->quiz_id, $question->id);
1841
            foreach($answers as $answer)
1842
            {
1843
                $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->added_on);
1844
                $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->updated_on);
1845
 
1846
                array_push($record_answers, [
1847
                    'uuid' => $answer->uuid,
1848
                    'text' => trim($answer->text),
1849
                    'correct' => $answer->correct ? $answer->correct  : 0 ,
1850
                    'points' => strval(intval($answer->points, 10)),
1851
                    'added_on'  => $dtAddedOn->format($serviceDatetimeFormat),
1852
                    'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1853
                ]);
1854
            }
1855
 
1856
            $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->added_on);
1857
            $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->updated_on);
1858
 
1859
            array_push($record_questions, [
1860
                'uuid'          => $question->uuid,
1861
                'text'          => trim($question->text),
1862
                'type'          => $question->type,
1863
                'maxlength'     => strval($question->maxlength),
1864
                'points'        => strval($question->points),
1865
                'answers'       => $record_answers,
1866
                'added_on'      => $dtAddedOn->format($serviceDatetimeFormat),
1867
                'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1868
            ]);
1869
        }
1870
 
1871
        $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->added_on);
1872
        $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->updated_on);
1873
 
1874
        array_push($data, [
1875
            'uuid' => $quiz->uuid,
1876
            'name' => $quiz->name,
1877
            'text' => trim($quiz->text ? $quiz->text : ''),
1878
            'failed' => trim($quiz->failed ? $quiz->failed : ''),
1879
            'points' => strval($quiz->points),
1880
            'minimum_points_required' => strval($quiz->minimum_points_required),
1881
            'max_time' => $quiz->max_time ? $quiz->max_time : 5,
1882
            'company_uuid' => $company->uuid,
1883
            'company_name' => $company->name,
1884
            'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
1885
            'questions'     => $record_questions,
1886
            'added_on'      => $dtAddedOn->format($serviceDatetimeFormat),
1887
            'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1888
        ]);
1889
 
1890
        return $data;
1891
 
1892
    }
161 efrain 1893
 
229 efrain 1894
 
161 efrain 1895
    public function getSlideAction()
1896
    {
1897
        $request = $this->getRequest();
1898
        if($request->isGet()) {
1899
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1900
            $currentUser = $currentUserPlugin->getUser();
1901
 
1902
 
1903
 
1904
            $id = $this->params()->fromRoute('id');
1905
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1906
            $slide = $slideMapper->fetchOneByUuid($id);
1907
 
1908
            if(!$slide) {
1909
                return new JsonModel([
1910
                    'success' => false,
1911
                    'data' => 'ERROR_SLIDE_NOT_FOUND'
1912
                ]);
1913
            }
1914
 
1915
            $accessGrantedIds = $this->getAccessGranted();
1916
 
1917
 
1918
 
1919
            if(!in_array($slide->capsule_id, $accessGrantedIds->capsules)) {
1920
                return new JsonModel([
1921
                    'success' => false,
1922
                    'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
1923
                ]);
1924
            }
1925
 
1926
 
1927
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1928
            $topic = $topicMapper->fetchOne($slide->topic_id);
1929
 
1930
            $capsuleMapper =  CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1931
            $capsule = $capsuleMapper->fetchOne($slide->capsule_id);
1932
 
1933
 
1934
 
1935
 
1936
 
1937
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1938
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1939
 
1940
 
1941
            $userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
1942
            if($userProgress) {
1943
                $completed = $userProgress->completed;
1944
            } else {
1945
                $completed = 0;
1946
            }
235 efrain 1947
 
1948
            $quiz_uuid = '';
1949
            $quiz_data = [];
1950
            $link_take_a_test = '';
1951
            if($slide->quiz_id) {
1952
 
1953
                $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
1954
                $quiz = $quizMapper->fetchOne($slide->quiz_id);
1955
                if($quiz) {
1956
                    $quiz_uuid = $quiz->uuid;
1957
                    $quiz_data = $this->getQuiz($slide->quiz_id);
1958
                    $link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);
1959
                }
161 efrain 1960
 
235 efrain 1961
            }
161 efrain 1962
 
1963
 
1964
            $data =[
235 efrain 1965
                'quiz'              => $quiz_uuid,
1966
                'quiz_data'         => $quiz_data,
1967
                'uuid'              => $slide->uuid,
1968
                'name'              => $slide->name ? $slide->name : '',
1969
                'description'       => $slide->description ? $slide->description : '',
1970
                'type'              => $slide->type,
1971
                'background'        => $slide->background ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '',
1972
                'file'              => $slide->file ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '',
1973
                'order'             => $slide->order,
1974
                'completed'         => $completed,
1975
                '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]),
1976
                'link_take_a_test'  => $link_take_a_test,
1977
                'added_on'          => $slide->added_on,
1978
                'updated_on'        => $slide->updated_on,
161 efrain 1979
            ];
1980
 
1981
 
1982
 
1983
 
1984
            return new JsonModel([
1985
                'success' => true,
1986
                'data' => $data
1987
            ]);
1988
 
1989
        } else {
1990
            return new JsonModel([
1991
                'success' => false,
1992
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1993
            ]);
1994
        }
1995
    }
1996
 
119 efrain 1997
    public function profileAction()
1998
    {
1999
        $request = $this->getRequest();
2000
        if($request->isGet()) {
2001
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2002
            $currentUser = $currentUserPlugin->getUser();
2003
 
2004
 
2005
            $accessGrantedIds = $this->getAccessGranted();
2006
 
2007
            $companyMapper = CompanyMapper::getInstance($this->adapter);
2008
            $companyExtendUserMapper = CompanyMicrolearningExtendUserMapper::getInstance($this->adapter);
2009
            $companyExtendUserCompanyMapper = CompanyMicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
2010
            $companyExtendUserFunctionMapper = CompanyMicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
2011
            $companyExtendUserGroupMapper = CompanyMicrolearningExtendUserGroupMapper::getInstance($this->adapter);
2012
            $companyExtendUserInstitutionMapper = CompanyMicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
2013
            $companyExtendUserPartnerMapper = CompanyMicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
2014
            $companyExtendUserProgramMapper = CompanyMicrolearningExtendUserProgramMapper::getInstance($this->adapter);
2015
            $companyExtendUserStudentTypeMapper = CompanyMicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
2016
            $companyExtendUserSectorMapper = CompanyMicrolearningExtendUserSectorMapper::getInstance($this->adapter);
2017
 
2018
 
2019
            $data = [];
2020
            foreach($accessGrantedIds->companies as $company_id)
2021
            {
2022
                $company = $companyMapper->fetchOne($company_id);
2023
                if(!$company) {
2024
                    continue;
2025
                }
2026
 
2027
                $record = [
2028
                    'name' => $company->name,
164 efrain 2029
                    'image' => $this->url()->fromRoute('storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
119 efrain 2030
                    'details' => [],
2031
                ];
2032
 
2033
                $companyExtendUser = $companyExtendUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
2034
                if(!$companyExtendUser) {
2035
                    continue;
2036
                }
2037
 
2038
                if($companyExtendUser->extend_company_id) {
2039
 
2040
                    $extendedCompany = $companyExtendUserCompanyMapper->fetchOne($companyExtendUser->company_id);
2041
                    if($extendedCompany) {
2042
                        array_push($record['details'],[
2043
                            'uuid' => $extendedCompany->uuid,
2044
                            'label' => 'LABEL_COMPANY',
2045
                            'value' => $extendedCompany->name
2046
                        ]);
2047
                    }
2048
                }
2049
 
2050
                if($companyExtendUser->extend_function_id) {
2051
                    $extendedFunction = $companyExtendUserFunctionMapper->fetchOne($companyExtendUser->extend_function_id);
2052
                    if($extendedFunction) {
2053
                        array_push($record['details'],[
2054
                            'uuid' => $extendedFunction->uuid,
2055
                            'label' => 'LABEL_FUNCTION',
2056
                            'value' => $extendedFunction->name
2057
                        ]);
2058
                    }
2059
                }
2060
 
2061
                if($companyExtendUser->extend_group_id) {
2062
                    $extendedGroup = $companyExtendUserGroupMapper->fetchOne($companyExtendUser->extend_group_id);
2063
                    if($extendedGroup) {
2064
                        array_push($record['details'],[
2065
                            'uuid' => $extendedGroup->uuid,
2066
                            'label' => 'LABEL_GROUP',
2067
                            'value' => $extendedGroup->name
2068
                        ]);
2069
                    }
2070
                }
2071
 
2072
                if($companyExtendUser->extend_institution_id) {
2073
                    $extendedInstitution= $companyExtendUserInstitutionMapper->fetchOne($companyExtendUser->extend_institution_id);
2074
                    if($extendedInstitution) {
2075
                        array_push($record['details'],[
2076
                            'uuid' => $extendedInstitution->uuid,
2077
                            'label' => 'LABEL_INSTITUTION',
2078
                            'value' => $extendedInstitution->name
2079
                        ]);
2080
                    }
2081
                }
2082
 
2083
                if($companyExtendUser->extend_program_id) {
2084
                    $extendedProgram = $companyExtendUserProgramMapper->fetchOne($companyExtendUser->extend_program_id);
2085
                    if($extendedProgram) {
2086
                        array_push($record['details'],[
2087
                            'uuid' => $extendedProgram->uuid,
2088
                            'label' => 'LABEL_PROGRAM',
2089
                            'value' => $extendedProgram->name
2090
                        ]);
2091
 
2092
                    }
2093
                }
2094
 
2095
                if($companyExtendUser->extend_sector_id) {
2096
                    $extendedSector = $companyExtendUserSectorMapper->fetchOne($companyExtendUser->extend_sector_id);
2097
                    if($extendedSector) {
2098
                        array_push($record['details'],[
2099
                            'uuid' => $extendedSector->uuid,
2100
                            'label' => 'LABEL_SECTOR',
2101
                            'value' => $extendedSector->name
2102
                        ]);
2103
                    }
2104
                }
2105
 
2106
                if($companyExtendUser->extend_partner_id) {
2107
                    $extendedPartner = $companyExtendUserPartnerMapper->fetchOne($companyExtendUser->extend_partner_id);
2108
                    if($extendedPartner) {
2109
                        array_push($record['details'],[
2110
                            'uuid' => $extendedPartner->uuid,
2111
                            'label' => 'LABEL_PARTNER',
2112
                            'value' => $extendedPartner->name
2113
                        ]);
2114
                    }
2115
                }
2116
 
2117
                if($companyExtendUser->extend_student_type_id) {
2118
                    $extendedStudentType = $companyExtendUserStudentTypeMapper->fetchOne($companyExtendUser->extend_student_type_id);
2119
                    if($extendedStudentType) {
2120
                        array_push($record['details'],[
2121
                            'uuid' => $extendedStudentType->uuid,
2122
                            'label' => 'LABEL_TYPE',
2123
                            'value' => $extendedStudentType->name
2124
                        ]);
2125
                    }
2126
                }
2127
 
2128
                array_push($data, $record);
2129
            }
2130
 
2131
            return new JsonModel([
2132
                'success' => true,
2133
                'data' => $data
2134
            ]);
2135
 
2136
        } else {
2137
            return new JsonModel([
2138
                'success' => false,
2139
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2140
            ]);
2141
        }
2142
    }
2143
 
167 efrain 2144
    public function syncAction()
2145
    {
2146
        $request = $this->getRequest();
168 efrain 2147
        if($request->isPost()) {
167 efrain 2148
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2149
            $currentUser = $currentUserPlugin->getUser();
2150
 
2151
 
2152
            $operation = $this->params()->fromRoute('operation');
2153
            if($operation == 'slide-view' || $operation == 'capsule-close' || $operation == 'topic-close') {
2154
                $accessGrantedIds = $this->getAccessGranted();
2155
 
2156
                $topic_uuid     = $this->params()->fromRoute('topic_uuid');
2157
                $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
2158
                $slide_uuid     = $this->params()->fromRoute('slide_uuid');
2159
 
2160
                $accessGrantedIds = $this->getAccessGranted();
2161
                if($operation == 'slide-view') {
2162
 
2163
                    if(empty($slide_uuid) || empty($capsule_uuid ) || empty($topic_uuid)) {
2164
                        return new JsonModel([
2165
                            'success' => false,
2166
                            'data' => 'ERROR_INVALID_PARAMETERS'
2167
                        ]);
2168
                    }
2169
 
2170
 
2171
                    $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
2172
                    $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2173
 
2174
                    if(!$topic) {
2175
                        return new JsonModel([
2176
                            'success' => false,
2177
                            'data' => 'ERROR_TOPIC_NOT_FOUND'
2178
                        ]);
2179
                    }
2180
 
2181
 
2182
 
2183
                    if(!in_array($topic->id, $accessGrantedIds->topics)) {
2184
                        return new JsonModel([
2185
                            'success' => false,
2186
                            'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
2187
                        ]);
2188
                    }
2189
 
2190
                    $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
2191
                    $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
2192
 
2193
                    if(!$capsule) {
2194
                        return new JsonModel([
2195
                            'success' => false,
2196
                            'data' => 'ERROR_CAPSULE_NOT_FOUND'
2197
                        ]);
2198
                    }
119 efrain 2199
 
167 efrain 2200
                    if(!in_array($capsule->id, $accessGrantedIds->capsules) || $capsule->topic_id != $topic->id) {
2201
                        return new JsonModel([
2202
                            'success' => false,
2203
                            'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
2204
                        ]);
2205
                    }
2206
 
2207
                    $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
2208
                    $slide = $slideMapper->fetchOneByUuid($slide_uuid);
2209
                    if(!$slide) {
2210
                        return new JsonModel([
2211
                            'success' => false,
2212
                            'data' => 'ERROR_SLIDE_NOT_FOUND'
2213
                        ]);
2214
                    }
2215
 
2216
                    if($slide->capsule_id != $capsule->id && $slide->topic_id != $topic->id) {
2217
                        return new JsonModel([
2218
                            'success' => false,
2219
                            'data' => 'ERROR_SLIDE_NOT_FOUND'
2220
                        ]);
2221
 
2222
                    }
2223
 
2224
 
2225
                    $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2226
 
2227
                    $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
2228
                    $added_on = $userProgressMapper->getDatebaseNow();
2229
 
2230
 
2231
                    $userProgressTopic = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);
2232
                    if(!$userProgressTopic) {
2233
 
2234
                        $userProgressTopic = new CompanyMicrolearningUserProgress();
2235
                        $userProgressTopic->company_id                  = $slide->company_id;
2236
                        $userProgressTopic->topic_id                    = $slide->topic_id;
176 efrain 2237
                        $userProgressTopic->user_id                     = $currentUser->id;
167 efrain 2238
                        $userProgressTopic->progress                    = 0;
2239
                        $userProgressTopic->returning                   = 0;
2240
                        $userProgressTopic->returning_after_completed   = 0;
2241
                        $userProgressTopic->completed                   = 0;
2242
                        $userProgressTopic->total_slides                = $slideMapper->fetchTotalCountByCompanyIdAndTopicId($slide->company_id, $slide->topic_id);
2243
                        $userProgressTopic->view_slides                 = 0;
2244
                        $userProgressTopic->type                        = CompanyMicrolearningUserProgress::TYPE_TOPIC;
2245
                        $userProgressTopic->added_on                    = $added_on;
2246
                        $userProgressTopic->updated_on                  = $added_on;
2247
 
2248
                        if($userProgressMapper->insert($userProgressTopic)) {
2249
 
2250
                            $userLog = new CompanyMicrolearningUserLog();
2251
                            $userLog->activity      = CompanyMicrolearningUserLog::ACTIVITY_START_TOPIC;
2252
                            $userLog->user_id       = $currentUser->id;
2253
                            $userLog->company_id    = $slide->company_id;
2254
                            $userLog->topic_id      = $slide->topic_id;
2255
                            $userLog->added_on      = $added_on;
2256
 
2257
                            if(!$userLogMapper->insert($userLog)) {
2258
                                return new JsonModel([
2259
                                    'success' => false,
2260
                                    'data' => $userProgressMapper->getError()
2261
                                ]);
2262
                            }
2263
                        } else {
2264
                            return new JsonModel([
2265
                                'success' => false,
2266
                                'data' => $userProgressMapper->getError()
2267
                            ]);
2268
                        }
2269
                    }
2270
 
2271
 
2272
                    $userProgressCapsule = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
2273
                    if(!$userProgressCapsule) {
2274
 
2275
                        $userProgressCapsule = new CompanyMicrolearningUserProgress();
2276
                        $userProgressCapsule->company_id                  = $slide->company_id;
2277
                        $userProgressCapsule->topic_id                    = $slide->topic_id;
2278
                        $userProgressCapsule->capsule_id                  = $slide->capsule_id;
176 efrain 2279
                        $userProgressCapsule->user_id                     = $currentUser->id;
167 efrain 2280
                        $userProgressCapsule->progress                    = 0;
2281
                        $userProgressCapsule->returning                   = 0;
2282
                        $userProgressCapsule->returning_after_completed   = 0;
2283
                        $userProgressCapsule->completed                   = 0;
2284
                        $userProgressCapsule->total_slides                = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($slide->company_id, $slide->topic_id, $slide->capsule_id);
2285
                        $userProgressCapsule->view_slides                 = 0;
2286
                        $userProgressCapsule->type                        = CompanyMicrolearningUserProgress::TYPE_CAPSULE;
2287
                        $userProgressCapsule->added_on                    = $added_on;
2288
                        $userProgressTopic->updated_on                    = $added_on;
2289
 
2290
                        if($userProgressMapper->insert($userProgressCapsule)) {
2291
 
2292
                            $userLog = new CompanyMicrolearningUserLog();
2293
                            $userLog->activity      = CompanyMicrolearningUserLog::ACTIVITY_START_CAPSULE;
2294
                            $userLog->user_id       = $currentUser->id;
2295
                            $userLog->company_id    = $slide->company_id;
2296
                            $userLog->topic_id      = $slide->topic_id;
2297
                            $userLog->capsule_id    = $slide->capsule_id;
2298
                            $userLog->added_on      = $added_on;
2299
 
2300
                            if(!$userLogMapper->insert($userLog)) {
2301
                                return new JsonModel([
2302
                                    'success' => false,
2303
                                    'data' => $userLogMapper->getError()
2304
                                ]);
2305
                            }
2306
                        } else {
2307
                            return new JsonModel([
2308
                                'success' => false,
2309
                                'data' => $userProgressMapper->getError()
2310
                            ]);
2311
                        }
2312
                    }
2313
 
2314
 
2315
                    $userProgressSlide = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
2316
                    if(!$userProgressSlide) {
2317
                        $userProgressSlide = new CompanyMicrolearningUserProgress();
2318
                        $userProgressSlide->company_id                  = $slide->company_id;
2319
                        $userProgressSlide->topic_id                    = $slide->topic_id;
2320
                        $userProgressSlide->capsule_id                  = $slide->capsule_id;
2321
                        $userProgressSlide->slide_id                    = $slide->id;
176 efrain 2322
                        $userProgressSlide->user_id                     = $currentUser->id;
167 efrain 2323
                        $userProgressSlide->progress                    = 0;
2324
                        $userProgressSlide->returning                   = 0;
2325
                        $userProgressSlide->returning_after_completed   = 0;
2326
                        $userProgressSlide->completed                   = 1;
2327
                        $userProgressSlide->total_slides                = 0;
2328
                        $userProgressSlide->view_slides                 = 0;
2329
                        $userProgressSlide->type                        = CompanyMicrolearningUserProgress::TYPE_SLIDE;
2330
                        $userProgressSlide->added_on                    = $added_on;
2331
                        $userProgressSlide->updated_on                  = $added_on;
2332
 
2333
                        if(!$userProgressMapper->insert($userProgressSlide)) {
2334
                            return new JsonModel([
2335
                                'success' => false,
2336
                                'data' => $userProgressMapper->getError()
2337
                            ]);
2338
                        }
2339
                    }
2340
 
2341
                    $userLog = new CompanyMicrolearningUserLog();
2342
                    $userLog->activity      = CompanyMicrolearningUserLog::ACTIVITY_VIEW_SLIDE;
2343
                    $userLog->user_id       = $currentUser->id;
2344
                    $userLog->company_id    = $slide->company_id;
2345
                    $userLog->topic_id      = $slide->topic_id;
2346
                    $userLog->capsule_id    = $slide->capsule_id;
2347
                    $userLog->slide_id      = $slide->id;
2348
                    $userLog->added_on      = $added_on;
2349
 
2350
                    if(!$userLogMapper->insert($userLog)) {
2351
                        return new JsonModel([
2352
                            'success' => false,
2353
                            'data' => $userLogMapper->getError()
2354
                        ]);
2355
                    }
2356
 
2357
                    $closeCapsule = false;
2358
 
2359
                    if($userProgressCapsule->completed) {
2360
 
2361
                        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $added_on);
2362
                        $returning_on = $dt->format('Y-m-d');
2363
 
2364
                        if(!$userProgressCapsule->returning_on || $userProgressCapsule->returning_on != $returning_on) {
2365
 
2366
                            $userProgressCapsule->returning_on = $returning_on;
2367
                            $userProgressCapsule->returning_after_completed = $userProgressCapsule->returning_after_completed + 1;
2368
 
2369
                            if(!$userProgressMapper->update($userProgressCapsule)) {
2370
                                return new JsonModel([
2371
                                    'success' => false,
2372
                                    'data' => $userProgressMapper->getError()
2373
                                ]);
2374
                            }
2375
                        }
2376
 
2377
                    }  else {
2378
 
2379
                        $userProgressCapsule->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($slide->company_id, $slide->topic_id, $slide->capsule_id);
2380
                        $userProgressCapsule->view_slides = $userProgressMapper->fetchCountAllSlideCompletedByUserIdAndCapsuleId($currentUser->id, $slide->capsule_id);
2381
 
2382
                        if($userProgressCapsule->total_slides) {
2383
 
2384
                            $userProgressCapsule->progress = ($userProgressCapsule->view_slides * 100) / $userProgressCapsule->total_slides;
2385
                            $userProgressCapsule->progress = $userProgressCapsule->progress > 100 ? 100 : $userProgressCapsule->progress;
2386
                        }
2387
 
2388
                        if(!$userProgressMapper->update($userProgressCapsule)) {
2389
                            return new JsonModel([
2390
                                'success' => false,
2391
                                'data' => $userProgressMapper->getError()
2392
                            ]);
2393
                        }
2394
 
2395
                        if($userProgressCapsule->progress >= 100) {
2396
                            $closeCapsule = true;
2397
                        }
171 efrain 2398
 
172 efrain 2399
                       // print_r($userProgressCapsule);
167 efrain 2400
                    }
2401
 
2402
                    $closeTopic = false;
2403
                    if(!$userProgressTopic->completed) {
2404
 
2405
 
2406
                        $userProgressTopic->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndTopicId($slide->company_id, $slide->topic_id);
2407
                        $userProgressTopic->view_slides = $userProgressMapper->fetchCountAllSlideCompletedByUserIdAndTopicId($currentUser->id, $slide->topic_id);
2408
 
2409
                        if($userProgressTopic->total_slides) {
2410
 
2411
                            $userProgressTopic->progress = ($userProgressTopic->view_slides * 100) / $userProgressTopic->total_slides;
2412
                            $userProgressTopic->progress = $userProgressTopic->progress > 100 ? 100 : $userProgressTopic->progress;
2413
                        }
2414
                        if(!$userProgressMapper->update($userProgressTopic)) {
2415
                            return new JsonModel([
2416
                                'success' => false,
2417
                                'data' => $userProgressMapper->getError()
2418
                            ]);
2419
                        }
2420
 
2421
                        if($userProgressTopic->progress >= 100) {
2422
                            $closeTopic = true;
2423
                        }
2424
 
172 efrain 2425
                        //print_r($userProgressTopic);
167 efrain 2426
 
171 efrain 2427
 
167 efrain 2428
                    }
2429
 
2430
 
2431
                    $data = [
2432
                        'message' => 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED',
2433
 
2434
                    ];
2435
 
2436
                    if($closeCapsule) {
173 efrain 2437
                        $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 2438
                    }
2439
 
2440
 
2441
                    if($closeTopic) {
173 efrain 2442
                        $data['link_close_topic'] = $this->url()->fromRoute('microlearning/sync', ['operation' => 'topic-close', 'topic_uuid' => $topic->uuid], ['force_canonical' => true]);
167 efrain 2443
                    }
2444
 
2445
 
2446
                    return new JsonModel([
2447
                        'success' => true,
2448
                        'data' => $data
2449
                    ]);
2450
 
2451
 
2452
 
2453
 
2454
                } else if($operation == 'capsule-close') {
2455
 
2456
                    if(empty($capsule_uuid ) || empty($topic_uuid)) {
2457
                        return new JsonModel([
2458
                            'success' => false,
2459
                            'data' => 'ERROR_INVALID_PARAMETERS'
2460
                        ]);
2461
                    }
2462
 
2463
 
2464
                    $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
2465
                    $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2466
 
2467
                    if(!$topic) {
2468
                        return new JsonModel([
2469
                            'success' => false,
2470
                            'data' => 'ERROR_TOPIC_NOT_FOUND'
2471
                        ]);
2472
                    }
2473
 
2474
 
2475
 
2476
                    if(!in_array($topic->id, $accessGrantedIds->topics)) {
2477
                        return new JsonModel([
2478
                            'success' => false,
2479
                            'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
2480
                        ]);
2481
                    }
2482
 
2483
                    $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
2484
                    $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
2485
 
2486
                    if(!$capsule) {
2487
                        return new JsonModel([
2488
                            'success' => false,
2489
                            'data' => 'ERROR_CAPSULE_NOT_FOUND'
2490
                        ]);
2491
                    }
2492
 
2493
                    if(!in_array($capsule->id, $accessGrantedIds->capsules) || $capsule->topic_id != $topic->id) {
2494
                        return new JsonModel([
2495
                            'success' => false,
2496
                            'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE'
2497
                        ]);
2498
                    }
2499
 
2500
 
2501
                    $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2502
 
2503
                    $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
2504
                    $updated_on = $userProgressMapper->getDatebaseNow();
2505
 
2506
                    $userProgressCapsule = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);
2507
                    if(!$userProgressCapsule) {
2508
                        return new JsonModel([
2509
                            'success' => false,
2510
                            'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_CAPSULE_NOT_FOUND'
2511
                        ]);
2512
                    }
2513
 
2514
                    if($userProgressCapsule->completed) {
2515
                        return new JsonModel([
2516
                            'success' => false,
2517
                            'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_CAPSULE_ALREADY_CLOSED'
2518
                        ]);
2519
                    }
2520
 
2521
 
2522
                    $userProgressCapsule->completed = 1;
2523
                    $userProgressCapsule->updated_on = $updated_on;
2524
 
2525
                    if($userProgressMapper->update($userProgressCapsule)) {
225 efrain 2526
 
2527
 
2528
                        $userLog = new CompanyMicrolearningUserLog();
2529
                        $userLog->activity      = CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_CAPSULE;
227 efrain 2530
                        $userLog->user_id       = $currentUser->id;
2531
                        $userLog->company_id    = $capsule->company_id;
2532
                        $userLog->topic_id      = $capsule->topic_id;
2533
                        $userLog->capsule_id    = $capsule->id;
2534
                        $userLog->added_on      = $updated_on;
225 efrain 2535
 
2536
                        if(!$userLogMapper->insert($userLog)) {
2537
                            return new JsonModel([
2538
                                'success' => false,
2539
                                'data' => $userProgressMapper->getError()
2540
                            ]);
2541
                        }
2542
 
2543
 
167 efrain 2544
                        return new JsonModel([
2545
                            'success' => true,
2546
                            'data' => 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED'
2547
                        ]);
2548
                    } else {
2549
                        return new JsonModel([
2550
                            'success' => false,
2551
                            'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_CAPSULE_COULD_NOT_BE_COMPLETED'
2552
                        ]);
2553
                    }
2554
 
2555
 
2556
 
2557
 
2558
 
2559
 
2560
 
2561
                } else if($operation == 'topic-close') {
174 efrain 2562
                    if(empty($topic_uuid)) {
167 efrain 2563
                        return new JsonModel([
2564
                            'success' => false,
2565
                            'data' => 'ERROR_INVALID_PARAMETERS'
2566
                        ]);
2567
                    }
2568
 
2569
 
2570
                    $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
2571
                    $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2572
 
2573
                    if(!$topic) {
2574
                        return new JsonModel([
2575
                            'success' => false,
2576
                            'data' => 'ERROR_TOPIC_NOT_FOUND'
2577
                        ]);
2578
                    }
2579
 
2580
 
2581
 
2582
                    if(!in_array($topic->id, $accessGrantedIds->topics)) {
2583
                        return new JsonModel([
2584
                            'success' => false,
2585
                            'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC'
2586
                        ]);
2587
                    }
2588
 
2589
 
2590
 
2591
 
2592
                    $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2593
 
2594
                    $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
2595
                    $updated_on = $userProgressMapper->getDatebaseNow();
2596
 
2597
                    $userProgressTopic = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);
2598
                    if(!$userProgressTopic) {
2599
                        return new JsonModel([
2600
                            'success' => false,
2601
                            'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_TOPIC_NOT_FOUND'
2602
                        ]);
2603
                    }
2604
 
2605
                    if($userProgressTopic->completed) {
2606
                        return new JsonModel([
2607
                            'success' => false,
2608
                            'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_TOPIC_ALREADY_CLOSED'
2609
                        ]);
2610
                    }
2611
 
2612
 
2613
                    $userProgressTopic->completed = 1;
2614
                    $userProgressTopic->updated_on = $updated_on;
2615
 
2616
                    if($userProgressMapper->update($userProgressTopic)) {
226 efrain 2617
 
2618
                        $userLog = new CompanyMicrolearningUserLog();
2619
                        $userLog->activity      = CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_TOPIC;
227 efrain 2620
                        $userLog->user_id       = $currentUser->id;
2621
                        $userLog->company_id    = $topic->company_id;
2622
                        $userLog->topic_id      = $topic->id;
2623
                        $userLog->added_on      = $updated_on;
226 efrain 2624
 
2625
                        if(!$userLogMapper->insert($userLog)) {
2626
                            return new JsonModel([
2627
                                'success' => false,
2628
                                'data' => $userProgressMapper->getError()
2629
                            ]);
2630
                        }
2631
 
167 efrain 2632
                        return new JsonModel([
2633
                            'success' => true,
2634
                            'data' => 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED'
2635
                        ]);
2636
                    } else {
2637
                        return new JsonModel([
2638
                            'success' => false,
2639
                            'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_TOPIC_COULD_NOT_BE_COMPLETED'
2640
                        ]);
2641
                    }
2642
                }
2643
 
2644
 
2645
 
2646
 
2647
            } else {
2648
 
2649
                return new JsonModel([
2650
                    'success' => false,
2651
                    'data' => 'ERROR_OPERATION_UNKNOWN'
2652
                ]);
2653
 
2654
 
2655
            }
2656
 
2657
        } else {
2658
            return new JsonModel([
2659
                'success' => false,
2660
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2661
            ]);
2662
        }
2663
    }
2664
 
2665
 
119 efrain 2666
    /**
2667
     *
2668
     * @return \LeadersLinked\Controller\MicrolearningUserAccessGrantedIds
2669
     */
2670
    private function getAccessGranted()
2671
    {
2672
        $currentUserPlugin = $this->plugin('currentUserPlugin');
2673
        $currentUser = $currentUserPlugin->getUser();
2674
 
2675
        $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
2676
        $now = $capsuleUserMapper->getDatebaseNow();
2677
 
2678
        $records = $capsuleUserMapper->fetchAllActiveByUserId($currentUser->id);
2679
 
2680
        $accessGrantedIds = new MicrolearningUserAccessGrantedIds();
2681
 
2682
 
2683
        foreach($records as $record)
2684
        {
2685
            if($record->access != CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED && $record->access != CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
2686
                continue;
2687
            }
2688
            if($record->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
2689
                if($now < $record->paid_from || $now > $record->paid_to) {
2690
                    continue;
2691
                }
2692
            }
2693
 
2694
 
2695
            if(!in_array($record->company_id, $accessGrantedIds->companies )) {
2696
                array_push($accessGrantedIds->companies, $record->company_id);
2697
            }
2698
 
2699
            if(!in_array($record->topic_id, $accessGrantedIds->topics )) {
2700
                array_push( $accessGrantedIds->topics, $record->topic_id);
2701
            }
2702
 
2703
            if(!in_array($record->capsule_id, $accessGrantedIds->capsules)) {
2704
                array_push( $accessGrantedIds->capsules, $record->capsule_id);
2705
            }
2706
        }
2707
 
2708
        return $accessGrantedIds;
2709
    }
2710
 
2711
 
2712
}