Proyectos de Subversion LeadersLinked - Services

Rev

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