Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 52 | Rev 112 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
 
7
use Laminas\Authentication\AuthenticationService;
8
use Laminas\Authentication\Result as AuthResult;
9
use Laminas\Db\Adapter\AdapterInterface;
10
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
11
use Laminas\Mvc\Controller\AbstractActionController;
12
use Laminas\Log\LoggerInterface;
13
use Laminas\View\Model\JsonModel;
14
 
15
use LeadersLinked\Authentication\AuthAdapter;
16
use LeadersLinked\Mapper\UserMapper;
17
use LeadersLinked\Mapper\EmailTemplateMapper;
18
use LeadersLinked\Model\User;
19
use LeadersLinked\Model\UserType;
20
 
21
use LeadersLinked\Library\QueueEmail;
22
use LeadersLinked\Library\Functions;
23
use LeadersLinked\Model\EmailTemplate;
24
use LeadersLinked\Mapper\UserPasswordMapper;
25
use LeadersLinked\Mapper\DeviceMapper;
26
use LeadersLinked\Model\Device;
27
use LeadersLinked\Mapper\ApplicationMapper;
28
use LeadersLinked\Model\Application;
29
use LeadersLinked\Validator\PasswordStrengthCheck;
30
 
31
use LeadersLinked\Mapper\CompanyMapper;
32
use LeadersLinked\Model\Company;
33
use LeadersLinked\Mapper\CompanyMicrolearningTopicMapper;
34
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleMapper;
35
use LeadersLinked\Mapper\CompanyMicrolearningSlideMapper;
36
use LeadersLinked\Model\CompanyMicrolearningSlide;
37
use LeadersLinked\Mapper\CompanyMicrolearningUserLogMapper;
38
use LeadersLinked\Mapper\CompanyMicrolearningUserProgressMapper;
39
use LeadersLinked\Mapper\CompanyMicrolearningQuizMapper;
40
use LeadersLinked\Mapper\CompanyMicrolearningQuestionMapper;
41
use LeadersLinked\Mapper\CompanyMicrolearningAnswerMapper;
42
use LeadersLinked\Model\CompanyMicrolearningUserProgress;
43
use LeadersLinked\Model\CompanyMicrolearningUserLog;
44
use LeadersLinked\Mapper\DeviceHistoryMapper;
45
use LeadersLinked\Model\DeviceHistory;
46
use LeadersLinked\Mapper\PushMapper;
47
use LeadersLinked\Model\Push;
48
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleUserMapper;
49
use LeadersLinked\Mapper\CompanyServiceMapper;
50
use LeadersLinked\Model\Service;
51
use LeadersLinked\Model\CompanyService;
52
use LeadersLinked\Model\CompanyMicrolearningCapsuleUser;
53
use LeadersLinked\Model\CompanyMicrolearningUserQuiz;
54
use LeadersLinked\Mapper\CompanyMicrolearningUserQuizMapper;
55
use LeadersLinked\Mapper\CompanyMicrolearningUserMapper;
56
use LeadersLinked\Model\CompanyMicrolearningUser;
57
use LeadersLinked\Mapper\PushTemplateMapper;
58
use LeadersLinked\Model\PushTemplate;
41 efrain 59
use LeadersLinked\Mapper\SyncLogMapper;
60
use LeadersLinked\Model\SyncLog;
47 efrain 61
use LeadersLinked\Model\CompanyMicrolearningExtendUser;
62
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserMapper;
63
use LeadersLinked\Model\CompanyMicrolearningExtendUserCompany;
64
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserCompanyMapper;
65
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserFunctionMapper;
66
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserGroupMapper;
67
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserInstitutionMapper;
68
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserPartnerMapper;
69
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserProgramMapper;
70
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserStudentTypeMapper;
71
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserSectorMapper;
1 www 72
 
73
 
74
class ServiceController extends AbstractActionController
75
{
76
 
77
 
78
    /**
79
     *
80
     * @var AdapterInterface
81
     */
82
    private $adapter;
83
 
84
 
85
    /**
86
     *
87
     * @var AbstractAdapter
88
     */
89
    private $cache;
90
 
91
    /**
92
     *
93
     * @var  LoggerInterface
94
     */
95
    private $logger;
96
 
97
    /**
98
     *
99
     * @var array
100
     */
101
    private $config;
102
 
103
    /**
104
     *
105
     * @param AdapterInterface $adapter
106
     * @param AbstractAdapter $cache
107
     * @param LoggerInterface $logger
108
     * @param array $config
109
     */
110
    public function __construct($adapter, $cache , $logger, $config)
111
    {
112
        $this->adapter      = $adapter;
113
        $this->cache        = $cache;
114
        $this->logger       = $logger;
115
        $this->config       = $config;
116
    }
117
 
118
    public function signoutAction()
119
    {
120
        $currentUser = $this->plugin('currentUserPlugin');
121
        if($currentUser->hasIdentity()) {
122
            $device_uuid = $currentUser->getDeviceId();
123
            if($device_uuid) {
124
                $deviceMapper = DeviceMapper::getInstance($this->adapter);
125
                $device = $deviceMapper->fetchOne($device_uuid);
126
                if($device) {
127
                    $deviceMapper->signout($device);
128
                }
129
            }
130
 
131
 
132
            $this->logger->info('Desconexión del mobile', ['user_id' => $currentUser->getUserId(), 'ip' => Functions::getUserIP()]);
133
        }
134
        $authService = new \Laminas\Authentication\AuthenticationService();
135
        $authService->clearIdentity();
136
 
137
        return new JsonModel([
138
            'success' => true,
139
            'data' => 'LABEL_SIGNOUT_SUCCESSFULL'
140
        ]);
141
    }
142
 
143
    public function fcmAction()
144
    {
145
        $request = $this->getRequest();
146
 
147
        if($request->isPost()) {
148
 
43 efrain 149
            //$rawdata = file_get_contents("php://input");
150
            //error_log('$rawdata = ' . $rawdata );
1 www 151
 
152
            $device_uuid      = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
153
            $token          = filter_var($this->params()->fromPost('token', ''), FILTER_SANITIZE_STRING);
154
            $sync_id        = filter_var($this->params()->fromPost('sync_id', ''), FILTER_SANITIZE_NUMBER_INT);
155
 
156
            /*
157
            echo '$device_uuid = ' . $device_uuid .PHP_EOL;
158
            echo '$token = ' . $token .PHP_EOL;
159
            echo '$sync_id  = ' . $sync_id  .PHP_EOL;
160
            */
161
            $ok = $device_uuid && strlen($device_uuid) == 36 && $sync_id;
162
            $ok = $ok && strlen($token) <= 512;
163
 
164
 
165
            if(!$ok) {
166
                return new JsonModel([
167
                    'success' => false,
168
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
169
                ]);
170
            }
171
 
172
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
173
            $device = $deviceMapper->fetchOne($device_uuid);
174
            if(!$device) {
175
                return new JsonModel([
176
                    'success' => false,
177
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
178
                ]);
179
            }
180
 
181
 
182
            $applicationMapper = ApplicationMapper::getInstance($this->adapter);
183
            $application = $applicationMapper->fetchOne($device->application_id);
184
            if(!$application) {
185
                return new JsonModel([
186
                    'success' => false,
187
                    'data' => 'ERROR_APPLICATION_NOT_FOUND',
188
                ]);
189
            }
190
 
191
            if($application->status == Application::STATUS_INACTIVE) {
192
                return new JsonModel([
193
                    'success' => false,
194
                    'data' => 'ERROR_APPLICATION_IS_INACTIVE',
195
                ]);
196
            }
197
 
41 efrain 198
 
199
            $syncLog = new SyncLog();
46 efrain 200
            $syncLog->data = json_encode(['token' => $token]);
41 efrain 201
            $syncLog->type = 'token';
202
            $syncLog->device_uuid = $device->id;
203
            $syncLog->ip = Functions::getUserIP();
204
 
205
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
206
            $syncLogMapper->insert($syncLog);
207
 
1 www 208
            $device->token = $token;
209
            $device->ip = Functions::getUserIP();
210
            $result = $deviceMapper->update($device);
211
 
212
 
213
            if($result) {
214
                return new JsonModel([
215
                    'success' => true,
216
                    'data' => [
217
                        'sync_id' => $sync_id
218
                    ]
219
                ]);
220
            } else {
221
                return new JsonModel([
222
                    'success' => false,
223
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
224
                ]);
225
            }
226
 
227
        }
228
 
229
        return new JsonModel([
230
            'success' => false,
231
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
232
        ]);
233
    }
234
 
235
    public function checkSessionAction()
236
    {
237
        $request = $this->getRequest();
238
 
239
        if($request->isPost()) {
240
            $device_uuid  = trim(filter_var($this->params()->fromPost('device_id', ''), FILTER_SANITIZE_STRING));
241
            $secret     = trim(filter_var($this->params()->fromPost('secret', ''), FILTER_SANITIZE_STRING));
242
            $rand       = filter_var($this->params()->fromPost('rand', ''), FILTER_SANITIZE_NUMBER_INT);
243
            $created    = trim(filter_var($this->params()->fromPost('created', ''), FILTER_SANITIZE_STRING));
244
 
245
            if(!$device_uuid || !$secret || !$rand || !$created) {
246
                return new JsonModel([
247
                    'success' => false,
248
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
249
                ]);
250
            }
251
 
252
            $dt = \DateTime::createFromFormat('Y-m-d\TH:i:s',  $created);
253
            if(!$dt) {
254
                return new JsonModel([
255
                    'success' => false,
256
                    'data' => 'ERROR_PARAMETERS_ARE_INCORRECTLY_FORMATTED'
257
                ]);
258
            }
259
 
260
 
261
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
262
            $device = $deviceMapper->fetchOne($device_uuid);
263
            if(!$device) {
264
                return new JsonModel([
265
                    'success' => false,
266
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
267
                ]);
268
            }
269
 
270
 
271
            $passworVerification = md5($device->password . ':' . $created . ':'  . $rand);
272
            if($secret != $passworVerification) {
273
                return new JsonModel([
274
                    'success' => false,
275
                    'data' => 'ERROR_WEBSERVICE_PASSWORD'
276
                ]);
277
            }
278
 
279
 
280
            $userMapper = UserMapper::getInstance($this->adapter);
281
            $user = $userMapper->fetchOne($device->user_id);
282
 
283
            if(User::BLOCKED_YES == $user->blocked) {
284
                return new JsonModel([
285
                    'success' => false,
286
                    'data' => 'ERROR_USER_IS_BLOCKED'
287
                ]);
288
            }
289
 
290
            if(User::STATUS_INACTIVE == $user->status) {
291
                return new JsonModel([
292
                    'success' => false,
293
                    'data' =>'ERROR_USER_IS_INACTIVE'
294
                ]);
295
            }
296
 
297
 
298
            return new JsonModel([
299
                'success' => true,
300
                'data' => [
301
                    'user_uuid' => $device->user_uuid
302
                ]
303
            ]);
304
 
305
        }
306
 
307
        return new JsonModel([
308
            'success' => false,
309
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
310
        ]);
311
    }
312
 
313
    public function deviceAction()
314
    {
315
 
43 efrain 316
        //$rawdata = file_get_contents("php://input");
317
        //error_log('$rawdata = ' . $rawdata );
1 www 318
 
319
        $request = $this->getRequest();
320
 
321
        if($request->isPost()) {
322
            //print_r($_POST);
323
 
324
 
325
            $application_id = filter_var($this->params()->fromPost('application_id', 0), FILTER_SANITIZE_NUMBER_INT);
326
            $device_uuid    = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
327
            $manufacturer   = filter_var($this->params()->fromPost('manufacturer', ''), FILTER_SANITIZE_STRING);
328
            $platform       = filter_var($this->params()->fromPost('platform', ''), FILTER_SANITIZE_STRING);
329
            $brand          = filter_var($this->params()->fromPost('brand', ''), FILTER_SANITIZE_STRING);
330
            $version        = filter_var($this->params()->fromPost('version', ''), FILTER_SANITIZE_STRING);
331
            $model          = filter_var($this->params()->fromPost('model', ''), FILTER_SANITIZE_STRING);
332
            $sync_id        = filter_var($this->params()->fromPost('sync_id', ''), FILTER_SANITIZE_NUMBER_INT);
333
 
334
            $ok = $application_id && $device_uuid && strlen($device_uuid) == 36 && $sync_id;
335
            $ok = $ok && strlen($manufacturer) <= 250;
336
            $ok = $ok && strlen($brand) <= 250;
337
            $ok = $ok && strlen($version) <= 250;
338
            $ok = $ok && strlen($model) <= 250;
339
 
340
            if(!$ok) {
341
                return new JsonModel([
342
                    'success' => false,
343
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
344
                ]);
345
            }
346
 
347
 
348
            $applicationMapper = ApplicationMapper::getInstance($this->adapter);
349
            $application = $applicationMapper->fetchOne($application_id);
350
            if(!$application) {
351
                return new JsonModel([
352
                    'success' => false,
353
                    'data' => 'ERROR_APPLICATION_NOT_FOUND',
354
                ]);
355
            }
356
 
357
            if($application->status == Application::STATUS_INACTIVE) {
358
                return new JsonModel([
359
                    'success' => false,
360
                    'data' => 'ERROR_APPLICATION_IS_INACTIVE',
361
                ]);
362
            }
363
 
41 efrain 364
 
365
            $syncLog = new SyncLog();
366
            $syncLog->data = json_encode([
367
                'platform' => $platform,
368
                'manufacturer' => $manufacturer,
369
                'brand' => $brand,
370
                'version' => $version,
371
                'model' => $model,
372
            ]);
373
            $syncLog->type = 'device';
374
            $syncLog->device_uuid = $device_uuid;
375
            $syncLog->ip = Functions::getUserIP();
376
 
377
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
378
            $syncLogMapper->insert($syncLog);
379
 
380
 
1 www 381
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
382
            $device = $deviceMapper->fetchOne($device_uuid);
383
 
384
 
385
 
386
 
387
            if($device) {
388
                $device->platform       = $platform;
389
                $device->manufacturer   = $manufacturer;
390
                $device->brand          = $brand;
391
                $device->version        = $version;
392
                $device->model          = $model;
393
                $device->ip             = Functions::getUserIP();
394
                $result                 = $deviceMapper->update($device);
395
 
396
            } else {
397
                $device                 = new Device();
398
                $device->id             = $device_uuid;
399
                $device->application_id = $application->id;
400
                $device->manufacturer   = $manufacturer;
401
                $device->brand          = $brand;
402
                $device->version        = $version;
403
                $device->model          = $model;
404
                $device->platform       = $platform;
405
                $device->ip             = Functions::getUserIP();
406
                $device->aes            = Functions::generatePassword(16);
407
                $device->password       = Functions::generatePassword(32);
408
                $result                 = $deviceMapper->insert($device);
409
            }
410
 
411
 
412
 
413
            if($result) {
414
                return new JsonModel([
415
                    'success' => true,
416
                    'data' => [
417
                        'sync_id'   => $sync_id,
418
                        'aes'       => $device->aes,
419
                        'password'  => $device->password,
420
                    ]
421
                ]);
422
            } else {
423
                return new JsonModel([
424
                    'success' => false,
425
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
426
                ]);
427
            }
428
 
429
        }
430
 
431
        return new JsonModel([
432
            'success' => false,
433
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
434
        ]);
435
 
436
    }
437
 
438
    public function microlearningCheckChangesAction()
439
    {
440
        $request = $this->getRequest();
441
 
442
        if($request->isPost()) {
443
            $currentUserPlugin = $this->plugin('currentUserPlugin');
444
            $user = $currentUserPlugin->getUser();
445
 
43 efrain 446
            //$rawdata = file_get_contents("php://input");
447
            //error_log('$rawdata = ' . $rawdata );
1 www 448
 
449
 
450
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
451
 
452
 
453
            $device_uuid        = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
454
            $max_date_changes   = filter_var($this->params()->fromPost('max_date_changes', ''), FILTER_SANITIZE_STRING);
455
            $max_ids            = filter_var($this->params()->fromPost('max_ids', ''), FILTER_SANITIZE_NUMBER_INT);
456
 
457
 
458
            $ids = [];
459
            for($i = 1; $i <= $max_ids; $i++)
460
            {
461
                $id = filter_var($this->params()->fromPost('id_' . $i, ''), FILTER_SANITIZE_STRING);
462
                if(empty($id)) {
463
                    continue;
464
                }
465
 
466
                $pattern = '/[A-Za-z0-9\-]+\|[A-Za-z0-9\-]+/';
467
                $matches = [];  preg_match($pattern, $id, $matches, PREG_OFFSET_CAPTURE);
468
                if(count($matches) > 1) {
469
                    array_push($ids, $matches[0]);
470
                }
471
 
472
            }
473
 
474
 
475
 
476
            if($max_date_changes) {
477
                $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $max_date_changes);
478
                if($dt) {
479
                  $max_date_changes = $dt->format('Y-m-d H:i:s');
480
                } else {
481
                    $max_date_changes = '';
482
                }
483
            } else {
484
                $max_date_changes = '';
485
            }
486
 
487
 
43 efrain 488
            //error_log('device_uuid = ' . $device_uuid . ' max_date_changes = ' . $max_date_changes);
1 www 489
 
490
            $ok = $device_uuid && strlen($device_uuid);
491
 
492
            if(!$ok) {
493
                return new JsonModel([
494
                    'success' => false,
495
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
496
                ]);
497
            }
498
 
499
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
500
            $device = $deviceMapper->fetchOne($device_uuid);
501
 
502
 
503
            if(!$device) {
504
                return new JsonModel([
505
                    'success' => false,
506
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
507
                ]);
508
            } else {
509
                $device->ip = Functions::getUserIP();
510
                $deviceMapper->update($device);
511
            }
512
 
513
            //Cargamos la fecha máxima del cambio
514
            $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
515
            $max_date_changes_db = $companyMicrolearningUserMapper->fetchMaxDateChanges($user->id);
516
 
517
            //Si la fecha es vacia agregamos la fecha máxima de la asignación de la capsula
518
            if(!$max_date_changes_db) {
519
                $companyUsers = [];
520
                $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
521
                $capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
522
                foreach($capsules as $capsule)
523
                {
524
 
525
 
526
 
527
                    if(empty($companyUsers[$capsule->company_id])) {
528
                        $companyUsers[$capsule->company_id] = $capsule->updated_on;
529
                    } else {
530
 
531
                        if($capsule->updated_on > $companyUsers[$capsule->company_id]) {
532
                            $companyUsers[$capsule->company_id] = $capsule->updated_on;
533
                        }
534
 
535
                    }
536
 
537
                }
538
 
539
                $max_date_changes_db = '';
540
                foreach($companyUsers as $company_id => $update_on)
541
                {
542
 
543
                    $max_date_changes_db = $max_date_changes_db < $update_on ? $update_on : $max_date_changes_db;
544
 
545
                    $companyMicrolearningUser = new CompanyMicrolearningUser();
546
                    $companyMicrolearningUser->company_id = $company_id;
547
                    $companyMicrolearningUser->user_id = $user->id;
548
                    $companyMicrolearningUser->added_on = $update_on;
549
                    $companyMicrolearningUser->updated_on = $update_on;
550
 
551
                    $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
552
                }
553
            }
554
 
555
 
43 efrain 556
 
1 www 557
            //Si la que tiene el dispositivo es diferente a la fecha máxima almacenada
558
            $newCapsules = 0;
559
            if($max_date_changes != $max_date_changes_db) {
560
                if(is_array($ids)) {
561
                    $companyMicrolearningTopicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
562
                    $companyMicrolearningTopics = $companyMicrolearningTopicMapper->fetchAllActive();
563
 
564
                    $topics = [];
565
                    foreach($companyMicrolearningTopics as $topic)
566
                    {
567
                        $topics[$topic->id] = $topic->uuid;
568
                    }
569
 
570
                    $companyMicrolearningCapsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
571
                    $companyMicrolearningCapsules = $companyMicrolearningCapsuleMapper->fetchAllActiveAndPublic();
572
 
573
                    $capsules = [];
574
                    foreach($companyMicrolearningCapsules as $capsule)
575
                    {
576
                        $capsules[$capsule->id] = $capsule->uuid;
577
                    }
578
 
579
                    $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
580
                    $user_capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
581
 
582
                    foreach($user_capsules as $user_capsule)
583
                    {
584
                        $topic_uuid     = isset($topics[$user_capsule->topic_id]) ? $topics[$user_capsule->topic_id] : '';
585
                        $capsule_uuid   = isset($capsules[$user_capsule->capsule_id]) ?  $capsules[$user_capsule->capsule_id] : '';
586
 
587
                        if(!$topic_uuid || !$capsule_uuid) {
588
                            continue;
589
                        }
590
 
591
                        $key = $topic_uuid . '|' . $capsule_uuid;
592
                        if(!in_array($key, $ids)) {
593
                            $newCapsules++;
594
                        }
595
                    }
596
                }
597
            }
598
 
599
 
600
            //echo 'Vamos a lanzar un PUSH' . PHP_EOL;
601
            if($newCapsules) {
602
 
603
                if($device->token)
604
                {
605
 
606
                    $pushMapper = PushMapper::getInstance($this->adapter);
607
                    $pushTemplateMapper = PushTemplateMapper::getInstance($this->adapter);
608
                    $pushTemplate = $pushTemplateMapper->fetchOne(PushTemplate::ID_MICRO_LEARNING_NEW_CONTENT);
609
 
610
                    //echo 'PushTemplate' . PHP_EOL;
611
                    //print_r($pushTemplate);
612
 
613
                    $applicationMapper = ApplicationMapper::getInstance($this->adapter);
614
                    $application = $applicationMapper->fetchOne(Application::TWOGETSKILLS);
615
 
616
 
617
                    //echo 'Application';
618
                    //print_r($application);
619
                    if($pushTemplate && $application) {
620
                         $push = new Push();
621
                        $push->status = Push::STATUS_PENDING;
622
                        $push->data = json_encode([
623
                            'server' => [
624
                                'key' =>   $application->key,
625
                            ],
626
                            'push' => [
627
                                'registration_ids'   => [
628
                                    $device->token,
629
                                ],
630
                                'notification' => [
631
                                    'body' =>  $pushTemplate->body,
632
                                    'title' => $pushTemplate->title,
633
                                    'vibrate' => 1,
634
                                    'sound' =>  1,
635
 
636
 
637
                                ],
638
                                'data' => [
639
                                    'new_capsules' => $newCapsules,
640
                                ]
641
                            ]
642
                        ]);
643
                        $pushMapper->insert($push);
644
                    }
645
                }
646
 
647
                $dataSync = $this->getSyncData($user,false, false);
648
            } else {
649
                $dataSync = [];
650
            }
651
 
652
 
653
 
654
            //error_log('$max_date_changes_db = ' . $max_date_changes_db);
655
 
656
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $max_date_changes_db);
657
            if($dt) {
658
                $max_date_changes_db = $dt->format($serviceDatetimeFormat);
659
            } else {
660
                $max_date_changes_db = '';
661
            }
662
 
663
            $data = [
664
                'success'   => true,
665
                'data'      =>[
666
                    'user' => [
667
                        'uuid' => $user->uuid,
668
                        'first_name' => $user->first_name,
669
                        'last_name' => $user->last_name,
670
                        'email' => $user->email,
671
                        'image' => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
672
                    ],
673
                    'max_date_changes' => $max_date_changes_db,
674
                    'topics'    => isset( $dataSync['topics'] ) ? $dataSync['topics'] : [],
675
                    'quizzes'   => isset( $dataSync['quizzes'] ) ? $dataSync['quizzes'] : [],
52 efrain 676
                    'extended'=> isset( $dataSync['extended'] ) ? $dataSync['extended'] : [],
1 www 677
                ]
678
            ];
679
 
680
            //error_log(print_r($data, true));
681
 
682
            return new JsonModel($data);
683
        }
684
 
685
        return new JsonModel([
686
            'success' => false,
687
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
688
        ]);
689
 
690
    }
691
 
692
 
693
 
694
    public function microlearningRefreshAction()
695
    {
696
        $request = $this->getRequest();
697
 
698
        if($request->isGet()) {
699
            $currentUserPlugin = $this->plugin('currentUserPlugin');
700
            $user = $currentUserPlugin->getUser();
701
 
702
            $dataSync = $this->getSyncData($user,false, false);
703
 
704
            //Cargamos la fecha máxima del cambio
705
            $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
706
            $max_date_changes_db = $companyMicrolearningUserMapper->fetchMaxDateChanges($user->id);
707
 
708
            //Si la fecha es vacia agregamos la fecha máxima de la asignación de la capsula
709
            if(!$max_date_changes_db) {
710
                $companyUsers = [];
711
                $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
712
                $capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
713
                foreach($capsules as $capsule)
714
                {
715
 
716
 
717
 
718
                    if(empty($companyUsers[$capsule->company_id])) {
719
                        $companyUsers[$capsule->company_id] = $capsule->updated_on;
720
                    } else {
721
 
722
                        if($capsule->updated_on > $companyUsers[$capsule->company_id]) {
723
                            $companyUsers[$capsule->company_id] = $capsule->updated_on;
724
                        }
725
 
726
                    }
727
 
728
                }
729
 
730
                $max_date_changes_db = '';
731
                foreach($companyUsers as $company_id => $update_on)
732
                {
733
 
734
                    $max_date_changes_db = $max_date_changes_db < $update_on ? $update_on : $max_date_changes_db;
735
 
736
                    $companyMicrolearningUser = new CompanyMicrolearningUser();
737
                    $companyMicrolearningUser->company_id = $company_id;
738
                    $companyMicrolearningUser->user_id = $user->id;
739
                    $companyMicrolearningUser->added_on = $update_on;
740
                    $companyMicrolearningUser->updated_on = $update_on;
741
 
742
                    $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
743
                }
744
            }
745
 
746
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $max_date_changes_db);
747
            if($dt) {
748
                $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
749
                $max_date_changes_db = $dt->format($serviceDatetimeFormat);
750
            } else {
751
                $max_date_changes_db = '';
752
            }
753
 
754
            return new JsonModel([
755
                'success'   => true,
756
                'data'      =>[
757
                    'user' => [
758
                        'uuid' => $user->uuid,
759
                        'first_name' => $user->first_name,
760
                        'last_name' => $user->last_name,
761
                        'email' => $user->email,
762
                        'image' => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
763
                    ],
764
                    'max_date_changes' => $max_date_changes_db,
765
                    'topics'    => $dataSync['topics'],
766
                    'quizzes'   => $dataSync['quizzes'],
52 efrain 767
                    'extended'   => $dataSync['extended'],
1 www 768
 
769
                ]
770
            ]);
771
        }
772
 
773
        return new JsonModel([
774
            'success' => false,
775
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
776
        ]);
777
    }
778
 
779
 
780
    public function signinAction()
781
    {
782
        $request = $this->getRequest();
783
 
784
        if($request->isPost()) {
785
 
786
 
43 efrain 787
            //$rawdata = file_get_contents("php://input");
788
            //error_log('$rawdata = ' . $rawdata );
1 www 789
 
790
 
791
            $application_id = filter_var($this->params()->fromPost('application_id', 0), FILTER_SANITIZE_NUMBER_INT);
792
            $device_uuid    = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
793
            $email          = filter_var($this->params()->fromPost('email', ''), FILTER_SANITIZE_EMAIL);
794
            $password       = filter_var($this->params()->fromPost('password', ''), FILTER_SANITIZE_STRING);
795
            //$encrypter      = filter_var($this->params()->fromPost('encrypter', ''), FILTER_SANITIZE_STRING);
796
 
797
 
798
 
799
            $ok = $application_id && $device_uuid && strlen($device_uuid) == 36;
800
            $ok = $ok && $email && $password;
801
            //$ok = $ok && in_array($encrypter, ['CryptoJsAes','RNCryptor','AesCipher']);
802
 
803
            if(!$ok) {
804
                return new JsonModel([
805
                    'success' => false,
806
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
807
                ]);
808
            }
809
 
810
 
811
            $applicationMapper = ApplicationMapper::getInstance($this->adapter);
812
            $application = $applicationMapper->fetchOne($application_id);
813
            if(!$application) {
814
                return new JsonModel([
815
                    'success' => false,
816
                    'data' => 'ERROR_APPLICATION_NOT_FOUND',
817
                ]);
818
            }
819
 
820
            if($application->status == Application::STATUS_INACTIVE) {
821
                return new JsonModel([
822
                    'success' => false,
823
                    'data' => 'ERROR_APPLICATION_IS_INACTIVE',
824
                ]);
825
            }
826
 
827
 
828
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
829
            $device = $deviceMapper->fetchOne($device_uuid);
830
            if(!$device) {
831
                $device                 = new Device();
832
                $device->id             = $device_uuid;
833
                $device->application_id = $application->id;
834
                $device->ip             = Functions::getUserIP();
835
                $device->aes            = Functions::generatePassword(16);
836
                $device->password       = Functions::generatePassword(32);
837
                $result                 = $deviceMapper->insert($device);
838
 
839
                if(!$result) {
840
                    return new JsonModel([
841
                        'success' => false,
842
                        'data' => 'ERROR_DEVICE_NOT_FOUND',
843
                    ]);
844
                }
845
            }
846
 
41 efrain 847
 
848
 
1 www 849
            /*
850
            if($encrypter == 'CryptoJsAes') {
851
 
852
 
853
                $email = html_entity_decode($email);
854
                $password = html_entity_decode($password);
855
 
856
 
857
                ob_start();
858
 
859
                $email      = CryptoJsAes::decrypt($email, $device->aes);
860
                $password   = CryptoJsAes::decrypt($password, $device->aes);
861
 
862
                ob_end_clean();
863
 
864
                if(!$email || !$password) {
865
                    return new JsonModel([
866
                        'success' => false,
867
                        'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
868
                    ]);
869
                }
870
            } else if($encrypter == 'RNCryptor') {
871
                $cryptor = new \RNCryptor\RNCryptor\Decryptor;
872
                $email = $cryptor->decrypt($email, $device->aes);
873
                $password = $cryptor->decrypt($password, $device->aes);
874
 
875
                if(!$email || !$password) {
876
                    return new JsonModel([
877
                        'success' => false,
878
                        'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
879
                    ]);
880
                }
881
 
882
 
883
            } else if($encrypter == 'AesCipher') {
884
 
885
                $emailDecrypted = AesCipher::decrypt($device->aes,$email);
886
                $passwordDecrypted = AesCipher::decrypt($device->aes,$password);
887
                if($emailDecrypted->hasError() || $passwordDecrypted->hasError()) {
888
                    return new JsonModel([
889
                        'success' => false,
890
                        'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
891
                    ]);
892
                }
893
 
894
                $email = $emailDecrypted->getData();
895
                $password = $passwordDecrypted->getData();
896
            } else {
897
                return new JsonModel([
898
                    'success' => false,
899
                    'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
900
                ]);
901
            }*/
902
 
903
 
904
            $authAdapter = new AuthAdapter($this->adapter);
905
            $authAdapter->setData($email, $password);
906
 
907
            $authService = new AuthenticationService();
908
            $result = $authService->authenticate($authAdapter);
909
 
910
            if($result->getCode() == AuthResult::SUCCESS) {
911
 
912
                $userMapper = UserMapper::getInstance($this->adapter);
913
                $user = $userMapper->fetchOneByEmail($email);
914
 
915
 
916
                $device->user_id    = $user->id;
917
                $device->ip         = Functions::getUserIP();
918
                if($deviceMapper->update($device)) {
919
 
920
                    $ip = Functions::getUserIP();
921
 
922
                    $deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
923
                    $deviceHistory = $deviceHistoryMapper->fetchOneByDeviceIdAndUserIdAndIp($device->id, $user->id, $ip);
924
                    if($deviceHistory) {
925
                        $deviceHistoryMapper->update($deviceHistory);
926
                    } else {
927
                        $deviceHistory = new DeviceHistory();
928
                        $deviceHistory->device_id = $device->id;
929
                        $deviceHistory->user_id = $user->id;
930
                        $deviceHistory->ip = $ip;
931
                        $deviceHistoryMapper->insert($deviceHistory);
932
                    }
933
 
934
                    $pushMapper = PushMapper::getInstance($this->adapter);
935
 
936
                    $userDevices =  $deviceMapper->fetchAllByUserId($user->id);
937
                    foreach($userDevices as $userDevice)
938
                    {
939
 
940
 
941
                        if($userDevice->id != $device->id && $userDevice->token) {
942
 
943
                            $push = new Push();
944
                            $push->status = Push::STATUS_PENDING;
945
                            $push->data = json_encode([
946
                                'server' => [
947
                                    'key' =>   $application->key
948
                                 ],
949
                                 'push' => [
950
                                    'registration_ids'   => [
951
                                        $userDevice->token,
952
                                     ],
953
                                     /*'notification' => [
954
                                         'body' =>  'Se registro un inicio de sessión desde otro dispositivo',
955
                                         'title' => 'Inicio de sessión',
956
                                         'vibrate' => 1,
957
                                         'sound' =>  1
958
                                     ],*/
959
                                    'data' => [
960
                                        'command' => 'signout'
961
                                    ]
962
                                 ]
963
                             ]);
964
 
965
                            $pushMapper->insert($push);
966
 
967
                        }
968
                    }
969
 
970
 
971
                    $companyUsers = [];
972
                    $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
973
                    $capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
974
                    foreach($capsules as $capsule)
975
                    {
976
 
977
 
978
 
979
                        if(empty($companyUsers[$capsule->company_id])) {
980
                            $companyUsers[$capsule->company_id] = $capsule->updated_on;
981
                        } else {
982
 
983
                            if($capsule->updated_on > $companyUsers[$capsule->company_id]) {
984
                                $companyUsers[$capsule->company_id] = $capsule->updated_on;
985
                            }
986
 
987
                        }
988
 
989
                    }
990
 
991
                    $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
992
 
993
                    $maxDateChanges = $companyMicrolearningUserMapper->fetchMaxDateChanges($user->id);
994
                    if(!$maxDateChanges) {
995
 
996
 
997
                        $maxDateChanges = '';
998
                        foreach($companyUsers as $company_id => $update_on)
999
                        {
1000
 
1001
                            $maxDateChanges = $maxDateChanges < $update_on ? $update_on : $maxDateChanges;
1002
 
1003
                            $companyMicrolearningUser = new CompanyMicrolearningUser();
1004
                            $companyMicrolearningUser->company_id = $company_id;
1005
                            $companyMicrolearningUser->user_id = $user->id;
1006
                            $companyMicrolearningUser->added_on = $update_on;
1007
                            $companyMicrolearningUser->updated_on = $update_on;
1008
 
1009
                            $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
1010
                        }
1011
 
1012
 
1013
                    }
1014
 
1015
 
1016
 
1017
                   $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $maxDateChanges);
1018
                   if($dt) {
1019
                       $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1020
                       $maxDateChanges = $dt->format($serviceDatetimeFormat);
1021
                   } else {
1022
                       $maxDateChanges = '';
1023
                   }
1024
 
1025
 
1026
                    $data = [
1027
                        'success'   => true,
1028
                        'data'      =>[
1029
                            'user' => [
1030
                                'uuid' => $user->uuid,
1031
                                'first_name' => $user->first_name,
1032
                                'last_name' => $user->last_name,
1033
                                'email' => $user->email,
1034
                                'image' => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
1035
 
1036
                             ],
1037
                            'max_date_changes' => $maxDateChanges,
1038
                            'device' => [
1039
                                'aes' => $device->aes,
1040
                                'password' => $device->password
1041
                            ]
1042
 
1043
                        ]
1044
                    ];
1045
 
1046
                    if($application->id == Application::TWOGETSKILLS) {
1047
                        $dataSync = $this->getSyncData($user);
1048
 
1049
                        $data['data']['topics'] = $dataSync['topics'];
1050
                        $data['data']['quizzes'] = $dataSync['quizzes'];
1051
                        $data['data']['userlog'] = $dataSync['userlog'];
1052
                        $data['data']['progress'] = $dataSync['progress'];
52 efrain 1053
                        $data['data']['extended'] = $dataSync['extended'];
1 www 1054
                    }
1055
 
1056
 
1057
 
1058
                    return new JsonModel($data);
1059
 
1060
 
1061
 
1062
                } else {
1063
                    return new JsonModel([
1064
                        'success' => false,
1065
                        'data' => 'ERROR_THERE_WAS_AN_ERROR',
1066
                    ]);
1067
                }
1068
 
1069
 
1070
            } else {
1071
                $message = $result->getMessages()[0];
1072
                if(!in_array($message, ['ERROR_USER_NOT_FOUND', 'ERROR_USER_PROVIDER_NOT_FOUND', 'ERROR_USER_EMAIL_HASNT_BEEN_VARIFIED', 'ERROR_USER_IS_BLOCKED',
1073
                    'ERROR_USER_IS_INACTIVE', 'ERROR_ENTERED_PASS_INCORRECT_USER_IS_BLOCKED', 'ERROR_ENTERED_PASS_INCORRECT_2',
1074
                    'ERROR_ENTERED_PASS_INCORRECT_1'])) {
1075
                }
1076
 
1077
                switch($message)
1078
                {
1079
                    case 'ERROR_USER_NOT_FOUND' :
1080
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Email no existe', ['ip' => Functions::getUserIP()]);
1081
                        break;
1082
 
1083
                    case 'ERROR_USER_EMAIL_HASNT_BEEN_VARIFIED' :
1084
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Email no verificado', ['ip' => Functions::getUserIP()]);
1085
                        break;
1086
 
1087
                    case 'ERROR_USER_IS_BLOCKED' :
1088
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Usuario bloqueado', ['ip' => Functions::getUserIP()]);
1089
                        break;
1090
 
1091
                    case 'ERROR_USER_IS_INACTIVE' :
1092
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Usuario inactivo', ['ip' => Functions::getUserIP()]);
1093
                        break;
1094
 
1095
 
1096
                    case 'ERROR_ENTERED_PASS_INCORRECT_USER_IS_BLOCKED':
1097
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - 3er Intento Usuario bloqueado', ['ip' => Functions::getUserIP()]);
1098
                        break;
1099
 
1100
 
1101
                    case 'ERROR_ENTERED_PASS_INCORRECT_2' :
1102
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - 1er Intento', ['ip' => Functions::getUserIP()]);
1103
                        break;
1104
 
1105
 
1106
                    case 'ERROR_ENTERED_PASS_INCORRECT_1' :
1107
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - 2do Intento', ['ip' => Functions::getUserIP()]);
1108
                        break;
1109
 
1110
 
1111
                    default :
1112
                        $message = 'ERROR_UNKNOWN';
1113
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Error desconocido', ['ip' => Functions::getUserIP()]);
1114
                        break;
1115
 
1116
 
1117
                }
1118
 
1119
 
1120
                return new JsonModel([
1121
                    'success'   => false,
1122
                    'data'   => $message
1123
                ]);
1124
            }
1125
 
1126
        }
1127
 
1128
        return new JsonModel([
1129
            'success' => false,
1130
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1131
        ]);
1132
 
1133
    }
1134
 
1135
 
1136
 
1137
 
1138
    public function storageAction()
1139
    {
1140
 
1141
        // Get the file name from GET variable.
1142
        $code       = $this->params()->fromRoute('code', '');
1143
        $fileName   = $this->params()->fromRoute('filename', '');
1144
        $type       = $this->params()->fromRoute('type', 'user');
1145
 
1146
 
1147
        $no_image = $this->config['leaderslinked.images_default.no_image'];
1148
        $path = '';
1149
        switch($type)
1150
        {
1151
            case 'user' :
1152
                $no_image = $this->config['leaderslinked.images_default.user_image'];
1153
                $path = $this->config['leaderslinked.fullpath.user'];
1154
                break;
1155
 
1156
 
1157
            case 'user-profile' :
1158
                $no_image = $this->config['leaderslinked.images_default.user_profile'];
1159
                $path = $this->config['leaderslinked.fullpath.user'];
1160
                break;
1161
 
1162
            case 'user-cover' :
1163
                $no_image = $this->config['leaderslinked.images_default.user_cover'];
1164
                $path = $this->config['leaderslinked.fullpath.user'];
1165
                break;
1166
 
1167
            case 'company' :
1168
                $no_image = $this->config['leaderslinked.images_default.company_profile'];
1169
                $path = $this->config['leaderslinked.fullpath.company'];
1170
                break;
1171
 
1172
            case 'company-cover' :
1173
                $no_image = $this->config['leaderslinked.images_default.company_cover'];
1174
                $path = $this->config['leaderslinked.fullpath.company'];
1175
                break;
1176
 
1177
            case 'group' :
1178
                $no_image = $this->config['leaderslinked.images_default.group_profile'];
1179
                $path = $this->config['leaderslinked.fullpath.group'];
1180
                break;
1181
 
1182
            case 'group-cover' :
1183
                $no_image = $this->config['leaderslinked.images_default.group_cover'];
1184
                $path = $this->config['leaderslinked.fullpath.group'];
1185
                break;
1186
 
1187
            case 'job' :
1188
                $path = $this->config['leaderslinked.fullpath.job'];
1189
                break;
1190
 
1191
            case 'chat' :
1192
                $path = $this->config['leaderslinked.fullpath.chat'];
1193
                break;
1194
 
1195
            case 'feed' :
1196
                $path = $this->config['leaderslinked.fullpath.feed'];
1197
                break;
1198
 
1199
            case 'post' :
1200
                $path = $this->config['leaderslinked.fullpath.post'];
1201
                break;
1202
 
1203
            case 'microlearning-topic' :
1204
                $path = $this->config['leaderslinked.fullpath.microlearning_topic'];
1205
                break;
1206
 
1207
            case 'microlearning-capsule' :
1208
                $path = $this->config['leaderslinked.fullpath.microlearning_capsule'];
1209
                break;
1210
 
1211
            case 'microlearning-slide' :
1212
                $path = $this->config['leaderslinked.fullpath.microlearning_slide'];
1213
                break;
1214
 
1215
            default :
1216
                $path = $this->config['leaderslinked.fullpath.image'];
1217
                break;
1218
 
1219
        }
1220
        if($code && $fileName) {
1221
            $request_fullpath = $path . $code . DIRECTORY_SEPARATOR . $fileName;
1222
        } else {
1223
            $request_fullpath = $no_image;
1224
        }
1225
 
1226
        if(empty($fileName)) {
1227
            $extensions     = explode('.',$request_fullpath);
1228
            $extension      = strtolower(trim($extensions[count($extensions)-1]));
1229
            if ($extension=='jpg' || $extension=='jpeg' || $extension=='gif' || $extension == 'png') {
1230
                $request_fullpath =  $no_image;
1231
            }
1232
        }
1233
 
1234
 
1235
        if(file_exists($request_fullpath)) {
1236
 
1237
            // Try to open file
1238
            if (!is_readable($request_fullpath)) {
1239
                return $this->getResponse()->setStatusCode(500);
1240
            }
1241
 
1242
            // Get file size in bytes.
1243
            $fileSize = filesize($request_fullpath);
1244
 
1245
            // Get MIME type of the file.
1246
            $mimeType = mime_content_type($request_fullpath);
1247
            if($mimeType===false) {
1248
                $mimeType = 'application/octet-stream';
1249
            }
1250
 
1251
            $request_fullpath = trim($request_fullpath);
1252
            $length = strlen($request_fullpath);
1253
            if(substr($request_fullpath, $length - 1) == '/') {
1254
                $request_fullpath = substr($request_fullpath, 0, $length - 1);
1255
            }
1256
 
1257
 
1258
            $filename = basename($request_fullpath);
1259
 
1260
            header('Content-type: ' . $mimeType);
1261
            readfile($request_fullpath);
1262
 
1263
 
1264
            exit;
1265
            //header("X-Sendfile: $request_fullpath");
1266
            //header("Content-type: application/octet-stream");
1267
            //header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
1268
 
1269
 
1270
            /*
1271
 
1272
 
1273
            if ($fd = fopen ($request_fullpath, "r")) {
1274
 
1275
                $fsize = filesize($request_fullpath);
1276
 
1277
                header("Content-type: $mimeType");
1278
                header("Accept-Ranges: bytes");
1279
 
1280
                //header("Content-Disposition: attachment; filename=\"$filename\"");
1281
 
1282
                header("Content-length: $fsize");
1283
                header("Cache-control: private");
1284
 
1285
                while(!feof($fd)) {
1286
                    $buffer = fread($fd, 2048);
1287
                    echo $buffer;
1288
                }
1289
            }
1290
 
1291
            fclose ($fd);
1292
            exit;*/
1293
 
1294
 
1295
            /*
1296
             $fileContent = file_get_contents($request_fullpath);
1297
            $response = $this->getResponse();
1298
            $headers = $response->getHeaders();
1299
            $headers->addHeaderLine('Accept-Ranges: bytes');
1300
            $headers->addHeaderLine('Content-type: ' . $mimeType);
1301
            $headers->addHeaderLine('Content-length: ' . $fileSize);
1302
 
1303
            /*
1304
            Date: Tue, 13 Jul 2021 03:11:42 GMT
1305
            Server: Apache/2.4.41 (Ubuntu)
1306
            Last-Modified: Mon, 28 Jun 2021 16:43:04 GMT
1307
            ETag: "54e4-5c5d62eed581e"
1308
            Accept-Ranges: bytes
1309
            Content-Length: 21732
1310
            Cache-Control: max-age=1
1311
            Expires: Tue, 13 Jul 2021 03:11:43 GMT
1312
            Keep-Alive: timeout=5, max=100
1313
            Connection: Keep-Alive
1314
            Content-Type: audio/mpeg
1315
            */
1316
 
1317
            /*
1318
            if($fileContent!==false) {
1319
                error_log($_SERVER['REQUEST_URI']);
1320
                error_log($request_fullpath);
1321
                return $response->setContent($fileContent);
1322
 
1323
                header('Content-Type: '.$mimeType );
1324
                readfile_chunked($filename);
1325
                exit;
1326
 
1327
            } else {
1328
                error_log('500');
1329
                $this->getResponse()->setStatusCode(500);
1330
                return;
1331
            }*/
1332
        } else {
1333
            error_log('404');
1334
            return $this->getResponse()->setStatusCode(404);
1335
        }
1336
 
1337
        return $this->getResponse();
1338
    }
1339
 
1340
 
1341
    public function syncAction()
1342
    {
1343
        $request = $this->getRequest();
1344
 
1345
        if($request->isPost()) {
1346
 
41 efrain 1347
           // $rawdata = file_get_contents("php://input");
1348
           // error_log('$rawdata = ' . $rawdata );
1 www 1349
 
1350
 
1351
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1352
 
1353
            $device_uuid    = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
1354
            $sync_id        = filter_var($this->params()->fromPost('sync_id', ''), FILTER_SANITIZE_NUMBER_INT);
1355
            $data           = $this->params()->fromPost('data', '');
1356
 
1357
 
1358
 
41 efrain 1359
            //error_log('device_uuid = ' . $device_uuid);
1360
            //error_log('sync_id = ' . $sync_id);
1361
            //error_log(print_r($data, true));
1 www 1362
 
1363
            $ok = $device_uuid && strlen($device_uuid) == 36 && $data && $sync_id;
1364
 
1365
            if(!$ok) {
1366
                return new JsonModel([
1367
                    'success' => false,
1368
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
1369
                ]);
1370
            }
1371
 
1372
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
1373
            $device = $deviceMapper->fetchOne($device_uuid);
1374
 
1375
 
1376
            if(!$device) {
1377
                return new JsonModel([
1378
                    'success' => false,
1379
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
1380
                ]);
1381
            } else {
1382
                $device->ip = Functions::getUserIP();
1383
                $deviceMapper->update($device);
1384
            }
1385
 
44 efrain 1386
 
41 efrain 1387
 
44 efrain 1388
 
1389
 
1390
            $data = json_decode($data, true);
1391
            $sync_type      = isset($data['sync_type']) ? filter_var($data['sync_type'], FILTER_SANITIZE_STRING) : '';
1392
            $user_uuid      = isset($data['user_uuid']) ? filter_var($data['user_uuid'], FILTER_SANITIZE_STRING) : '';
1393
            $company_uuid   = isset($data['company_uuid']) ? filter_var($data['company_uuid'], FILTER_SANITIZE_STRING) :  '';
1394
 
1395
 
41 efrain 1396
            $syncLog = new SyncLog();
1397
            $syncLog->data = $data;
44 efrain 1398
            $syncLog->type = $sync_type;
41 efrain 1399
            $syncLog->device_uuid = $device->id;
1400
            $syncLog->ip = Functions::getUserIP();
1401
 
1402
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
1403
            $syncLogMapper->insert($syncLog);
1404
 
1 www 1405
 
1406
    //
1407
 
1408
            if($user_uuid && $device->application_id = Application::TWOGETSKILLS  && $company_uuid && in_array($sync_type, ['microlearning-progress', 'microlearning-userlog', 'microlearning-quiz'])) {
1409
                $userMapper = UserMapper::getInstance($this->adapter);
1410
                $user = $userMapper->fetchOneByUuid($user_uuid);
1411
 
1412
                if(!$user) {
1413
                    return new JsonModel([
1414
                        'success' => false,
1415
                        'data' => [
1416
                            'sync_id' => $sync_id,
1417
                            'message' => 'ERROR_USER_NOT_FOUND',
1418
                            'fatal' => true
1419
                        ]
1420
                    ]);
1421
                }
1422
 
1423
 
1424
                if($user->status != User::STATUS_ACTIVE) {
1425
                    return new JsonModel([
1426
                        'success' => false,
1427
                        'data' => [
1428
                            'sync_id' => $sync_id,
1429
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
1430
                            'fatal' => true
1431
                        ]
1432
                    ]);
1433
                }
1434
 
1435
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1436
                $company = $companyMapper->fetchOneByUuid($company_uuid);
1437
                if(!$company) {
1438
                    return new JsonModel([
1439
                        'success' => false,
1440
                        'data' => [
1441
                            'sync_id' => $sync_id,
1442
                            'message' => 'ERROR_COMPANY_NOT_FOUND',
1443
                            'fatal' => true
1444
                        ]
1445
                    ]);
1446
                }
1447
 
1448
                if($company->status != Company::STATUS_ACTIVE) {
1449
                    return new JsonModel([
1450
                        'success' => false,
1451
                        'data' => [
1452
                            'sync_id' => $sync_id,
1453
                            'message' => 'ERROR_COMPANY_IS_NOT_FOUND',
1454
                            'fatal' => true
1455
                        ]
1456
                    ]);
1457
                }
1458
 
1459
 
1460
 
1461
 
1462
 
1463
                $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
1464
                $companyService = $companyServiceMapper->fetchOneByCompanyIdAndServiceId($company->id, Service::MICRO_LEARNING);
1465
                if(!$companyService) {
1466
                    return new JsonModel([
1467
                        'success' => false,
1468
                        'data' => [
1469
                            'sync_id' => $sync_id,
1470
                            'message' => 'ERROR_COMPANY_SERVICE_NOT_FOUND',
1471
                            'fatal' => true
1472
                        ]
1473
                    ]);
1474
                }
1475
 
1476
                $serviceActive = true;
1477
                $now = date('Y-m-d H:i:s');
1478
                if($companyService->status == CompanyService::ACTIVE) {
1479
 
1480
                    if($now < $companyService->paid_from || $now > $companyService->paid_to) {
1481
                        $serviceActive = false;
1482
                    }
1483
 
1484
                } else {
1485
                    $serviceActive = false;
1486
                }
1487
 
1488
                if( !$serviceActive) {
1489
                    return new JsonModel([
1490
                        'success' => false,
1491
                        'data' => [
1492
                            'sync_id' => $sync_id,
1493
                            'message' => 'ERROR_COMPANY_SERVICE_IS_NOT_ACTIVE',
1494
                            'fatal' => true
1495
                        ]
1496
                    ]);
1497
                }
1498
 
1499
                $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1500
                $topic_uuid = isset($data['topic_uuid']) ? filter_var($data['topic_uuid'], FILTER_SANITIZE_STRING) :  '';
1501
                if($topic_uuid) {
1502
                    $topic = $topicMapper->fetchOneByUuid($topic_uuid);
1503
 
1504
                    if(!$topic) {
1505
                        return new JsonModel([
1506
                            'success' => false,
1507
                            'data' => [
1508
                                'sync_id' => $sync_id,
1509
                                'message' => 'ERROR_TOPIC_NOT_FOUND',
1510
                            ]
1511
                        ]);
1512
                    }
1513
 
1514
                    if($topic->company_id != $company->id) {
1515
                        return new JsonModel([
1516
                            'success' => false,
1517
                            'data' => [
1518
                                'sync_id' => $sync_id,
1519
                                'message' => 'ERROR_INVALID_PARAMETERS_TOPIC_COMPANY',
1520
                            ]
1521
                        ]);
1522
                    }
1523
 
1524
                } else {
1525
                    $topic = null;
1526
                }
1527
 
1528
                $capsule_uuid     = isset($data['capsule_uuid']) ? filter_var($data['capsule_uuid'], FILTER_SANITIZE_STRING) :  '';
1529
                $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1530
                if($capsule_uuid) {
1531
 
1532
                    $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
1533
                    if(!$capsule) {
1534
                        return new JsonModel([
1535
                            'success' => false,
1536
                            'data' => [
1537
                                'sync_id' => $sync_id,
1538
                                'message' => 'ERROR_CAPSULE_NOT_FOUND',
1539
                            ]
1540
                        ]);
1541
                    }
1542
 
1543
                    if(!$topic || $capsule->topic_id != $topic->id) {
1544
                        return new JsonModel([
1545
                            'success' => false,
1546
                            'data' => [
1547
                                'sync_id' => $sync_id,
1548
                                'message' => 'ERROR_INVALID_PARAMETERS_CAPSULE_TOPIC',
1549
                            ]
1550
                        ]);
1551
                    }
1552
                } else {
1553
                    $capsule = null;
1554
                }
1555
 
1556
                if($capsule) {
1557
 
1558
                    $capsuleActive = true;
1559
                    $capsuleMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1560
                    $capsuleUser = $capsuleMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
1561
 
1562
 
1563
                    $now = date('Y-m-d H:i:s');
1564
                    if($capsuleUser && in_array($capsuleUser->access, [CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED,CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD ])) {
1565
 
1566
 
1567
                        if($capsuleUser->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
1568
 
1569
                            if($now < $capsuleUser->paid_from || $now > $capsuleUser->paid_to) {
1570
                                $capsuleActive = false;;
1571
                            }
1572
                        }
1573
 
1574
                    } else {
1575
                        $capsuleActive = false;
1576
                    }
1577
 
1578
                    if(!$capsuleActive) {
1579
                        return new JsonModel([
1580
                            'success' => false,
1581
                            'data' => [
1582
                                'sync_id' => $sync_id,
1583
                                'message' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
1584
                            ]
1585
                        ]);
1586
                    }
1587
                }
1588
 
1589
                $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1590
                $slide_uuid      = isset($data['slide_uuid']) ? filter_var($data['slide_uuid'], FILTER_SANITIZE_STRING) :  '';
1591
                if($slide_uuid) {
1592
                    $slide = $slideMapper->fetchOneByUuid($slide_uuid);
1593
                    if(!$slide) {
1594
                        return new JsonModel([
1595
                            'success' => false,
1596
                            'data' => [
1597
                                'sync_id' => $sync_id,
1598
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
1599
                            ]
1600
                        ]);
1601
                    }
1602
 
1603
                    if(!$capsule || $slide->capsule_id != $capsule->id) {
1604
                        return new JsonModel([
1605
                            'success' => false,
1606
                            'data' => [
1607
                                'sync_id' => $sync_id,
1608
                                'message' => 'ERROR_INVALID_PARAMETERS_SLIDE_CAPSULE',
1609
                            ]
1610
                        ]);
1611
                    }
1612
                } else {
1613
                    $slide = null;
1614
                }
1615
 
1616
                if($sync_type == 'microlearning-quiz') {
1617
                    $ok = true;
1618
 
1619
                    $quiz_uuid = isset($data['quiz_uuid']) ? $data['quiz_uuid'] : '';
1620
                    $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
1621
 
1622
                    $quiz = $quizMapper->fetchOneByUuid($quiz_uuid);
1623
                    if(!$quiz) {
1624
                        return new JsonModel([
1625
                            'success' => false,
1626
                            'data' => [
1627
                                'sync_id' => $sync_id,
1628
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
1629
                            ]
1630
                        ]);
1631
                    }
1632
 
1633
                    if(!$capsule || $slide->capsule_id != $capsule->id) {
1634
                        return new JsonModel([
1635
                            'success' => false,
1636
                            'data' => [
1637
                                'sync_id' => $sync_id,
1638
                                'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_SLIDE',
1639
                            ]
1640
                        ]);
1641
                    }
1642
 
1643
                    $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
1644
 
1645
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
1646
                    if(!$dt) {
1647
                        $ok = false;
1648
                    } else {
1649
                        $added_on = $dt->format('Y-m-d H:i:s');
1650
                    }
1651
 
1652
 
1653
                    if(isset($data['points'])) {
1654
                        $points = intval($data['points'], 10);
1655
                    } else {
1656
                        $ok = false;
1657
                    }
1658
 
1659
 
1660
                    if(isset($data['pass'])) {
1661
                        $status = $data['pass'] == 'yes' ? CompanyMicrolearningUserQuiz::STATUS_PASS : CompanyMicrolearningUserQuiz::STATUS_FAIL;
1662
                    } else {
1663
                        $ok = false;
1664
                    }
1665
 
1666
 
1667
                    if(!$ok) {
1668
                        return new JsonModel([
1669
                            'success' => false,
1670
                            'data' => [
1671
                                'sync_id' => $sync_id,
1672
                                'message' => 'ERROR_INVALID_PARAMETERS',
1673
                            ]
1674
                        ]);
1675
                    }
1676
 
1677
 
1678
                    $array_response = [];
1679
                    $response = isset($data['response']) ? intval($data['response'], 10) : 0;
1680
                    for($i = 0; $i < $response; $i++)
1681
                    {
1682
                        $question_uuid = isset($data["response_{$i}_question_uuid"]) ? $data["response_{$i}_question_uuid"] : '';
1683
                        $answer_uuid = isset($data["response_{$i}_answer_uuid"]) ? $data["response_{$i}_answer_uuid"] : '';
1684
                        $value = isset($data["response_{$i}_value"]) ?  intval($data["response_{$i}_value"], 10) : 0;
1685
                        $points = isset($data["response_{$i}_points"]) ?  intval($data["response_{$i}_points"], 10) : 0;
1686
 
1687
                        if($question_uuid && $answer_uuid)
1688
                        {
1689
                            array_push($array_response, [
1690
                                'question_uuid' => $question_uuid,
1691
                                'answer_uuid' => $answer_uuid,
1692
                                'value' => $value,
1693
                                'points' => $points
1694
 
1695
                            ]);
1696
                        }
1697
 
1698
 
1699
                    }
1700
 
1701
 
1702
                    $userQuiz = new CompanyMicrolearningUserQuiz();
1703
                    $userQuiz->company_id = $company->id;
1704
                    $userQuiz->topic_id = $topic->id;
1705
                    $userQuiz->capsule_id = $capsule->id;
1706
                    $userQuiz->slide_id = $slide->id;
1707
                    $userQuiz->quiz_id = $quiz->id;
1708
                    $userQuiz->user_id = $user->id;
1709
                    $userQuiz->added_on = $added_on;
1710
                    $userQuiz->points = $points;
1711
                    $userQuiz->status = $status;
1712
                    $userQuiz->response = json_encode($array_response);
1713
 
1714
                    $userQuizMapper = CompanyMicrolearningUserQuizMapper::getInstance($this->adapter);
1715
 
1716
                    if($userQuizMapper->insert($userQuiz)) {
1717
                        return new JsonModel([
1718
                            'success' => true,
1719
                            'data' => [
1720
                                'sync_id' => $sync_id
1721
                            ]
1722
                        ]);
1723
                    } else {
1724
                        return new JsonModel([
1725
                            'success' => false,
1726
                            'data' => [
1727
                                'sync_id' => $sync_id,
1728
                                'message' => $userQuizMapper->getError()
1729
                            ]
1730
                        ]);
1731
                    }
1732
 
1733
                }
1734
 
1735
 
1736
                if($sync_type == 'microlearning-progress') {
1737
                    $ok = true;
1738
 
1739
                    $type = isset($data['type']) ? $data['type'] : '';
1740
                    switch($type)
1741
                    {
1742
                        case CompanyMicrolearningUserProgress::TYPE_TOPIC :
1743
                            if(!$topic) {
1744
                                $ok = false;
1745
                            }
1746
                            break;
1747
 
1748
                        case CompanyMicrolearningUserProgress::TYPE_CAPSULE :
1749
                            if(!$topic || !$capsule) {
1750
                                $ok = false;
1751
                            }
1752
                            break;
1753
 
1754
                        case CompanyMicrolearningUserProgress::TYPE_SLIDE :
1755
                            if(!$topic || !$capsule || !$slide) {
1756
                                $ok = false;
1757
                            }
1758
                            break;
1759
 
1760
                        default :
1761
                            $ok = false;
1762
                            break;
1763
 
1764
                    }
1765
 
1766
 
1767
                    $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
1768
                    $updated_on = isset($data['updated_on'])    ? filter_var($data['updated_on'], FILTER_SANITIZE_STRING) :  '';
1769
 
1770
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
1771
                    if(!$dt) {
1772
                        $ok = false;
1773
                    } else {
1774
                        $added_on = $dt->format('Y-m-d H:i:s');
1775
                    }
1776
 
1777
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $updated_on );
1778
                    if(!$dt) {
1779
                        $ok = false;
1780
                    } else {
1781
                        $updated_on = $dt->format('Y-m-d H:i:s');
1782
                    }
1783
 
1784
                    if(!$ok) {
1785
                        return new JsonModel([
1786
                            'success' => false,
1787
                            'data' => [
1788
                                'sync_id' => $sync_id,
1789
                                'message' => 'ERROR_INVALID_PARAMETERS',
1790
                            ]
1791
                        ]);
1792
                    }
1793
 
1794
                           //$progress                   = isset($data['progress'])                  ? floatval($data['progress']) :  0;
1795
                    //$total_slides               = isset($data['total_slides'])              ? intval($data['total_slides'], 10) :  0;
1796
                    //$view_slides                = isset($data['view_slides'])               ? intval($data['view_slides'], 10) :  0;
1797
                    $returning                  = isset($data['returning'])                 ? intval($data['returning'], 10) :  0;
1798
                    $returning_after_completed  = isset($data['returning_after_completed']) ? intval($data['returning_after_completed'], 10) :  0;
1799
                    $completed                  = isset($data['completed'])                 ? intval($data['completed'], 10) :  0;
1800
 
1801
                    $progressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1802
                    $recordProgress = null;
1803
                    switch($type) {
1804
                        case CompanyMicrolearningUserProgress::TYPE_TOPIC  :
1805
                            $recordProgress = $progressMapper->fetchOneByUserIdAndTopicId($user->id, $topic->id);
1806
 
1807
                            break;
1808
 
1809
                        case CompanyMicrolearningUserProgress::TYPE_CAPSULE  :
1810
                            $recordProgress = $progressMapper->fetchOneByUseridAndCapsuleId($user->id, $capsule->id);
1811
                            break;
1812
 
1813
                        case CompanyMicrolearningUserProgress::TYPE_SLIDE  :
1814
                            $recordProgress = $progressMapper->fetchOneByUserIdAndSlideId($user->id, $slide->id);
1815
                            break;
1816
 
1817
                        default :
1818
                            $recordProgress= null;
1819
                    }
1820
 
1821
 
1822
                    if(!$recordProgress) {
1823
                        $recordProgress = new CompanyMicrolearningUserProgress();
1824
 
1825
                        $recordProgress->user_id    = $user->id;
1826
                        $recordProgress->type       = $type;
1827
                        $recordProgress->company_id = $topic->company_id;
1828
                        $recordProgress->topic_id   = $topic->id;
1829
                        $recordProgress->capsule_id = $capsule ? $capsule->id : null;
1830
                        $recordProgress->slide_id   = $slide ? $slide->id : null;
1831
                        $recordProgress->added_on   = $added_on;
1832
                    }
1833
                    $recordProgress->returning                  = $returning;
1834
                    $recordProgress->returning_after_completed  = $returning_after_completed;
1835
                    $recordProgress->completed                  = $completed;
1836
 
1837
                    if($type == CompanyMicrolearningUserProgress::TYPE_TOPIC ) {
1838
 
1839
                        $capsule_ids = [];
1840
                        $companyMicrolearningCapsuleUser = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1841
                        $records =  $companyMicrolearningCapsuleUser->fetchAllActiveByUserId($user->id);
1842
                        foreach($records as $record)
1843
                        {
1844
                            if($now >= $record->paid_from || $now <= $capsuleUser->paid_to) {
1845
                                if(!in_array($record->capsule_id, $capsule_ids)) {
1846
                                    array_push($capsule_ids, $record->capsule_id);
1847
                                }
1848
                            }
1849
                        }
1850
 
1851
                        $view_slides    = 0;
1852
                        $total_slides   = 0;
1853
                        foreach($capsule_ids as $capsule_id)
1854
                        {
1855
                            $view_slides    += $progressMapper->fetchCountAllSlideViewedByUserIdAndCapsuleId($user->id, $capsule_id);
1856
                            $total_slides   += $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($topic->company_id, $topic->id, $capsule_id);
1857
 
1858
                        }
1859
 
1860
 
1861
                        $recordProgress->progress       = $total_slides > 0 ? (($view_slides * 100) / $total_slides) : 0;
1862
                        $recordProgress->total_slides   = $total_slides;
1863
                        $recordProgress->view_slides    = $view_slides;
1864
                    }
1865
                    else if($type == CompanyMicrolearningUserProgress::TYPE_CAPSULE ) {
1866
                        $view_slides    = $progressMapper->fetchCountAllSlideViewedByUserIdAndCapsuleId($user->id, $capsule->id);
1867
                        $total_slides   = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($topic->company_id, $capsule->topic_id, $capsule->id);
1868
 
1869
                        $recordProgress->progress       = $total_slides > 0 ? (($view_slides * 100) / $total_slides) : 0;
1870
                        $recordProgress->total_slides   = $total_slides;
1871
                        $recordProgress->view_slides    = $view_slides;
1872
                    }
1873
                    else {
1874
                        $recordProgress->progress       = 0;
1875
                        $recordProgress->total_slides   = 0;
1876
                        $recordProgress->view_slides    = 0;
1877
                    }
1878
 
1879
                    $recordProgress->updated_on = $updated_on;
1880
 
1881
 
1882
 
1883
                    if($recordProgress->id) {
1884
                        $result = $progressMapper->update($recordProgress);
1885
                    } else {
1886
                        $result = $progressMapper->insert($recordProgress);
1887
                    }
1888
 
1889
                    if($result) {
1890
                        return new JsonModel([
1891
                            'success' => true,
1892
                            'data' => [
1893
                                'sync_id' => $sync_id
1894
                            ]
1895
                        ]);
1896
                    } else {
1897
                        return new JsonModel([
1898
                            'success' => false,
1899
                            'data' => [
1900
                                'sync_id' => $sync_id,
1901
                                'message' => $progressMapper->getError()
1902
                            ]
1903
                        ]);
1904
                    }
1905
                }
1906
 
1907
 
1908
 
1909
                if($sync_type == 'microlearning-userlog') {
1910
                    $activity   = isset($data['activity'])      ? filter_var($data['activity'], FILTER_SANITIZE_STRING)  :  '';
1911
                    $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
1912
 
1913
 
1914
                    if(empty($activity)) {
1915
                        $ok = false;
1916
                    }
1917
 
1918
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
1919
                    if(!$dt) {
1920
                        $ok = false;
1921
                    } else {
1922
                        $added_on = $dt->format('Y-m-d H:i:s');
1923
                    }
1924
 
1925
                    if(!$ok) {
1926
                        return new JsonModel([
1927
                            'success' => false,
1928
                            'data' => [
1929
                                'sync_id' => $sync_id,
1930
                                'message' => 'ERROR_INVALID_PARAMETERS',
1931
                            ]
1932
                        ]);
1933
                    }
1934
 
1935
                    $userLog = new CompanyMicrolearningUserLog();
1936
                    $userLog->activity      = $activity;
1937
                    $userLog->user_id       = $user->id;
1938
                    $userLog->company_id    = $topic->company_id;
1939
                    $userLog->topic_id      = $topic->id;
1940
                    $userLog->capsule_id    = $capsule ? $capsule->id : null;
1941
                    $userLog->slide_id      = $slide ? $slide->id : null;
1942
                    $userLog->added_on      = $added_on;
1943
 
1944
 
1945
 
1946
                    $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
1947
                    if($userLogMapper->insert($userLog)) {
1948
                        return new JsonModel([
1949
                            'success' => true,
1950
                            'data' => [
1951
                                'sync_id' => $sync_id
1952
                            ]
1953
                        ]);
1954
                    } else {
1955
                        return new JsonModel([
1956
                            'success' => false,
1957
                            'data' => [
1958
                                'sync_id' => $sync_id,
1959
                                'message' => $userLogMapper->getError()
1960
                            ]
1961
                        ]);
1962
                    }
1963
                }
1964
 
1965
            }
1966
 
1967
 
1968
 
1969
 
1970
            if($user_uuid && $sync_type == 'userlog' && $device->application_id = Application::TWOGETSKILLS) {
1971
 
1972
                $userMapper = UserMapper::getInstance($this->adapter);
1973
                $user = $userMapper->fetchOneByUuid($user_uuid);
1974
 
1975
                if(!$user) {
1976
                    return new JsonModel([
1977
                        'success' => false,
1978
                        'data' => [
1979
                            'sync_id' => $sync_id,
1980
                            'message' => 'ERROR_USER_NOT_FOUND',
1981
                            'fatal' => true
1982
                        ]
1983
                    ]);
1984
                }
1985
 
1986
 
1987
                if($user->status != User::STATUS_ACTIVE) {
1988
                    return new JsonModel([
1989
                        'success' => false,
1990
                        'data' => [
1991
                            'sync_id' => $sync_id,
1992
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
1993
                            'fatal' => true
1994
                        ]
1995
                    ]);
1996
                }
1997
 
1998
                $activity   = isset($data['activity'])      ? filter_var($data['activity'], FILTER_SANITIZE_STRING)  :  '';
1999
                $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
2000
 
2001
                if(empty($activity)) {
2002
                    $ok = false;
2003
                }
2004
 
2005
                $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2006
                if(!$dt) {
2007
                    $ok = false;
2008
                } else {
2009
                    $added_on = $dt->format('Y-m-d H:i:s');
2010
                }
2011
 
2012
                if(!$ok) {
2013
                    return new JsonModel([
2014
                        'success' => false,
2015
                        'data' => [
2016
                            'sync_id' => $sync_id,
2017
                            'message' => 'ERROR_INVALID_PARAMETERS',
2018
                        ]
2019
                    ]);
2020
                }
2021
 
2022
                $userLog = new CompanyMicrolearningUserLog();
2023
                $userLog->company_id = null;
2024
                $userLog->user_id = $user->id;
2025
                $userLog->activity = $activity;
2026
                $userLog->added_on = $added_on;
2027
 
2028
 
2029
                $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2030
                if($userLogMapper->insert($userLog)) {
2031
                    return new JsonModel([
2032
                        'success' => true,
2033
                        'data' => [
2034
                            'sync_id' => $sync_id
2035
                        ]
2036
                    ]);
2037
                } else {
2038
                    return new JsonModel([
2039
                        'success' => false,
2040
                        'data' => [
2041
                            'sync_id' => $sync_id,
2042
                            'message' => $userLogMapper->getError()
2043
                        ]
2044
                    ]);
2045
                }
2046
            }
2047
 
2048
            return new JsonModel([
2049
                'success' => true,
2050
                'data' => [
2051
                    'sync_id' => $sync_id
2052
                ]
2053
            ]);
2054
 
2055
        }
2056
 
2057
        return new JsonModel([
2058
            'success' => false,
2059
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2060
        ]);
2061
    }
2062
 
2063
 
2064
    public function syncBatchAction()
2065
    {
2066
        $request = $this->getRequest();
2067
 
2068
        if($request->isPost()) {
2069
 
41 efrain 2070
 
1 www 2071
 
2072
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
2073
 
2074
            $device_uuid = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
2075
            $max_records = filter_var($this->params()->fromPost('max_records', 0), FILTER_SANITIZE_NUMBER_INT);
41 efrain 2076
 
1 www 2077
            $ok = $device_uuid && strlen($device_uuid) == 36 && $max_records;
2078
 
2079
            if(!$ok) {
2080
                return new JsonModel([
2081
                    'success' => false,
2082
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
2083
                ]);
2084
            }
2085
 
2086
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
2087
            $device = $deviceMapper->fetchOne($device_uuid);
2088
 
2089
 
2090
            if(!$device) {
2091
                return new JsonModel([
2092
                    'success' => false,
2093
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
2094
                ]);
2095
            } else {
2096
                $device->ip = Functions::getUserIP();
2097
                $deviceMapper->update($device);
2098
            }
41 efrain 2099
 
2100
 
1 www 2101
 
41 efrain 2102
 
2103
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
2104
 
2105
 
2106
 
1 www 2107
            $result_sync_ids = [];
2108
 
2109
 
2110
 
2111
 
16 efrain 2112
            $users = [];
2113
            $companies = [];
2114
            $company_services = [];
2115
            $topics = [];
2116
            $capsules = [];
2117
            $capsule_users = [];
2118
            $slides = [];
2119
            $quizzes = [];
2120
            $questions = [];
2121
            $answers = [];
2122
 
2123
            $userMapper = UserMapper::getInstance($this->adapter);
2124
            $companyMapper = CompanyMapper::getInstance($this->adapter);
2125
            $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
2126
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
2127
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
2128
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
2129
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
2130
            $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
2131
            $questionMapper = CompanyMicrolearningQuestionMapper::getInstance($this->adapter);
2132
            $answerMapper = CompanyMicrolearningAnswerMapper::getInstance($this->adapter);
2133
 
2134
 
2135
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
2136
            $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2137
 
1 www 2138
            for($i = 1; $i <= $max_records; $i++)
2139
            {
2140
                $sync_id        = filter_var($this->params()->fromPost('record_sync_id' . $i, ''), FILTER_SANITIZE_NUMBER_INT);
2141
                $record_data    = $this->params()->fromPost('record_data' . $i, '');
2142
 
2143
                if(empty($record_data) || empty($sync_id )) {
2144
                    continue;
2145
                }
41 efrain 2146
 
1 www 2147
 
45 efrain 2148
 
1 www 2149
                $record         = json_decode($record_data, true);
2150
                $sync_type      = isset($record['sync_type']) ? filter_var($record['sync_type'],  FILTER_SANITIZE_STRING) : '';
2151
                $user_uuid      = isset($record['user_uuid']) ? filter_var($record['user_uuid'],  FILTER_SANITIZE_STRING) : '';
2152
                $company_uuid   = isset($record['company_uuid']) ? filter_var($record['company_uuid'], FILTER_SANITIZE_STRING) : '';
2153
 
2154
                if(!$sync_id) {
2155
                    continue;
2156
                }
2157
 
45 efrain 2158
                $syncLog = new SyncLog();
2159
                $syncLog->data = $record_data;
2160
                $syncLog->type = $sync_type;
2161
                $syncLog->device_uuid = $device->id;
2162
                $syncLog->ip = Functions::getUserIP();
2163
                $syncLogMapper->insert($syncLog);
2164
 
1 www 2165
                /***** INICIO MICROLEARNING *****/
2166
 
2167
                if($user_uuid && $device->application_id = Application::TWOGETSKILLS  && $company_uuid && in_array($sync_type, ['microlearning-progress', 'microlearning-userlog', 'microlearning-quiz'])) {
2168
 
16 efrain 2169
 
2170
                    if(isset($users[$user_uuid])) {
2171
                        $user = $users[$user_uuid];
2172
                    } else {
2173
 
2174
                        $user = $userMapper->fetchOneByUuid($user_uuid);
2175
                        if($user) {
2176
                            $users[$user_uuid] = $user;
2177
                        }
2178
                    }
2179
 
2180
 
1 www 2181
                    if(!$user) {
2182
                        array_push($result_sync_ids, [
2183
                            'success' => false,
2184
                            'sync_id' => $sync_id,
2185
                            'message' => 'ERROR_USER_NOT_FOUND',
2186
                            'fatal' => true
2187
                        ]);
2188
                        continue;
2189
                    }
2190
 
2191
 
2192
                    if($user->status != User::STATUS_ACTIVE) {
2193
                        array_push($result_sync_ids, [
2194
                            'success' => false,
2195
                            'sync_id' => $sync_id,
2196
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
2197
                            'fatal' => true
2198
                        ]);
2199
                        continue;
2200
                    }
2201
 
16 efrain 2202
 
2203
                    if(isset($companies[$company_uuid])) {
2204
                        $company = $companies[$company_uuid];
2205
                    } else {
2206
                        $company = $companyMapper->fetchOneByUuid($company_uuid);
2207
                        if($company) {
2208
                            $companies[$company_uuid] = $company;
2209
                        }
2210
                    }
2211
 
2212
 
2213
 
2214
 
1 www 2215
                    if(!$company) {
2216
                        array_push($result_sync_ids, [
2217
                            'success' => false,
2218
                            'sync_id' => $sync_id,
2219
                            'message' => 'ERROR_COMPANY_NOT_FOUND',
2220
                            'fatal' => true
2221
                        ]);
2222
                        continue;
2223
                    }
2224
 
2225
                    if($company->status != Company::STATUS_ACTIVE) {
2226
                        array_push($result_sync_ids, [
2227
                            'success' => false,
2228
                            'sync_id' => $sync_id,
2229
                            'message' => 'ERROR_COMPANY_IS_NOT_FOUND',
2230
                            'fatal' => true
2231
                        ]);
2232
                        continue;
2233
                    }
2234
 
2235
 
2236
 
16 efrain 2237
                    $key = $company->id . '-' .  Service::MICRO_LEARNING;
2238
                    if(isset($company_services[$key])) {
2239
                        $companyService = $company_services[$key];
2240
                    } else {
2241
                        $companyService = $companyServiceMapper->fetchOneByCompanyIdAndServiceId($company->id, Service::MICRO_LEARNING);
2242
                        if($companyService) {
2243
                            $company_services[$key] = $companyService;
2244
                        }
2245
                    }
1 www 2246
 
2247
                    if(!$companyService) {
2248
                        array_push($result_sync_ids, [
2249
                            'success' => false,
2250
                            'sync_id' => $sync_id,
2251
                            'message' => 'ERROR_COMPANY_SERVICE_NOT_FOUND',
2252
                            'fatal' => true
2253
                        ]);
2254
                        continue;
2255
                    }
2256
 
2257
                    $serviceActive = true;
2258
                    $now = date('Y-m-d H:i:s');
2259
                    if($companyService->status == CompanyService::ACTIVE) {
2260
 
2261
                        if($now < $companyService->paid_from || $now > $companyService->paid_to) {
2262
                            $serviceActive = false;
2263
                        }
2264
 
2265
                    } else {
2266
                        $serviceActive = false;
2267
                    }
2268
 
2269
                    if( !$serviceActive) {
2270
                        array_push($result_sync_ids, [
2271
                            'success' => false,
2272
                            'sync_id' => $sync_id,
2273
                            'message' => 'ERROR_COMPANY_SERVICE_IS_NOT_ACTIVE',
2274
                            'fatal' => true
2275
                        ]);
2276
                        continue;
2277
                    }
2278
 
16 efrain 2279
 
1 www 2280
                    $topic_uuid = isset($record['topic_uuid']) ? filter_var($record['topic_uuid'], FILTER_SANITIZE_STRING) :  '';
2281
                    if($topic_uuid) {
2282
 
16 efrain 2283
                        if(isset($topics[$topic_uuid])) {
2284
                            $topic = $topics[$topic_uuid];
2285
                        } else {
2286
                            $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2287
                            if($topic) {
2288
                                $topics[$topic_uuid] = $topic;
2289
                            }
2290
                        }
2291
 
1 www 2292
                        if(!$topic) {
2293
                            array_push($result_sync_ids, [
2294
                                'success' => false,
2295
                                'sync_id' => $sync_id,
2296
                                'message' => 'ERROR_TOPIC_NOT_FOUND',
2297
                            ]);
2298
                            continue;
2299
                        }
2300
 
2301
                        if($topic->company_id != $company->id) {
2302
                            array_push($result_sync_ids, [
2303
                                'success' => false,
2304
                                'sync_id' => $sync_id,
2305
                                'message' => 'ERROR_INVALID_PARAMETERS_TOPIC_COMPANY',
2306
                            ]);
2307
                            continue;
2308
                        }
2309
 
2310
                    } else {
2311
                        $topic = null;
2312
                    }
2313
 
2314
                    $capsule_uuid     = isset($record['capsule_uuid']) ? filter_var($record['capsule_uuid'], FILTER_SANITIZE_STRING) :  '';
16 efrain 2315
 
1 www 2316
                    if($capsule_uuid) {
2317
 
16 efrain 2318
                        if(isset($capsules[$capsule_uuid])) {
2319
                            $capsule = $capsules[$capsule_uuid];
2320
                        } else {
2321
                            $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
2322
                            if($capsule) {
2323
                                $capsules[$capsule_uuid] = $capsule;
2324
                            }
2325
                        }
1 www 2326
                        if(!$capsule) {
2327
                            array_push($result_sync_ids, [
2328
                                'success' => false,
2329
                                'sync_id' => $sync_id,
2330
                                'message' => 'ERROR_CAPSULE_NOT_FOUND',
2331
                            ]);
2332
                            continue;
2333
                        }
2334
 
2335
                        if(!$topic || $capsule->topic_id != $topic->id) {
2336
                            array_push($result_sync_ids, [
2337
                                'success' => false,
2338
                                'sync_id' => $sync_id,
2339
                                'message' => 'ERROR_INVALID_PARAMETERS_CAPSULE_TOPIC',
2340
                            ]);
2341
                            continue;
2342
                        }
2343
                    } else {
2344
                        $capsule = null;
2345
                    }
2346
 
2347
                    if($capsule) {
2348
 
2349
                        $capsuleActive = true;
2350
 
16 efrain 2351
                        $key = $user->id . '-' . $capsule->id;
1 www 2352
 
16 efrain 2353
                        if(isset($capsule_users[$key])) {
2354
                            $capsuleUser = $capsule_users[$key];
2355
                        } else {
2356
 
2357
                            $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
2358
                            if($capsuleUser) {
2359
                                $capsule_users[$key] = $capsuleUser;
2360
                            }
2361
 
2362
                        }
2363
 
1 www 2364
                        $now = date('Y-m-d H:i:s');
2365
                        if($capsuleUser && in_array($capsuleUser->access, [CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED,CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD ])) {
2366
 
2367
 
2368
                            if($capsuleUser->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
2369
 
2370
                                if($now < $capsuleUser->paid_from || $now > $capsuleUser->paid_to) {
2371
                                    $capsuleActive = false;;
2372
                                }
2373
                            }
2374
 
2375
                        } else {
2376
                            $capsuleActive = false;
2377
                        }
2378
 
2379
                        if(!$capsuleActive) {
2380
                            array_push($result_sync_ids, [
2381
                                'success' => false,
2382
                                'sync_id' => $sync_id,
2383
                                'message' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
2384
                            ]);
2385
                            continue;
2386
                        }
2387
                    }
2388
 
16 efrain 2389
 
1 www 2390
                    $slide_uuid      = isset($record['slide_uuid']) ? filter_var($record['slide_uuid'], FILTER_SANITIZE_STRING) :  '';
2391
                    if($slide_uuid) {
16 efrain 2392
 
2393
                        if(isset($slides[$slide_uuid])) {
2394
                            $slide = $slides[$slide_uuid];
2395
                        } else {
2396
 
2397
                            $slide = $slideMapper->fetchOneByUuid($slide_uuid);
2398
                            if($slide) {
2399
                                $slides[$slide_uuid] = $slide;
2400
                            }
2401
                        }
1 www 2402
                        if(!$slide) {
2403
                            array_push($result_sync_ids, [
2404
                                'success' => false,
2405
                                'sync_id' => $sync_id,
2406
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
2407
                            ]);
2408
                            continue;
2409
                        }
2410
 
2411
                        if(!$capsule || $slide->capsule_id != $capsule->id) {
2412
                            array_push($result_sync_ids, [
2413
                                'success' => false,
2414
                                'sync_id' => $sync_id,
2415
                                'message' => 'ERROR_INVALID_PARAMETERS_SLIDE_CAPSULE',
2416
                            ]);
2417
                            continue;
2418
                        }
2419
                    } else {
2420
                        $slide = null;
2421
                    }
2422
 
2423
                    if($sync_type == 'microlearning-quiz') {
2424
                        $ok = true;
2425
 
2426
                        $quiz_uuid = isset($record['quiz_uuid']) ? $record['quiz_uuid'] : '';
16 efrain 2427
 
2428
                        if(isset($quizzes[$quiz_uuid])) {
2429
                            $quiz = $quizzes[$quiz_uuid];
2430
                        } else {
2431
                            $quiz = $quizMapper->fetchOneByUuid($quiz_uuid);
2432
                            if($quiz) {
2433
                                $quizzes[$quiz_uuid] = $quiz;
2434
                            }
2435
                        }
1 www 2436
                        if(!$quiz) {
2437
                            array_push($result_sync_ids, [
2438
                                'success' => false,
2439
                                'sync_id' => $sync_id,
2440
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
2441
                            ]);
2442
                            continue;
2443
                        }
2444
 
2445
                        if(!$capsule || $slide->capsule_id != $capsule->id) {
2446
                            array_push($result_sync_ids, [
2447
                                'success' => false,
2448
                                'sync_id' => $sync_id,
2449
                                'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_SLIDE',
2450
                            ]);
2451
                            continue;
2452
                        }
2453
 
2454
                        $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2455
 
2456
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2457
                        if(!$dt) {
2458
                            $ok = false;
2459
                        } else {
2460
                            $added_on = $dt->format('Y-m-d H:i:s');
2461
                        }
2462
 
2463
                        if(isset($record['points'])) {
2464
                            $points = intval($record['points'], 10);
2465
                        } else {
2466
                            $ok = false;
2467
                        }
2468
 
2469
                        if(isset($record['pass'])) {
2470
                            $status = $record['pass'] == 'yes' ? CompanyMicrolearningUserQuiz::STATUS_PASS : CompanyMicrolearningUserQuiz::STATUS_FAIL;
2471
                        } else {
2472
                            $ok = false;
2473
                        }
2474
 
2475
                        if(!$ok) {
2476
                            array_push($result_sync_ids, [
2477
                                'success' => false,
2478
                                'sync_id' => $sync_id,
2479
                                'message' => 'ERROR_INVALID_PARAMETERS',
2480
                            ]);
2481
                            continue;
2482
                        }
2483
 
2484
                        $array_response = [];
2485
                        $response = isset($record['response']) ? intval($record['response'], 10) : 0;
2486
                        for($i = 0; $i < $response; $i++)
2487
                        {
2488
                            $question_uuid = isset($record["response_{$i}_question_uuid"]) ? $record["response_{$i}_question_uuid"] : '';
2489
                            $answer_uuid = isset($record["response_{$i}_answer_uuid"]) ? $record["response_{$i}_answer_uuid"] : '';
2490
                            $value = isset($record["response_{$i}_value"]) ?  intval($record["response_{$i}_value"], 10) : 0;
2491
                            $points = isset($record["response_{$i}_points"]) ?  intval($record["response_{$i}_points"], 10) : 0;
2492
 
16 efrain 2493
 
2494
                            if(isset($questions[$question_uuid])) {
2495
                                $question = $questions[$question_uuid];
2496
                            } else {
2497
                                $question = $questionMapper->fetchOneByUuid($question_uuid);
2498
                                if($question) {
2499
                                    $questions[$question_uuid] = $question;
2500
                                }
2501
                            }
2502
 
2503
                            if(!$question || $question->quiz_id != $quiz->id) {
2504
                                array_push($result_sync_ids, [
2505
                                    'success' => false,
2506
                                    'sync_id' => $sync_id,
2507
                                    'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_QUESTION_SLIDE',
1 www 2508
                                ]);
16 efrain 2509
                                continue;
2510
                            }
2511
 
2512
                            if(isset($answers[$answer_uuid])) {
2513
                                $answer = $answers[$answer_uuid];
2514
                            } else {
2515
                                $answer = $answerMapper->fetchOneByUuid($answer_uuid);
2516
                                if($answer) {
2517
                                    $answers[$answer_uuid] = $answer;
2518
                                }
2519
                            }
2520
 
2521
                            if($answer && $answer->question_id != $question->id) {
2522
                                array_push($result_sync_ids, [
2523
                                    'success' => false,
2524
                                    'sync_id' => $sync_id,
2525
                                    'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_ANSWER_SLIDE',
2526
                                ]);
2527
                                continue;
2528
                            }
2529
 
2530
                            array_push($array_response, [
2531
                                'question_uuid' => $question_uuid,
2532
                                'answer_uuid' => $answer_uuid,
2533
                                'value' => $value,
2534
                                'points' => $points
2535
                            ]);
1 www 2536
                        }
2537
 
2538
                        $userQuiz = new CompanyMicrolearningUserQuiz();
2539
                        $userQuiz->company_id = $company->id;
2540
                        $userQuiz->topic_id = $topic->id;
2541
                        $userQuiz->capsule_id = $capsule->id;
2542
                        $userQuiz->slide_id = $slide->id;
2543
                        $userQuiz->quiz_id = $quiz->id;
2544
                        $userQuiz->user_id = $user->id;
2545
                        $userQuiz->added_on = $added_on;
2546
                        $userQuiz->points = $points;
2547
                        $userQuiz->status = $status;
2548
                        $userQuiz->response = json_encode($array_response);
2549
 
2550
                        $userQuizMapper = CompanyMicrolearningUserQuizMapper::getInstance($this->adapter);
2551
 
2552
                        if($userQuizMapper->insert($userQuiz)) {
2553
                            array_push($result_sync_ids, [
2554
                                'success' => true,
2555
                                'sync_id' => $sync_id
2556
                            ]);
2557
                        } else {
2558
                            array_push($result_sync_ids, [
2559
                                'success' => false,
2560
                                'sync_id' => $sync_id,
2561
                                'message' => $userQuizMapper->getError()
2562
                            ]);
2563
                        }
2564
                        continue;
2565
                    }
2566
 
2567
                    if($sync_type == 'microlearning-progress') {
2568
                        $ok = true;
2569
 
2570
                        $type = isset($record['type']) ? $record['type'] : '';
2571
                        switch($type)
2572
                        {
2573
                            case CompanyMicrolearningUserProgress::TYPE_TOPIC :
2574
                                if(!$topic) {
2575
                                    $ok = false;
2576
                                }
2577
                                break;
2578
 
2579
                            case CompanyMicrolearningUserProgress::TYPE_CAPSULE :
2580
                                if(!$topic || !$capsule) {
2581
                                    $ok = false;
2582
                                }
2583
                                break;
2584
 
2585
                            case CompanyMicrolearningUserProgress::TYPE_SLIDE :
2586
                                if(!$topic || !$capsule || !$slide) {
2587
                                    $ok = false;
2588
                                }
2589
                                break;
2590
 
2591
                            default :
2592
                                $ok = false;
2593
                                break;
2594
                        }
2595
 
2596
                        $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2597
                        $updated_on = isset($record['updated_on'])    ? filter_var($record['updated_on'], FILTER_SANITIZE_STRING) :  '';
2598
 
2599
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2600
                        if(!$dt) {
2601
                            $ok = false;
2602
                        } else {
2603
                            $added_on = $dt->format('Y-m-d H:i:s');
2604
                        }
2605
 
2606
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $updated_on );
2607
                        if(!$dt) {
2608
                            $ok = false;
2609
                        } else {
2610
                            $updated_on = $dt->format('Y-m-d H:i:s');
2611
                        }
2612
 
2613
                        if(!$ok) {
2614
                            array_push($result_sync_ids, [
2615
                                'success' => false,
2616
                                'sync_id' => $sync_id,
2617
                                'message' => 'ERROR_INVALID_PARAMETERS',
2618
                            ]);
2619
                            continue;
2620
                        }
2621
 
18 efrain 2622
                        $progress                   = isset($record['progress'])                  ? floatval($record['progress']) :  0;
2623
                        $total_slides               = isset($record['total_slides'])              ? intval($record['total_slides'], 10) :  0;
2624
                        $view_slides                = isset($record['view_slides'])               ? intval($record['view_slides'], 10) :  0;
1 www 2625
                        $returning                  = isset($record['returning'])                 ? intval($record['returning'], 10) :  0;
2626
                        $returning_after_completed  = isset($record['returning_after_completed']) ? intval($record['returning_after_completed'], 10) :  0;
2627
                        $completed                  = isset($record['completed'])                 ? intval($record['completed'], 10) :  0;
2628
 
16 efrain 2629
 
1 www 2630
                        $recordProgress = null;
2631
                        switch($type) {
2632
                            case CompanyMicrolearningUserProgress::TYPE_TOPIC  :
16 efrain 2633
                                $recordProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($user->id, $topic->id);
1 www 2634
 
2635
                                break;
2636
 
2637
                            case CompanyMicrolearningUserProgress::TYPE_CAPSULE  :
16 efrain 2638
                                $recordProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($user->id, $capsule->id);
1 www 2639
                                break;
2640
 
2641
                            case CompanyMicrolearningUserProgress::TYPE_SLIDE  :
16 efrain 2642
                                $recordProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($user->id, $slide->id);
1 www 2643
                                break;
2644
 
2645
                            default :
2646
                                $recordProgress= null;
2647
                        }
2648
 
2649
 
2650
                        if(!$recordProgress) {
2651
                            $recordProgress = new CompanyMicrolearningUserProgress();
2652
 
2653
                            $recordProgress->user_id    = $user->id;
2654
                            $recordProgress->type       = $type;
2655
                            $recordProgress->company_id = $topic->company_id;
2656
                            $recordProgress->topic_id   = $topic->id;
2657
                            $recordProgress->capsule_id = $capsule ? $capsule->id : null;
2658
                            $recordProgress->slide_id   = $slide ? $slide->id : null;
2659
                            $recordProgress->added_on   = $added_on;
43 efrain 2660
                        }
2661
                        /*
2662
                        else {
16 efrain 2663
 
2664
                            if($recordProgress->updated_on > $updated_on) {
2665
                                array_push($result_sync_ids, [
2666
                                    'success' => true,
2667
                                    'sync_id' => $sync_id,
2668
                                ]);
2669
                                continue;
2670
                            }
2671
 
2672
 
2673
 
43 efrain 2674
                        }*/
1 www 2675
                        $recordProgress->returning                  = $returning;
2676
                        $recordProgress->returning_after_completed  = $returning_after_completed;
2677
                        $recordProgress->completed                  = $completed;
2678
 
2679
                        if($type == CompanyMicrolearningUserProgress::TYPE_TOPIC ) {
2680
 
2681
                            $capsule_ids = [];
2682
                            $companyMicrolearningCapsuleUser = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
2683
                            $records =  $companyMicrolearningCapsuleUser->fetchAllActiveByUserId($user->id);
2684
                            foreach($records as $record)
2685
                            {
2686
                                if($now >= $record->paid_from || $now <= $capsuleUser->paid_to) {
2687
                                    if(!in_array($record->capsule_id, $capsule_ids)) {
2688
                                        array_push($capsule_ids, $record->capsule_id);
2689
                                    }
2690
                                }
2691
                            }
18 efrain 2692
 
2693
                            $recordProgress->progress       = $progress;
1 www 2694
                            $recordProgress->total_slides   = $total_slides;
2695
                            $recordProgress->view_slides    = $view_slides;
2696
                        }
2697
                        else if($type == CompanyMicrolearningUserProgress::TYPE_CAPSULE ) {
18 efrain 2698
 
2699
                            $recordProgress->progress       = $progress;
1 www 2700
                            $recordProgress->total_slides   = $total_slides;
2701
                            $recordProgress->view_slides    = $view_slides;
2702
                        }
2703
                        else {
2704
                            $recordProgress->progress       = 0;
2705
                            $recordProgress->total_slides   = 0;
2706
                            $recordProgress->view_slides    = 0;
2707
                        }
2708
 
2709
                        $recordProgress->updated_on = $updated_on;
2710
 
2711
 
2712
 
2713
                        if($recordProgress->id) {
16 efrain 2714
                            $result = $userProgressMapper->update($recordProgress);
1 www 2715
                        } else {
16 efrain 2716
                            $result = $userProgressMapper->insert($recordProgress);
1 www 2717
                        }
2718
 
2719
                        if($result) {
2720
                            array_push($result_sync_ids, [
2721
                                'success' => true,
2722
                                'sync_id' => $sync_id
2723
                            ]);
2724
                        } else {
2725
                            array_push($result_sync_ids, [
2726
                                'success' => false,
2727
                                'sync_id' => $sync_id,
16 efrain 2728
                                'message' => $userProgressMapper->getError()
1 www 2729
                            ]);
2730
                        }
2731
                        continue;
2732
                    }
2733
 
2734
 
2735
 
2736
                    if($sync_type == 'microlearning-userlog') {
2737
                        $activity   = isset($record['activity'])      ? filter_var($record['activity'], FILTER_SANITIZE_STRING)  :  '';
2738
                        $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2739
 
2740
 
2741
                        if(empty($activity)) {
2742
                            $ok = false;
2743
                        }
2744
 
2745
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2746
                        if(!$dt) {
2747
                            $ok = false;
2748
                        } else {
2749
                            $added_on = $dt->format('Y-m-d H:i:s');
2750
                        }
2751
 
2752
                        if(!$ok) {
2753
                            array_push($result_sync_ids, [
2754
                                'success' => false,
2755
                                'sync_id' => $sync_id,
2756
                                'message' => 'ERROR_INVALID_PARAMETERS',
2757
                            ]);
2758
                            continue;
2759
                        }
2760
 
2761
 
2762
 
2763
 
16 efrain 2764
                        $userLog = $userLogMapper->fetchLastBy($user->id);
2765
                        if($userLog) {
2766
                            $insert = $userLog->added_on <= $added_on;
2767
                        } else {
2768
                            $insert = true;
2769
                        }
2770
 
2771
 
2772
                        if($insert) {
2773
 
2774
                            $userLog = new CompanyMicrolearningUserLog();
2775
                            $userLog->activity      = $activity;
2776
                            $userLog->user_id       = $user->id;
2777
                            $userLog->company_id    = $topic->company_id;
2778
                            $userLog->topic_id      = $topic->id;
2779
                            $userLog->capsule_id    = $capsule ? $capsule->id : null;
2780
                            $userLog->slide_id      = $slide ? $slide->id : null;
2781
                            $userLog->added_on      = $added_on;
2782
 
2783
 
2784
 
2785
 
2786
                            if($userLogMapper->insert($userLog)) {
2787
                                array_push($result_sync_ids, [
2788
                                    'success' => true,
2789
                                    'sync_id' => $sync_id
2790
                                ]);
2791
                            } else {
2792
                                array_push($result_sync_ids, [
2793
                                    'success' => false,
2794
                                    'sync_id' => $sync_id,
2795
                                    'message' => $userLogMapper->getError()
2796
                                ]);
2797
                            }
2798
                        } else {
1 www 2799
                            array_push($result_sync_ids, [
2800
                                'success' => true,
16 efrain 2801
                                'sync_id' => $sync_id
1 www 2802
                            ]);
2803
                        }
2804
                        continue;
2805
                    }
2806
 
2807
                }
2808
 
2809
                /***** FIN MICROLEARNING *****/
2810
 
2811
 
2812
                /***** INICIO LOG DE USUARIO GENERAL *****/
2813
 
2814
                if($user_uuid && $sync_type == 'userlog' && $device->application_id = Application::TWOGETSKILLS) {
2815
 
2816
 
16 efrain 2817
                    if(isset($users[$user_uuid])) {
2818
                        $user = $users[$user_uuid];
2819
                    } else {
2820
                        $user = $userMapper->fetchOneByUuid($user_uuid);
2821
                        if($user) {
2822
                            $users[$user_uuid] = $user;
2823
                        }
2824
                    }
2825
 
2826
 
2827
 
2828
 
1 www 2829
                    if(!$user) {
2830
                        array_push($result_sync_ids, [
2831
                            'success' => false,
2832
                            'sync_id' => $sync_id,
2833
                            'message' => 'ERROR_USER_NOT_FOUND',
2834
                            'fatal' => true
2835
                        ]);
2836
                        continue;
2837
                    }
2838
 
2839
 
2840
                    if($user->status != User::STATUS_ACTIVE) {
2841
                        array_push($result_sync_ids, [
2842
                            'success' => false,
2843
                            'sync_id' => $sync_id,
2844
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
2845
                            'fatal' => true
2846
                        ]);
2847
                        continue;
2848
                    }
2849
 
2850
                    $activity   = isset($record['activity'])      ? filter_var($record['activity'], FILTER_SANITIZE_STRING)  :  '';
2851
                    $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2852
 
2853
                    if(empty($activity)) {
2854
                        $ok = false;
2855
                    }
2856
 
2857
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2858
                    if(!$dt) {
2859
                        $ok = false;
2860
                    } else {
2861
                        $added_on = $dt->format('Y-m-d H:i:s');
2862
                    }
2863
 
2864
                    if(!$ok) {
2865
                        array_push($result_sync_ids, [
2866
                            'success' => false,
2867
                            'sync_id' => $sync_id,
2868
                            'message' => 'ERROR_INVALID_PARAMETERS',
2869
                        ]);
2870
                        continue;
2871
                    }
2872
 
2873
 
16 efrain 2874
                    $userLog = $userLogMapper->fetchLastBy($user->id);
2875
                    if($userLog) {
2876
                        $insert = $userLog->added_on <= $added_on;
2877
                    } else {
2878
                        $insert = true;
2879
                    }
1 www 2880
 
16 efrain 2881
 
2882
                    if($insert) {
2883
                        $userLog = new CompanyMicrolearningUserLog();
2884
                        $userLog->company_id = null;
2885
                        $userLog->user_id = $user->id;
2886
                        $userLog->activity = $activity;
2887
                        $userLog->added_on = $added_on;
2888
 
2889
 
2890
                        $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2891
                        if($userLogMapper->insert($userLog)) {
2892
                            array_push($result_sync_ids, [
2893
                                'success' => true,
2894
                                'sync_id' => $sync_id
2895
                            ]);
2896
                        } else {
2897
                            array_push($result_sync_ids, [
2898
                                'success' => false,
2899
                                'sync_id' => $sync_id,
2900
                                'message' => $userLogMapper->getError()
2901
                            ]);
2902
                        }
2903
                    } else {
1 www 2904
                        array_push($result_sync_ids, [
2905
                            'success' => true,
2906
                            'sync_id' => $sync_id
2907
                        ]);
2908
                    }
2909
 
16 efrain 2910
 
2911
 
1 www 2912
                    continue;
2913
                }
2914
 
2915
                /***** FIN LOG DE USUARIO GENERAL ******/
2916
            }
2917
 
2918
            if( $result_sync_ids) {
2919
                return new JsonModel([
2920
                    'success' => true,
2921
                    'data' => $result_sync_ids
2922
                ]);
2923
            } else {
2924
                return new JsonModel([
2925
                    'success' => false,
2926
                    'data' => 'ERROR_INVALID_PARAMETERS'
2927
                ]);
2928
            }
2929
 
2930
 
2931
        }
2932
 
2933
        return new JsonModel([
2934
            'success' => false,
2935
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2936
        ]);
2937
    }
2938
 
2939
    /**
2940
     *
2941
     * @param User $user
2942
     * @param boolean $includeLogs
2943
     * @param boolean $includeProgress
2944
     * @return array[]
2945
     */
2946
    private function getSyncData($user, $includeLogs = true, $includeProgress = true)
2947
    {
2948
 
2949
        $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
2950
 
2951
        $data = [
2952
            'userlog'   => [],
2953
            'progress'  => [],
2954
            'topics'    => [],
2955
            'quizzes'   => [],
47 efrain 2956
            'extended'  => [],
1 www 2957
        ];
2958
 
2959
 
2960
        $companies = [];
2961
        $companyMapper = CompanyMapper::getInstance($this->adapter);
2962
 
2963
        $topics = [];
2964
        $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
2965
 
2966
        $capsules = [];
2967
        $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
2968
 
2969
        $slides = [];
2970
        $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
2971
 
2972
        $quizzes = [];
2973
        $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
2974
 
2975
        $questions = [];
2976
        $questionMapper = CompanyMicrolearningQuestionMapper::getInstance($this->adapter);
2977
 
2978
        $answers = [];
2979
        $answerMapper = CompanyMicrolearningAnswerMapper::getInstance($this->adapter);
2980
 
2981
 
2982
        $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2983
 
2984
        if($includeLogs) {
2985
 
54 efrain 2986
            //$records = $userLogMapper->fetchLast20ByUserId($user->id);
2987
            $records = $userLogMapper->fetchAllByUserId($user->id);
1 www 2988
            foreach($records as $record)
2989
            {
2990
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
2991
 
2992
                if($record->company_id) {
2993
 
2994
                    if(isset($companies[$record->company_id])) {
2995
                        $company = $companies[$record->company_id];
2996
                    } else {
2997
                        $company = $companyMapper->fetchOne($record->company_id);
2998
                        $companies[$record->company_id] = $company;
2999
                    }
3000
                } else {
3001
                    $company = null;
3002
                }
3003
 
3004
                if($record->topic_id) {
3005
 
3006
                    if(isset($topics[$record->topic_id])) {
3007
                        $topic = $topics[$record->topic_id];
3008
                    } else {
3009
                        $topic = $topicMapper->fetchOne($record->topic_id);
3010
                        $topics[$record->topic_id] = $topic;
3011
                    }
3012
                } else {
3013
                    $topic = null;
3014
                }
3015
 
3016
 
3017
                if($record->capsule_id) {
3018
 
3019
                    if(isset($capsules[$record->capsule_id])) {
3020
                        $capsule = $capsules[$record->capsule_id];
3021
                    } else {
3022
                        $capsule = $capsuleMapper->fetchOne($record->capsule_id);
3023
                        $capsules[$record->capsule_id] = $capsule;
3024
                    }
3025
                } else {
3026
                    $capsule = null;
3027
                }
3028
 
3029
 
3030
                if($record->slide_id) {
3031
 
3032
                    if(isset($slides[$record->slide_id])) {
3033
                        $slide = $slides[$record->slide_id];
3034
                    } else {
3035
                        $slide = $slideMapper->fetchOne($record->slide_id);
3036
                        $slides[$record->slide_id] = $slide;
3037
                    }
3038
                } else {
3039
                    $slide = null;
3040
                }
3041
 
3042
 
3043
                array_push($data['userlog'], [
3044
                    'user_uuid'     => $user->uuid,
3045
                    'company_uuid'  => $company ? $company->uuid : '',
3046
                    'topic_uuid'    => $topic ? $topic->uuid : '',
3047
                    'capsule_uuid'  => $capsule ? $capsule->uuid : '',
3048
                    'slide_uuid'    => $slide ? $slide->uuid : '',
3049
                    'activity'      => $record->activity,
3050
                    'added_on'      => $dt->format($serviceDatetimeFormat),
3051
                ]);
3052
 
3053
 
3054
            }
3055
        }
3056
 
3057
        if($includeProgress) {
3058
 
3059
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
3060
            $records = $userProgressMapper->fetchAllByUserId($user->id);
3061
            foreach($records as $record)
3062
            {
3063
                if($record->company_id) {
3064
 
3065
                    if(isset($companies[$record->company_id])) {
3066
                        $company = $companies[$record->company_id];
3067
                    } else {
3068
                        $company = $companyMapper->fetchOne($record->company_id);
3069
                        $companies[$record->company_id] = $company;
3070
                    }
3071
                } else {
3072
                    $company = null;
3073
                }
3074
 
3075
                if($record->topic_id) {
3076
 
3077
                    if(isset($topics[$record->topic_id])) {
3078
                        $topic = $topics[$record->topic_id];
3079
                    } else {
3080
                        $topic = $topicMapper->fetchOne($record->topic_id);
3081
                        $topics[$record->topic_id] = $topic;
3082
                    }
3083
                } else {
3084
                    $topic = null;
3085
                }
3086
 
3087
 
3088
                if($record->capsule_id) {
3089
 
3090
                    if(isset($capsules[$record->capsule_id])) {
3091
                        $capsule = $capsules[$record->capsule_id];
3092
                    } else {
3093
                        $capsule = $capsuleMapper->fetchOne($record->capsule_id);
3094
                        $capsules[$record->capsule_id] = $capsule;
3095
                    }
3096
                } else {
3097
                    $capsule = null;
3098
                }
3099
 
3100
 
3101
                if($record->slide_id) {
3102
 
3103
                    if(isset($slides[$record->slide_id])) {
3104
                        $slide = $slides[$record->slide_id];
3105
                    } else {
3106
                        $slide = $slideMapper->fetchOne($record->slide_id);
3107
                        $slides[$record->slide_id] = $slide;
3108
                    }
3109
                } else {
3110
                    $slide = null;
3111
                }
3112
 
3113
 
3114
                $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
3115
                $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
3116
 
3117
                array_push($data['progress'], [
3118
                    'user_uuid'                 => $user->uuid,
3119
                    'company_uuid'              => $company ? $company->uuid : '',
3120
                    'topic_uuid'                => $topic ? $topic->uuid : '',
3121
                    'capsule_uuid'              => $capsule ? $capsule->uuid : '',
3122
                    'slide_uuid'                => $slide ? $slide->uuid : '',
3123
                    'progress'                  => $record->progress ? $record->progress : 0,
3124
                    'total_slides'              => $record->total_slides ? $record->total_slides : 0,
3125
                    'view_slides'               => $record->view_slides ? $record->view_slides : 0,
3126
                    'type'                      => $record->type,
3127
                    'returning'                 => $record->returning ? $record->returning : 0,
3128
                    'returning_after_completed' => $record->returning_after_completed ? $record->returning_after_completed : 0,
3129
                    'completed'                 => $record->completed ? $record->completed : 0,
3130
                    'added_on'                  => $dtAddedOn->format($serviceDatetimeFormat),
3131
                    'updated_on'                => $dtUpdatedOn->format($serviceDatetimeFormat),
3132
                ]);
3133
            }
3134
        }
3135
 
3136
 
3137
        $now = date('Y-m-d H:i:s');
3138
        $companies_with_access  = [];
3139
        $topics_with_access     = [];
3140
        $capsules_with_access   = [];
3141
        $quizzes_with_access    = [];
3142
        $quizzes                = [];
3143
 
3144
 
3145
        $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
3146
        $records = $capsuleUserMapper->fetchAllActiveByUserId($user->id);
3147
 
3148
 
3149
        foreach($records as $record)
3150
        {
3151
            if($record->access != CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED && $record->access != CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
3152
                continue;
3153
            }
3154
            if($record->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
3155
                if($now < $record->paid_from || $now > $record->paid_to) {
3156
                    continue;
3157
                }
3158
            }
3159
 
3160
 
3161
            if(!in_array($record->company_id,$companies_with_access)) {
3162
                array_push($companies_with_access, $record->company_id);
3163
            }
3164
 
3165
            if(!in_array($record->topic_id,$topics_with_access)) {
3166
                array_push($topics_with_access, $record->topic_id);
3167
            }
3168
 
3169
            if(!in_array($record->capsule_id,$capsules_with_access)) {
3170
                array_push($capsules_with_access, $record->capsule_id);
3171
            }
3172
        }
3173
 
3174
 /*
3175
        echo '$companies_with_access ' . PHP_EOL;
3176
        print_r($companies_with_access);
3177
 
3178
        echo '$topics_with_access ' . PHP_EOL;
3179
        print_r($topics_with_access);
3180
 
3181
        echo '$capsules_with_access' . PHP_EOL;
3182
        print_r($capsules_with_access);
3183
        */
3184
 
3185
        $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
3186
        foreach($companies_with_access as $company_id)
3187
        {
3188
            $companyService =  $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company_id, Service::MICRO_LEARNING);
3189
 
3190
            //print_r($companyService); exit;
3191
 
3192
            if(!$companyService) {
3193
                continue;
3194
            }
3195
 
3196
 
3197
            if(isset($companies[$companyService->company_id])) {
3198
                $company = $companies[$companyService->company_id];
3199
            } else {
3200
                $company = $companyMapper->fetchOne($companyService->company_id);
3201
                $companies[$companyService->company_id] = $company;
3202
            }
3203
 
3204
            $topics = $topicMapper->fetchAllActiveByCompanyId($company_id);
3205
            foreach($topics as $topic)
3206
            {
3207
                if(!in_array($topic->id, $topics_with_access)) {
3208
                    continue;
3209
                }
3210
 
3211
                $record_capsules = [];
3212
                $capsules = $capsuleMapper->fetchAllActiveByCompanyIdAndTopicId($topic->company_id, $topic->id);
3213
                foreach($capsules as $capsule)
3214
                {
3215
                    if(!in_array($capsule->id, $capsules_with_access)) {
3216
                        continue;
3217
                    }
3218
 
3219
 
3220
                    $record_slides = [];
3221
                    $slides = $slideMapper->fetchAllByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
3222
                    foreach($slides as $slide)
3223
                    {
3224
                        if($slide->type == CompanyMicrolearningSlide::TYPE_QUIZ) {
3225
                            if(!in_array($slide->quiz_id, $quizzes_with_access)) {
3226
                                array_push($quizzes_with_access, $slide->quiz_id);
3227
                            }
3228
 
3229
                            if(isset($quizzes[$slide->quiz_id])) {
3230
                                $quiz = $quizzes[$slide->quiz_id];
3231
 
3232
                            } else {
3233
                                $quiz = $quizMapper->fetchOne($slide->quiz_id);
3234
                                $quizzes[$slide->quiz_id] =  $quiz;
3235
                            }
3236
                        } else {
3237
                            $quiz = null;
3238
                        }
3239
 
3240
 
3241
 
3242
                        array_push($record_slides, [
3243
                            'uuid' => $slide->uuid,
3244
                            'quiz_uuid' => $quiz ? $quiz->uuid : '',
3245
                            'name' => $slide->name ? $slide->name : '',
3246
                            'description' => $slide->description ? $slide->description : '',
3247
                            'position' => $slide->order,
3248
                            'type' => $slide->type,
3249
                            'background' => $slide->background ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '',
3250
                            'file' => $slide->file ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '',
3251
                        ]);
3252
                    }
3253
 
3254
                    array_push($record_capsules, [
3255
                        'uuid' => $capsule->uuid,
3256
                        'name' => $capsule->name ? $capsule->name : '',
3257
                        'description' => $capsule->description ? $capsule->description : '',
3258
                        'image' => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
3259
                        'position' => $capsule->order,
3260
                        'slides' => $record_slides,
3261
                    ]);
3262
                }
3263
 
3264
                array_push($data['topics'], [
3265
                    'uuid' => $topic->uuid,
3266
                    'name' => $topic->name ? $topic->name : '',
3267
                    'description' => $topic->description ? $topic->description : '',
3268
                    'image' => $topic->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '',
3269
                    'position' => $topic->order,
3270
                    'company_uuid' => $company->uuid,
3271
                    'company_name' => $company->name,
3272
                    'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
3273
                    'capsules' => $record_capsules
3274
                ]);
3275
            }
3276
        }
3277
 
3278
 
3279
 
3280
        foreach($quizzes_with_access as $quiz_id)
3281
        {
3282
            if(isset($quizzes[$quiz_id])) {
3283
                $quiz = $quizzes[$quiz_id];
3284
            } else {
3285
                $quiz = $quizMapper->fetchOne($quiz_id);
3286
                array_push($quizzes, $quiz);
3287
            }
3288
 
3289
            if(isset($companies[$quiz->company_id])) {
3290
                $company = $companies[$quiz->company_id];
3291
            } else {
3292
                $company = $companyMapper->fetchOne($quiz->company_id);
3293
                $companies[$quiz->company_id] = $company;
3294
            }
3295
 
3296
 
3297
            $record_questions = [];
3298
            $questions = $questionMapper->fetchAllByQuizId($quiz->id);
3299
            foreach($questions as $question)
3300
            {
3301
                $record_answers = [];
3302
 
3303
                $answers = $answerMapper->fetchAllByQuizIdAndQuestionId($question->quiz_id, $question->id);
3304
                foreach($answers as $answer)
3305
                {
3306
                    array_push($record_answers, [
3307
                        'uuid' => $answer->uuid,
3308
                        'text' => trim($answer->text),
3309
                        'correct' => $answer->correct ? $answer->correct  : 0 ,
3310
                        'points' => intval($answer->points, 10),
3311
                    ]);
3312
                }
3313
 
3314
                array_push($record_questions, [
3315
                    'uuid' => $question->uuid,
3316
                    'text' => trim($question->text),
3317
                    'type' => $question->type,
3318
                    'maxlength' => $question->maxlength,
3319
                    'points' => $question->points,
3320
                    'answers' => $record_answers,
3321
                ]);
3322
            }
3323
 
3324
 
3325
            array_push($data['quizzes'], [
3326
                'uuid' => $quiz->uuid,
3327
                'name' => $quiz->name,
3328
                'text' => trim($quiz->text ? $quiz->text : ''),
3329
                'failed' => trim($quiz->failed ? $quiz->failed : ''),
3330
                'points' => $quiz->points,
3331
                'minimum_points_required' => $quiz->minimum_points_required,
3332
                'max_time' => $quiz->max_time ? $quiz->max_time : 5,
3333
                'company_uuid' => $company->uuid,
3334
                'company_name' => $company->name,
3335
                'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
3336
                'questions' => $record_questions,
3337
            ]);
3338
        }
47 efrain 3339
 
3340
        $companyExtendUserMapper = CompanyMicrolearningExtendUserMapper::getInstance($this->adapter);
3341
        $companyExtendUserCompanyMapper = CompanyMicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
3342
        $companyExtendUserFunctionMapper = CompanyMicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
3343
        $companyExtendUserGroupMapper = CompanyMicrolearningExtendUserGroupMapper::getInstance($this->adapter);
3344
        $companyExtendUserInstitutionMapper = CompanyMicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
3345
        $companyExtendUserPartnerMapper = CompanyMicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
3346
        $companyExtendUserProgramMapper = CompanyMicrolearningExtendUserProgramMapper::getInstance($this->adapter);
3347
        $companyExtendUserStudentTypeMapper = CompanyMicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
3348
        $companyExtendUserSectorMapper = CompanyMicrolearningExtendUserSectorMapper::getInstance($this->adapter);
3349
 
3350
        $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
3351
        foreach($companies_with_access as $company_id)
3352
        {
3353
            $companyService =  $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company_id, Service::MICRO_LEARNING);
3354
 
3355
            //print_r($companyService); exit;
3356
 
3357
            if(!$companyService) {
3358
                continue;
3359
            }
3360
 
3361
 
3362
            if(isset($companies[$companyService->company_id])) {
3363
                $company = $companies[$companyService->company_id];
3364
            } else {
3365
                $company = $companyMapper->fetchOne($companyService->company_id);
3366
                $companies[$companyService->company_id] = $company;
3367
            }
3368
 
3369
            if(!$company) {
3370
                continue;
3371
            }
3372
 
3373
            $record = [
3374
                'company_uuid' => $company->uuid,
3375
                'company_name' => $company->name,
3376
                'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
48 efrain 3377
                'details' => [],
47 efrain 3378
            ];
3379
 
3380
            $companyExtendUser = $companyExtendUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
3381
            if(!$companyExtendUser) {
3382
                continue;
3383
            }
3384
 
3385
            if($companyExtendUser->extend_company_id) {
3386
 
3387
                $extendedCompany = $companyExtendUserCompanyMapper->fetchOne($companyExtendUser->company_id);
3388
                if($extendedCompany) {
48 efrain 3389
                    array_push($record['details'],[
3390
                        'uuid' => $extendedCompany->uuid,
3391
                        'label' => 'LABEL_COMPANY',
3392
                        'value' => $extendedCompany->name
3393
                    ]);
47 efrain 3394
                }
3395
            }
3396
 
3397
            if($companyExtendUser->extend_function_id) {
3398
                $extendedFunction = $companyExtendUserFunctionMapper->fetchOne($companyExtendUser->extend_function_id);
3399
                if($extendedFunction) {
48 efrain 3400
                    array_push($record['details'],[
3401
                        'uuid' => $extendedFunction->uuid,
3402
                        'label' => 'LABEL_FUNCTION',
3403
                        'value' => $extendedFunction->name
3404
                    ]);
47 efrain 3405
                }
3406
            }
3407
 
3408
            if($companyExtendUser->extend_group_id) {
3409
                $extendedGroup = $companyExtendUserGroupMapper->fetchOne($companyExtendUser->extend_group_id);
3410
                if($extendedGroup) {
48 efrain 3411
                    array_push($record['details'],[
3412
                        'uuid' => $extendedGroup->uuid,
3413
                        'label' => 'LABEL_GROUP',
3414
                        'value' => $extendedGroup->name
3415
                    ]);
47 efrain 3416
                }
3417
            }
3418
 
3419
            if($companyExtendUser->extend_institution_id) {
3420
                $extendedInstitution= $companyExtendUserInstitutionMapper->fetchOne($companyExtendUser->extend_institution_id);
3421
                if($extendedInstitution) {
48 efrain 3422
                    array_push($record['details'],[
3423
                        'uuid' => $extendedInstitution->uuid,
3424
                        'label' => 'LABEL_INSTITUTION',
3425
                        'value' => $extendedInstitution->name
3426
                    ]);
47 efrain 3427
                }
3428
            }
3429
 
3430
            if($companyExtendUser->extend_program_id) {
3431
                $extendedProgram = $companyExtendUserProgramMapper->fetchOne($companyExtendUser->extend_program_id);
3432
                if($extendedProgram) {
48 efrain 3433
                    array_push($record['details'],[
3434
                        'uuid' => $extendedProgram->uuid,
3435
                        'label' => 'LABEL_PROGRAM',
3436
                        'value' => $extendedProgram->name
3437
                    ]);
3438
 
47 efrain 3439
                }
3440
            }
3441
 
3442
            if($companyExtendUser->extend_sector_id) {
3443
                $extendedSector = $companyExtendUserSectorMapper->fetchOne($companyExtendUser->extend_sector_id);
3444
                if($extendedSector) {
48 efrain 3445
                    array_push($record['details'],[
3446
                        'uuid' => $extendedSector->uuid,
3447
                        'label' => 'LABEL_SECTOR',
3448
                        'value' => $extendedSector->name
3449
                    ]);
47 efrain 3450
                }
3451
            }
3452
 
3453
            if($companyExtendUser->extend_partner_id) {
3454
                $extendedPartner = $companyExtendUserPartnerMapper->fetchOne($companyExtendUser->extend_partner_id);
3455
                if($extendedPartner) {
48 efrain 3456
                    array_push($record['details'],[
3457
                        'uuid' => $extendedPartner->uuid,
3458
                        'label' => 'LABEL_PARTNER',
3459
                        'value' => $extendedPartner->name
3460
                    ]);
47 efrain 3461
                }
3462
            }
3463
 
3464
            if($companyExtendUser->extend_student_type_id) {
3465
                $extendedStudentType = $companyExtendUserStudentTypeMapper->fetchOne($companyExtendUser->extend_student_type_id);
3466
                if($extendedStudentType) {
48 efrain 3467
                    array_push($record['details'],[
3468
                        'uuid' => $extendedStudentType->uuid,
3469
                        'label' => 'LABEL_TYPE',
3470
                        'value' => $extendedStudentType->name
3471
                    ]);
47 efrain 3472
                }
3473
            }
3474
 
3475
            array_push($data['extended'], $record);
3476
        }
3477
 
1 www 3478
        return $data;
3479
    }
3480
 
3481
 
3482
    /**
3483
     *
3484
     * @param string $filename
3485
     * @param boolean $retbytes
3486
     * @return boolean|number
3487
     */
3488
    private function readfile_chunked($filename, $retbytes = true) {
3489
        $buffer = '';
3490
        $cnt =0;;
3491
        $handle = fopen($filename,'rb');
3492
        if ($handle === false) {
3493
            return false;
3494
        }
3495
        while (!feof($handle)) {
3496
            $buffer = fread($handle, self::CHUNK_SIZE);
3497
            echo $buffer;
3498
            ob_flush();
3499
            flush();
3500
            if ($retbytes) {
3501
                $cnt += strlen($buffer);
3502
            }
3503
        }
3504
        $status = fclose($handle);
3505
        if ($retbytes && $status) {
3506
            return $cnt; // return num. bytes delivered like readfile() does.
3507
        }
3508
        return $status;
3509
    }
3510
}