Proyectos de Subversion LeadersLinked - Services

Rev

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